diff --git a/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsEvent.kt b/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsEvent.kt index fd01e12134..8604959068 100644 --- a/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsEvent.kt +++ b/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsEvent.kt @@ -9,7 +9,23 @@ package io.element.android.libraries.permissions.api sealed interface PermissionsEvent { + /** + * Request the runtime permission. If the app has already recorded a soft denial for this + * permission, this event is intercepted to raise [PermissionsState.showDialog] instead of + * hitting the OS — the intent is for the caller to render `PermissionsView` to prompt the + * user to open system settings. + * + * If the caller renders its own "already denied" UI and wants the OS prompt regardless, + * use [ForceRequestPermissions]. + */ data object RequestPermissions : PermissionsEvent + + /** + * Same as [RequestPermissions] but bypasses the soft-denial intercept — always launches + * the OS permission dialog. The OS may still auto-deny for permanently-denied permissions. + */ + data object ForceRequestPermissions : PermissionsEvent + data object CloseDialog : PermissionsEvent data object OpenSystemSettingAndCloseDialog : PermissionsEvent } diff --git a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt index 42331e001a..e3979e5ed2 100644 --- a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt +++ b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt @@ -112,6 +112,9 @@ class DefaultPermissionsPresenter( permissionState.launchPermissionRequest() } } + PermissionsEvent.ForceRequestPermissions -> { + permissionState.launchPermissionRequest() + } PermissionsEvent.OpenSystemSettingAndCloseDialog -> { permissionActions.openSettings(permission) showDialog.value = false diff --git a/libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionsPresenter.kt b/libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionsPresenter.kt index efd584585f..4c04a919da 100644 --- a/libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionsPresenter.kt +++ b/libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionsPresenter.kt @@ -21,6 +21,7 @@ class FakePermissionsPresenter( private fun handleEvent(event: PermissionsEvent) { when (event) { PermissionsEvent.RequestPermissions -> state.value = state.value.copy(showDialog = true, permissionAlreadyAsked = true) + PermissionsEvent.ForceRequestPermissions -> state.value = state.value.copy(permissionAlreadyAsked = true) PermissionsEvent.CloseDialog -> state.value = state.value.copy(showDialog = false) PermissionsEvent.OpenSystemSettingAndCloseDialog -> state.value = state.value.copy(showDialog = false) }