Skip to content

Commit e6394a0

Browse files
committed
refactor: use a permission set instead of individual permissions to filter options
1 parent 99201b0 commit e6394a0

4 files changed

Lines changed: 44 additions & 15 deletions

File tree

‎owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListFragment.kt‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import com.owncloud.android.databinding.SpacesListFragmentBinding
4444
import com.owncloud.android.domain.files.model.FileListOption
4545
import com.owncloud.android.domain.spaces.model.OCSpace
4646
import com.owncloud.android.domain.spaces.model.SpaceMenuOption
47+
import com.owncloud.android.domain.user.model.UserPermissions
4748
import com.owncloud.android.extensions.collectLatestLifecycleFlow
4849
import com.owncloud.android.extensions.showErrorInSnackbar
4950
import com.owncloud.android.extensions.showMessageInSnackbar
@@ -71,7 +72,7 @@ class SpacesListFragment :
7172
private val binding get() = _binding!!
7273

7374
private var isMultiPersonal = false
74-
private var editSpacesPermission = false
75+
private var userPermissions = mutableSetOf<UserPermissions>()
7576
private var editQuotaPermission = false
7677
private lateinit var currentSpace: OCSpace
7778

@@ -181,7 +182,7 @@ class SpacesListFragment :
181182
Timber.d("The permissions for $accountName are: ${uiResult.data}")
182183
uiResult.data?.let {
183184
binding.fabCreateSpace.isVisible = it.contains(DRIVES_CREATE_ALL_PERMISSION)
184-
editSpacesPermission = it.contains(DRIVES_READ_WRITE_ALL_PERMISSION)
185+
if(it.contains(DRIVES_READ_WRITE_ALL_PERMISSION)) userPermissions.add(UserPermissions.CAN_EDIT_SPACES)
185186
editQuotaPermission = it.contains(DRIVES_READ_WRITE_PROJECT_QUOTA_ALL_PERMISSION)
186187
}
187188
}
@@ -243,7 +244,7 @@ class SpacesListFragment :
243244

244245
override fun onThreeDotButtonClick(ocSpace: OCSpace) {
245246
currentSpace = ocSpace
246-
spacesListViewModel.filterMenuOptions(ocSpace, editSpacesPermission)
247+
spacesListViewModel.filterMenuOptions(ocSpace, userPermissions)
247248
}
248249

249250
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {

‎owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListViewModel.kt‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import com.owncloud.android.domain.spaces.usecases.GetPersonalAndProjectSpacesWi
3737
import com.owncloud.android.domain.spaces.usecases.GetPersonalSpacesWithSpecialsForAccountAsStreamUseCase
3838
import com.owncloud.android.domain.spaces.usecases.GetProjectSpacesWithSpecialsForAccountAsStreamUseCase
3939
import com.owncloud.android.domain.spaces.usecases.RefreshSpacesFromServerAsyncUseCase
40+
import com.owncloud.android.domain.user.model.UserPermissions
4041
import com.owncloud.android.domain.user.usecases.GetUserIdAsyncUseCase
4142
import com.owncloud.android.domain.user.usecases.GetUserPermissionsAsyncUseCase
4243
import com.owncloud.android.domain.utils.Event
@@ -176,13 +177,13 @@ class SpacesListViewModel(
176177
}
177178
}
178179

179-
fun filterMenuOptions(space: OCSpace, editSpacesPermission: Boolean) {
180+
fun filterMenuOptions(space: OCSpace, userPermissions: Set<UserPermissions>) {
180181
viewModelScope.launch(coroutinesDispatcherProvider.io) {
181182
val result = filterSpaceMenuOptionsUseCase(
182183
FilterSpaceMenuOptionsUseCase.Params(
183184
accountName = accountName,
184185
space = space,
185-
editSpacesPermission = editSpacesPermission
186+
userPermissions = userPermissions
186187
)
187188
)
188189
_menuOptions.emit(result)

‎owncloudDomain/src/main/java/com/owncloud/android/domain/spaces/usecases/FilterSpaceMenuOptionsUseCase.kt‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.owncloud.android.domain.BaseUseCase
2424
import com.owncloud.android.domain.UseCaseResult
2525
import com.owncloud.android.domain.spaces.model.OCSpace
2626
import com.owncloud.android.domain.spaces.model.SpaceMenuOption
27+
import com.owncloud.android.domain.user.model.UserPermissions
2728

2829
class FilterSpaceMenuOptionsUseCase(
2930
private val getSpacePermissionsAsyncUseCase: GetSpacePermissionsAsyncUseCase,
@@ -32,15 +33,10 @@ class FilterSpaceMenuOptionsUseCase(
3233
override fun run(params: Params): MutableList<SpaceMenuOption> {
3334
val optionsToShow = mutableListOf<SpaceMenuOption>()
3435

35-
val editPermission = if (params.editSpacesPermission) {
36-
true
37-
} else {
38-
when (val spacePermissionsResult =
39-
getSpacePermissionsAsyncUseCase(GetSpacePermissionsAsyncUseCase.Params(params.accountName, params.space.id))) {
40-
is UseCaseResult.Success -> DRIVES_MANAGE_PERMISSION in spacePermissionsResult.data
41-
is UseCaseResult.Error -> false
42-
}
43-
}
36+
val spacePermissionsResult = getSpacePermissionsAsyncUseCase(GetSpacePermissionsAsyncUseCase.Params(params.accountName, params.space.id))
37+
38+
val editPermission =
39+
(UserPermissions.CAN_EDIT_SPACES in params.userPermissions || hasSpacePermission(spacePermissionsResult, DRIVES_MANAGE_PERMISSION))
4440

4541
if (editPermission) {
4642
optionsToShow.add(SpaceMenuOption.EDIT)
@@ -49,10 +45,16 @@ class FilterSpaceMenuOptionsUseCase(
4945
return optionsToShow
5046
}
5147

48+
private fun hasSpacePermission(spacePermissions: UseCaseResult<List<String>>, requiredPermission: String) =
49+
when (spacePermissions) {
50+
is UseCaseResult.Success -> requiredPermission in spacePermissions.data
51+
is UseCaseResult.Error -> false
52+
}
53+
5254
data class Params(
5355
val accountName: String,
5456
val space: OCSpace,
55-
val editSpacesPermission: Boolean
57+
val userPermissions: Set<UserPermissions>
5658
)
5759

5860
companion object {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* ownCloud Android client application
3+
*
4+
* @author Jorge Aguado Recio
5+
*
6+
* Copyright (C) 2025 ownCloud GmbH.
7+
*
8+
* This program is free software: you can redistribute it and/or modify
9+
* it under the terms of the GNU General Public License version 2,
10+
* as published by the Free Software Foundation.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
21+
package com.owncloud.android.domain.user.model
22+
23+
enum class UserPermissions {
24+
CAN_EDIT_SPACES
25+
}

0 commit comments

Comments
 (0)