Commit 565e77c8 by Maurits van Beusekom Committed by GitHub

Merge pull request #158 from ened/android-q-locationalways

Android Q: Support for locationAlways
parents 9aa77e4f ff730b1b
## 3.3.0
* Android: Add support for requesting the background location permission within the `locationAlways` group.
* Android: Update AGP, Gradle and AndroidX dependencies
## 3.2.2 ## 3.2.2
* Fixed problem with dependency on specific version of gradle wrapper on Android. * Fixed problem with dependency on specific version of gradle wrapper on Android.
......
...@@ -9,7 +9,7 @@ buildscript { ...@@ -9,7 +9,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.android.tools.build:gradle:3.5.1'
} }
} }
...@@ -23,7 +23,7 @@ rootProject.allprojects { ...@@ -23,7 +23,7 @@ rootProject.allprojects {
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
android { android {
compileSdkVersion 28 compileSdkVersion 29
defaultConfig { defaultConfig {
minSdkVersion 16 minSdkVersion 16
...@@ -35,8 +35,8 @@ android { ...@@ -35,8 +35,8 @@ android {
} }
dependencies { dependencies {
implementation 'androidx.annotation:annotation:1.0.2' implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.core:core:1.0.2' implementation 'androidx.core:core:1.1.0'
} }
repositories { repositories {
......
...@@ -166,6 +166,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -166,6 +166,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
case Manifest.permission.WRITE_CONTACTS: case Manifest.permission.WRITE_CONTACTS:
case Manifest.permission.GET_ACCOUNTS: case Manifest.permission.GET_ACCOUNTS:
return PERMISSION_GROUP_CONTACTS; return PERMISSION_GROUP_CONTACTS;
case Manifest.permission.ACCESS_BACKGROUND_LOCATION:
return PERMISSION_GROUP_LOCATION_ALWAYS;
case Manifest.permission.ACCESS_COARSE_LOCATION: case Manifest.permission.ACCESS_COARSE_LOCATION:
case Manifest.permission.ACCESS_FINE_LOCATION: case Manifest.permission.ACCESS_FINE_LOCATION:
return PERMISSION_GROUP_LOCATION; return PERMISSION_GROUP_LOCATION;
...@@ -450,17 +452,20 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -450,17 +452,20 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
if (!mRequestResults.containsKey(PERMISSION_GROUP_SPEECH)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_SPEECH)) {
mRequestResults.put(PERMISSION_GROUP_SPEECH, toPermissionStatus(grantResults[i])); mRequestResults.put(PERMISSION_GROUP_SPEECH, toPermissionStatus(grantResults[i]));
} }
} else if (permission == PERMISSION_GROUP_LOCATION) { } else if (permission == PERMISSION_GROUP_LOCATION_ALWAYS) {
final Context context = mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity(); @PermissionStatus int permissionStatus = determineActualLocationStatus(grantResults[i]);
final boolean isLocationServiceEnabled = context != null && isLocationServiceEnabled(context);
@PermissionStatus int permissionStatus = toPermissionStatus(grantResults[i]); if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
if (permissionStatus == PERMISSION_STATUS_GRANTED && !isLocationServiceEnabled) { mRequestResults.put(PERMISSION_GROUP_LOCATION_ALWAYS, permissionStatus);
permissionStatus = PERMISSION_STATUS_DISABLED;
} }
} else if (permission == PERMISSION_GROUP_LOCATION) {
@PermissionStatus int permissionStatus = determineActualLocationStatus(grantResults[i]);
if (VERSION.SDK_INT < VERSION_CODES.Q) {
if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
mRequestResults.put(PERMISSION_GROUP_LOCATION_ALWAYS, permissionStatus); mRequestResults.put(PERMISSION_GROUP_LOCATION_ALWAYS, permissionStatus);
} }
}
if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_WHEN_IN_USE)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_WHEN_IN_USE)) {
mRequestResults.put(PERMISSION_GROUP_LOCATION_WHEN_IN_USE, permissionStatus); mRequestResults.put(PERMISSION_GROUP_LOCATION_WHEN_IN_USE, permissionStatus);
...@@ -475,6 +480,23 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -475,6 +480,23 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
processResult(); processResult();
} }
/**
* Crosschecks a permission grant result with the location service availability.
*
* @param grantResult Grant Result as received from the Android system.
*/
@PermissionStatus
private int determineActualLocationStatus(int grantResult) {
final Context context =
mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity();
final boolean isLocationServiceEnabled = context != null && isLocationServiceEnabled(context);
@PermissionStatus int permissionStatus = toPermissionStatus(grantResult);
if (permissionStatus == PERMISSION_STATUS_GRANTED && !isLocationServiceEnabled) {
permissionStatus = PERMISSION_STATUS_DISABLED;
}
return permissionStatus;
}
private void handleIgnoreBatteryOptimizationsRequest(boolean granted) { private void handleIgnoreBatteryOptimizationsRequest(boolean granted) {
if (mResult == null) { if (mResult == null) {
return; return;
...@@ -551,6 +573,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -551,6 +573,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
break; break;
case PERMISSION_GROUP_LOCATION_ALWAYS: case PERMISSION_GROUP_LOCATION_ALWAYS:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (hasPermissionInManifest(Manifest.permission.ACCESS_BACKGROUND_LOCATION))
permissionNames.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
}
case PERMISSION_GROUP_LOCATION_WHEN_IN_USE: case PERMISSION_GROUP_LOCATION_WHEN_IN_USE:
case PERMISSION_GROUP_LOCATION: case PERMISSION_GROUP_LOCATION:
if (hasPermissionInManifest(Manifest.permission.ACCESS_COARSE_LOCATION)) if (hasPermissionInManifest(Manifest.permission.ACCESS_COARSE_LOCATION))
......
...@@ -25,7 +25,7 @@ apply plugin: 'com.android.application' ...@@ -25,7 +25,7 @@ apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion 28 compileSdkVersion 29
lintOptions { lintOptions {
disable 'InvalidPackage' disable 'InvalidPackage'
...@@ -35,7 +35,7 @@ android { ...@@ -35,7 +35,7 @@ android {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.permissionhandlerexample" applicationId "com.example.permissionhandlerexample"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 28 targetSdkVersion 29
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
<!-- Permissions options for the `location` group --> <!-- Permissions options for the `location` group -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- Permissions options for the `microphone` or `speech` group --> <!-- Permissions options for the `microphone` or `speech` group -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
......
...@@ -5,7 +5,7 @@ buildscript { ...@@ -5,7 +5,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.android.tools.build:gradle:3.5.1'
} }
} }
......
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.enableJetifier=true android.enableJetifier=true
android.useAndroidX=true android.useAndroidX=true
android.enableR8=true
...@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME ...@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-all.zip
...@@ -99,7 +99,9 @@ class PermissionGroup { ...@@ -99,7 +99,9 @@ class PermissionGroup {
/// iOS: CoreLocation (Always and WhenInUse) /// iOS: CoreLocation (Always and WhenInUse)
static const PermissionGroup location = PermissionGroup._(3); static const PermissionGroup location = PermissionGroup._(3);
/// Android: Fine and Coarse Location /// Android:
/// When running on Android < Q: Fine and Coarse Location
/// When running on Android Q and above: Background Location Permission
/// iOS: CoreLocation - Always /// iOS: CoreLocation - Always
static const PermissionGroup locationAlways = PermissionGroup._(4); static const PermissionGroup locationAlways = PermissionGroup._(4);
......
name: permission_handler name: permission_handler
description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.
version: 3.2.2 version: 3.3.0
authors: authors:
- Baseflow <hello@baseflow.com> - Baseflow <hello@baseflow.com>
- long1eu <home@long1.eu> - long1eu <home@long1.eu>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment