Android: modernize permission callback code

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>
This commit is contained in:
Volker Hilsheimer 2024-10-09 14:26:19 +02:00
parent 115ab2c553
commit 46737c0bc0
4 changed files with 15 additions and 24 deletions

View File

@ -22,6 +22,8 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative")
namespace QtAndroidPrivate namespace QtAndroidPrivate
{ {
class Q_CORE_EXPORT ActivityResultListener class Q_CORE_EXPORT ActivityResultListener

View File

@ -17,6 +17,8 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
using namespace QtJniTypes;
class QAndroidParcelPrivate class QAndroidParcelPrivate
{ {
public: public:
@ -1029,8 +1031,6 @@ void QAndroidActivityCallbackResultReceiver::registerCallback(
// Permissions API // Permissions API
static const char qtNativeClassName[] = "org/qtproject/qt/android/QtNative";
QtAndroidPrivate::PermissionResult resultFromAndroid(jint value) QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
{ {
return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied; return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied;
@ -1054,10 +1054,12 @@ static int nextRequestCode()
Once a permission is requested, the result is braodcast by the OS and listened 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. to by QtActivity which passes it to C++ through a native JNI method call.
*/ */
static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint requestCode, static void sendRequestPermissionsResult(JNIEnv *env, jobject obj, jint requestCode,
jobjectArray permissions, jintArray grantResults) const QStringList &permissions, const QList<int> &grantResults)
{ {
Q_UNUSED(env);
Q_UNUSED(obj); Q_UNUSED(obj);
Q_UNUSED(permissions);
QMutexLocker locker(&g_pendingPermissionRequestsMutex); QMutexLocker locker(&g_pendingPermissionRequestsMutex);
auto it = g_pendingPermissionRequests->constFind(requestCode); auto it = g_pendingPermissionRequests->constFind(requestCode);
@ -1070,18 +1072,13 @@ static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint request
g_pendingPermissionRequests->erase(it); g_pendingPermissionRequests->erase(it);
locker.unlock(); locker.unlock();
const int size = env->GetArrayLength(permissions); for (qsizetype i = 0; i < grantResults.size(); ++i)
std::unique_ptr<jint[]> results(new jint[size]); request->addResult(resultFromAndroid(grantResults.at(i)), i);
env->GetIntArrayRegion(grantResults, 0, size, results.get());
for (int i = 0 ; i < size; ++i) {
QtAndroidPrivate::PermissionResult result = resultFromAndroid(results[i]);
request->addResult(result, i);
}
QtAndroidPrivate::releaseAndroidDeadlockProtector(); QtAndroidPrivate::releaseAndroidDeadlockProtector();
request->finish(); request->finish();
} }
Q_DECLARE_JNI_NATIVE_METHOD(sendRequestPermissionsResult)
QFuture<QtAndroidPrivate::PermissionResult> QFuture<QtAndroidPrivate::PermissionResult>
requestPermissionsInternal(const QStringList &permissions) requestPermissionsInternal(const QStringList &permissions)
@ -1165,10 +1162,7 @@ QtAndroidPrivate::checkPermission(const QString &permission)
{ {
QtAndroidPrivate::PermissionResult result = Denied; QtAndroidPrivate::PermissionResult result = Denied;
if (!permission.isEmpty()) { if (!permission.isEmpty()) {
auto res = QJniObject::callStaticMethod<jint>(qtNativeClassName, auto res = QtNative::callStaticMethod<jint>("checkSelfPermission", permission);
"checkSelfPermission",
"(Ljava/lang/String;)I",
QJniObject::fromString(permission).object());
result = resultFromAndroid(res); result = resultFromAndroid(res);
} }
return QtFuture::makeReadyValueFuture(result); return QtFuture::makeReadyValueFuture(result);
@ -1179,12 +1173,9 @@ bool QtAndroidPrivate::registerPermissionNatives(QJniEnvironment &env)
if (QtAndroidPrivate::androidSdkVersion() < 23) if (QtAndroidPrivate::androidSdkVersion() < 23)
return true; return true;
const JNINativeMethod methods[] = { return env.registerNativeMethods<QtNative>({
{"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V", Q_JNI_NATIVE_METHOD(sendRequestPermissionsResult)
reinterpret_cast<void *>(sendRequestPermissionsResult) });
}};
return env.registerNativeMethods(qtNativeClassName, methods, 1);
} }
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -55,7 +55,6 @@ Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::Pri
bool QAndroidPlatformIntegration::m_showPasswordEnabled = false; 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(QtDisplayManager, "org/qtproject/qt/android/QtDisplayManager")
Q_DECLARE_JNI_CLASS(Display, "android/view/Display") Q_DECLARE_JNI_CLASS(Display, "android/view/Display")

View File

@ -55,7 +55,6 @@ Q_DECLARE_JNI_CLASS(Display, "android/view/Display")
Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics") Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics")
Q_DECLARE_JNI_CLASS(Resources, "android/content/res/Resources") Q_DECLARE_JNI_CLASS(Resources, "android/content/res/Resources")
Q_DECLARE_JNI_CLASS(Size, "android/util/Size") 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(QtDisplayManager, "org/qtproject/qt/android/QtDisplayManager")
Q_DECLARE_JNI_CLASS(QtWindowInterface, "org/qtproject/qt/android/QtWindowInterface") Q_DECLARE_JNI_CLASS(QtWindowInterface, "org/qtproject/qt/android/QtWindowInterface")