Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,10 @@ class GetConversationsFromSearchUseCase @Inject constructor(
.map { staticPagingItems(it) }
}
}.map { pagingData ->
pagingData.map {
it.toConversationItem(userTypeMapper, uiTextResolver, selfUserTeamId)
}
}.flowOn(dispatchers.io())
pagingData.map {
it.toConversationItem(userTypeMapper, uiTextResolver, selfUserTeamId)
}
}.flowOn(dispatchers.io())
}

private fun staticPagingItems(conversations: List<ConversationDetailsWithEvents>): PagingData<ConversationDetailsWithEvents> {
Expand Down
3 changes: 3 additions & 0 deletions features/cells/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ dependencies {
implementation(libs.coil.video)
implementation(libs.coil.compose)

implementation(libs.media3.exoplayer)
implementation(libs.media3.ui)

implementation(libs.ktx.dateTime)

implementation(libs.androidx.paging3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ import com.ramcosta.composedestinations.generated.cells.destinations.AddRemoveTa
import com.ramcosta.composedestinations.generated.cells.destinations.CellImageViewerScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.PublicLinkScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.SearchScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.VideoPlayerScreenDestination
import com.wire.android.feature.cells.R
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.videoplayer.VideoViewerNavArgs
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.WireNavigator
import com.wire.android.ui.common.scaffold.WireScaffold
Expand Down Expand Up @@ -133,6 +135,19 @@ fun AllFilesScreen(
)
)
},
showVideoPlayer = { file ->
navigator.navigate(
NavigationCommand(
VideoPlayerScreenDestination(
VideoViewerNavArgs(
localPath = file.localPath,
contentUrl = file.contentUrl,
fileName = file.name,
)
)
)
)
},
fileReadyFlow = viewModel.fileReadyFlow,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ internal fun CellScreenContent(
retryEditNodeError: (String) -> Unit = {},
showVersionHistoryScreen: (String, String) -> Unit = { _, _ -> },
showImageViewer: (CellNodeUi.File) -> Unit = {},
showVideoPlayer: (CellNodeUi.File) -> Unit = {},
fileReadyFlow: Flow<CellNodeUi.File>? = emptyFlow(),
) {

Expand Down Expand Up @@ -257,6 +258,7 @@ internal fun CellScreenContent(
).show()
}
is OpenImageViewer -> showImageViewer(action.file)
is OpenVideoPlayer -> showVideoPlayer(action.file)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@

isConversationFiles() -> "${currentNodeUuid()}/${cellNode.name}"
else -> cellNode.remotePath
} ?: run {

Check warning on line 348 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this useless elvis operation ?:, it always succeeds.

See more on https://sonarcloud.io/project/issues?id=wireapp_wire-android&issues=AZ68AWbykedoSjrIaZ8s&open=AZ68AWbykedoSjrIaZ8s&pullRequest=4961
sendAction(ShowError(CellError.OTHER_ERROR))
return
}
Expand All @@ -371,9 +371,18 @@
}

