Commit 4432f406 by Kostya Manoilo

Added neverAskAgain permission status for android devices

parent 3e7ee829
...@@ -19,6 +19,7 @@ import android.telephony.TelephonyManager; ...@@ -19,6 +19,7 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import io.flutter.plugin.common.PluginRegistry.ActivityResultListener; import io.flutter.plugin.common.PluginRegistry.ActivityResultListener;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
...@@ -100,7 +101,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -100,7 +101,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
private static final int PERMISSION_STATUS_GRANTED = 2; private static final int PERMISSION_STATUS_GRANTED = 2;
private static final int PERMISSION_STATUS_RESTRICTED = 3; private static final int PERMISSION_STATUS_RESTRICTED = 3;
private static final int PERMISSION_STATUS_UNKNOWN = 4; private static final int PERMISSION_STATUS_UNKNOWN = 4;
private static final int PERMISSION_STATUS_NEWER_ASK_AGAIN = 5;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
PERMISSION_STATUS_DENIED, PERMISSION_STATUS_DENIED,
...@@ -108,6 +109,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -108,6 +109,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
PERMISSION_STATUS_GRANTED, PERMISSION_STATUS_GRANTED,
PERMISSION_STATUS_RESTRICTED, PERMISSION_STATUS_RESTRICTED,
PERMISSION_STATUS_UNKNOWN, PERMISSION_STATUS_UNKNOWN,
PERMISSION_STATUS_NEWER_ASK_AGAIN,
}) })
private @interface PermissionStatus { private @interface PermissionStatus {
} }
...@@ -204,12 +206,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -204,12 +206,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
} }
} }
private final Registrar mRegistrar;
private Result mResult;
private ArrayList<String> mRequestedPermissions;
@SuppressLint("UseSparseArrays")
private Map<Integer, Integer> mRequestResults = new HashMap<>();
@Override @Override
public void onMethodCall(MethodCall call, Result result) { public void onMethodCall(MethodCall call, Result result) {
switch (call.method) { switch (call.method) {
...@@ -302,7 +298,9 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -302,7 +298,9 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
} }
final int permissionStatus = ContextCompat.checkSelfPermission(context, name); final int permissionStatus = ContextCompat.checkSelfPermission(context, name);
if (permissionStatus == PackageManager.PERMISSION_DENIED) { if (permissionStatus == PackageManager.PERMISSION_DENIED) {
return PERMISSION_STATUS_DENIED; if (VERSION.SDK_INT >= VERSION_CODES.M && isNeverAskAgainSelected(permission)) {
return PERMISSION_STATUS_NEWER_ASK_AGAIN;
} else return PERMISSION_STATUS_DENIED;
} else if (permissionStatus != PackageManager.PERMISSION_GRANTED) { } else if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
return PERMISSION_STATUS_UNKNOWN; return PERMISSION_STATUS_UNKNOWN;
} }
...@@ -456,21 +454,24 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -456,21 +454,24 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
if (permission == PERMISSION_GROUP_UNKNOWN) if (permission == PERMISSION_GROUP_UNKNOWN)
continue; continue;
final int result = grantResults[i];
updatePermissionShouldShowStatus(permission);
if (permission == PERMISSION_GROUP_MICROPHONE) { if (permission == PERMISSION_GROUP_MICROPHONE) {
if (!mRequestResults.containsKey(PERMISSION_GROUP_MICROPHONE)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_MICROPHONE)) {
mRequestResults.put(PERMISSION_GROUP_MICROPHONE, toPermissionStatus(grantResults[i])); mRequestResults.put(PERMISSION_GROUP_MICROPHONE, toPermissionStatus(permission, result));
} }
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(permission, result));
} }
} else if (permission == PERMISSION_GROUP_LOCATION_ALWAYS) { } else if (permission == PERMISSION_GROUP_LOCATION_ALWAYS) {
@PermissionStatus int permissionStatus = determineActualLocationStatus(grantResults[i]); @PermissionStatus int permissionStatus = determineActualLocationStatus(permission, result);
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);
} }
} else if (permission == PERMISSION_GROUP_LOCATION) { } else if (permission == PERMISSION_GROUP_LOCATION) {
@PermissionStatus int permissionStatus = determineActualLocationStatus(grantResults[i]); @PermissionStatus int permissionStatus = determineActualLocationStatus(permission, result);
if (VERSION.SDK_INT < VERSION_CODES.Q) { if (VERSION.SDK_INT < VERSION_CODES.Q) {
if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
...@@ -484,7 +485,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -484,7 +485,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
mRequestResults.put(permission, permissionStatus); mRequestResults.put(permission, permissionStatus);
} else if (!mRequestResults.containsKey(permission)) { } else if (!mRequestResults.containsKey(permission)) {
mRequestResults.put(permission, toPermissionStatus(grantResults[i])); mRequestResults.put(permission, toPermissionStatus(permission, result));
} }
} }
...@@ -497,11 +498,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -497,11 +498,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
* @param grantResult Grant Result as received from the Android system. * @param grantResult Grant Result as received from the Android system.
*/ */
@PermissionStatus @PermissionStatus
private int determineActualLocationStatus(int grantResult) { private int determineActualLocationStatus(@PermissionGroup int permission, int grantResult) {
final Context context = final Context context =
mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity(); mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity();
final boolean isLocationServiceEnabled = context != null && isLocationServiceEnabled(context); final boolean isLocationServiceEnabled = context != null && isLocationServiceEnabled(context);
@PermissionStatus int permissionStatus = toPermissionStatus(grantResult); @PermissionStatus int permissionStatus = toPermissionStatus(permission, grantResult);
if (permissionStatus == PERMISSION_STATUS_GRANTED && !isLocationServiceEnabled) { if (permissionStatus == PERMISSION_STATUS_GRANTED && !isLocationServiceEnabled) {
permissionStatus = PERMISSION_STATUS_DISABLED; permissionStatus = PERMISSION_STATUS_DISABLED;
} }
...@@ -521,7 +522,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -521,7 +522,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
} }
@PermissionStatus @PermissionStatus
private int toPermissionStatus(int grantResult) { private int toPermissionStatus(@PermissionGroup int permission, int grantResult) {
if (VERSION.SDK_INT >= VERSION_CODES.M && isNeverAskAgainSelected(permission)) {
return PERMISSION_STATUS_NEWER_ASK_AGAIN;
}
return grantResult == PackageManager.PERMISSION_GRANTED ? PERMISSION_STATUS_GRANTED : PERMISSION_STATUS_DENIED; return grantResult == PackageManager.PERMISSION_GRANTED ? PERMISSION_STATUS_GRANTED : PERMISSION_STATUS_DENIED;
} }
...@@ -722,6 +727,46 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -722,6 +727,46 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return false; return false;
} }
private void updatePermissionShouldShowStatus(@PermissionGroup int permission) {
List<String> names = getManifestNames(permission);
if (names == null || names.isEmpty()) {
return;
}
final Context context = mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity();
if (context == null) {
return;
}
for (String name : names) {
PermissionUtils.setShouldShowStatus(context, name);
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
private boolean isNeverAskAgainSelected(@PermissionGroup int permission) {
List<String> names = getManifestNames(permission);
if (names == null || names.isEmpty()) {
return false;
}
final Activity activity = mRegistrar.activity();
if (activity == null) {
return false;
}
boolean isNeverAskAgainSelected = false;
for (String name : names) {
isNeverAskAgainSelected |= PermissionUtils.neverAskAgainSelected(activity, name);
}
return isNeverAskAgainSelected;
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private boolean isLocationServiceEnabled(Context context) { private boolean isLocationServiceEnabled(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
......
package com.baseflow.permissionhandler;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
public class PermissionUtils {
@RequiresApi(api = Build.VERSION_CODES.M)
static boolean neverAskAgainSelected(final Activity activity, final String permission) {
final boolean prevShouldShowStatus = getRationaleDisplayStatus(activity, permission);
final boolean currShouldShowStatus = ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
return prevShouldShowStatus != currShouldShowStatus;
}
static void setShouldShowStatus(final Context context, final String permission) {
SharedPreferences genPrefs = context.getSharedPreferences("GENERIC_PREFERENCES", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = genPrefs.edit();
editor.putBoolean(permission, true);
editor.apply();
}
private static boolean getRationaleDisplayStatus(final Context context, final String permission) {
SharedPreferences genPrefs = context.getSharedPreferences("GENERIC_PREFERENCES", Context.MODE_PRIVATE);
return genPrefs.getBoolean(permission, false);
}
}
\ No newline at end of file
...@@ -21,12 +21,16 @@ class PermissionStatus { ...@@ -21,12 +21,16 @@ class PermissionStatus {
/// Permission is in an unknown state /// Permission is in an unknown state
static const PermissionStatus unknown = PermissionStatus._(4); static const PermissionStatus unknown = PermissionStatus._(4);
/// Permission to access the requested feature is denied by the user and never show selected (only on Android).
static const PermissionStatus neverAskAgain = PermissionStatus._(5);
static const List<PermissionStatus> values = <PermissionStatus>[ static const List<PermissionStatus> values = <PermissionStatus>[
denied, denied,
disabled, disabled,
granted, granted,
restricted, restricted,
unknown, unknown,
neverAskAgain,
]; ];
static const List<String> _names = <String>[ static const List<String> _names = <String>[
...@@ -35,6 +39,7 @@ class PermissionStatus { ...@@ -35,6 +39,7 @@ class PermissionStatus {
'granted', 'granted',
'restricted', 'restricted',
'unknown', 'unknown',
'neverAskAgain',
]; ];
@override @override
......
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