Request notification permission for geofence alerts

This commit is contained in:
Artem Kokos
2026-05-15 10:43:21 +07:00
parent 8b9a25e746
commit 50748c6945
6 changed files with 124 additions and 14 deletions

View File

@@ -5,6 +5,7 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.provider.Settings
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import io.flutter.embedding.engine.FlutterEngine
@@ -12,6 +13,8 @@ import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel
class MainActivity : FlutterActivity() {
private var pendingNotificationPermissionResult: MethodChannel.Result? = null
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
@@ -67,9 +70,10 @@ class MainActivity : FlutterActivity() {
}
}
"getNotificationPermissionStatus" -> {
result.success(
if (isNotificationPermissionEnabled()) "enabled" else "disabled",
)
result.success(getNotificationPermissionStatusValue())
}
"requestNotificationPermission" -> {
requestNotificationPermission(result)
}
"openNotificationSettings" -> {
val intent =
@@ -85,6 +89,70 @@ class MainActivity : FlutterActivity() {
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray,
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode != notificationPermissionRequestCode) {
return
}
pendingNotificationPermissionResult?.success(getNotificationPermissionStatusValue())
pendingNotificationPermissionResult = null
}
private fun requestNotificationPermission(result: MethodChannel.Result) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
result.success(getNotificationPermissionStatusValue())
return
}
if (pendingNotificationPermissionResult != null) {
result.error(
"request_in_progress",
"Notification permission request is already in progress",
null,
)
return
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
PackageManager.PERMISSION_GRANTED
) {
result.success(getNotificationPermissionStatusValue())
return
}
pendingNotificationPermissionResult = result
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
notificationPermissionRequestCode,
)
}
private fun getNotificationPermissionStatusValue(): String {
if (isNotificationPermissionEnabled()) {
return "enabled"
}
val runtimePermissionGranted =
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
ContextCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS,
) == PackageManager.PERMISSION_GRANTED
return if (!runtimePermissionGranted) {
"requestable"
} else {
"settings_required"
}
}
private fun isNotificationPermissionEnabled(): Boolean {
val runtimePermissionGranted =
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
@@ -95,4 +163,8 @@ class MainActivity : FlutterActivity() {
return runtimePermissionGranted &&
NotificationManagerCompat.from(this).areNotificationsEnabled()
}
companion object {
private const val notificationPermissionRequestCode = 4102
}
}