2222
2323package com.owncloud.android.presentation.spaces
2424
25+ import android.content.DialogInterface
2526import android.content.res.Configuration
2627import android.os.Bundle
2728import android.view.LayoutInflater
@@ -44,7 +45,10 @@ import com.owncloud.android.databinding.SpacesListFragmentBinding
4445import com.owncloud.android.domain.files.model.FileListOption
4546import com.owncloud.android.domain.spaces.model.OCSpace
4647import com.owncloud.android.domain.spaces.model.SpaceMenuOption
48+ import com.owncloud.android.domain.user.model.UserPermissions
49+ import com.owncloud.android.domain.utils.Event
4750import com.owncloud.android.extensions.collectLatestLifecycleFlow
51+ import com.owncloud.android.extensions.showAlertDialog
4852import com.owncloud.android.extensions.showErrorInSnackbar
4953import com.owncloud.android.extensions.showMessageInSnackbar
5054import com.owncloud.android.extensions.toDrawableRes
@@ -57,6 +61,7 @@ import com.owncloud.android.presentation.common.BottomSheetFragmentItemView
5761import com.owncloud.android.utils.DisplayUtils
5862import com.owncloud.android.presentation.common.UIResult
5963import com.owncloud.android.presentation.spaces.createspace.CreateSpaceDialogFragment
64+ import kotlinx.coroutines.flow.SharedFlow
6065import org.koin.androidx.viewmodel.ext.android.viewModel
6166import org.koin.core.parameter.parametersOf
6267import timber.log.Timber
@@ -71,7 +76,7 @@ class SpacesListFragment :
7176 private val binding get() = _binding !!
7277
7378 private var isMultiPersonal = false
74- private var editSpacesPermission = false
79+ private var userPermissions = mutableSetOf< UserPermissions >()
7580 private var editQuotaPermission = false
7681 private lateinit var currentSpace: OCSpace
7782
@@ -136,7 +141,7 @@ class SpacesListFragment :
136141 collectLatestLifecycleFlow(spacesListViewModel.spacesList) { uiState ->
137142 if (uiState.searchFilter != " " ) {
138143 var spacesToListFiltered =
139- uiState.spaces.filter { it.name.lowercase().contains(uiState.searchFilter.lowercase()) && ! it.isPersonal && ! it.isDisabled }
144+ uiState.spaces.filter { it.name.lowercase().contains(uiState.searchFilter.lowercase()) && ! it.isPersonal }
140145 val personalSpace = uiState.spaces.find { it.isPersonal }
141146 personalSpace?.let {
142147 spacesToListFiltered = spacesToListFiltered.toMutableList().apply {
@@ -147,7 +152,7 @@ class SpacesListFragment :
147152 spacesListAdapter.setData(spacesToListFiltered, isMultiPersonal)
148153 } else {
149154 showOrHideEmptyView(uiState.spaces)
150- spacesListAdapter.setData(uiState.spaces.filter { ! it.isDisabled } , isMultiPersonal)
155+ spacesListAdapter.setData(uiState.spaces, isMultiPersonal)
151156 }
152157 binding.swipeRefreshSpacesList.isRefreshing = uiState.refreshing
153158 uiState.error?.let { showErrorInSnackbar(R .string.spaces_sync_failed, it) }
@@ -181,8 +186,9 @@ class SpacesListFragment :
181186 Timber .d(" The permissions for $accountName are: ${uiResult.data} " )
182187 uiResult.data?.let {
183188 binding.fabCreateSpace.isVisible = it.contains(DRIVES_CREATE_ALL_PERMISSION )
184- editSpacesPermission = it.contains(DRIVES_READ_WRITE_ALL_PERMISSION )
189+ if ( it.contains(DRIVES_READ_WRITE_ALL_PERMISSION )) userPermissions.add( UserPermissions . CAN_EDIT_SPACES )
185190 editQuotaPermission = it.contains(DRIVES_READ_WRITE_PROJECT_QUOTA_ALL_PERMISSION )
191+ if (it.contains(DRIVES_DELETE_PROJECT_ALL_PERMISSION )) userPermissions.add(UserPermissions .CAN_DELETE_SPACES )
186192 }
187193 }
188194 is UIResult .Loading -> { }
@@ -194,30 +200,28 @@ class SpacesListFragment :
194200 }
195201 }
196202
197- collectLatestLifecycleFlow (spacesListViewModel.createSpaceFlow) { event ->
198- event?. let {
199- when ( val uiResult = event.peekContent()) {
200- is UIResult . Success -> { showMessageInSnackbar(getString( R .string.create_space_correctly)) }
201- is UIResult . Loading -> { }
202- is UIResult . Error -> { showErrorInSnackbar( R .string.create_space_failed, uiResult.error) }
203- }
204- }
203+ collectSpaceOperationsFlow (spacesListViewModel.createSpaceFlow, R .string.create_space_correctly, R .string.create_space_failed)
204+ collectSpaceOperationsFlow(spacesListViewModel.editSpaceFlow, R .string.edit_space_correctly, R .string.edit_space_failed)
205+ collectSpaceOperationsFlow(spacesListViewModel.disableSpaceFlow, R .string.disable_space_correctly, R .string.disable_space_failed)
206+ collectSpaceOperationsFlow(spacesListViewModel.enableSpaceFlow, R .string.enable_space_correctly, R .string.enable_space_failed)
207+ collectSpaceOperationsFlow(spacesListViewModel.deleteSpaceFlow, R .string.delete_space_correctly, R .string.delete_space_failed)
208+
209+ collectLatestLifecycleFlow(spacesListViewModel.menuOptions) { menuOptions ->
210+ showSpaceMenuOptionsDialog(menuOptions)
205211 }
206212
207- collectLatestLifecycleFlow(spacesListViewModel.editSpaceFlow) { event ->
213+ }
214+
215+ private fun collectSpaceOperationsFlow (flow : SharedFlow <Event <UIResult <Unit >>? >, successMessage : Int , errorMessage : Int ) {
216+ collectLatestLifecycleFlow(flow) { event ->
208217 event?.let {
209218 when (val uiResult = event.peekContent()) {
210- is UIResult .Success -> { showMessageInSnackbar(getString(R .string.edit_space_correctly )) }
219+ is UIResult .Success -> { showMessageInSnackbar(getString(successMessage )) }
211220 is UIResult .Loading -> { }
212- is UIResult .Error -> { showErrorInSnackbar(R .string.edit_space_failed , uiResult.error) }
221+ is UIResult .Error -> { showErrorInSnackbar(errorMessage , uiResult.error) }
213222 }
214223 }
215224 }
216-
217- collectLatestLifecycleFlow(spacesListViewModel.menuOptions) { menuOptions ->
218- showSpaceMenuOptionsDialog(menuOptions)
219- }
220-
221225 }
222226
223227 private fun showOrHideEmptyView (spacesList : List <OCSpace >) {
@@ -243,7 +247,7 @@ class SpacesListFragment :
243247
244248 override fun onThreeDotButtonClick (ocSpace : OCSpace ) {
245249 currentSpace = ocSpace
246- spacesListViewModel.filterMenuOptions(ocSpace, editSpacesPermission )
250+ spacesListViewModel.filterMenuOptions(ocSpace, userPermissions )
247251 }
248252
249253 override fun onCreateOptionsMenu (menu : Menu , inflater : MenuInflater ) {
@@ -337,6 +341,33 @@ class SpacesListFragment :
337341 )
338342 editDialog.show(requireActivity().supportFragmentManager, DIALOG_CREATE_SPACE )
339343 }
344+ SpaceMenuOption .DISABLE -> {
345+ showAlertDialog(
346+ title = getString(R .string.disable_space_dialog_title, currentSpace.name),
347+ message = getString(R .string.disable_space_dialog_message),
348+ positiveButtonText = getString(R .string.common_yes),
349+ positiveButtonListener = { _: DialogInterface ? , _: Int -> spacesListViewModel.disableSpace(currentSpace.id) },
350+ negativeButtonText = getString(R .string.common_no)
351+ )
352+ }
353+ SpaceMenuOption .ENABLE -> {
354+ showAlertDialog(
355+ title = getString(R .string.enable_space_dialog_title, currentSpace.name),
356+ message = getString(R .string.enable_space_dialog_message),
357+ positiveButtonText = getString(R .string.common_yes),
358+ positiveButtonListener = { _: DialogInterface ? , _: Int -> spacesListViewModel.enableSpace(currentSpace.id) },
359+ negativeButtonText = getString(R .string.common_no)
360+ )
361+ }
362+ SpaceMenuOption .DELETE -> {
363+ showAlertDialog(
364+ title = getString(R .string.delete_space_dialog_title, currentSpace.name),
365+ message = getString(R .string.delete_space_dialog_message),
366+ positiveButtonText = getString(R .string.common_yes),
367+ positiveButtonListener = { _: DialogInterface ? , _: Int -> spacesListViewModel.deleteSpace(currentSpace.id) },
368+ negativeButtonText = getString(R .string.common_no)
369+ )
370+ }
340371 }
341372 }
342373 }
@@ -351,6 +382,7 @@ class SpacesListFragment :
351382 const val DRIVES_CREATE_ALL_PERMISSION = " Drives.Create.all"
352383 const val DRIVES_READ_WRITE_ALL_PERMISSION = " Drives.ReadWrite.all"
353384 const val DRIVES_READ_WRITE_PROJECT_QUOTA_ALL_PERMISSION = " Drives.ReadWriteProjectQuota.all"
385+ const val DRIVES_DELETE_PROJECT_ALL_PERMISSION = " Drives.DeleteProject.all"
354386
355387 private const val DIALOG_CREATE_SPACE = " DIALOG_CREATE_SPACE"
356388
0 commit comments