Room: add network monitor in LoadingRoomView
This commit is contained in:
parent
d71a025f9d
commit
e6f40bbfe8
3 changed files with 44 additions and 30 deletions
|
|
@ -18,6 +18,7 @@ package io.element.android.appnav.room
|
||||||
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.WindowInsets
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
|
|
@ -36,9 +37,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import io.element.android.appnav.loggedin.LoggedInState
|
import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorView
|
||||||
import io.element.android.appnav.loggedin.LoggedInStateProvider
|
|
||||||
import io.element.android.appnav.loggedin.LoggedInView
|
|
||||||
import io.element.android.libraries.designsystem.atomic.atoms.PlaceholderAtom
|
import io.element.android.libraries.designsystem.atomic.atoms.PlaceholderAtom
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||||
|
|
@ -52,10 +51,10 @@ import io.element.android.libraries.designsystem.theme.placeholderBackground
|
||||||
import io.element.android.libraries.theme.ElementTheme
|
import io.element.android.libraries.theme.ElementTheme
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LoadingRoomNodeView(
|
fun LoadingRoomNodeView(
|
||||||
state: LoadingRoomState,
|
state: LoadingRoomState,
|
||||||
|
hasNetworkConnection: Boolean,
|
||||||
onBackClicked: () -> Unit,
|
onBackClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
|
|
@ -63,28 +62,10 @@ fun LoadingRoomNodeView(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
contentWindowInsets = WindowInsets.systemBars,
|
contentWindowInsets = WindowInsets.systemBars,
|
||||||
topBar = {
|
topBar = {
|
||||||
TopAppBar(
|
Column {
|
||||||
modifier = Modifier,
|
ConnectivityIndicatorView(isOnline = hasNetworkConnection)
|
||||||
navigationIcon = {
|
LoadingRoomTopBar(onBackClicked)
|
||||||
BackButton(onClick = onBackClicked)
|
}
|
||||||
},
|
|
||||||
title = {
|
|
||||||
Row(
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
|
||||||
Box(
|
|
||||||
modifier = Modifier
|
|
||||||
.size(AvatarSize.TimelineRoom.dp)
|
|
||||||
.align(Alignment.CenterVertically)
|
|
||||||
.background(color = ElementTheme.colors.placeholderBackground, shape = CircleShape)
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.width(8.dp))
|
|
||||||
PlaceholderAtom(width = 20.dp, height = 7.dp)
|
|
||||||
Spacer(modifier = Modifier.width(7.dp))
|
|
||||||
PlaceholderAtom(width = 45.dp, height = 7.dp)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
content = { padding ->
|
content = { padding ->
|
||||||
Box(
|
Box(
|
||||||
|
|
@ -107,6 +88,33 @@ fun LoadingRoomNodeView(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
private fun LoadingRoomTopBar(onBackClicked: () -> Unit) {
|
||||||
|
TopAppBar(
|
||||||
|
modifier = Modifier,
|
||||||
|
navigationIcon = {
|
||||||
|
BackButton(onClick = onBackClicked)
|
||||||
|
},
|
||||||
|
title = {
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.size(AvatarSize.TimelineRoom.dp)
|
||||||
|
.align(Alignment.CenterVertically)
|
||||||
|
.background(color = ElementTheme.colors.placeholderBackground, shape = CircleShape)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(8.dp))
|
||||||
|
PlaceholderAtom(width = 20.dp, height = 7.dp)
|
||||||
|
Spacer(modifier = Modifier.width(7.dp))
|
||||||
|
PlaceholderAtom(width = 45.dp, height = 7.dp)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun LoadingRoomNodeViewLightPreview(@PreviewParameter(LoadingRoomStateProvider::class) state: LoadingRoomState) =
|
fun LoadingRoomNodeViewLightPreview(@PreviewParameter(LoadingRoomStateProvider::class) state: LoadingRoomState) =
|
||||||
|
|
@ -121,6 +129,7 @@ fun LoadingRoomNodeViewDarkPreview(@PreviewParameter(LoadingRoomStateProvider::c
|
||||||
private fun ContentToPreview(state: LoadingRoomState) {
|
private fun ContentToPreview(state: LoadingRoomState) {
|
||||||
LoadingRoomNodeView(
|
LoadingRoomNodeView(
|
||||||
state = state,
|
state = state,
|
||||||
onBackClicked = {}
|
onBackClicked = {},
|
||||||
|
hasNetworkConnection = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ open class LoadingRoomStateProvider : PreviewParameterProvider<LoadingRoomState>
|
||||||
}
|
}
|
||||||
|
|
||||||
@SingleIn(SessionScope::class)
|
@SingleIn(SessionScope::class)
|
||||||
class AwaitRoomStateFlowFactory @Inject constructor(private val matrixClient: MatrixClient) {
|
class LoadingRoomStateFlowFactory @Inject constructor(private val matrixClient: MatrixClient) {
|
||||||
|
|
||||||
fun create(lifecycleScope: CoroutineScope, roomId: RoomId): StateFlow<LoadingRoomState> =
|
fun create(lifecycleScope: CoroutineScope, roomId: RoomId): StateFlow<LoadingRoomState> =
|
||||||
getRoomFlow(roomId)
|
getRoomFlow(roomId)
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,8 @@ import dagger.assisted.AssistedInject
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
import io.element.android.appnav.NodeLifecycleCallback
|
import io.element.android.appnav.NodeLifecycleCallback
|
||||||
import io.element.android.appnav.safeRoot
|
import io.element.android.appnav.safeRoot
|
||||||
|
import io.element.android.features.networkmonitor.api.NetworkMonitor
|
||||||
|
import io.element.android.features.networkmonitor.api.NetworkStatus
|
||||||
import io.element.android.libraries.architecture.BackstackNode
|
import io.element.android.libraries.architecture.BackstackNode
|
||||||
import io.element.android.libraries.architecture.NodeInputs
|
import io.element.android.libraries.architecture.NodeInputs
|
||||||
import io.element.android.libraries.architecture.createNode
|
import io.element.android.libraries.architecture.createNode
|
||||||
|
|
@ -53,7 +55,8 @@ import kotlinx.parcelize.Parcelize
|
||||||
class RoomFlowNode @AssistedInject constructor(
|
class RoomFlowNode @AssistedInject constructor(
|
||||||
@Assisted val buildContext: BuildContext,
|
@Assisted val buildContext: BuildContext,
|
||||||
@Assisted plugins: List<Plugin>,
|
@Assisted plugins: List<Plugin>,
|
||||||
awaitRoomStateFlowFactory: AwaitRoomStateFlowFactory,
|
loadingRoomStateFlowFactory: LoadingRoomStateFlowFactory,
|
||||||
|
private val networkMonitor: NetworkMonitor,
|
||||||
) :
|
) :
|
||||||
BackstackNode<RoomFlowNode.NavTarget>(
|
BackstackNode<RoomFlowNode.NavTarget>(
|
||||||
backstack = BackStack(
|
backstack = BackStack(
|
||||||
|
|
@ -70,7 +73,7 @@ class RoomFlowNode @AssistedInject constructor(
|
||||||
) : NodeInputs
|
) : NodeInputs
|
||||||
|
|
||||||
private val inputs: Inputs = inputs()
|
private val inputs: Inputs = inputs()
|
||||||
private val loadingRoomStateStateFlow = awaitRoomStateFlowFactory.create(lifecycleScope, inputs.roomId)
|
private val loadingRoomStateStateFlow = loadingRoomStateFlowFactory.create(lifecycleScope, inputs.roomId)
|
||||||
|
|
||||||
sealed interface NavTarget : Parcelable {
|
sealed interface NavTarget : Parcelable {
|
||||||
@Parcelize
|
@Parcelize
|
||||||
|
|
@ -117,8 +120,10 @@ class RoomFlowNode @AssistedInject constructor(
|
||||||
|
|
||||||
private fun loadingNode(buildContext: BuildContext, onBackClicked: () -> Unit) = node(buildContext) { modifier ->
|
private fun loadingNode(buildContext: BuildContext, onBackClicked: () -> Unit) = node(buildContext) { modifier ->
|
||||||
val loadingRoomState by loadingRoomStateStateFlow.collectAsState()
|
val loadingRoomState by loadingRoomStateStateFlow.collectAsState()
|
||||||
|
val networkStatus by networkMonitor.connectivity.collectAsState()
|
||||||
LoadingRoomNodeView(
|
LoadingRoomNodeView(
|
||||||
state = loadingRoomState,
|
state = loadingRoomState,
|
||||||
|
hasNetworkConnection = networkStatus == NetworkStatus.Online,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onBackClicked = onBackClicked
|
onBackClicked = onBackClicked
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue