Open app settings from the permission dialog.

This commit is contained in:
Benoit Marty 2023-09-21 11:37:59 +02:00
parent 676b2cc66b
commit 378d3ff9ab
7 changed files with 38 additions and 8 deletions

View file

@ -18,6 +18,7 @@ package io.element.android.features.createroom.impl.configureroom
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.lifecycle.subscribe
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
@ -28,6 +29,7 @@ import dagger.assisted.AssistedInject
import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.MobileScreen
import io.element.android.anvilannotations.ContributesNode import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.createroom.impl.di.CreateRoomScope import io.element.android.features.createroom.impl.di.CreateRoomScope
import io.element.android.libraries.androidutils.system.openAppSettingsPage
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.api.AnalyticsService
@ -58,11 +60,13 @@ class ConfigureRoomNode @AssistedInject constructor(
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
val state = presenter.present() val state = presenter.present()
val context = LocalContext.current
ConfigureRoomView( ConfigureRoomView(
state = state, state = state,
modifier = modifier, modifier = modifier,
onBackPressed = this::navigateUp, onBackPressed = this::navigateUp,
onRoomCreated = this::onRoomCreated, onRoomCreated = this::onRoomCreated,
onOpenSystemSettings = { context.openAppSettingsPage() }
) )
} }
} }

View file

@ -74,9 +74,10 @@ import kotlinx.coroutines.launch
@Composable @Composable
fun ConfigureRoomView( fun ConfigureRoomView(
state: ConfigureRoomState, state: ConfigureRoomState,
onBackPressed: () -> Unit,
onRoomCreated: (RoomId) -> Unit,
onOpenSystemSettings: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onRoomCreated: (RoomId) -> Unit = {},
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
@ -174,7 +175,10 @@ fun ConfigureRoomView(
else -> Unit else -> Unit
} }
PermissionsView(state = state.cameraPermissionState) PermissionsView(
state = state.cameraPermissionState,
onOpenSystemSettings = onOpenSystemSettings,
)
} }
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@ -281,5 +285,8 @@ private fun Modifier.clearFocusOnTap(focusManager: FocusManager): Modifier =
internal fun ConfigureRoomViewPreview(@PreviewParameter(ConfigureRoomStateProvider::class) state: ConfigureRoomState) = ElementPreview { internal fun ConfigureRoomViewPreview(@PreviewParameter(ConfigureRoomStateProvider::class) state: ConfigureRoomState) = ElementPreview {
ConfigureRoomView( ConfigureRoomView(
state = state, state = state,
onBackPressed = {},
onRoomCreated = {},
onOpenSystemSettings = {},
) )
} }

View file

@ -18,12 +18,14 @@ package io.element.android.features.preferences.impl.user.editprofile
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.Plugin
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.androidutils.system.openAppSettingsPage
import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.inputs import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.SessionScope import io.element.android.libraries.di.SessionScope
@ -46,10 +48,12 @@ class EditUserProfileNode @AssistedInject constructor(
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
val state = presenter.present() val state = presenter.present()
val context = LocalContext.current
EditUserProfileView( EditUserProfileView(
state = state, state = state,
onBackPressed = ::navigateUp, onBackPressed = ::navigateUp,
onProfileEdited = ::navigateUp, onProfileEdited = ::navigateUp,
onOpenSystemSettings = { context.openAppSettingsPage() },
modifier = modifier modifier = modifier
) )
} }

View file

@ -69,6 +69,7 @@ fun EditUserProfileView(
state: EditUserProfileState, state: EditUserProfileState,
onBackPressed: () -> Unit, onBackPressed: () -> Unit,
onProfileEdited: () -> Unit, onProfileEdited: () -> Unit,
onOpenSystemSettings: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
@ -169,7 +170,10 @@ fun EditUserProfileView(
else -> Unit else -> Unit
} }
} }
PermissionsView(state = state.cameraPermissionState) PermissionsView(
state = state.cameraPermissionState,
onOpenSystemSettings = onOpenSystemSettings,
)
} }
private fun Modifier.clearFocusOnTap(focusManager: FocusManager): Modifier = private fun Modifier.clearFocusOnTap(focusManager: FocusManager): Modifier =
@ -186,6 +190,7 @@ internal fun EditUserProfileViewPreview(@PreviewParameter(EditUserProfileStatePr
EditUserProfileView( EditUserProfileView(
onBackPressed = {}, onBackPressed = {},
onProfileEdited = {}, onProfileEdited = {},
onOpenSystemSettings = {},
state = state, state = state,
) )
} }

View file

@ -18,6 +18,7 @@ package io.element.android.features.roomdetails.impl.edit
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.lifecycle.subscribe
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
@ -26,6 +27,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.MobileScreen
import io.element.android.anvilannotations.ContributesNode import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.androidutils.system.openAppSettingsPage
import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.RoomScope
import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.api.AnalyticsService
@ -48,10 +50,12 @@ class RoomDetailsEditNode @AssistedInject constructor(
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
val state = presenter.present() val state = presenter.present()
val context = LocalContext.current
RoomDetailsEditView( RoomDetailsEditView(
state = state, state = state,
onBackPressed = ::navigateUp, onBackPressed = ::navigateUp,
onRoomEdited = ::navigateUp, onRoomEdited = ::navigateUp,
onOpenSystemSettings = { context.openAppSettingsPage() },
modifier = modifier, modifier = modifier,
) )
} }

View file

@ -73,6 +73,7 @@ fun RoomDetailsEditView(
state: RoomDetailsEditState, state: RoomDetailsEditState,
onBackPressed: () -> Unit, onBackPressed: () -> Unit,
onRoomEdited: () -> Unit, onRoomEdited: () -> Unit,
onOpenSystemSettings: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
@ -195,7 +196,10 @@ fun RoomDetailsEditView(
else -> Unit else -> Unit
} }
PermissionsView(state = state.cameraPermissionState) PermissionsView(
state = state.cameraPermissionState,
onOpenSystemSettings = onOpenSystemSettings,
)
} }
@Composable @Composable
@ -238,5 +242,6 @@ internal fun RoomDetailsEditViewPreview(@PreviewParameter(RoomDetailsEditStatePr
state = state, state = state,
onBackPressed = {}, onBackPressed = {},
onRoomEdited = {}, onRoomEdited = {},
onOpenSystemSettings = {},
) )
} }

View file

@ -26,8 +26,8 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
@Composable @Composable
fun PermissionsView( fun PermissionsView(
state: PermissionsState, state: PermissionsState,
onOpenSystemSettings: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
openSystemSettings: () -> Unit = {},
) { ) {
if (state.showDialog.not()) return if (state.showDialog.not()) return
@ -44,7 +44,7 @@ fun PermissionsView(
submitText = "Open settings", submitText = "Open settings",
onSubmitClicked = { onSubmitClicked = {
state.eventSink.invoke(PermissionsEvents.CloseDialog) state.eventSink.invoke(PermissionsEvents.CloseDialog)
openSystemSettings() onOpenSystemSettings()
}, },
onDismiss = { state.eventSink.invoke(PermissionsEvents.CloseDialog) }, onDismiss = { state.eventSink.invoke(PermissionsEvents.CloseDialog) },
) )
@ -85,5 +85,6 @@ fun PermissionsView(
internal fun PermissionsViewPreview(@PreviewParameter(PermissionsViewStateProvider::class) state: PermissionsState) = ElementPreview { internal fun PermissionsViewPreview(@PreviewParameter(PermissionsViewStateProvider::class) state: PermissionsState) = ElementPreview {
PermissionsView( PermissionsView(
state = state, state = state,
onOpenSystemSettings = {},
) )
} }