From 3fca15c7eec36a830df1c18663b5435d058f2fa9 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 15 Dec 2022 14:03:12 +0100 Subject: [PATCH] Fix some permission backwards compatibility issues with older android versions --- .../android/platformpermissionsandroid.cpp | 74 +++++++++++++------ .../android/platformpermissionsandroid.h | 2 + 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/nymea-app/platformintegration/android/platformpermissionsandroid.cpp b/nymea-app/platformintegration/android/platformpermissionsandroid.cpp index 2870ddf2..5587ed11 100644 --- a/nymea-app/platformintegration/android/platformpermissionsandroid.cpp +++ b/nymea-app/platformintegration/android/platformpermissionsandroid.cpp @@ -5,25 +5,14 @@ #include #include +#include "logging.h" + +NYMEA_LOGGING_CATEGORY(dcPlatformPermissions, "PlatformPermissions") + PlatformPermissionsAndroid * PlatformPermissionsAndroid::s_instance = nullptr; #define FLAG_ACTIVITY_NEW_TASK 0x10000000 -QHash permissionMapV31 = { - // TODO: Once QtBluetooth does not request the COARSE_LOCATION and FINE_LOCATION for Bluetooth any more, remove it from here. The new Bluetooth permissions would be enough. - {PlatformPermissions::PermissionBluetooth, {"android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, - {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, - {PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION"}}, - {PlatformPermissions::PermissionNotifications, {"android.permission.POST_NOTIFICATIONS"}}, -}; - -QHash permissionMapV30 = { - {PlatformPermissions::PermissionBluetooth, {"android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, - {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, - {PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION"}}, - {PlatformPermissions::PermissionNotifications, {"android.permission.POST_NOTIFICATIONS"}}, -}; - PlatformPermissionsAndroid::PlatformPermissionsAndroid(QObject *parent) : PlatformPermissions{parent} { @@ -44,12 +33,14 @@ PlatformPermissionsAndroid::PlatformPermissionsAndroid(QObject *parent) void PlatformPermissionsAndroid::requestPermission(PlatformPermissions::Permission permission) { if (permissionMap().contains(permission)) { + qCDebug(dcPlatformPermissions()) << "Requesting permissions:" << permissionMap().value(permission); QtAndroid::requestPermissions({permissionMap().value(permission)}, &permissionResultCallback); } } void PlatformPermissionsAndroid::openPermissionSettings() { + qCDebug(dcPlatformPermissions()) << "Opening permission dialog."; QAndroidJniObject packageName = QtAndroid::androidContext().callObjectMethod("getPackageName", "()Ljava/lang/String;"); QString packageUri = "package:" + packageName.toString(); QAndroidJniObject uri = QAndroidJniObject::callStaticObjectMethod("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", QAndroidJniObject::fromString(packageUri).object()); @@ -62,29 +53,68 @@ void PlatformPermissionsAndroid::openPermissionSettings() QHash PlatformPermissionsAndroid::permissionMap() const { QOperatingSystemVersion osVersion = QOperatingSystemVersion::current(); - if (osVersion.majorVersion() <= 11) { - return permissionMapV30; + if (osVersion.majorVersion() <= 9) { + return { + {PlatformPermissions::PermissionBluetooth, {"android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION"}} + }; } - return permissionMapV31; + if (osVersion.majorVersion() <= 10) { + return { + {PlatformPermissions::PermissionBluetooth, {"android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION"}} + }; + } + if (osVersion.majorVersion() <= 12) { + return { + // TODO: Once QtBluetooth does not request the COARSE_LOCATION and FINE_LOCATION for Bluetooth any more, remove it from here. The new Bluetooth permissions would be enough. + {PlatformPermissions::PermissionBluetooth, {"android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION"}} + }; + } + return { + // TODO: Once QtBluetooth does not request the COARSE_LOCATION and FINE_LOCATION for Bluetooth any more, remove it from here. The new Bluetooth permissions would be enough. + {PlatformPermissions::PermissionBluetooth, {"android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, + {PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION"}}, + {PlatformPermissions::PermissionNotifications, {"android.permission.POST_NOTIFICATIONS"}} + }; } PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermission(Permission permission) const { PermissionStatus status = PermissionStatusGranted; QStringList androidPermissions = permissionMap().value(permission); + qCDebug(dcPlatformPermissions()) << "Checking permission" << permission << "(" << androidPermissions << ")"; foreach (const QString androidPermission, androidPermissions) { - if (QtAndroid::shouldShowRequestPermissionRationale(androidPermission)) { - return PermissionStatusDenied; + if (QtAndroid::shouldShowRequestPermissionRationale(androidPermission) || m_requestedButDeniedPermissions.contains(androidPermission)) { + qCDebug(dcPlatformPermissions()) << "Permission:" << androidPermission << "denied"; + status = PermissionStatusDenied; } if (QtAndroid::checkPermission(androidPermission) == QtAndroid::PermissionResult::Denied) { - status = PermissionStatusNotDetermined; + qDebug(dcPlatformPermissions()) << "Permission:" << androidPermission << "not determined"; + if (status != PermissionStatusDenied) { + status = PermissionStatusNotDetermined; + } + } else { + qDebug(dcPlatformPermissions()) << "Permission:" << androidPermission << "granted"; } } + qCDebug(dcPlatformPermissions()) << "Permission status for:" << permission << ":" << status; return status; } -void PlatformPermissionsAndroid::permissionResultCallback(const QtAndroid::PermissionResultMap &/*results*/) +void PlatformPermissionsAndroid::permissionResultCallback(const QtAndroid::PermissionResultMap &results) { + foreach (const QString &androidPermission, results.keys()) { + qCDebug(dcPlatformPermissions()) << "Permission result callback:" << androidPermission << (results.value(androidPermission) == QtAndroid::PermissionResult::Granted ? "Granted" : "Denied"); + if (results.value(androidPermission) == QtAndroid::PermissionResult::Denied) { + s_instance->m_requestedButDeniedPermissions.append(androidPermission); + } + } emit s_instance->bluetoothPermissionChanged(); emit s_instance->locationPermissionChanged(); emit s_instance->backgroundLocationPermissionChanged(); diff --git a/nymea-app/platformintegration/android/platformpermissionsandroid.h b/nymea-app/platformintegration/android/platformpermissionsandroid.h index 02828137..5aa543ec 100644 --- a/nymea-app/platformintegration/android/platformpermissionsandroid.h +++ b/nymea-app/platformintegration/android/platformpermissionsandroid.h @@ -21,6 +21,8 @@ signals: private: QHash permissionMap() const; + QStringList m_requestedButDeniedPermissions; + static PlatformPermissionsAndroid *s_instance; static void permissionResultCallback(const QtAndroid::PermissionResultMap &results);