private fun openFileContentUrl(file: CellNodeUi.File) {
if (file.assetType == AttachmentFileType.IMAGE) {
sendAction(OpenImageViewer(file))
return
when (file.assetType) {
AttachmentFileType.IMAGE -> {
sendAction(OpenImageViewer(file))
return
}

AttachmentFileType.VIDEO -> {
sendAction(OpenVideoPlayer(file))

Check warning on line 381 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt#L381

Added line #L381 was not covered by tests
return
}

else -> Unit
}
file.contentUrl?.let { url ->
fileHelper.openAssetUrlWithExternalApp(
Expand All @@ -387,9 +396,18 @@
}

private fun openLocalFile(file: CellNodeUi.File) {
if (file.assetType == AttachmentFileType.IMAGE) {
sendAction(OpenImageViewer(file))
return
when (file.assetType) {
AttachmentFileType.IMAGE -> {
sendAction(OpenImageViewer(file))
return
}

AttachmentFileType.VIDEO -> {
sendAction(OpenVideoPlayer(file))

Check warning on line 406 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt#L406

Added line #L406 was not covered by tests
return
}

else -> Unit
}
file.localPath?.let { path ->
fileHelper.openAssetFileWithExternalApp(
Expand Down Expand Up @@ -638,6 +656,7 @@
internal data class ShowEditErrorDialog(val nodeUuid: String) : CellViewAction
internal data object ShowOfflineFileSaved : CellViewAction
internal data class OpenImageViewer(val file: CellNodeUi.File) : CellViewAction
internal data class OpenVideoPlayer(val file: CellNodeUi.File) : CellViewAction

Check warning on line 659 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellViewModel.kt#L659

Added line #L659 was not covered by tests

internal enum class CellError(val message: Int) {
NO_APP_FOUND(R.string.no_app_found),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/

@file:Suppress("TooManyFunctions")

package com.wire.android.feature.cells.ui

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
import androidx.lifecycle.createSavedStateHandle
import androidx.lifecycle.viewmodel.CreationExtras
import com.wire.android.feature.cells.ui.create.file.CreateFileViewModel
import com.wire.android.feature.cells.ui.create.folder.CreateFolderViewModel
import com.wire.android.feature.cells.ui.imageviewer.CellImageViewerViewModel
import com.wire.android.feature.cells.ui.movetofolder.MoveToFolderViewModel
import com.wire.android.feature.cells.ui.publiclink.PublicLinkViewModel
import com.wire.android.feature.cells.ui.publiclink.settings.expiration.PublicLinkExpirationScreenViewModel
Expand All @@ -30,6 +35,7 @@
import com.wire.android.feature.cells.ui.search.SearchScreenViewModel
import com.wire.android.feature.cells.ui.tags.AddRemoveTagsViewModel
import com.wire.android.feature.cells.ui.versioning.VersionHistoryViewModel
import com.wire.android.feature.cells.ui.videoplayer.VideoPlayerViewModel
import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.IntoMap
import dev.zacsweers.metro.Provides
Expand Down Expand Up @@ -105,6 +111,25 @@
fun versionHistoryViewModel(factory: CellsViewModelFactory): ViewModelAssistedFactory =
savedStateViewModel { factory.versionHistoryViewModel(it.createSavedStateHandle()) }

@Provides
@IntoMap
@ViewModelAssistedFactoryKey(CellImageViewerViewModel::class)
fun imageViewerViewModel(factory: CellsViewModelFactory): ViewModelAssistedFactory =
savedStateViewModel { factory.cellImageViewerViewModel(it.createSavedStateHandle()) }

Check warning on line 118 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt#L118

Added line #L118 was not covered by tests

@Provides
@IntoMap
@ViewModelAssistedFactoryKey(VideoPlayerViewModel::class)
fun videoViewerViewModel(factory: CellsViewModelFactory): ViewModelAssistedFactory =
savedStateViewModel {
factory.cellVideoViewerViewModel(

Check warning on line 125 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt#L124-L125

Added lines #L124 - L125 were not covered by tests
context = checkNotNull(it[APPLICATION_KEY]) {
"No Application was provided via CreationExtras"

Check warning on line 127 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt#L127

Added line #L127 was not covered by tests
},
savedStateHandle = it.createSavedStateHandle(),

Check warning on line 129 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsMetroViewModelBindings.kt#L129

Added line #L129 was not covered by tests
)
}

private fun savedStateViewModel(create: (CreationExtras) -> ViewModel): ViewModelAssistedFactory =
object : ViewModelAssistedFactory {
override fun create(extras: CreationExtras): ViewModel = create(extras)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package com.wire.android.feature.cells.ui

import android.content.Context
import androidx.lifecycle.SavedStateHandle
import com.wire.android.feature.cells.ui.create.file.CreateFileViewModel
import com.wire.android.feature.cells.ui.create.folder.CreateFolderViewModel
Expand All @@ -30,6 +31,7 @@
import com.wire.android.feature.cells.ui.search.SearchScreenViewModel
import com.wire.android.feature.cells.ui.tags.AddRemoveTagsViewModel
import com.wire.android.feature.cells.ui.versioning.VersionHistoryViewModel
import com.wire.android.feature.cells.ui.videoplayer.VideoPlayerViewModel
import com.wire.android.feature.cells.util.FileHelper
import com.wire.android.util.FileSizeFormatter
import com.wire.android.util.dispatchers.DispatcherProvider
Expand Down Expand Up @@ -214,4 +216,12 @@
internal fun cellImageViewerViewModel(savedStateHandle: SavedStateHandle) = CellImageViewerViewModel(
savedStateHandle = savedStateHandle,
)

internal fun cellVideoViewerViewModel(
context: Context,
savedStateHandle: SavedStateHandle
) = VideoPlayerViewModel(
context = context,
savedStateHandle = savedStateHandle,

Check warning on line 225 in features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsViewModelFactory.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsViewModelFactory.kt#L223-L225

Added lines #L223 - L225 were not covered by tests
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/

@file:Suppress("TooManyFunctions")

package com.wire.android.feature.cells.ui

import androidx.compose.runtime.Composable
Expand All @@ -33,6 +36,7 @@ import com.wire.android.feature.cells.ui.rename.RenameNodeViewModel
import com.wire.android.feature.cells.ui.search.SearchScreenViewModel
import com.wire.android.feature.cells.ui.tags.AddRemoveTagsViewModel
import com.wire.android.feature.cells.ui.versioning.VersionHistoryViewModel
import com.wire.android.feature.cells.ui.videoplayer.VideoPlayerViewModel

@Composable
inline fun <reified VM> cellsViewModel(
Expand Down Expand Up @@ -87,3 +91,6 @@ fun versionHistoryViewModel(): VersionHistoryViewModel = cellsViewModel()

@Composable
fun cellImageViewerViewModel(): CellImageViewerViewModel = cellsViewModel()

@Composable
fun cellVideoViewerViewModel(): VideoPlayerViewModel = cellsViewModel()
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,17 @@ import com.ramcosta.composedestinations.generated.cells.destinations.RecycleBinS
import com.ramcosta.composedestinations.generated.cells.destinations.RenameNodeScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.SearchScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.VersionHistoryScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.VideoPlayerScreenDestination
import com.wire.android.feature.cells.R
import com.wire.android.feature.cells.domain.model.AttachmentFileType
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.create.FileTypeBottomSheetDialog
import com.wire.android.feature.cells.ui.create.file.CreateFileScreenNavArgs
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.videoplayer.VideoViewerNavArgs
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.PreviewNavigator
Expand Down Expand Up @@ -378,6 +380,19 @@ internal fun ConversationFilesScreenContent(
)
)
},
showVideoPlayer = { file ->
navigator.navigate(
NavigationCommand(
VideoPlayerScreenDestination(
VideoViewerNavArgs(
localPath = file.localPath,
contentUrl = file.contentUrl,
fileName = file.name,
)
)
)
)
},
retryEditNodeError = { retryEditNodeError(it) },
isRefreshing = isRefreshing,
onRefresh = onRefresh,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,17 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.wire.android.feature.cells.ui.searchScreenViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.paging.compose.collectAsLazyPagingItems
import com.ramcosta.composedestinations.generated.cells.destinations.AddRemoveTagsScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.CellImageViewerScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.ConversationFilesWithSlideInTransitionScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.ConversationFilesWithSlideInTransitionScreenDestination.invoke
import com.ramcosta.composedestinations.generated.cells.destinations.MoveToFolderScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.PublicLinkScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.RenameNodeScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.VersionHistoryScreenDestination
import com.ramcosta.composedestinations.generated.cells.destinations.VideoPlayerScreenDestination
import com.wire.android.feature.cells.R
import com.wire.android.feature.cells.ui.CellScreenContent
import com.wire.android.feature.cells.ui.CellViewModel
Expand All @@ -58,6 +60,9 @@ import com.wire.android.feature.cells.ui.search.filter.bottomsheet.conversation.
import com.wire.android.feature.cells.ui.search.filter.bottomsheet.owner.FilterByOwnerBottomSheet
import com.wire.android.feature.cells.ui.search.filter.bottomsheet.tags.FilterByTagsBottomSheet
import com.wire.android.feature.cells.ui.search.sort.SortRowWithMenu
import com.wire.android.feature.cells.ui.searchScreenViewModel
import com.wire.android.feature.cells.ui.videoplayer.VideoViewerNavArgs
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.WireNavigator
import com.wire.android.navigation.annotation.features.cells.WireCellsDestination
Expand Down Expand Up @@ -207,7 +212,19 @@ fun SearchScreen(
isSearchResult = true,
isRestoreInProgress = cellViewModel.isRestoreInProgress.collectAsState().value,
isDeleteInProgress = cellViewModel.isDeleteInProgress.collectAsState().value,
openFolder = { _, _, _ -> },
openFolder = { path, title, parentFolderUuid ->
navigator.navigate(
NavigationCommand(
ConversationFilesWithSlideInTransitionScreenDestination(
conversationId = path,
screenTitle = title,
parentFolderUuid = parentFolderUuid,
),
BackStackMode.NONE,
launchSingleTop = false
)
)
},
showPublicLinkScreen = { publicLinkScreenData ->
navigator.navigate(
NavigationCommand(
Expand Down Expand Up @@ -268,6 +285,19 @@ fun SearchScreen(
)
)
},
showVideoPlayer = { file ->
navigator.navigate(
NavigationCommand(
VideoPlayerScreenDestination(
VideoViewerNavArgs(
localPath = file.localPath,
contentUrl = file.contentUrl,
fileName = file.name,
)
)
)
)
},
retryEditNodeError = { cellViewModel.editNode(it) },
isRefreshing = remember { mutableStateOf(false) },
onRefresh = { },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Wire
* Copyright (C) 2026 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.wire.android.feature.cells.ui.videoplayer

data class VideoPlaybackState(
val isPlaying: Boolean = false,
val isStarted: Boolean = false,
val isCompleted: Boolean = false,
val isBuffering: Boolean = false,
Comment thread
saleniuk marked this conversation as resolved.
val isMuted: Boolean = false,
val currentPositionMs: Int = 0,
val durationMs: Int = 0,

Check warning on line 27 in features/cells/src/main/java/com/wire/android/feature/cells/ui/videoplayer/VideoPlaybackState.kt

View check run for this annotation

Codecov / codecov/patch

features/cells/src/main/java/com/wire/android/feature/cells/ui/videoplayer/VideoPlaybackState.kt#L21-L27

Added lines #L21 - L27 were not covered by tests
)
Loading
Loading