Commit 4a48af08 by Maurits van Beusekom

Removed the need for ServiceStatus.unknown

parent 17e196ad
...@@ -5,26 +5,35 @@ import android.content.Intent; ...@@ -5,26 +5,35 @@ import android.content.Intent;
import android.util.Log; import android.util.Log;
final class AppSettingsManager { final class AppSettingsManager {
boolean openAppSettings(Context applicationContext) { @FunctionalInterface
if (applicationContext == null) { interface OpenAppSettingsSuccessCallback {
Log.d(PermissionConstants.LOG_TAG, "Unable to detect current Activity or App Context."); void onSuccess(boolean appSettingsOpenedSuccessfully);
return false; }
void openAppSettings(
Context context,
OpenAppSettingsSuccessCallback successCallback,
ErrorCallback errorCallback) {
if(context == null) {
Log.d(PermissionConstants.LOG_TAG, "Context cannot be null.");
errorCallback.onError("PermissionHandler.AppSettingsManager", "Android context cannot be null.");
return;
} }
try { try {
Intent settingsIntent = new Intent(); Intent settingsIntent = new Intent();
settingsIntent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); settingsIntent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
settingsIntent.addCategory(Intent.CATEGORY_DEFAULT); settingsIntent.addCategory(Intent.CATEGORY_DEFAULT);
settingsIntent.setData(android.net.Uri.parse("package:" + applicationContext.getPackageName())); settingsIntent.setData(android.net.Uri.parse("package:" + context.getPackageName()));
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); settingsIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
applicationContext.startActivity(settingsIntent); context.startActivity(settingsIntent);
return true; successCallback.onSuccess(true);
} catch (Exception ex) { } catch (Exception ex) {
return false; successCallback.onSuccess(false);
} }
} }
} }
package com.baseflow.permissionhandler;
@FunctionalInterface
interface ErrorCallback {
void onError(String errorCode, String errorDescription);
}
...@@ -51,24 +51,30 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { ...@@ -51,24 +51,30 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler {
public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result)
{ {
switch (call.method) { switch (call.method) {
case "checkPermissionStatus": { case "checkServiceStatus": {
@PermissionConstants.PermissionGroup final int permission = Integer.parseInt(call.arguments.toString()); @PermissionConstants.PermissionGroup final int permission = Integer.parseInt(call.arguments.toString());
@PermissionConstants.PermissionStatus final int permissionStatus = serviceManager.checkServiceStatus(
permissionManager.checkPermissionStatus( permission,
permission, applicationContext,
activity); result::success,
(String errorCode, String errorDescription) -> result.error(
errorCode,
errorDescription,
null));
result.success(permissionStatus);
break; break;
} }
case "checkServiceStatus": { case "checkPermissionStatus": {
@PermissionConstants.PermissionGroup final int permission = Integer.parseInt(call.arguments.toString()); @PermissionConstants.PermissionGroup final int permission = Integer.parseInt(call.arguments.toString());
@PermissionConstants.ServiceStatus final int serviceStatus = permissionManager.checkPermissionStatus(
serviceManager.checkServiceStatus( permission,
permission, activity,
activity); result::success,
(String errorCode, String errorDescription) -> result.error(
errorCode,
errorDescription,
null));
result.success(serviceStatus);
break; break;
} }
case "requestPermissions": case "requestPermissions":
...@@ -79,21 +85,34 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { ...@@ -79,21 +85,34 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler {
activityRegistry, activityRegistry,
permissionRegistry, permissionRegistry,
result::success, result::success,
(String errorCode, String errorDescription) -> { (String errorCode, String errorDescription) -> result.error(
result.error(errorCode, errorDescription, null); errorCode,
}); errorDescription,
null));
break; break;
case "shouldShowRequestPermissionRationale": { case "shouldShowRequestPermissionRationale": {
@PermissionConstants.PermissionGroup final int permission = Integer.parseInt(call.arguments.toString()); @PermissionConstants.PermissionGroup final int permission = Integer.parseInt(call.arguments.toString());
final boolean showRationale = permissionManager permissionManager.shouldShowRequestPermissionRationale(
.shouldShowRequestPermissionRationale(permission, activity); permission,
result.success(showRationale); activity,
result::success,
(String errorCode, String errorDescription) -> result.error(
errorCode,
errorDescription,
null));
break; break;
} }
case "openAppSettings": case "openAppSettings":
boolean isOpen = appSettingsManager.openAppSettings(applicationContext); appSettingsManager.openAppSettings(
result.success(isOpen); applicationContext,
result::success,
(String errorCode, String errorDescription) -> result.error(
errorCode,
errorDescription,
null));
break; break;
default: default:
result.notImplemented(); result.notImplemented();
......
...@@ -80,14 +80,12 @@ final class PermissionConstants { ...@@ -80,14 +80,12 @@ final class PermissionConstants {
static final int SERVICE_STATUS_DISABLED = 0; static final int SERVICE_STATUS_DISABLED = 0;
static final int SERVICE_STATUS_ENABLED = 1; static final int SERVICE_STATUS_ENABLED = 1;
static final int SERVICE_STATUS_NOT_APPLICABLE = 2; static final int SERVICE_STATUS_NOT_APPLICABLE = 2;
static final int SERVICE_STATUS_UNKNOWN = 3;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
SERVICE_STATUS_DISABLED, SERVICE_STATUS_DISABLED,
SERVICE_STATUS_ENABLED, SERVICE_STATUS_ENABLED,
SERVICE_STATUS_NOT_APPLICABLE, SERVICE_STATUS_NOT_APPLICABLE
SERVICE_STATUS_UNKNOWN,
}) })
@interface ServiceStatus { @interface ServiceStatus {
} }
......
...@@ -36,16 +36,16 @@ public final class PermissionHandlerPlugin implements FlutterPlugin, ActivityAwa ...@@ -36,16 +36,16 @@ public final class PermissionHandlerPlugin implements FlutterPlugin, ActivityAwa
* <p>Calling this automatically initializes the plugin. However plugins initialized this way * <p>Calling this automatically initializes the plugin. However plugins initialized this way
* won't react to changes in activity or context, unlike {@link PermissionHandlerPlugin}. * won't react to changes in activity or context, unlike {@link PermissionHandlerPlugin}.
*/ */
public static void registerWith(Registrar registrar) { public static void registerWith(Registrar registrar) {
final PermissionHandlerPlugin permissionHandlerPlugin = new PermissionHandlerPlugin(); final PermissionHandlerPlugin permissionHandlerPlugin = new PermissionHandlerPlugin();
permissionHandlerPlugin.startListening( permissionHandlerPlugin.startListening(
registrar.context(), registrar.context(),
registrar.activity(), registrar.activity(),
registrar.messenger(), registrar.messenger(),
registrar::addActivityResultListener, registrar::addActivityResultListener,
registrar::addRequestPermissionsResultListener registrar::addRequestPermissionsResultListener
); );
} }
@Override @Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
......
package com.baseflow.permissionhandler; package com.baseflow.permissionhandler;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
...@@ -18,34 +17,45 @@ import android.util.Log; ...@@ -18,34 +17,45 @@ import android.util.Log;
import java.util.List; import java.util.List;
final class ServiceManager { final class ServiceManager {
@PermissionConstants.ServiceStatus @FunctionalInterface
int checkServiceStatus( interface SuccessCallback {
void onSuccess(@PermissionConstants.ServiceStatus int serviceStatus);
}
void checkServiceStatus(
int permission, int permission,
Activity activity) { Context context,
if (activity == null) { SuccessCallback successCallback,
Log.d(PermissionConstants.LOG_TAG, "Unable to detect current Activity or App Context."); ErrorCallback errorCallback) {
return PermissionConstants.SERVICE_STATUS_UNKNOWN; if(context == null) {
Log.d(PermissionConstants.LOG_TAG, "Context cannot be null.");
errorCallback.onError("PermissionHandler.ServiceManager", "Android context cannot be null.");
return;
} }
if (permission == PermissionConstants.PERMISSION_GROUP_LOCATION || if (permission == PermissionConstants.PERMISSION_GROUP_LOCATION ||
permission == PermissionConstants.PERMISSION_GROUP_LOCATION_ALWAYS || permission == PermissionConstants.PERMISSION_GROUP_LOCATION_ALWAYS ||
permission == PermissionConstants.PERMISSION_GROUP_LOCATION_WHEN_IN_USE) { permission == PermissionConstants.PERMISSION_GROUP_LOCATION_WHEN_IN_USE) {
return isLocationServiceEnabled(activity) final int serviceStatus = isLocationServiceEnabled(context)
? PermissionConstants.SERVICE_STATUS_ENABLED ? PermissionConstants.SERVICE_STATUS_ENABLED
: PermissionConstants.SERVICE_STATUS_DISABLED; : PermissionConstants.SERVICE_STATUS_DISABLED;
successCallback.onSuccess(serviceStatus);
} }
if (permission == PermissionConstants.PERMISSION_GROUP_PHONE) { if (permission == PermissionConstants.PERMISSION_GROUP_PHONE) {
PackageManager pm = activity.getPackageManager(); PackageManager pm = context.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { if (!pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
return PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE; successCallback.onSuccess(PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE);
return;
} }
TelephonyManager telephonyManager = (TelephonyManager) activity TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE); .getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager == null || telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) { if (telephonyManager == null || telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) {
return PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE; successCallback.onSuccess(PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE);
return;
} }
Intent callIntent = new Intent(Intent.ACTION_CALL); Intent callIntent = new Intent(Intent.ACTION_CALL);
...@@ -53,23 +63,28 @@ final class ServiceManager { ...@@ -53,23 +63,28 @@ final class ServiceManager {
List<ResolveInfo> callAppsList = pm.queryIntentActivities(callIntent, 0); List<ResolveInfo> callAppsList = pm.queryIntentActivities(callIntent, 0);
if (callAppsList.isEmpty()) { if (callAppsList.isEmpty()) {
return PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE; successCallback.onSuccess(PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE);
return;
} }
if (telephonyManager.getSimState() != TelephonyManager.SIM_STATE_READY) { if (telephonyManager.getSimState() != TelephonyManager.SIM_STATE_READY) {
return PermissionConstants.SERVICE_STATUS_DISABLED; successCallback.onSuccess(PermissionConstants.SERVICE_STATUS_DISABLED);
return;
} }
return PermissionConstants.SERVICE_STATUS_ENABLED; successCallback.onSuccess(PermissionConstants.SERVICE_STATUS_ENABLED);
return;
} }
if (permission == PermissionConstants.PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS) { if (permission == PermissionConstants.PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS) {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M final int serviceStatus = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
? PermissionConstants.SERVICE_STATUS_ENABLED ? PermissionConstants.SERVICE_STATUS_ENABLED
: PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE; : PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE;
successCallback.onSuccess(serviceStatus);
return;
} }
return PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE; successCallback.onSuccess(PermissionConstants.SERVICE_STATUS_NOT_APPLICABLE);
} }
private boolean isLocationServiceEnabled(Context context) { private boolean isLocationServiceEnabled(Context context) {
...@@ -87,7 +102,7 @@ final class ServiceManager { ...@@ -87,7 +102,7 @@ final class ServiceManager {
} }
} }
// Suppress deprecation warnings since it's purpose is to support to be backwards compatible with // Suppress deprecation warnings since its purpose is to support to be backwards compatible with
// pre Pie versions of Android. // pre Pie versions of Android.
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static boolean isLocationServiceEnablePrePie(Context context) private static boolean isLocationServiceEnablePrePie(Context context)
...@@ -109,7 +124,7 @@ final class ServiceManager { ...@@ -109,7 +124,7 @@ final class ServiceManager {
return locationMode != Settings.Secure.LOCATION_MODE_OFF; return locationMode != Settings.Secure.LOCATION_MODE_OFF;
} }
// Suppress deprecation warnings since it's purpose is to support to be backwards compatible with // Suppress deprecation warnings since its purpose is to support to be backwards compatible with
// pre KitKat versions of Android. // pre KitKat versions of Android.
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static boolean isLocationServiceEnablePreKitKat(Context context) private static boolean isLocationServiceEnablePreKitKat(Context context)
......
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