Skip to content

Commit

Permalink
Android: modernize permission callback code
Browse files Browse the repository at this point in the history
Centralize the declaration of the QtNative JNI type in the
qjnihelpes_p.h header, which the code in the Android
platform plugin already includes.

Change-Id: Ibdccabbcc0c7feb3d75ea17304004bcec5bb33f9
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
  • Loading branch information
vohi committed Oct 9, 2024
1 parent 115ab2c commit 46737c0
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 24 deletions.
2 changes: 2 additions & 0 deletions src/corelib/kernel/qjnihelpers_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

QT_BEGIN_NAMESPACE

Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative")

namespace QtAndroidPrivate
{
class Q_CORE_EXPORT ActivityResultListener
Expand Down
35 changes: 13 additions & 22 deletions src/corelib/platform/android/qandroidextras.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

QT_BEGIN_NAMESPACE

using namespace QtJniTypes;

class QAndroidParcelPrivate
{
public:
Expand Down Expand Up @@ -1029,8 +1031,6 @@ void QAndroidActivityCallbackResultReceiver::registerCallback(

// Permissions API

static const char qtNativeClassName[] = "org/qtproject/qt/android/QtNative";

QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
{
return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied;
Expand All @@ -1054,10 +1054,12 @@ static int nextRequestCode()
Once a permission is requested, the result is braodcast 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,
jobjectArray permissions, jintArray grantResults)
static void sendRequestPermissionsResult(JNIEnv *env, jobject obj, jint requestCode,
const QStringList &permissions, const QList<int> &grantResults)
{
Q_UNUSED(env);
Q_UNUSED(obj);
Q_UNUSED(permissions);

QMutexLocker locker(&g_pendingPermissionRequestsMutex);
auto it = g_pendingPermissionRequests->constFind(requestCode);
Expand All @@ -1070,18 +1072,13 @@ static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint request
g_pendingPermissionRequests->erase(it);
locker.unlock();

const int size = env->GetArrayLength(permissions);
std::unique_ptr<jint[]> results(new jint[size]);
env->GetIntArrayRegion(grantResults, 0, size, results.get());

for (int i = 0 ; i < size; ++i) {
QtAndroidPrivate::PermissionResult result = resultFromAndroid(results[i]);
request->addResult(result, i);
}
for (qsizetype i = 0; i < grantResults.size(); ++i)
request->addResult(resultFromAndroid(grantResults.at(i)), i);

QtAndroidPrivate::releaseAndroidDeadlockProtector();
request->finish();
}
Q_DECLARE_JNI_NATIVE_METHOD(sendRequestPermissionsResult)

QFuture<QtAndroidPrivate::PermissionResult>
requestPermissionsInternal(const QStringList &permissions)
Expand Down Expand Up @@ -1165,10 +1162,7 @@ QtAndroidPrivate::checkPermission(const QString &permission)
{
QtAndroidPrivate::PermissionResult result = Denied;
if (!permission.isEmpty()) {
auto res = QJniObject::callStaticMethod<jint>(qtNativeClassName,
"checkSelfPermission",
"(Ljava/lang/String;)I",
QJniObject::fromString(permission).object());
auto res = QtNative::callStaticMethod<jint>("checkSelfPermission", permission);
result = resultFromAndroid(res);
}
return QtFuture::makeReadyValueFuture(result);
Expand All @@ -1179,12 +1173,9 @@ bool QtAndroidPrivate::registerPermissionNatives(QJniEnvironment &env)
if (QtAndroidPrivate::androidSdkVersion() < 23)
return true;

const JNINativeMethod methods[] = {
{"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V",
reinterpret_cast<void *>(sendRequestPermissionsResult)
}};

return env.registerNativeMethods(qtNativeClassName, methods, 1);
return env.registerNativeMethods<QtNative>({
Q_JNI_NATIVE_METHOD(sendRequestPermissionsResult)
});
}

QT_END_NAMESPACE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::Pri

bool QAndroidPlatformIntegration::m_showPasswordEnabled = false;

Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative")
Q_DECLARE_JNI_CLASS(QtDisplayManager, "org/qtproject/qt/android/QtDisplayManager")
Q_DECLARE_JNI_CLASS(Display, "android/view/Display")

Expand Down
1 change: 0 additions & 1 deletion src/plugins/platforms/android/qandroidplatformscreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ Q_DECLARE_JNI_CLASS(Display, "android/view/Display")
Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics")
Q_DECLARE_JNI_CLASS(Resources, "android/content/res/Resources")
Q_DECLARE_JNI_CLASS(Size, "android/util/Size")
Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative")
Q_DECLARE_JNI_CLASS(QtDisplayManager, "org/qtproject/qt/android/QtDisplayManager")
Q_DECLARE_JNI_CLASS(QtWindowInterface, "org/qtproject/qt/android/QtWindowInterface")

Expand Down

0 comments on commit 46737c0

Please sign in to comment.