Introduce qt_internal_add_android_permission CMake function

This is a manual cherry-pick from
5efbfcb032d801c7083d4a850d0279a075de7f1a

The function allows setting additional permission attributes like
minSdkVersion and maxSdkVersion. The function's implementation is such
that it should work alongside the older way of directly setting the
QT_ANDROID_PERMISSIONS target property.

Task-number: QTBUG-129944
Task-number: QTBUG-117358
Task-number: QTBUG-112164
Change-Id: I0f40692574848fccdf65f9baedd14351917ce4bf
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 5efbfcb032d801c7083d4a850d0279a075de7f1a)
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
This commit is contained in:
Juha Vuolle 2024-08-14 12:55:53 +03:00
parent d4989135f9
commit e6aa48dc2c
2 changed files with 55 additions and 6 deletions

View File

@ -88,6 +88,44 @@ macro(qt_internal_setup_android_target_properties)
)
endmacro()
function(qt_internal_add_android_permission target)
cmake_parse_arguments(arg "" "NAME" "ATTRIBUTES" ${ARGN})
if(NOT target)
message(FATAL_ERROR "Target for adding Android permission cannot be empty (${arg_NAME})")
endif()
if(NOT arg_NAME)
message(FATAL_ERROR "NAME for adding Android permission cannot be empty (${target})")
endif()
set(permission_entry "${arg_NAME}")
if(arg_ATTRIBUTES)
# Permission with additional attributes
list(LENGTH arg_ATTRIBUTES attributes_len)
math(EXPR attributes_modulus "${attributes_len} % 2")
if(NOT (attributes_len GREATER 1 AND attributes_modulus EQUAL 0))
message(FATAL_ERROR "Android permission attributes must be name-value pairs (${arg_NAME})")
endif()
# Combine name-value pairs
set(index 0)
set(attributes "")
while(index LESS attributes_len)
list(GET arg_ATTRIBUTES ${index} name)
math(EXPR index "${index} + 1")
list(GET arg_ATTRIBUTES ${index} value)
string(APPEND attributes " android:${name}=\"${value}\"")
math(EXPR index "${index} + 1")
endwhile()
set(permission_entry "${permission_entry}\;${attributes}")
endif()
# Append the permission to the target's property
set_property(TARGET ${target} APPEND PROPERTY QT_ANDROID_PERMISSIONS "${permission_entry}")
endfunction()
function(qt_internal_android_dependencies_content target file_content_out)
get_target_property(arg_JAR_DEPENDENCIES ${target} QT_ANDROID_JAR_DEPENDENCIES)
get_target_property(arg_BUNDLED_JAR_DEPENDENCIES ${target} QT_ANDROID_BUNDLED_JAR_DEPENDENCIES)
@ -194,7 +232,17 @@ function(qt_internal_android_dependencies_content target file_content_out)
# Android Permissions
if(arg_PERMISSIONS)
foreach(permission IN LISTS arg_PERMISSIONS)
string(APPEND file_contents "<permission name=\"${permission}\" />\n")
# Check if the permission has also extra attributes in addition to the permission name
list(LENGTH permission permission_len)
if(permission_len EQUAL 1)
string(APPEND file_contents "<permission name=\"${permission}\" />\n")
elseif(permission_len EQUAL 2)
list(GET permission 0 name)
list(GET permission 1 extras)
string(APPEND file_contents "<permission name=\"${name}\" extras=\'${extras}\'/>\n")
else()
message(FATAL_ERROR "Unexpected permission: " "${permission}" "${permission_len}")
endif()
endforeach()
endif()

View File

@ -240,7 +240,8 @@ struct Options
// Per package collected information
QStringList initClasses;
QStringList permissions;
// permissions 'name' => 'optional additional attributes'
QMap<QString, QString> permissions;
QStringList features;
// Override qml import scanner path
@ -1855,8 +1856,8 @@ bool updateAndroidManifest(Options &options)
replacements[QStringLiteral("package=\"org.qtproject.example\"")] = "package=\"%1\""_L1.arg(options.packageName);
QString permissions;
for (const QString &permission : std::as_const(options.permissions))
permissions += " <uses-permission android:name=\"%1\" />\n"_L1.arg(permission);
for (auto [name, extras] : options.permissions.asKeyValueRange())
permissions += " <uses-permission android:name=\"%1\" %2 />\n"_L1.arg(name).arg(extras);
replacements[QStringLiteral("<!-- %%INSERT_PERMISSIONS -->")] = permissions.trimmed();
QString features;
@ -2127,7 +2128,8 @@ bool readAndroidDependencyXml(Options *options,
}
} else if (reader.name() == "permission"_L1) {
QString name = reader.attributes().value("name"_L1).toString();
options->permissions.append(name);
QString extras = reader.attributes().value("extras"_L1).toString();
options->permissions.insert(name, extras);
} else if (reader.name() == "feature"_L1) {
QString name = reader.attributes().value("name"_L1).toString();
options->features.append(name);
@ -2142,7 +2144,6 @@ bool readAndroidDependencyXml(Options *options,
} else if (options->verbose) {
fprintf(stdout, "No android dependencies for %s\n", qPrintable(moduleName));
}
options->permissions.removeDuplicates();
options->features.removeDuplicates();
return true;