From 56830449c598a21b732857d0e11cd09eaff55c61 Mon Sep 17 00:00:00 2001 From: "sergei.bakhtiarov" Date: Wed, 17 Dec 2025 10:37:56 +0100 Subject: [PATCH] feat: use collabora config from cell feature config (WPB-22343) --- .../android/di/accountScoped/CellsModule.kt | 5 +++++ .../MultipartAttachmentsViewModel.kt | 18 ++++++++++++++--- default.json | 3 ++- .../feature/cells/ui/CellFileActionsMenu.kt | 7 ++++--- .../android/feature/cells/ui/CellViewModel.kt | 20 ++++++++++++++----- .../cells/ui/filter/FilterBottomSheet.kt | 2 +- .../cells/ui/CellFileActionsMenuTest.kt | 3 ++- .../feature/cells/ui/CellViewModelTest.kt | 5 +++++ kalium | 2 +- 9 files changed, 50 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt index 5adfe59138e..47818ba5370 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt @@ -34,6 +34,7 @@ import com.wire.kalium.cells.domain.usecase.GetFoldersUseCase import com.wire.kalium.cells.domain.usecase.GetMessageAttachmentUseCase import com.wire.kalium.cells.domain.usecase.GetPaginatedFilesFlowUseCase import com.wire.kalium.cells.domain.usecase.GetPaginatedNodesUseCase +import com.wire.kalium.cells.domain.usecase.GetWireCellConfigurationUseCase import com.wire.kalium.cells.domain.usecase.IsAtLeastOneCellAvailableUseCase import com.wire.kalium.cells.domain.usecase.MoveNodeUseCase import com.wire.kalium.cells.domain.usecase.ObserveAttachmentDraftsUseCase @@ -220,4 +221,8 @@ class CellsModule { @Provides fun provideRestoreNodeVersionUseCase(cellsScope: CellsScope): RestoreNodeVersionUseCase = cellsScope.restoreNodeVersion + + @ViewModelScoped + @Provides + fun provideGetCellsConfigUseCase(cellsScope: CellsScope): GetWireCellConfigurationUseCase = cellsScope.getCellConfig } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/multipart/MultipartAttachmentsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/multipart/MultipartAttachmentsViewModel.kt index fbc075b71af..7d361b38ccc 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/multipart/MultipartAttachmentsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/multipart/MultipartAttachmentsViewModel.kt @@ -31,9 +31,11 @@ import com.wire.android.ui.common.multipart.toUiModel import com.wire.android.util.FileManager import com.wire.kalium.cells.domain.usecase.DownloadCellFileUseCase import com.wire.kalium.cells.domain.usecase.GetEditorUrlUseCase +import com.wire.kalium.cells.domain.usecase.GetWireCellConfigurationUseCase import com.wire.kalium.common.functional.onSuccess import com.wire.kalium.logic.data.asset.AssetTransferStatus import com.wire.kalium.logic.data.asset.KaliumFileSystem +import com.wire.kalium.logic.data.featureConfig.CollaboraEdition import com.wire.kalium.logic.data.message.AssetContent import com.wire.kalium.logic.data.message.CellAssetContent import com.wire.kalium.logic.data.message.MessageAttachment @@ -107,14 +109,22 @@ class MultipartAttachmentsViewModelImpl @Inject constructor( private val fileManager: FileManager, private val kaliumFileSystem: KaliumFileSystem, private val featureFlags: KaliumConfigs, + private val getWireCellsConfig: GetWireCellConfigurationUseCase, ) : ViewModel(), MultipartAttachmentsViewModel { private val uploadProgress = mutableStateMapOf() + private var isCollaboraEnabled: Boolean = false + + init { + loadWireCellConfig() + } + override fun onClick(attachment: MultipartAttachmentUi, openInImageViewer: (String) -> Unit) { when { attachment.isImage() && !attachment.fileNotFound() -> openInImageViewer(attachment.uuid) - attachment.isEditSupported && featureFlags.collaboraIntegration -> openOnlineEditor(attachment.uuid) + attachment.isEditSupported && isCollaboraEnabled && featureFlags.collaboraIntegration -> + openOnlineEditor(attachment.uuid) attachment.fileNotFound() -> { refreshHelper.refresh(attachment.uuid) } attachment.localFileAvailable() -> openLocalFile(attachment) attachment.canOpenWithUrl() -> openUrl(attachment) @@ -187,8 +197,10 @@ class MultipartAttachmentsViewModelImpl @Inject constructor( refreshHelper.close() } - private fun MessageAttachment.toUiModel() = - toUiModel(uploadProgress[assetId()]) + private fun loadWireCellConfig() = viewModelScope.launch { + val config = getWireCellsConfig() + isCollaboraEnabled = config?.collabora != CollaboraEdition.NO + } } private fun MessageAttachment.assetId() = diff --git a/default.json b/default.json index 500d8d831c9..86fb3549fbf 100644 --- a/default.json +++ b/default.json @@ -72,7 +72,8 @@ "analytics_app_key": "8ffae535f1836ed5f58fd5c8a11c00eca07c5438", "analytics_server_url": "https://wire.count.ly/", "enable_new_registration": true, - "use_async_flush_logging": true + "use_async_flush_logging": true, + "collabora_integration": true }, "internal": { "application_id": "com.wire.internal", diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt index aed066ccd51..805c3ef9f14 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt @@ -24,6 +24,7 @@ import com.wire.android.feature.cells.ui.model.localFileAvailable import com.wire.kalium.logic.featureFlags.KaliumConfigs import javax.inject.Inject +@Suppress("CyclomaticComplexMethod", "LongParameterList") class CellFileActionsMenu @Inject constructor( private val featureFlags: KaliumConfigs ) { @@ -32,7 +33,8 @@ class CellFileActionsMenu @Inject constructor( isRecycleBin: Boolean, isConversationFiles: Boolean, isAllFiles: Boolean, - isSearching: Boolean + isSearching: Boolean, + isCollaboraEnabled: Boolean, ): List = when { isRecycleBin -> { @@ -50,7 +52,7 @@ class CellFileActionsMenu @Inject constructor( add(NodeBottomSheetAction.PUBLIC_LINK) add(NodeBottomSheetAction.DOWNLOAD) - if (featureFlags.collaboraIntegration && cellNode.isEditSupported()) { + if (isCollaboraEnabled && featureFlags.collaboraIntegration && cellNode.isEditSupported()) { add(NodeBottomSheetAction.EDIT) } @@ -86,7 +88,6 @@ class CellFileActionsMenu @Inject constructor( internal data class Download(val node: CellNodeUi) : MenuActionResult internal data class Edit(val node: CellNodeUi) : MenuActionResult - @Suppress("CyclomaticComplexMethod") internal fun onMenuItemAction( conversationId: String?, parentFolderUuid: String?, 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 346eb61eaa1..54185194325 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 @@ -43,11 +43,13 @@ import com.wire.kalium.cells.domain.usecase.DownloadCellFileUseCase import com.wire.kalium.cells.domain.usecase.GetAllTagsUseCase import com.wire.kalium.cells.domain.usecase.GetEditorUrlUseCase import com.wire.kalium.cells.domain.usecase.GetPaginatedFilesFlowUseCase +import com.wire.kalium.cells.domain.usecase.GetWireCellConfigurationUseCase import com.wire.kalium.cells.domain.usecase.IsAtLeastOneCellAvailableUseCase import com.wire.kalium.cells.domain.usecase.RestoreNodeFromRecycleBinUseCase import com.wire.kalium.common.functional.fold import com.wire.kalium.common.functional.onFailure import com.wire.kalium.common.functional.onSuccess +import com.wire.kalium.logic.data.featureConfig.CollaboraEdition import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toImmutableMap import kotlinx.coroutines.delay @@ -89,6 +91,7 @@ class CellViewModel @Inject constructor( private val getEditorUrl: GetEditorUrlUseCase, private val onlineEditor: OnlineEditor, private val cellFileActionsMenu: CellFileActionsMenu, + private val getWireCellsConfig: GetWireCellConfigurationUseCase, ) : ActionsViewModel() { private val navArgs: CellFilesNavArgs = savedStateHandle.navArgs() @@ -132,10 +135,11 @@ class CellViewModel @Inject constructor( private val refreshTrigger = MutableSharedFlow(replay = 0) + private var isCollaboraEnabled: Boolean = false + init { - viewModelScope.launch { - loadTags() - } + loadTags() + loadWireCellConfig() } internal val nodesFlow = flow { @@ -374,7 +378,8 @@ class CellViewModel @Inject constructor( isRecycleBin = isRecycleBin(), isConversationFiles = isConversationFiles(), isAllFiles = isAllFiles(), - isSearching = isSearching() + isSearching = isSearching(), + isCollaboraEnabled = isCollaboraEnabled, ) _menu.emit(MenuOptions(cellNode, menuItems)) @@ -499,12 +504,17 @@ class CellViewModel @Inject constructor( } } - suspend fun loadTags() { + internal fun loadTags() = viewModelScope.launch { getAllTagsUseCase().onSuccess { updated -> _tags.update { updated.sorted().toSet() } } // apply delay to avoid too frequent requests delay(30.seconds) } + private fun loadWireCellConfig() = viewModelScope.launch { + val config = getWireCellsConfig() + isCollaboraEnabled = config?.collabora != CollaboraEdition.NO + } + companion object { const val ZIP_EXTENSION = ".zip" diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/filter/FilterBottomSheet.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/filter/FilterBottomSheet.kt index 7e81875d530..21f37bfe484 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/filter/FilterBottomSheet.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/filter/FilterBottomSheet.kt @@ -67,7 +67,7 @@ fun FilterBottomSheet( onApply: (Set) -> Unit, onClearAll: () -> Unit, onDismiss: () -> Unit, - onShow: suspend () -> Unit = {}, + onShow: () -> Unit = {}, sheetState: WireModalSheetState = rememberWireModalSheetState(WireSheetValue.Expanded(Unit)) ) { WireModalSheetLayout( diff --git a/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellFileActionsMenuTest.kt b/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellFileActionsMenuTest.kt index c69a9ba77af..709a90aa0ed 100644 --- a/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellFileActionsMenuTest.kt +++ b/features/cells/src/test/kotlin/com/wire/android/feature/cells/ui/CellFileActionsMenuTest.kt @@ -456,12 +456,13 @@ class CellFileActionsMenuTest { isConversationFiles: Boolean = false, isAllFiles: Boolean = false, isSearching: Boolean = false, + isCollaboraEnabled: Boolean = false, ): List = CellFileActionsMenu( featureFlags = KaliumConfigs( collaboraIntegration = withCollaboraIntegration ) - ).buildMenu(fileNode, isRecycleBin, isConversationFiles, isAllFiles, isSearching) + ).buildMenu(fileNode, isRecycleBin, isConversationFiles, isAllFiles, isSearching, isCollaboraEnabled) private companion object { val fileNode = CellNodeUi.File( 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 ad3278a93bc..8794e882c59 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 @@ -35,6 +35,7 @@ import com.wire.kalium.cells.domain.usecase.DownloadCellFileUseCase import com.wire.kalium.cells.domain.usecase.GetAllTagsUseCase import com.wire.kalium.cells.domain.usecase.GetEditorUrlUseCase import com.wire.kalium.cells.domain.usecase.GetPaginatedFilesFlowUseCase +import com.wire.kalium.cells.domain.usecase.GetWireCellConfigurationUseCase import com.wire.kalium.cells.domain.usecase.IsAtLeastOneCellAvailableUseCase import com.wire.kalium.cells.domain.usecase.RestoreNodeFromRecycleBinUseCase import com.wire.kalium.common.error.CoreFailure @@ -304,6 +305,9 @@ class CellViewModelTest { @MockK lateinit var cellFileActionsMenu: CellFileActionsMenu + @MockK + lateinit var getWireCellsConfig: GetWireCellConfigurationUseCase + init { MockKAnnotations.init(this, relaxUnitFun = true) @@ -384,6 +388,7 @@ class CellViewModelTest { onlineEditor = onlineEditor, getEditorUrl = getEditorUrlUseCase, cellFileActionsMenu = cellFileActionsMenu, + getWireCellsConfig = getWireCellsConfig, ) } } diff --git a/kalium b/kalium index 35685adde44..d1a950afe78 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 35685adde4487d788ad049ebe6fadc456e091605 +Subproject commit d1a950afe78cd7245856597278c9546304e609e3