From eba5fa6a09dfcb633bda4738806e69cfe5e04778 Mon Sep 17 00:00:00 2001 From: Jakub Zerko Date: Fri, 29 May 2026 13:31:46 +0200 Subject: [PATCH 1/2] fix: conversation details focus traversal order --- .../details/GroupConversationDetailsScreen.kt | 11 ++++++----- .../GroupConversationDetailsTopBarCollapsing.kt | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt index df71c714460..868fc414f7c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt @@ -392,6 +392,7 @@ private fun GroupConversationDetailsContent( ) val currentTabState by remember { derivedStateOf { pagerState.calculateCurrentTab() } } val legalHoldSubjectDialogState = rememberVisibilityState() + val isLoading by isScreenLoading.collectAsState() CollapsingTopBarScaffold( topBarHeader = { @@ -428,7 +429,7 @@ private fun GroupConversationDetailsContent( } AnimatedContent( - targetState = isScreenLoading.collectAsState().value, + targetState = isLoading, transitionSpec = { val enter = fadeIn(tween(durationMillis = 500, delayMillis = 100)) val exit = fadeOut() @@ -456,8 +457,8 @@ private fun GroupConversationDetailsContent( } }, topBarFooter = { - Crossfade(isScreenLoading.collectAsState().value) { - if (it) { + Crossfade(isLoading) { loading -> + if (loading) { LoadingWireTabRow() } else { WireTabRow( @@ -508,7 +509,7 @@ private fun GroupConversationDetailsContent( contentLazyListState = lazyListStates[currentTabState], ) { AnimatedVisibility( - visible = isScreenLoading.collectAsState().value, + visible = isLoading, enter = fadeIn(), exit = fadeOut() ) { @@ -520,7 +521,7 @@ private fun GroupConversationDetailsContent( val focusManager = LocalFocusManager.current AnimatedVisibility( - visible = !isScreenLoading.collectAsState().value, + visible = !isLoading, enter = fadeIn( animationSpec = tween(durationMillis = 500, delayMillis = 100) ), diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsTopBarCollapsing.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsTopBarCollapsing.kt index 2a35e019d8e..9dd3e0df52a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsTopBarCollapsing.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsTopBarCollapsing.kt @@ -19,6 +19,7 @@ package com.wire.android.ui.home.conversations.details import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background +import androidx.compose.foundation.focusGroup import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -71,6 +72,7 @@ fun GroupConversationDetailsTopBarCollapsing( modifier = modifier .fillMaxWidth() .wrapContentHeight() + .focusGroup() ) { Box(contentAlignment = Alignment.Center) { GroupConversationAvatar( From 5739d5e231511636ff514fa3e3956382ed80ad7d Mon Sep 17 00:00:00 2001 From: Jakub Zerko Date: Mon, 1 Jun 2026 13:23:05 +0200 Subject: [PATCH 2/2] review fixes --- .../conversations/details/GroupConversationDetailsScreen.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt index 868fc414f7c..1ee86d60bf2 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt @@ -46,7 +46,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -60,6 +59,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.wire.android.di.wireViewModel import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultBackNavigator @@ -153,7 +153,7 @@ fun GroupConversationDetailsScreen( val resources = LocalContext.current.resources val snackbarHostState = LocalSnackbarHostState.current val sheetState = rememberWireModalSheetState() - val groupOptions by viewModel.groupOptionsState.collectAsState() + val groupOptions by viewModel.groupOptionsState.collectAsStateWithLifecycle() val onSearchConversationMessagesClick: () -> Unit = { navigator.navigate( @@ -392,7 +392,7 @@ private fun GroupConversationDetailsContent( ) val currentTabState by remember { derivedStateOf { pagerState.calculateCurrentTab() } } val legalHoldSubjectDialogState = rememberVisibilityState() - val isLoading by isScreenLoading.collectAsState() + val isLoading by isScreenLoading.collectAsStateWithLifecycle() CollapsingTopBarScaffold( topBarHeader = {