Skip to content

Commit aa64fbc

Browse files
authored
Merge pull request #111 from Joe3112/feature/android-notification-settings
Android notification permission opens notification settings
2 parents c047d29 + 0edfc3f commit aa64fbc

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

calf-permissions/src/androidMain/kotlin/com/mohamedrejeb/calf/permissions/MutablePermissionState.android.kt

+25-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.provider.Settings
99
import androidx.activity.compose.rememberLauncherForActivityResult
1010
import androidx.activity.result.ActivityResultLauncher
1111
import androidx.activity.result.contract.ActivityResultContracts
12+
import androidx.annotation.RequiresApi
1213
import androidx.compose.runtime.Composable
1314
import androidx.compose.runtime.DisposableEffect
1415
import androidx.compose.runtime.Stable
@@ -106,10 +107,14 @@ internal actual class MutablePermissionState(
106107
actual override fun openAppSettings() {
107108
if (context == null) return
108109

109-
val intent = Intent().apply {
110-
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
111-
data = Uri.fromParts("package", context.packageName, null)
112-
flags = Intent.FLAG_ACTIVITY_NEW_TASK
110+
val intent = when (permission) {
111+
Permission.Notification -> if (supportsNotificationSettings()) {
112+
createAppNotificationsIntent(context)
113+
} else {
114+
createAppSettingsIntent(context)
115+
}
116+
117+
else -> createAppSettingsIntent(context)
113118
}
114119
context.startActivity(intent)
115120
}
@@ -132,4 +137,20 @@ internal actual class MutablePermissionState(
132137
PermissionStatus.Denied(activity.shouldShowRationale(androidPermission))
133138
}
134139
}
140+
141+
@RequiresApi(Build.VERSION_CODES.O)
142+
private fun createAppNotificationsIntent(context: Context) =
143+
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
144+
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
145+
}
146+
147+
private fun supportsNotificationSettings() =
148+
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
149+
150+
private fun createAppSettingsIntent(context: Context) =
151+
Intent().apply {
152+
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
153+
data = Uri.fromParts("package", context.packageName, null)
154+
flags = Intent.FLAG_ACTIVITY_NEW_TASK
155+
}
135156
}

sample/common/src/commonMain/kotlin/com.mohamedrejeb.calf.sample/screens/PermissionsScreen.kt

+17
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,24 @@ private fun PermissionItem(permission: Permission) {
110110
)
111111
}
112112

113+
114+
113115
Spacer(modifier = Modifier.height(16.dp))
114116

117+
if (permission == Permission.Notification) {
118+
Button(
119+
onClick = {
120+
permissionState.openAppSettings()
121+
},
122+
) {
123+
Text(
124+
text = "Open Notification Settings",
125+
)
126+
}
127+
128+
Spacer(modifier = Modifier.height(16.dp))
129+
}
130+
131+
115132
HorizontalDivider()
116133
}

0 commit comments

Comments
 (0)