Commit de399a75 by Sebastian Roth

Adds AndroidQ support for locationAlways

parent 36ba8ee4
...@@ -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,9 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -551,6 +573,9 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
break; break;
case PERMISSION_GROUP_LOCATION_ALWAYS: case PERMISSION_GROUP_LOCATION_ALWAYS:
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))
......
...@@ -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" />
......
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