@@ -19,7 +19,6 @@ package com.wire.android.feature.cells.ui
1919
2020import com.wire.android.feature.cells.ui.model.CellNodeUi
2121import com.wire.android.feature.cells.ui.model.NodeBottomSheetAction
22- import com.wire.android.feature.cells.ui.model.OpenLoadState
2322import com.wire.android.feature.cells.ui.model.isEditSupported
2423import com.wire.android.feature.cells.ui.model.localFileAvailable
2524import com.wire.kalium.logic.featureFlags.KaliumConfigs
@@ -36,64 +35,131 @@ class CellFileActionsMenu @Inject constructor(
3635 isAllFiles : Boolean ,
3736 isSearching : Boolean ,
3837 isCollaboraEnabled : Boolean ,
39- ): List <NodeBottomSheetAction > =
40- when {
41- isRecycleBin -> {
42- buildList {
43- add(NodeBottomSheetAction .RESTORE )
44- add(NodeBottomSheetAction .DELETE_PERMANENTLY )
38+ isOnline : Boolean = true,
39+ ): List <NodeBottomSheetAction > {
40+ if (! isOnline) {
41+ return buildList {
42+ val canOpenOffline = cellNode is CellNodeUi .Folder ||
43+ (cellNode is CellNodeUi .File && cellNode.localFileAvailable())
44+ if (canOpenOffline) {
45+ add(NodeBottomSheetAction .OPEN )
46+ }
47+ if (cellNode is CellNodeUi .File && cellNode.isAvailableOffline) {
48+ add(NodeBottomSheetAction .REMOVE_OFFLINE_ACCESS )
4549 }
4650 }
51+ }
52+ return when {
53+ isRecycleBin -> recycleBinActions()
4754
4855 isAllFiles || isSearching -> {
49- buildList {
50- if (cellNode is CellNodeUi .File && cellNode.openLoadState is OpenLoadState .Loading ) {
51- add(NodeBottomSheetAction .CANCEL_LOADING )
52- } else {
53- if (cellNode is CellNodeUi .File && cellNode.localFileAvailable()) {
54- add(NodeBottomSheetAction .SHARE )
55- }
56- add(NodeBottomSheetAction .PUBLIC_LINK )
57- }
58- }
56+ commonActions(cellNode)
5957 }
6058
6159 isConversationFiles -> {
62- buildList {
63- if (cellNode is CellNodeUi .File && cellNode.openLoadState is OpenLoadState .Loading ) {
64- add(NodeBottomSheetAction .CANCEL_LOADING )
65- } else {
66- if (cellNode is CellNodeUi .File && cellNode.localFileAvailable()) {
67- add(NodeBottomSheetAction .SHARE )
68- }
69- add(NodeBottomSheetAction .PUBLIC_LINK )
70-
71- if (isCollaboraEnabled && featureFlags.collaboraIntegration && cellNode.isEditSupported()) {
72- add(NodeBottomSheetAction .EDIT )
73- }
74-
75- if (featureFlags.collaboraIntegration && cellNode.isEditSupported()) {
76- add(NodeBottomSheetAction .VERSION_HISTORY )
77- }
78-
79- add(NodeBottomSheetAction .ADD_REMOVE_TAGS )
80- add(NodeBottomSheetAction .MOVE )
81- add(NodeBottomSheetAction .RENAME )
82- add(NodeBottomSheetAction .DELETE )
83- }
60+ val common = commonActions(cellNode)
61+ val isTerminal = cellNode is CellNodeUi .File &&
62+ (cellNode.isOpenLoading || cellNode.downloadProgress != null )
63+ if (isTerminal) {
64+ common
65+ } else {
66+ common + conversationActions(
67+ cellNode = cellNode,
68+ isCollaboraEnabled = isCollaboraEnabled,
69+ )
8470 }
8571 }
8672
87- else -> {
88- emptyList()
73+ else -> emptyList()
74+ }
75+ }
76+
77+ private fun recycleBinActions (): List <NodeBottomSheetAction > = listOf (
78+ NodeBottomSheetAction .RESTORE ,
79+ NodeBottomSheetAction .DELETE_PERMANENTLY ,
80+ )
81+
82+ private fun commonActions (
83+ cellNode : CellNodeUi ,
84+ ): List <NodeBottomSheetAction > = buildList {
85+
86+ if (cellNode is CellNodeUi .File ) {
87+
88+ when {
89+ cellNode.isOpenLoading -> {
90+ add(NodeBottomSheetAction .CANCEL_LOADING )
91+ return @buildList
92+ }
93+
94+ cellNode.downloadProgress != null -> {
95+ add(NodeBottomSheetAction .CANCEL_DOWNLOAD )
96+ return @buildList
97+ }
98+
99+ else -> {
100+
101+ add(NodeBottomSheetAction .OPEN )
102+
103+ if (cellNode.localFileAvailable()) {
104+ add(NodeBottomSheetAction .SHARE )
105+ }
106+
107+ add(
108+ if (cellNode.isAvailableOffline) {
109+ NodeBottomSheetAction .REMOVE_OFFLINE_ACCESS
110+ } else {
111+ NodeBottomSheetAction .MAKE_AVAILABLE_OFFLINE
112+ },
113+ )
114+ }
89115 }
116+ } else {
117+ add(NodeBottomSheetAction .OPEN )
118+ }
119+ }
120+
121+ private fun conversationActions (
122+ cellNode : CellNodeUi ,
123+ isCollaboraEnabled : Boolean ,
124+ ): List <NodeBottomSheetAction > = buildList {
125+
126+ val canEdit = cellNode is CellNodeUi .File &&
127+ isCollaboraEnabled &&
128+ featureFlags.collaboraIntegration &&
129+ cellNode.isEditSupported()
130+
131+ if (canEdit) {
132+ add(NodeBottomSheetAction .EDIT )
133+ }
134+
135+ if (
136+ cellNode is CellNodeUi .File &&
137+ featureFlags.collaboraIntegration &&
138+ cellNode.isEditSupported()
139+ ) {
140+ add(NodeBottomSheetAction .VERSION_HISTORY )
90141 }
91142
143+ addAll(
144+ listOf (
145+ NodeBottomSheetAction .ADD_REMOVE_TAGS ,
146+ NodeBottomSheetAction .PUBLIC_LINK ,
147+ NodeBottomSheetAction .MOVE ,
148+ NodeBottomSheetAction .RENAME ,
149+ NodeBottomSheetAction .DELETE ,
150+ ),
151+ )
152+ }
153+
92154 internal sealed interface MenuActionResult
93155 internal data class Action (val action : CellViewAction ) : MenuActionResult
156+ internal data class Open (val node : CellNodeUi ) : MenuActionResult
94157 internal data class Share (val node : CellNodeUi .File ) : MenuActionResult
95158 internal data class Edit (val node : CellNodeUi ) : MenuActionResult
96159 internal data class CancelLoading (val node : CellNodeUi ) : MenuActionResult
160+ internal data class CancelDownload (val node : CellNodeUi ) : MenuActionResult
161+ internal data class MakeAvailableOffline (val node : CellNodeUi .File ) : MenuActionResult
162+ internal data class RemoveOfflineAccess (val node : CellNodeUi .File ) : MenuActionResult
97163
98164 internal fun onMenuItemAction (
99165 conversationId : String? ,
@@ -103,6 +169,7 @@ class CellFileActionsMenu @Inject constructor(
103169 onResult : (MenuActionResult ) -> Unit ,
104170 ) {
105171 val result = when (action) {
172+ NodeBottomSheetAction .OPEN -> Open (node)
106173 NodeBottomSheetAction .SHARE -> {
107174 if (node is CellNodeUi .File ) {
108175 Share (node)
@@ -137,6 +204,22 @@ class CellFileActionsMenu @Inject constructor(
137204 NodeBottomSheetAction .EDIT -> Edit (node)
138205 NodeBottomSheetAction .VERSION_HISTORY -> Action (ShowVersionHistoryScreen (node.uuid, node.name ? : " " ))
139206 NodeBottomSheetAction .CANCEL_LOADING -> CancelLoading (node)
207+ NodeBottomSheetAction .CANCEL_DOWNLOAD -> CancelDownload (node)
208+ NodeBottomSheetAction .MAKE_AVAILABLE_OFFLINE -> {
209+ if (node is CellNodeUi .File ) {
210+ MakeAvailableOffline (node)
211+ } else {
212+ Action (ShowPublicLinkScreen (node))
213+ }
214+ }
215+
216+ NodeBottomSheetAction .REMOVE_OFFLINE_ACCESS -> {
217+ if (node is CellNodeUi .File ) {
218+ RemoveOfflineAccess (node)
219+ } else {
220+ Action (ShowPublicLinkScreen (node))
221+ }
222+ }
140223 }
141224
142225 onResult(result)
0 commit comments