From e1949043bfe63d74b3a1706235b5f09c4f4c1cbe Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Wed, 15 Apr 2026 14:49:51 +0200 Subject: [PATCH 1/6] feat: Add 'PermissionManager' module --- PermissionManager/build.gradle.kts | 42 +++++++++++++++++ PermissionManager/lint-baseline.xml | 4 ++ PermissionManager/proguard-rules.pro | 21 +++++++++ .../permissionmanager/CustomPermission.kt | 25 ++++++++++ .../CustomPermissionManager.kt | 28 +++++++++++ .../permissionmanager/PermissionManager.kt | 39 +++++++++++++++ .../permissionmanager/SupportedApiManager.kt | 47 +++++++++++++++++++ .../UnsupportedApiManager.kt | 27 +++++++++++ gradle/core.versions.toml | 3 ++ settings.gradle.kts | 1 + 10 files changed, 237 insertions(+) create mode 100644 PermissionManager/build.gradle.kts create mode 100644 PermissionManager/lint-baseline.xml create mode 100644 PermissionManager/proguard-rules.pro create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt diff --git a/PermissionManager/build.gradle.kts b/PermissionManager/build.gradle.kts new file mode 100644 index 000000000..b85ce67e1 --- /dev/null +++ b/PermissionManager/build.gradle.kts @@ -0,0 +1,42 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(core.plugins.android.library) + alias(core.plugins.kotlin.android) + alias(core.plugins.compose.compiler) +} + +val coreCompileSdk: Int by rootProject.extra +val coreMinSdk: Int by rootProject.extra +val javaVersion: JavaVersion by rootProject.extra + +android { + namespace = "com.infomaniak.core.permissionmanager" + compileSdk = coreCompileSdk + + defaultConfig { + minSdk = coreMinSdk + } + + compileOptions { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion + } + + buildFeatures { + compose = true + } + + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.fromTarget(javaVersion.toString())) + } + } +} + +dependencies { + implementation(platform(core.compose.bom)) + implementation(core.compose.runtime) + implementation(core.compose.ui) + implementation(core.accompanist.permissions) +} diff --git a/PermissionManager/lint-baseline.xml b/PermissionManager/lint-baseline.xml new file mode 100644 index 000000000..19930a6df --- /dev/null +++ b/PermissionManager/lint-baseline.xml @@ -0,0 +1,4 @@ + + + + diff --git a/PermissionManager/proguard-rules.pro b/PermissionManager/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/PermissionManager/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt new file mode 100644 index 000000000..fd8221075 --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt @@ -0,0 +1,25 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager + +import android.Manifest +import android.os.Build + +enum class CustomPermission(val permissionString: String?) { + Notification(if (Build.VERSION.SDK_INT >= 33) Manifest.permission.POST_NOTIFICATIONS else null), +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt new file mode 100644 index 000000000..9c822c99d --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt @@ -0,0 +1,28 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager + +import androidx.compose.runtime.Stable + +@Stable +sealed interface CustomPermissionManager { + val shouldShow: Boolean + + fun askPermission() + fun dismissAndAskPermission() +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt new file mode 100644 index 000000000..bd4c95e23 --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt @@ -0,0 +1,39 @@ +/* + * Infomaniak SwissTransfer - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.rememberPermissionState + +@OptIn(ExperimentalPermissionsApi::class) +@Composable +fun rememberPermissionManager(customPermission: CustomPermission): CustomPermissionManager { + val permissionString = customPermission.permissionString + + return if (permissionString == null) { + remember { UnsupportedApiManager } + } else { + val permissionState = rememberPermissionState(permissionString) + val shouldShow = rememberSaveable { mutableStateOf(false) } + remember { SupportedApiManager(permissionState, shouldShow) } + } +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt new file mode 100644 index 000000000..10dc57838 --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt @@ -0,0 +1,47 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.PermissionState +import com.google.accompanist.permissions.shouldShowRationale + +@Stable +@OptIn(ExperimentalPermissionsApi::class) +internal class SupportedApiManager( + private val permissionState: PermissionState, + private val _shouldShow: MutableState, +) : CustomPermissionManager { + override val shouldShow: Boolean by _shouldShow + + override fun askPermission() { + if (permissionState.status.shouldShowRationale) { + _shouldShow.value = true + } else { + permissionState.launchPermissionRequest() + } + } + + override fun dismissAndAskPermission() { + _shouldShow.value = false + permissionState.launchPermissionRequest() + } +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt new file mode 100644 index 000000000..0656e189c --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt @@ -0,0 +1,27 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager + +import androidx.compose.runtime.Stable + +@Stable +internal object UnsupportedApiManager : CustomPermissionManager { + override val shouldShow: Boolean get() = false + override fun askPermission() = Unit + override fun dismissAndAskPermission() = Unit +} diff --git a/gradle/core.versions.toml b/gradle/core.versions.toml index 512a06d89..336acf13d 100644 --- a/gradle/core.versions.toml +++ b/gradle/core.versions.toml @@ -1,4 +1,5 @@ [versions] +accompanistPermissions = "0.37.3" activityCompose = "1.10.1" # TODO: Update to 1.11.0 or later after we bump compileSdk to 36 adaptive = "1.2.0" agp = "8.13.0" # Delete this to-do on agp 9+ after searching and checking the project for the following: TODO[AGP9 @@ -59,6 +60,7 @@ swipeRefreshLayout = "1.2.0" workManager = "2.11.0" [libraries] +accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanistPermissions" } activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" } android-login = { module = "com.github.infomaniak:android-login", version.ref = "androidLogin" } androidx-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", version.ref = "adaptive" } @@ -160,6 +162,7 @@ infomaniak-core-ui-compose-theme = { module = "com.infomaniak.core:Ui.Compose.Th infomaniak-core-ui-view = { module = "com.infomaniak.core:Ui.View" } infomaniak-core-ui-view-edgetoedge = { module = "com.infomaniak.core:Ui.View.EdgeToEdge" } infomaniak-core-webview = { module = "com.infomaniak.core:WebView" } +infomaniak-core-permissionmanager = { module = "com.infomaniak.core:PermissionManager" } integrity = { module = "com.google.android.play:integrity", version.ref = "integrity" } kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 9cf95d0cf..7be4eb6ab 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -56,6 +56,7 @@ include( ":Notifications", ":Notifications:Registration", ":Onboarding", + ":PermissionManager", ":PrivacyManagement", ":RecyclerView", ":Sentry", From f8e9e94e16b0a3a5d133e6c227ff40f3bb0c73a4 Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Thu, 16 Apr 2026 08:11:43 +0200 Subject: [PATCH 2/6] refactor: Apply suggestion from code review --- PermissionManager/lint-baseline.xml | 4 --- PermissionManager/proguard-rules.pro | 21 -------------- .../CustomPermissionManager.kt | 28 ------------------- ...onManager.kt => PermissionManagerState.kt} | 21 ++++++++++---- ...{CustomPermission.kt => PermissionType.kt} | 2 +- ... => SupportedApiPermissionManagerState.kt} | 12 ++++---- ...> UnsupportedApiPermissionManagerState.kt} | 4 +-- gradle/core.versions.toml | 2 +- 8 files changed, 25 insertions(+), 69 deletions(-) delete mode 100644 PermissionManager/lint-baseline.xml delete mode 100644 PermissionManager/proguard-rules.pro delete mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt rename PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/{PermissionManager.kt => PermissionManagerState.kt} (67%) rename PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/{CustomPermission.kt => PermissionType.kt} (93%) rename PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/{SupportedApiManager.kt => SupportedApiPermissionManagerState.kt} (82%) rename PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/{UnsupportedApiManager.kt => UnsupportedApiPermissionManagerState.kt} (86%) diff --git a/PermissionManager/lint-baseline.xml b/PermissionManager/lint-baseline.xml deleted file mode 100644 index 19930a6df..000000000 --- a/PermissionManager/lint-baseline.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/PermissionManager/proguard-rules.pro b/PermissionManager/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/PermissionManager/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt deleted file mode 100644 index 9c822c99d..000000000 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermissionManager.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Infomaniak Core - Android - * Copyright (C) 2026 Infomaniak Network SA - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.infomaniak.core.permissionmanager - -import androidx.compose.runtime.Stable - -@Stable -sealed interface CustomPermissionManager { - val shouldShow: Boolean - - fun askPermission() - fun dismissAndAskPermission() -} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt similarity index 67% rename from PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt rename to PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt index bd4c95e23..8ddcdf8ec 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManager.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt @@ -1,5 +1,5 @@ /* - * Infomaniak SwissTransfer - Android + * Infomaniak Core - Android * Copyright (C) 2026 Infomaniak Network SA * * This program is free software: you can redistribute it and/or modify @@ -18,6 +18,7 @@ package com.infomaniak.core.permissionmanager import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable @@ -26,14 +27,22 @@ import com.google.accompanist.permissions.rememberPermissionState @OptIn(ExperimentalPermissionsApi::class) @Composable -fun rememberPermissionManager(customPermission: CustomPermission): CustomPermissionManager { - val permissionString = customPermission.permissionString +fun rememberPermissionManagerState(permissionType: PermissionType): PermissionManagerState { + val permissionString = permissionType.permission return if (permissionString == null) { - remember { UnsupportedApiManager } + remember { UnsupportedApiPermissionManagerState } } else { val permissionState = rememberPermissionState(permissionString) - val shouldShow = rememberSaveable { mutableStateOf(false) } - remember { SupportedApiManager(permissionState, shouldShow) } + val shouldDisplayRationale = rememberSaveable { mutableStateOf(false) } + remember { SupportedApiPermissionManagerState(permissionState, shouldDisplayRationale) } } } + +@Stable +sealed interface PermissionManagerState { + val shouldDisplayRationale: Boolean + + fun askPermission() + fun dismissAndAskPermission() +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt similarity index 93% rename from PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt rename to PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt index fd8221075..f8e98d783 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/CustomPermission.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt @@ -20,6 +20,6 @@ package com.infomaniak.core.permissionmanager import android.Manifest import android.os.Build -enum class CustomPermission(val permissionString: String?) { +enum class PermissionType(val permission: String?) { Notification(if (Build.VERSION.SDK_INT >= 33) Manifest.permission.POST_NOTIFICATIONS else null), } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt similarity index 82% rename from PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt rename to PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt index 10dc57838..4a5d00355 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiManager.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt @@ -26,22 +26,22 @@ import com.google.accompanist.permissions.shouldShowRationale @Stable @OptIn(ExperimentalPermissionsApi::class) -internal class SupportedApiManager( +internal class SupportedApiPermissionManagerState( private val permissionState: PermissionState, - private val _shouldShow: MutableState, -) : CustomPermissionManager { - override val shouldShow: Boolean by _shouldShow + private val _shouldDisplayRationale: MutableState, +) : PermissionManagerState { + override val shouldDisplayRationale: Boolean by _shouldDisplayRationale override fun askPermission() { if (permissionState.status.shouldShowRationale) { - _shouldShow.value = true + _shouldDisplayRationale.value = true } else { permissionState.launchPermissionRequest() } } override fun dismissAndAskPermission() { - _shouldShow.value = false + _shouldDisplayRationale.value = false permissionState.launchPermissionRequest() } } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt similarity index 86% rename from PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt rename to PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt index 0656e189c..312e73fbd 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiManager.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt @@ -20,8 +20,8 @@ package com.infomaniak.core.permissionmanager import androidx.compose.runtime.Stable @Stable -internal object UnsupportedApiManager : CustomPermissionManager { - override val shouldShow: Boolean get() = false +internal object UnsupportedApiPermissionManagerState : PermissionManagerState { + override val shouldDisplayRationale: Boolean get() = false override fun askPermission() = Unit override fun dismissAndAskPermission() = Unit } diff --git a/gradle/core.versions.toml b/gradle/core.versions.toml index 336acf13d..390675476 100644 --- a/gradle/core.versions.toml +++ b/gradle/core.versions.toml @@ -143,6 +143,7 @@ infomaniak-core-network-ktor = { module = "com.infomaniak.core:Network.Ktor" } infomaniak-core-notifications = { module = "com.infomaniak.core:Notifications" } infomaniak-core-notifications-registration = { module = "com.infomaniak.core:Notifications.Registration" } infomaniak-core-onboarding = { module = "com.infomaniak.core:Onboarding" } +infomaniak-core-permissionmanager = { module = "com.infomaniak.core:PermissionManager" } infomaniak-core-privacymanagement = { module = "com.infomaniak.core:PrivacyManagement" } infomaniak-core-recyclerview = { module = "com.infomaniak.core:RecyclerView" } infomaniak-core-sentry = { module = "com.infomaniak.core:Sentry" } @@ -162,7 +163,6 @@ infomaniak-core-ui-compose-theme = { module = "com.infomaniak.core:Ui.Compose.Th infomaniak-core-ui-view = { module = "com.infomaniak.core:Ui.View" } infomaniak-core-ui-view-edgetoedge = { module = "com.infomaniak.core:Ui.View.EdgeToEdge" } infomaniak-core-webview = { module = "com.infomaniak.core:WebView" } -infomaniak-core-permissionmanager = { module = "com.infomaniak.core:PermissionManager" } integrity = { module = "com.google.android.play:integrity", version.ref = "integrity" } kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } From 0d12ef05d498542d2ab65f47a46935aaa6d1f8ea Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Thu, 16 Apr 2026 10:52:38 +0200 Subject: [PATCH 3/6] feat: Add 'WRITE_EXTERNAL_STORAGE' permission in 'PermissionManager' --- .../PermissionManagerState.kt | 11 ++++-- .../core/permissionmanager/PermissionType.kt | 5 ++- .../SupportedApiPermissionManagerState.kt | 39 +++++++++++++++++-- .../UnsupportedApiPermissionManagerState.kt | 7 +++- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt index 8ddcdf8ec..580e1eb20 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt @@ -28,12 +28,12 @@ import com.google.accompanist.permissions.rememberPermissionState @OptIn(ExperimentalPermissionsApi::class) @Composable fun rememberPermissionManagerState(permissionType: PermissionType): PermissionManagerState { - val permissionString = permissionType.permission + val permission = permissionType.permission - return if (permissionString == null) { + return if (permission == null) { remember { UnsupportedApiPermissionManagerState } } else { - val permissionState = rememberPermissionState(permissionString) + val permissionState = rememberPermissionState(permission) val shouldDisplayRationale = rememberSaveable { mutableStateOf(false) } remember { SupportedApiPermissionManagerState(permissionState, shouldDisplayRationale) } } @@ -41,8 +41,11 @@ fun rememberPermissionManagerState(permissionType: PermissionType): PermissionMa @Stable sealed interface PermissionManagerState { - val shouldDisplayRationale: Boolean + val shouldShowRationale: Boolean fun askPermission() fun dismissAndAskPermission() + + @Composable + fun waitUntilGranted(action: () -> Unit): () -> Unit } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt index f8e98d783..71fd665ed 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionType.kt @@ -18,8 +18,9 @@ package com.infomaniak.core.permissionmanager import android.Manifest -import android.os.Build +import android.os.Build.VERSION.SDK_INT enum class PermissionType(val permission: String?) { - Notification(if (Build.VERSION.SDK_INT >= 33) Manifest.permission.POST_NOTIFICATIONS else null), + Notification(permission = if (SDK_INT >= 33) Manifest.permission.POST_NOTIFICATIONS else null), + WriteExternalStorage(permission = if (SDK_INT >= 29) null else Manifest.permission.WRITE_EXTERNAL_STORAGE), } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt index 4a5d00355..774294f57 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt @@ -17,31 +17,62 @@ */ package com.infomaniak.core.permissionmanager +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshotFlow import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState +import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.shouldShowRationale +import kotlinx.coroutines.CompletableJob +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.first @Stable @OptIn(ExperimentalPermissionsApi::class) internal class SupportedApiPermissionManagerState( private val permissionState: PermissionState, - private val _shouldDisplayRationale: MutableState, + private val _shouldShowRationale: MutableState, ) : PermissionManagerState { - override val shouldDisplayRationale: Boolean by _shouldDisplayRationale + override val shouldShowRationale: Boolean by _shouldShowRationale override fun askPermission() { + if (permissionState.status.isGranted) return + if (permissionState.status.shouldShowRationale) { - _shouldDisplayRationale.value = true + _shouldShowRationale.value = true } else { permissionState.launchPermissionRequest() } } override fun dismissAndAskPermission() { - _shouldDisplayRationale.value = false + _shouldShowRationale.value = false permissionState.launchPermissionRequest() } + + @Composable + override fun waitUntilGranted(action: () -> Unit): () -> Unit = with(permissionState) { + val isGrantedFlow = remember(permission) { snapshotFlow { status.isGranted } } + val actionFired: CompletableJob = remember(permission) { Job() } + + LaunchedEffect(permission) { + actionFired.join() + isGrantedFlow.first { it } + action() + } + + return fun() { + if (status.isGranted) { + action() + } else { + launchPermissionRequest() + actionFired.complete() + } + } + } } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt index 312e73fbd..2009c164d 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt @@ -17,11 +17,16 @@ */ package com.infomaniak.core.permissionmanager +import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable @Stable internal object UnsupportedApiPermissionManagerState : PermissionManagerState { - override val shouldDisplayRationale: Boolean get() = false + override val shouldShowRationale: Boolean get() = false + override fun askPermission() = Unit override fun dismissAndAskPermission() = Unit + + @Composable + override fun waitUntilGranted(action: () -> Unit): () -> Unit = action } From 9dccbb23f0d38b19e908d82f7ad8596ce27b362b Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Wed, 22 Apr 2026 14:20:06 +0200 Subject: [PATCH 4/6] feat: Add permission key to recreate new instance on permission change --- .../PermissionManagerState.kt | 12 ++--- .../SupportedApiPermissionManagerState.kt | 23 +-------- .../UnsupportedApiPermissionManagerState.kt | 7 +-- .../RationalePermissionManagerState.kt | 49 ++++++++++++++++++ ...ortedApiRationalePermissionManagerState.kt | 50 +++++++++++++++++++ ...ortedApiRationalePermissionManagerState.kt | 28 +++++++++++ 6 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/RationalePermissionManagerState.kt create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/SupportedApiRationalePermissionManagerState.kt create mode 100644 PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/UnsupportedApiRationalePermissionManagerState.kt diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt index 580e1eb20..8f230c11a 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt @@ -19,9 +19,7 @@ package com.infomaniak.core.permissionmanager import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState @@ -34,18 +32,14 @@ fun rememberPermissionManagerState(permissionType: PermissionType): PermissionMa remember { UnsupportedApiPermissionManagerState } } else { val permissionState = rememberPermissionState(permission) - val shouldDisplayRationale = rememberSaveable { mutableStateOf(false) } - remember { SupportedApiPermissionManagerState(permissionState, shouldDisplayRationale) } + remember(permission) { SupportedApiPermissionManagerState(permissionState) } } } @Stable sealed interface PermissionManagerState { - val shouldShowRationale: Boolean - - fun askPermission() - fun dismissAndAskPermission() + fun askPermissionIfNeeded() @Composable - fun waitUntilGranted(action: () -> Unit): () -> Unit + fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt index 774294f57..b326dd7c9 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt @@ -19,15 +19,12 @@ package com.infomaniak.core.permissionmanager import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState import androidx.compose.runtime.Stable -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.isGranted -import com.google.accompanist.permissions.shouldShowRationale import kotlinx.coroutines.CompletableJob import kotlinx.coroutines.Job import kotlinx.coroutines.flow.first @@ -36,27 +33,11 @@ import kotlinx.coroutines.flow.first @OptIn(ExperimentalPermissionsApi::class) internal class SupportedApiPermissionManagerState( private val permissionState: PermissionState, - private val _shouldShowRationale: MutableState, ) : PermissionManagerState { - override val shouldShowRationale: Boolean by _shouldShowRationale - - override fun askPermission() { - if (permissionState.status.isGranted) return - - if (permissionState.status.shouldShowRationale) { - _shouldShowRationale.value = true - } else { - permissionState.launchPermissionRequest() - } - } - - override fun dismissAndAskPermission() { - _shouldShowRationale.value = false - permissionState.launchPermissionRequest() - } + override fun askPermissionIfNeeded() = permissionState.launchPermissionRequest() @Composable - override fun waitUntilGranted(action: () -> Unit): () -> Unit = with(permissionState) { + override fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit = with(permissionState) { val isGrantedFlow = remember(permission) { snapshotFlow { status.isGranted } } val actionFired: CompletableJob = remember(permission) { Job() } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt index 2009c164d..0ac48b7d6 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt @@ -22,11 +22,8 @@ import androidx.compose.runtime.Stable @Stable internal object UnsupportedApiPermissionManagerState : PermissionManagerState { - override val shouldShowRationale: Boolean get() = false - - override fun askPermission() = Unit - override fun dismissAndAskPermission() = Unit + override fun askPermissionIfNeeded() = Unit @Composable - override fun waitUntilGranted(action: () -> Unit): () -> Unit = action + override fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit = action } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/RationalePermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/RationalePermissionManagerState.kt new file mode 100644 index 000000000..6b96f0958 --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/RationalePermissionManagerState.kt @@ -0,0 +1,49 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager.rationale + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.rememberPermissionState +import com.infomaniak.core.permissionmanager.PermissionType + +@OptIn(ExperimentalPermissionsApi::class) +@Composable +fun rememberRationalePermissionManagerState(permissionType: PermissionType): RationalePermissionManagerState { + val permission = permissionType.permission + + return if (permission == null) { + remember { UnsupportedApiRationalePermissionManagerState } + } else { + val permissionState = rememberPermissionState(permission) + val shouldShowRationale = rememberSaveable(permission) { mutableStateOf(false) } + remember(permission) { SupportedApiRationalePermissionManagerState(permissionState, shouldShowRationale) } + } +} + +@Stable +sealed interface RationalePermissionManagerState { + val shouldShowRationale: Boolean + + fun requestPermissionOrShowRationaleIfNeeded() + fun dismissAndAskPermission() +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/SupportedApiRationalePermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/SupportedApiRationalePermissionManagerState.kt new file mode 100644 index 000000000..2c4f32a51 --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/SupportedApiRationalePermissionManagerState.kt @@ -0,0 +1,50 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager.rationale + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.PermissionState +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.shouldShowRationale + +@Stable +@OptIn(ExperimentalPermissionsApi::class) +internal class SupportedApiRationalePermissionManagerState( + private val permissionState: PermissionState, + private val _shouldShowRationale: MutableState, +) : RationalePermissionManagerState { + override val shouldShowRationale: Boolean by _shouldShowRationale + + override fun requestPermissionOrShowRationaleIfNeeded() { + if (permissionState.status.isGranted) return + + if (permissionState.status.shouldShowRationale) { + _shouldShowRationale.value = true + } else { + permissionState.launchPermissionRequest() + } + } + + override fun dismissAndAskPermission() { + _shouldShowRationale.value = false + permissionState.launchPermissionRequest() + } +} diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/UnsupportedApiRationalePermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/UnsupportedApiRationalePermissionManagerState.kt new file mode 100644 index 000000000..ffb038a3b --- /dev/null +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/rationale/UnsupportedApiRationalePermissionManagerState.kt @@ -0,0 +1,28 @@ +/* + * Infomaniak Core - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.core.permissionmanager.rationale + +import androidx.compose.runtime.Stable + +@Stable +internal object UnsupportedApiRationalePermissionManagerState : RationalePermissionManagerState { + override val shouldShowRationale: Boolean get() = false + + override fun requestPermissionOrShowRationaleIfNeeded() = Unit + override fun dismissAndAskPermission() = Unit +} From 0aa1f2c2732aacf3a0cc8feaf1c13f400376fbdc Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Thu, 23 Apr 2026 14:42:30 +0200 Subject: [PATCH 5/6] refactor: If permission already granted do nothing --- .../permissionmanager/SupportedApiPermissionManagerState.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt index b326dd7c9..3a1267852 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt @@ -34,7 +34,10 @@ import kotlinx.coroutines.flow.first internal class SupportedApiPermissionManagerState( private val permissionState: PermissionState, ) : PermissionManagerState { - override fun askPermissionIfNeeded() = permissionState.launchPermissionRequest() + override fun askPermissionIfNeeded() { + if (permissionState.status.isGranted) return + permissionState.launchPermissionRequest() + } @Composable override fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit = with(permissionState) { From 3078686b4731aceb7dbdce109b52b0d1793bdb36 Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Thu, 23 Apr 2026 14:49:28 +0200 Subject: [PATCH 6/6] refactor: Find better name --- .../core/permissionmanager/PermissionManagerState.kt | 4 ++-- .../permissionmanager/SupportedApiPermissionManagerState.kt | 4 ++-- .../permissionmanager/UnsupportedApiPermissionManagerState.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt index 8f230c11a..e8e47e0bc 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/PermissionManagerState.kt @@ -38,8 +38,8 @@ fun rememberPermissionManagerState(permissionType: PermissionType): PermissionMa @Stable sealed interface PermissionManagerState { - fun askPermissionIfNeeded() + fun launchPermissionRequestIfNeeded() @Composable - fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit + fun dropIfDenied(action: () -> Unit): () -> Unit } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt index 3a1267852..36fb6c8b2 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/SupportedApiPermissionManagerState.kt @@ -34,13 +34,13 @@ import kotlinx.coroutines.flow.first internal class SupportedApiPermissionManagerState( private val permissionState: PermissionState, ) : PermissionManagerState { - override fun askPermissionIfNeeded() { + override fun launchPermissionRequestIfNeeded() { if (permissionState.status.isGranted) return permissionState.launchPermissionRequest() } @Composable - override fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit = with(permissionState) { + override fun dropIfDenied(action: () -> Unit): () -> Unit = with(permissionState) { val isGrantedFlow = remember(permission) { snapshotFlow { status.isGranted } } val actionFired: CompletableJob = remember(permission) { Job() } diff --git a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt index 0ac48b7d6..d92d762ea 100644 --- a/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt +++ b/PermissionManager/src/main/kotlin/com/infomaniak/core/permissionmanager/UnsupportedApiPermissionManagerState.kt @@ -22,8 +22,8 @@ import androidx.compose.runtime.Stable @Stable internal object UnsupportedApiPermissionManagerState : PermissionManagerState { - override fun askPermissionIfNeeded() = Unit + override fun launchPermissionRequestIfNeeded() = Unit @Composable - override fun waitUntilPermissionGranted(action: () -> Unit): () -> Unit = action + override fun dropIfDenied(action: () -> Unit): () -> Unit = action }