Android: further simplify permission request callback

Since we don't use the list of strings, don't pass it from Java to C++
at all. This saves us making a copy of the strings. And as we need to
create a QList<PermissionResult> from the list of ints, don't receive
the list of int's as a QList<int>, but as a QJniArray<int>, which means
one less copy of the int-array we get from Java.

Amends 46737c0bc0bb86df87f509628797b5cab184760a.

Change-Id: Idae86174cafff90d56affba6e0862fb5c6668c13
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
This commit is contained in:
Volker Hilsheimer 2024-10-15 13:21:28 +02:00
parent 70738cf726
commit 3b85c77e89
3 changed files with 12 additions and 8 deletions

View File

@ -337,7 +337,7 @@ public class QtActivityBase extends Activity
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
QtNative.sendRequestPermissionsResult(requestCode, permissions, grantResults);
QtNative.sendRequestPermissionsResult(requestCode, grantResults);
}
@UsedFromNativeCode

View File

@ -462,7 +462,7 @@ public class QtNative
static native void runPendingCppRunnables();
static native void sendRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
static native void sendRequestPermissionsResult(int requestCode, int[] grantResults);
// activity methods
// service methods

View File

@ -1051,15 +1051,14 @@ static int nextRequestCode()
\internal
This function is called when the result of the permission request is available.
Once a permission is requested, the result is braodcast by the OS and listened
Once a permission is requested, the result is broadcast by the OS and listened
to by QtActivity which passes it to C++ through a native JNI method call.
*/
static void sendRequestPermissionsResult(JNIEnv *env, jobject obj, jint requestCode,
const QStringList &permissions, const QList<int> &grantResults)
static void sendRequestPermissionsResult(JNIEnv *env, jclass obj, jint requestCode,
const QJniArray<int> &grantResults)
{
Q_UNUSED(env);
Q_UNUSED(obj);
Q_UNUSED(permissions);
QMutexLocker locker(&g_pendingPermissionRequestsMutex);
auto it = g_pendingPermissionRequests->constFind(requestCode);
@ -1072,8 +1071,13 @@ static void sendRequestPermissionsResult(JNIEnv *env, jobject obj, jint requestC
g_pendingPermissionRequests->erase(it);
locker.unlock();
for (qsizetype i = 0; i < grantResults.size(); ++i)
request->addResult(resultFromAndroid(grantResults.at(i)), i);
request->addResults([grantResults](){
QList<QtAndroidPrivate::PermissionResult> results(grantResults.size(),
Qt::Uninitialized);
for (qsizetype i = 0; i < grantResults.size(); ++i)
results[i] = resultFromAndroid(grantResults.at(i));
return results;
}());
QtAndroidPrivate::releaseAndroidDeadlockProtector();
request->finish();