From f91ca07a5ee003e65cd2c6c941adfbd5f01c1658 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 21 Sep 2023 12:16:30 +0200 Subject: [PATCH] Resume action once persmission has been granted. --- .../impl/configureroom/ConfigureRoomPresenter.kt | 10 ++++++++++ .../impl/user/editprofile/EditUserProfilePresenter.kt | 10 ++++++++++ .../roomdetails/impl/edit/RoomDetailsEditPresenter.kt | 9 +++++++++ 3 files changed, 29 insertions(+) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index 4a89e09dcd..8321cd82c7 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -18,6 +18,7 @@ package io.element.android.features.createroom.impl.configureroom import android.net.Uri import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf @@ -58,6 +59,7 @@ class ConfigureRoomPresenter @Inject constructor( ) : Presenter { private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) + private var pendingPermissionRequest = false @Composable override fun present(): ConfigureRoomState { @@ -81,6 +83,13 @@ class ConfigureRoomPresenter @Inject constructor( } } + LaunchedEffect(cameraPermissionState.permissionGranted) { + if (cameraPermissionState.permissionGranted && pendingPermissionRequest) { + pendingPermissionRequest = false + cameraPhotoPicker.launch() + } + } + val localCoroutineScope = rememberCoroutineScope() val createRoomAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } @@ -102,6 +111,7 @@ class ConfigureRoomPresenter @Inject constructor( AvatarAction.TakePhoto -> if (cameraPermissionState.permissionGranted) { cameraPhotoPicker.launch() } else { + pendingPermissionRequest = true cameraPermissionState.eventSink(PermissionsEvents.AskPermissionToUser) } AvatarAction.Remove -> dataStore.setAvatarUri(uri = null) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt index 642f60a634..844fba5122 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt @@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.user.editprofile import android.net.Uri import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -55,6 +56,7 @@ class EditUserProfilePresenter @AssistedInject constructor( ) : Presenter { private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) + private var pendingPermissionRequest = false @AssistedFactory interface Factory { @@ -83,6 +85,13 @@ class EditUserProfilePresenter @AssistedInject constructor( } } + LaunchedEffect(cameraPermissionState.permissionGranted) { + if (cameraPermissionState.permissionGranted && pendingPermissionRequest) { + pendingPermissionRequest = false + cameraPhotoPicker.launch() + } + } + val saveAction: MutableState> = remember { mutableStateOf(Async.Uninitialized) } val localCoroutineScope = rememberCoroutineScope() fun handleEvents(event: EditUserProfileEvents) { @@ -94,6 +103,7 @@ class EditUserProfilePresenter @AssistedInject constructor( AvatarAction.TakePhoto -> if (cameraPermissionState.permissionGranted) { cameraPhotoPicker.launch() } else { + pendingPermissionRequest = true cameraPermissionState.eventSink.invoke(PermissionsEvents.AskPermissionToUser) } AvatarAction.Remove -> userAvatarUri = null diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt index da88f78b00..82704bdf78 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt @@ -55,6 +55,7 @@ class RoomDetailsEditPresenter @Inject constructor( ) : Presenter { private val cameraPermissionPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) + private var pendingPermissionRequest = false @Composable override fun present(): RoomDetailsEditState { @@ -98,6 +99,13 @@ class RoomDetailsEditPresenter @Inject constructor( onResult = { uri -> if (uri != null) roomAvatarUri = uri } ) + LaunchedEffect(cameraPermissionState.permissionGranted) { + if (cameraPermissionState.permissionGranted && pendingPermissionRequest) { + pendingPermissionRequest = false + cameraPhotoPicker.launch() + } + } + val avatarActions by remember(roomAvatarUri) { derivedStateOf { listOfNotNull( @@ -119,6 +127,7 @@ class RoomDetailsEditPresenter @Inject constructor( AvatarAction.TakePhoto -> if (cameraPermissionState.permissionGranted) { cameraPhotoPicker.launch() } else { + pendingPermissionRequest = true cameraPermissionState.eventSink(PermissionsEvents.AskPermissionToUser) } AvatarAction.Remove -> roomAvatarUri = null