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
Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative")
namespace QtAndroidPrivate
{
class Q_CORE_EXPORT ActivityResultListener

View File

@ -17,6 +17,8 @@
QT_BEGIN_NAMESPACE
using namespace QtJniTypes;
class QAndroidParcelPrivate
{
public:
@ -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;
@ -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);
@ -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)
@ -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);
@ -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

View File

@ -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")

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(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")