diff --git a/core/ui-common/stability/ui-common-debug.stability b/core/ui-common/stability/ui-common-debug.stability index 56cd40d39f..79ed001169 100644 --- a/core/ui-common/stability/ui-common-debug.stability +++ b/core/ui-common/stability/ui-common-debug.stability @@ -202,6 +202,13 @@ public fun com.wire.android.ui.common.ProtocolLabel(protocolName: kotlin.String, - protocolName: STABLE (String is immutable) - modifier: STABLE (marked @Stable or @Immutable) +@Composable +private fun com.wire.android.ui.common.RadioButtonInnerDot(color: androidx.compose.ui.graphics.Color): kotlin.Unit + skippable: true + restartable: true + params: + - color: STABLE (marked @Stable or @Immutable) + @Composable public fun com.wire.android.ui.common.SearchBarInput(placeholderText: kotlin.String, leadingIcon: @[Composable] androidx.compose.runtime.internal.ComposableFunction0, textState: androidx.compose.foundation.text.input.TextFieldState, modifier: androidx.compose.ui.Modifier, inputModifier: androidx.compose.ui.Modifier, clearButtonModifier: androidx.compose.ui.Modifier, placeholderTextStyle: androidx.compose.ui.text.TextStyle, placeholderAlignment: androidx.compose.ui.Alignment.Horizontal, interactionSource: androidx.compose.foundation.interaction.MutableInteractionSource, textStyle: androidx.compose.ui.text.TextStyle, textFieldState: com.wire.android.ui.common.textfield.WireTextFieldState, isLoading: kotlin.Boolean, inputEnabled: kotlin.Boolean, semanticDescription: kotlin.String?, onTap: kotlin.Function0?): kotlin.Unit skippable: true @@ -455,6 +462,32 @@ public fun com.wire.android.ui.common.WirePromotionDialog(title: kotlin.String, - shape: STABLE (marked @Stable or @Immutable) - contentPadding: STABLE (marked @Stable or @Immutable) +@Composable +public fun com.wire.android.ui.common.WireRadioButton(checked: kotlin.Boolean, modifier: androidx.compose.ui.Modifier, onButtonChecked: kotlin.Function0?, enabled: kotlin.Boolean): kotlin.Unit + skippable: true + restartable: true + params: + - checked: STABLE (primitive type) + - modifier: STABLE (marked @Stable or @Immutable) + - onButtonChecked: STABLE (function type) + - enabled: STABLE (primitive type) + +@Composable +private fun com.wire.android.ui.common.WireRadioButtonIndicator(checked: kotlin.Boolean, enabled: kotlin.Boolean, focused: kotlin.Boolean, selectedColor: androidx.compose.ui.graphics.Color, selectedContentColor: androidx.compose.ui.graphics.Color, unselectedColor: androidx.compose.ui.graphics.Color, unselectedBackgroundColor: androidx.compose.ui.graphics.Color, disabledSelectedColor: androidx.compose.ui.graphics.Color, disabledUnselectedColor: androidx.compose.ui.graphics.Color, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - checked: STABLE (primitive type) + - enabled: STABLE (primitive type) + - focused: STABLE (primitive type) + - selectedColor: STABLE (marked @Stable or @Immutable) + - selectedContentColor: STABLE (marked @Stable or @Immutable) + - unselectedColor: STABLE (marked @Stable or @Immutable) + - unselectedBackgroundColor: STABLE (marked @Stable or @Immutable) + - disabledSelectedColor: STABLE (marked @Stable or @Immutable) + - disabledUnselectedColor: STABLE (marked @Stable or @Immutable) + - modifier: STABLE (marked @Stable or @Immutable) + @Composable public fun com.wire.android.ui.common.WireTabRow(tabs: kotlin.collections.List, selectedTabIndex: kotlin.Int, onTabChange: kotlin.Function1, modifier: androidx.compose.ui.Modifier, tabModifiers: kotlin.collections.List, containerColor: androidx.compose.ui.graphics.Color, divider: @[Composable] androidx.compose.runtime.internal.ComposableFunction0, upperCaseTitles: kotlin.Boolean): kotlin.Unit skippable: false diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/AllFilesScreen.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/AllFilesScreen.kt index b230cde204..a004cd208e 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/AllFilesScreen.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/AllFilesScreen.kt @@ -20,8 +20,10 @@ package com.wire.android.feature.cells.ui import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier @@ -38,6 +40,7 @@ import com.wire.android.feature.cells.ui.audioplayer.AudioPlayerNavArgs import com.wire.android.feature.cells.ui.common.OfflineBanner import com.wire.android.feature.cells.ui.imageviewer.CellImageViewerNavArgs import com.wire.android.feature.cells.ui.search.DriveSearchScreenType +import com.wire.android.feature.cells.ui.search.sort.SortRowWithMenu import com.wire.android.feature.cells.ui.videoplayer.VideoViewerNavArgs import com.wire.android.navigation.NavigationCommand import com.wire.android.navigation.WireNavigator @@ -59,6 +62,12 @@ fun AllFilesScreen( val isOnlineState by viewModel.isOnline.collectAsState() // When offline files are disabled, never enter offline mode so all offline UI stays hidden. val isOnline = isOnlineState || !viewModel.offlineFilesEnabled + val sortingCriteria by viewModel.sortingCriteria.collectAsState() + + val lazyListState = rememberLazyListState() + LaunchedEffect(sortingCriteria) { + lazyListState.animateScrollToItem(0) + } WireScaffold( modifier = modifier, @@ -66,21 +75,29 @@ fun AllFilesScreen( Column { AnimatedContent(isOnline) { if (it) { - SearchTopBar( - modifier = Modifier, - isSearchActive = false, - searchBarHint = stringResource(R.string.search_label), - searchQueryTextState = rememberTextFieldState(), - onTap = { - navigator.navigate( - NavigationCommand( - SearchScreenDestination( - screenType = DriveSearchScreenType.DRIVE, + Column { + SearchTopBar( + modifier = Modifier, + isSearchActive = false, + searchBarHint = stringResource(R.string.search_label), + searchQueryTextState = rememberTextFieldState(), + onTap = { + navigator.navigate( + NavigationCommand( + SearchScreenDestination( + screenType = DriveSearchScreenType.DRIVE, + ) ) ) - ) - }, - ) + }, + ) + SortRowWithMenu( + sortingCriteria = sortingCriteria, + screenType = DriveSearchScreenType.DRIVE, + onSortByClicked = { viewModel.setSortBy(it) }, + onOrderClicked = { viewModel.setSorting(it) }, + ) + } } else { OfflineBanner() } @@ -90,6 +107,7 @@ fun AllFilesScreen( ) { innerPadding -> CellScreenContent( modifier = Modifier.padding(innerPadding), + lazyListState = lazyListState, actionsFlow = viewModel.actions, pagingListItems = pagingListItems, sendIntent = { viewModel.sendIntent(it) }, diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt index ff907c070d..c2429a6bb4 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt @@ -39,6 +39,8 @@ import com.wire.android.feature.cells.ui.model.localFileAvailable import com.wire.android.feature.cells.ui.model.toUiModel import com.wire.android.feature.cells.ui.search.DriveSearchScreenType import com.wire.android.feature.cells.ui.search.SearchNavArgs +import com.wire.android.feature.cells.ui.search.defaultCriteriaFor +import com.wire.android.feature.cells.ui.search.sort.SortBy import com.wire.android.feature.cells.ui.search.sort.SortingCriteria import com.wire.android.feature.cells.ui.search.sort.toKaliumCriteria import com.wire.android.feature.cells.util.FileHelper @@ -156,13 +158,14 @@ class CellViewModel( // AllFiles context (no conversationId, not recycle bin) defaults to newest-first; // ConversationFiles and RecycleBin default to folders-first. - private val _defaultSortingCriteria = MutableStateFlow( - if (navArgs.conversationId == null && !(navArgs.isRecycleBin ?: false)) { - SortingCriteria.ByDate.NewestFirst - } else { - SortingCriteria.FoldersFirst - } - ) + val defaultSortingCriteria: SortingCriteria = if (navArgs.conversationId == null && !(navArgs.isRecycleBin ?: false)) { + SortingCriteria.ByDate.NewestFirst + } else { + SortingCriteria.FoldersFirst + } + + private val _sortingCriteria = MutableStateFlow(defaultSortingCriteria) + val sortingCriteria: StateFlow = _sortingCriteria.asStateFlow() val isOnline: StateFlow = networkStateObserver.observeNetworkState() .map { it is NetworkState.ConnectedWithInternet } @@ -196,7 +199,7 @@ class CellViewModel( } refreshTrigger.flatMapLatest { - _defaultSortingCriteria.flatMapLatest { sortingCriteria -> + _sortingCriteria.flatMapLatest { sortingCriteria -> combine( getCellFilesPaged( conversationId = navArgs.conversationId, @@ -381,6 +384,16 @@ class CellViewModel( cancelOpenDownload(uuid) } + fun setSortBy(by: SortBy) { + _sortingCriteria.update { current -> + if (current.by == by) current else defaultCriteriaFor(by) + } + } + + fun setSorting(criteria: SortingCriteria) { + _sortingCriteria.value = criteria + } + @Suppress("ReturnCount") private fun openFileContentUrl(file: CellNodeUi.File) { when (file.assetType) { diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt index 54569abe70..3be6dd51cf 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -67,6 +68,10 @@ import com.wire.android.feature.cells.ui.dialog.CellsNewActionBottomSheet import com.wire.android.feature.cells.ui.dialog.CellsOptionsBottomSheet import com.wire.android.feature.cells.ui.imageviewer.CellImageViewerNavArgs import com.wire.android.feature.cells.ui.model.CellNodeUi +import com.wire.android.feature.cells.ui.search.DriveSearchScreenType +import com.wire.android.feature.cells.ui.search.sort.SortBy +import com.wire.android.feature.cells.ui.search.sort.SortRowWithMenu +import com.wire.android.feature.cells.ui.search.sort.SortingCriteria import com.wire.android.feature.cells.ui.videoplayer.VideoViewerNavArgs import com.wire.android.navigation.BackStackMode import com.wire.android.navigation.NavigationCommand @@ -132,6 +137,9 @@ fun ConversationFilesScreen( onRefresh = viewModel::onPullToRefresh, retryEditNodeError = viewModel::editNode, fileReadyFlow = viewModel.fileReadyFlow, + sortingCriteria = viewModel.sortingCriteria.collectAsState().value, + onSortByClicked = viewModel::setSortBy, + onSortOrderClicked = viewModel::setSorting, ) LaunchedEffect(Unit) { @@ -162,6 +170,9 @@ internal fun ConversationFilesScreenContent( isOnline: Boolean = true, breadcrumbs: Array? = emptyArray(), fileReadyFlow: Flow = emptyFlow(), + sortingCriteria: SortingCriteria = SortingCriteria.FoldersFirst, + onSortByClicked: (SortBy) -> Unit = {}, + onSortOrderClicked: (SortingCriteria) -> Unit = {}, ) { val sharedScope = LocalSharedTransitionScope.current @@ -176,6 +187,11 @@ internal fun ConversationFilesScreenContent( else -> true } + val lazyListState = rememberLazyListState() + LaunchedEffect(sortingCriteria) { + lazyListState.animateScrollToItem(0) + } + CellsNewActionBottomSheet( sheetState = newActionBottomSheetState, onDismiss = { @@ -264,6 +280,14 @@ internal fun ConversationFilesScreenContent( } }, ) + if (!isRecycleBin) { + SortRowWithMenu( + sortingCriteria = sortingCriteria, + screenType = DriveSearchScreenType.SHARED_DRIVE, + onSortByClicked = onSortByClicked, + onOrderClicked = onSortOrderClicked, + ) + } } else { OfflineBanner() } @@ -300,6 +324,7 @@ internal fun ConversationFilesScreenContent( ) { innerPadding -> CellScreenContent( modifier = Modifier.padding(innerPadding), + lazyListState = lazyListState, actionsFlow = actions, pagingListItems = pagingListItems, sendIntent = sendIntent, diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt index 21d368d553..d793b40593 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt @@ -74,5 +74,8 @@ fun ConversationFilesWithSlideInTransitionScreen( onRefresh = viewModel::onPullToRefresh, retryEditNodeError = viewModel::editNode, fileReadyFlow = viewModel.fileReadyFlow, + sortingCriteria = viewModel.sortingCriteria.collectAsState().value, + onSortByClicked = viewModel::setSortBy, + onSortOrderClicked = viewModel::setSorting, ) } diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/model/NodeBottomSheetAction.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/model/NodeBottomSheetAction.kt index e7c9359842..a84ff73361 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/model/NodeBottomSheetAction.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/model/NodeBottomSheetAction.kt @@ -25,7 +25,7 @@ enum class NodeBottomSheetAction( val isHighlighted: Boolean = false ) { OPEN(R.string.open_label, R.drawable.ic_open), - SHARE(R.string.share_label, R.drawable.ic_share), + SHARE(R.string.share_label, R.drawable.ic_file_share), PUBLIC_LINK(R.string.public_link, R.drawable.ic_link), ADD_REMOVE_TAGS(R.string.add_remove_tags_label, R.drawable.ic_tags), MOVE(R.string.move_label, R.drawable.ic_folder), @@ -38,7 +38,7 @@ enum class NodeBottomSheetAction( CANCEL_LOADING(R.string.cancel_loading_label, com.wire.android.ui.common.R.drawable.ic_close, true), CANCEL_DOWNLOAD(R.string.cancel_download_label, com.wire.android.ui.common.R.drawable.ic_close, true), MAKE_AVAILABLE_OFFLINE(R.string.make_available_offline_label, R.drawable.ic_arrow_down_circle), - REMOVE_OFFLINE_ACCESS(R.string.remove_offline_access_label, R.drawable.ic_cross_in_circle, true), + REMOVE_OFFLINE_ACCESS(R.string.remove_offline_access_label, R.drawable.ic_cross_in_circle), } /** diff --git a/features/cells/src/main/res/drawable/ic_share.xml b/features/cells/src/main/res/drawable/ic_file_share.xml similarity index 100% rename from features/cells/src/main/res/drawable/ic_share.xml rename to features/cells/src/main/res/drawable/ic_file_share.xml diff --git a/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellViewModelTest.kt b/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellViewModelTest.kt index 4e7a6d5b70..7d6d181957 100644 --- a/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellViewModelTest.kt +++ b/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellViewModelTest.kt @@ -31,6 +31,8 @@ import com.wire.android.feature.cells.ui.model.CellNodeUi import com.wire.android.feature.cells.ui.model.OpenLoadState import com.wire.android.feature.cells.ui.model.toUiModel import com.wire.android.feature.cells.ui.search.SearchNavArgs +import com.wire.android.feature.cells.ui.search.sort.SortBy +import com.wire.android.feature.cells.ui.search.sort.SortingCriteria import com.wire.android.feature.cells.util.FileHelper import com.wire.android.feature.cells.util.FileNameResolver import com.wire.kalium.cells.domain.model.Node @@ -413,6 +415,56 @@ class CellViewModelTest { } } + @Test + fun `GIVEN AllFiles context WHEN setSortBy called with Name THEN sortingCriteria changes to ByName AtoZ`() = runTest { + val (_, viewModel) = Arrangement() + .withLoadSuccess() + .arrange() + + assertEquals(SortingCriteria.ByDate.NewestFirst, viewModel.sortingCriteria.value) + + viewModel.setSortBy(SortBy.Name) + + assertEquals(SortingCriteria.ByName.AtoZ, viewModel.sortingCriteria.value) + } + + @Test + fun `GIVEN AllFiles context WHEN setSorting called THEN sortingCriteria updates`() = runTest { + val (_, viewModel) = Arrangement() + .withLoadSuccess() + .arrange() + + viewModel.setSorting(SortingCriteria.ByName.ZtoA) + + assertEquals(SortingCriteria.ByName.ZtoA, viewModel.sortingCriteria.value) + } + + @Test + fun `GIVEN same sortBy WHEN setSortBy called with same criteria THEN sortingCriteria unchanged`() = runTest { + val (_, viewModel) = Arrangement() + .withLoadSuccess() + .arrange() + + val initial = viewModel.sortingCriteria.value + viewModel.setSortBy(SortBy.Modified) + + assertEquals(initial, viewModel.sortingCriteria.value) + } + + @Test + fun `GIVEN conversation context WHEN setSortBy called with Size THEN sortingCriteria changes to BySize SmallestFirst`() = runTest { + val (_, viewModel) = Arrangement() + .withLoadSuccess() + .withConversationId("conversationId") + .arrange() + + assertEquals(SortingCriteria.FoldersFirst, viewModel.sortingCriteria.value) + + viewModel.setSortBy(SortBy.Size) + + assertEquals(SortingCriteria.BySize.SmallestFirst, viewModel.sortingCriteria.value) + } + private class Arrangement( private var conversationId: String? = null, private var inAppImageViewerEnabled: Boolean = false, @@ -550,6 +602,9 @@ class CellViewModelTest { fun withConversationId(conversationId: String) = apply { this.conversationId = conversationId + every { ConversationFilesScreenDestination.argsFrom(savedStateHandle) } returns CellFilesNavArgs( + conversationId = conversationId + ) every { savedStateHandle.get(any()) } returns conversationId every { savedStateHandle.get("conversationId") } returns conversationId } diff --git a/features/cells/stability/cells-debug.stability b/features/cells/stability/cells-debug.stability index f3c1947d20..426c1be473 100644 --- a/features/cells/stability/cells-debug.stability +++ b/features/cells/stability/cells-debug.stability @@ -209,7 +209,7 @@ public fun com.wire.android.feature.cells.ui.ConversationFilesScreen(navigator: - viewModel: UNSTABLE (has mutable properties or unstable members) @Composable -internal fun com.wire.android.feature.cells.ui.ConversationFilesScreenContent(animatedVisibilityScope: androidx.compose.animation.AnimatedVisibilityScope, navigator: com.wire.android.navigation.WireNavigator, currentNodeUuid: kotlin.String?, isSearchResult: kotlin.Boolean, actions: kotlinx.coroutines.flow.Flow, pagingListItems: androidx.paging.compose.LazyPagingItems, menu: kotlinx.coroutines.flow.SharedFlow, sendIntent: kotlin.Function1, isRefreshing: androidx.compose.runtime.State, onRefresh: kotlin.Function0, retryEditNodeError: kotlin.Function1, modifier: androidx.compose.ui.Modifier, isDeleteInProgress: kotlin.Boolean, screenTitle: kotlin.String?, isRecycleBin: kotlin.Boolean, isRestoreInProgress: kotlin.Boolean, isOnline: kotlin.Boolean, breadcrumbs: kotlin.Array?, fileReadyFlow: kotlinx.coroutines.flow.Flow): kotlin.Unit +internal fun com.wire.android.feature.cells.ui.ConversationFilesScreenContent(animatedVisibilityScope: androidx.compose.animation.AnimatedVisibilityScope, navigator: com.wire.android.navigation.WireNavigator, currentNodeUuid: kotlin.String?, isSearchResult: kotlin.Boolean, actions: kotlinx.coroutines.flow.Flow, pagingListItems: androidx.paging.compose.LazyPagingItems, menu: kotlinx.coroutines.flow.SharedFlow, sendIntent: kotlin.Function1, isRefreshing: androidx.compose.runtime.State, onRefresh: kotlin.Function0, retryEditNodeError: kotlin.Function1, modifier: androidx.compose.ui.Modifier, isDeleteInProgress: kotlin.Boolean, screenTitle: kotlin.String?, isRecycleBin: kotlin.Boolean, isRestoreInProgress: kotlin.Boolean, isOnline: kotlin.Boolean, breadcrumbs: kotlin.Array?, fileReadyFlow: kotlinx.coroutines.flow.Flow, sortingCriteria: com.wire.android.feature.cells.ui.search.sort.SortingCriteria, onSortByClicked: kotlin.Function1, onSortOrderClicked: kotlin.Function1): kotlin.Unit skippable: false restartable: true params: @@ -232,6 +232,9 @@ internal fun com.wire.android.feature.cells.ui.ConversationFilesScreenContent(an - isOnline: STABLE (primitive type) - breadcrumbs: UNSTABLE (has mutable properties or unstable members) - fileReadyFlow: RUNTIME (requires runtime check) + - sortingCriteria: STABLE (class with no mutable properties) + - onSortByClicked: STABLE (function type) + - onSortOrderClicked: STABLE (function type) @Composable public fun com.wire.android.feature.cells.ui.ConversationFilesWithSlideInTransitionScreen(navigator: com.wire.android.navigation.WireNavigator, cellFilesNavArgs: com.wire.android.feature.cells.ui.CellFilesNavArgs, animatedVisibilityScope: androidx.compose.animation.AnimatedVisibilityScope, viewModel: com.wire.android.feature.cells.ui.CellViewModel): kotlin.Unit @@ -366,12 +369,6 @@ public fun com.wire.android.feature.cells.ui.cellImageViewerViewModel(): com.wir restartable: true params: -@Composable -public fun com.wire.android.feature.cells.ui.cellVideoViewerViewModel(): com.wire.android.feature.cells.ui.videoplayer.VideoPlayerViewModel - skippable: true - restartable: true - params: - @Composable public fun com.wire.android.feature.cells.ui.cellViewModel(viewModelStoreOwner: androidx.lifecycle.ViewModelStoreOwner): com.wire.android.feature.cells.ui.CellViewModel skippable: false @@ -513,12 +510,13 @@ public fun com.wire.android.feature.cells.ui.createFolderViewModel(): com.wire.a params: @Composable -public fun com.wire.android.feature.cells.ui.dialog.BottomSheetMenuItem(action: com.wire.android.feature.cells.ui.model.NodeBottomSheetAction, modifier: androidx.compose.ui.Modifier): kotlin.Unit +public fun com.wire.android.feature.cells.ui.dialog.BottomSheetMenuItem(action: com.wire.android.feature.cells.ui.model.NodeBottomSheetAction, modifier: androidx.compose.ui.Modifier, enabled: kotlin.Boolean): kotlin.Unit skippable: true restartable: true params: - action: STABLE (class with no mutable properties) - modifier: STABLE (marked @Stable or @Immutable) + - enabled: STABLE (primitive type) @Composable internal fun com.wire.android.feature.cells.ui.dialog.CellsNewActionBottomSheet(sheetState: com.wire.android.ui.common.bottomsheet.WireModalSheetState, onDismiss: kotlin.Function0, onCreateFolder: kotlin.Function0, onCreateFile: kotlin.Function0): kotlin.Unit @@ -1336,26 +1334,10 @@ public fun com.wire.android.feature.cells.ui.versioning.restore.RestoreNodeVersi - restoreProgress: STABLE (primitive type) @Composable -internal fun com.wire.android.feature.cells.ui.videoplayer.CellVideoViewerScreenContent(player: androidx.media3.exoplayer.ExoPlayer, state: com.wire.android.feature.cells.ui.videoplayer.VideoPlaybackState, localPath: kotlin.String?, fileName: kotlin.String?, onTogglePlayPause: kotlin.Function0, onToggleMute: kotlin.Function0, onSeek: kotlin.Function1, onNavigateBack: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: false - restartable: true - params: - - player: RUNTIME (requires runtime check) - - state: STABLE (class with no mutable properties) - - localPath: STABLE (class with no mutable properties) - - fileName: STABLE (class with no mutable properties) - - onTogglePlayPause: STABLE (function type) - - onToggleMute: STABLE (function type) - - onSeek: STABLE (function type) - - onNavigateBack: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -public fun com.wire.android.feature.cells.ui.videoplayer.VideoPlayerScreen(navigator: com.wire.android.navigation.WireNavigator, modifier: androidx.compose.ui.Modifier, viewModel: com.wire.android.feature.cells.ui.videoplayer.VideoPlayerViewModel): kotlin.Unit - skippable: false +public fun com.wire.android.feature.cells.ui.videoplayer.VideoPlayerScreen(navigator: com.wire.android.navigation.WireNavigator, navArgs: com.wire.android.feature.cells.ui.videoplayer.VideoViewerNavArgs): kotlin.Unit + skippable: true restartable: true params: - navigator: STABLE (marked @Stable or @Immutable) - - modifier: STABLE (marked @Stable or @Immutable) - - viewModel: UNSTABLE (has mutable properties or unstable members) + - navArgs: STABLE (class with no mutable properties)