From 27030d943767a62492b3e09eed51ceca411d554c Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 14 Jan 2026 12:37:05 +0100 Subject: [PATCH 1/2] feat: show "+" icon for adding new members only for space managers --- .../spaces/members/SpaceMembersFragment.kt | 17 ++++++++++++++++- .../spaces/members/SpaceMembersViewModel.kt | 17 ++++++++++++++++- .../src/main/res/layout/members_fragment.xml | 17 ++++++++++++++++- owncloudApp/src/main/res/values/strings.xml | 1 + 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt index 00ed053774d..11349fd8603 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt @@ -3,7 +3,7 @@ * * @author Jorge Aguado Recio * - * Copyright (C) 2025 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -96,6 +96,20 @@ class SpaceMembersFragment : Fragment() { } } + collectLatestLifecycleFlow(spaceMembersViewModel.spacePermissions) { event -> + event?.let { + when (val uiResult = event.peekContent()) { + is UIResult.Success -> { + uiResult.data?.let { spacePermissions -> + if (DRIVES_CREATE_PERMISSION in spacePermissions) { binding.addMemberButton.visibility = View.VISIBLE } + } + } + is UIResult.Loading -> { } + is UIResult.Error -> { } + } + } + } + val currentSpace = requireArguments().getParcelable(ARG_CURRENT_SPACE) ?: return binding.apply { itemName.text = currentSpace.name @@ -118,6 +132,7 @@ class SpaceMembersFragment : Fragment() { companion object { private const val ARG_CURRENT_SPACE = "CURRENT_SPACE" private const val ARG_ACCOUNT_NAME = "ACCOUNT_NAME" + private const val DRIVES_CREATE_PERMISSION = "libre.graph/driveItem/permissions/create" fun newInstance( accountName: String, diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt index 72b4fa673fb..8fb7d58a54d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt @@ -3,7 +3,7 @@ * * @author Jorge Aguado Recio * - * Copyright (C) 2025 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -26,6 +26,7 @@ import com.owncloud.android.domain.spaces.model.OCSpace import com.owncloud.android.domain.spaces.model.SpaceMembers import com.owncloud.android.domain.spaces.usecases.GetSpaceMembersUseCase import com.owncloud.android.domain.roles.usecases.GetRolesAsyncUseCase +import com.owncloud.android.domain.spaces.usecases.GetSpacePermissionsAsyncUseCase import com.owncloud.android.domain.utils.Event import com.owncloud.android.extensions.ViewModelExt.runUseCaseWithResult import com.owncloud.android.presentation.common.UIResult @@ -36,6 +37,7 @@ import kotlinx.coroutines.flow.StateFlow class SpaceMembersViewModel( private val getRolesAsyncUseCase: GetRolesAsyncUseCase, private val getSpaceMembersUseCase: GetSpaceMembersUseCase, + private val getSpacePermissionsAsyncUseCase: GetSpacePermissionsAsyncUseCase, private val accountName: String, private val space: OCSpace, private val coroutineDispatcherProvider: CoroutinesDispatcherProvider @@ -47,6 +49,9 @@ class SpaceMembersViewModel( private val _spaceMembers = MutableStateFlow>?>(null) val spaceMembers: StateFlow>?> = _spaceMembers + private val _spacePermissions = MutableStateFlow>>?>(null) + val spacePermissions: StateFlow>>?> = _spacePermissions + init { runUseCaseWithResult( coroutineDispatcher = coroutineDispatcherProvider.io, @@ -56,6 +61,16 @@ class SpaceMembersViewModel( showLoading = false, requiresConnection = true ) + + runUseCaseWithResult( + coroutineDispatcher = coroutineDispatcherProvider.io, + flow = _spacePermissions, + useCase = getSpacePermissionsAsyncUseCase, + useCaseParams = GetSpacePermissionsAsyncUseCase.Params(accountName = accountName, spaceId = space.id), + showLoading = false, + requiresConnection = true + ) + } fun getSpaceMembers() = runUseCaseWithResult( diff --git a/owncloudApp/src/main/res/layout/members_fragment.xml b/owncloudApp/src/main/res/layout/members_fragment.xml index f1fe488b450..51fa77b6f4e 100644 --- a/owncloudApp/src/main/res/layout/members_fragment.xml +++ b/owncloudApp/src/main/res/layout/members_fragment.xml @@ -1,7 +1,7 @@ - + + + + + + + + + + - - + android:layout_height="match_parent" + android:background="@color/actionbar_start_color"> - + - - - - - - - - - - - - - + android:layout_height="0dp" + android:layout_weight="1" + android:scrollbars="vertical" + android:visibility="visible" + tools:visibility="visible"/>