From 32c4648a24b9cb099b0760128b1b3321e4119af0 Mon Sep 17 00:00:00 2001 From: Nicolai Henriksen Date: Wed, 23 Sep 2020 10:16:08 +0200 Subject: [PATCH 1/2] Android background check does not work. Use Activity for requestNotificationPermissions which will only make sense in the foreground and use Context for getNotificationPermissionStatus which can also be used during a background task, such as handling a (silent) push notification. --- .../NotificationPermissionsPlugin.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java b/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java index b4c10cd..1d115f5 100644 --- a/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java +++ b/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java @@ -6,9 +6,9 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; -import android.util.Log; import androidx.core.app.NotificationManagerCompat; + import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.PluginRegistry.Registrar; @@ -24,9 +24,11 @@ public static void registerWith(Registrar registrar) { private static final String PERMISSION_DENIED = "denied"; private final Context context; + private final Activity activity; private NotificationPermissionsPlugin(Registrar registrar) { - this.context = registrar.activity(); + this.context = registrar.context(); + this.activity = registrar.activity(); } @Override @@ -35,30 +37,31 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { result.success(getNotificationPermissionStatus()); } else if ("requestNotificationPermissions".equalsIgnoreCase(call.method)) { if (PERMISSION_DENIED.equalsIgnoreCase(getNotificationPermissionStatus())) { - if (context instanceof Activity) { - // https://stackoverflow.com/a/45192258 - final Intent intent = new Intent(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - // ACTION_APP_NOTIFICATION_SETTINGS was introduced in API level 26 aka Android O - intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); - intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ - intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); - intent.putExtra("app_package", context.getPackageName()); - intent.putExtra("app_uid", context.getApplicationInfo().uid); - } else { - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setData(Uri.parse("package:" + context.getPackageName())); - } + if (activity == null) { + result.error(call.method, "activity is null", null); + return; + } - context.startActivity(intent); + // https://stackoverflow.com/a/45192258 + final Intent intent = new Intent(); - result.success(PERMISSION_DENIED); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // ACTION_APP_NOTIFICATION_SETTINGS was introduced in API level 26 aka Android O + intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.getPackageName()); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ + intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); + intent.putExtra("app_package", activity.getPackageName()); + intent.putExtra("app_uid", activity.getApplicationInfo().uid); } else { - result.error(call.method, "context is not instance of Activity", null); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Uri.parse("package:" + activity.getPackageName())); } + + activity.startActivity(intent); + + result.success(PERMISSION_DENIED); } else { result.success(PERMISSION_GRANTED); } From bb611cfd73957c48f05bb3bc037b8fbb4a013c21 Mon Sep 17 00:00:00 2001 From: Nicolai Henriksen Date: Wed, 30 Sep 2020 10:01:49 +0200 Subject: [PATCH 2/2] Now using activeContext() as this works both in foreground and background. --- .../NotificationPermissionsPlugin.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java b/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java index 1d115f5..5c2be43 100644 --- a/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java +++ b/android/src/main/java/com/vanethos/notification_permissions/NotificationPermissionsPlugin.java @@ -24,11 +24,9 @@ public static void registerWith(Registrar registrar) { private static final String PERMISSION_DENIED = "denied"; private final Context context; - private final Activity activity; private NotificationPermissionsPlugin(Registrar registrar) { - this.context = registrar.context(); - this.activity = registrar.activity(); + this.context = registrar.activeContext(); } @Override @@ -37,8 +35,8 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { result.success(getNotificationPermissionStatus()); } else if ("requestNotificationPermissions".equalsIgnoreCase(call.method)) { if (PERMISSION_DENIED.equalsIgnoreCase(getNotificationPermissionStatus())) { - if (activity == null) { - result.error(call.method, "activity is null", null); + if (context == null) { + result.error(call.method, "context is null", null); return; } @@ -48,18 +46,18 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // ACTION_APP_NOTIFICATION_SETTINGS was introduced in API level 26 aka Android O intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); - intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.getPackageName()); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); - intent.putExtra("app_package", activity.getPackageName()); - intent.putExtra("app_uid", activity.getApplicationInfo().uid); + intent.putExtra("app_package", context.getPackageName()); + intent.putExtra("app_uid", context.getApplicationInfo().uid); } else { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setData(Uri.parse("package:" + activity.getPackageName())); + intent.setData(Uri.parse("package:" + context.getPackageName())); } - activity.startActivity(intent); + context.startActivity(intent); result.success(PERMISSION_DENIED); } else {