From 273b3cd60bf3458d7e783c52335d90287ed785af Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Tue, 5 May 2026 17:49:51 +0200 Subject: [PATCH 1/2] fix: refresh public link options when user loses permissions --- .../spaces/links/SpaceLinksAdapter.kt | 3 ++- .../spaces/links/SpaceLinksDiffUtil.kt | 6 +++-- .../spaces/members/SpaceMembersAdapter.kt | 4 +-- .../spaces/members/SpaceMembersFragment.kt | 25 +++++++++++-------- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksAdapter.kt index 210b26350c9..2b03d7ee749 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksAdapter.kt @@ -93,9 +93,10 @@ class SpaceLinksAdapter( override fun getItemCount(): Int = spaceLinks.size fun setSpaceLinks(spaceLinks: List, canRemoveLinks: Boolean, canEditLinks: Boolean) { + val hasUserPermissionsChanged = this.canEditLinks != canEditLinks || this.canRemoveLinks != canRemoveLinks this.canRemoveLinks = canRemoveLinks this.canEditLinks = canEditLinks - val diffCallback = SpaceLinksDiffUtil(this.spaceLinks, spaceLinks) + val diffCallback = SpaceLinksDiffUtil(this.spaceLinks, spaceLinks, hasUserPermissionsChanged) val diffResult = DiffUtil.calculateDiff(diffCallback) this.spaceLinks = spaceLinks diffResult.dispatchUpdatesTo(this) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksDiffUtil.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksDiffUtil.kt index b1ae7d43fd6..39bb44d8880 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksDiffUtil.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksDiffUtil.kt @@ -25,7 +25,8 @@ import com.owncloud.android.domain.links.model.OCLink class SpaceLinksDiffUtil( private val oldList: List, - private val newList: List + private val newList: List, + private val hasUserPermissionsChanged: Boolean ) : DiffUtil.Callback() { override fun getOldListSize(): Int = oldList.size @@ -43,6 +44,7 @@ class SpaceLinksDiffUtil( val newItem = newList[newItemPosition] return ((oldItem.id == newItem.id) && (oldItem.expirationDateTime == newItem.expirationDateTime) && - (oldItem.displayName == newItem.displayName) && (oldItem.type == newItem.type) && (oldItem.webUrl == newItem.webUrl)) + (oldItem.displayName == newItem.displayName) && (oldItem.type == newItem.type) && + (oldItem.webUrl == newItem.webUrl) && !hasUserPermissionsChanged) } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersAdapter.kt index 10f6a0b3913..b7190b5c33d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersAdapter.kt @@ -112,7 +112,7 @@ class SpaceMembersAdapter( numberOfManagers: Int ) { - val userPermissionsChanged = this.canEditMembers != canEditMembers + val hasUserPermissionsChanged = this.canEditMembers != canEditMembers || this.canRemoveMembers != canRemoveMembers val numberOfManagersChanged = this.numberOfManagers != numberOfManagers this.canRemoveMembers = canRemoveMembers @@ -120,7 +120,7 @@ class SpaceMembersAdapter( this.rolesMap = roles.associate { it.id to it.displayName } val listOfMembersFiltered = spaceMembers.sortedWith(compareByDescending { member -> roles.indexOfFirst { it.id in member.roles } }.thenBy { member -> member.displayName }) - val diffCallback = SpaceMembersDiffUtil(this.members, listOfMembersFiltered, numberOfManagersChanged, userPermissionsChanged) + val diffCallback = SpaceMembersDiffUtil(this.members, listOfMembersFiltered, numberOfManagersChanged, hasUserPermissionsChanged) val diffResult = DiffUtil.calculateDiff(diffCallback) this.members = listOfMembersFiltered this.numberOfManagers = numberOfManagers 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 1498b8a29fd..fe5e146cfea 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 @@ -78,10 +78,11 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter private var roles: List = emptyList() private var addMemberRoles: List = emptyList() private var spaceMembers: List = emptyList() + private var spaceLinks: List = emptyList() private var listener: SpaceMemberFragmentListener? = null private var canRemoveMembersAndLinks = false private var canEditMembersAndLinks = false - private var canReadMembers = false + private var canReadMembersAndLinks = false private var numberOfManagers = 1 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { @@ -113,7 +114,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter savedInstanceState?.let { canRemoveMembersAndLinks = it.getBoolean(CAN_REMOVE_MEMBERS, false) canEditMembersAndLinks = it.getBoolean(CAN_EDIT_MEMBERS, false) - canReadMembers = it.getBoolean(CAN_READ_MEMBERS, false) + canReadMembersAndLinks = it.getBoolean(CAN_READ_MEMBERS, false) } subscribeToViewModels() @@ -163,7 +164,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter super.onSaveInstanceState(outState) outState.putBoolean(CAN_REMOVE_MEMBERS, canRemoveMembersAndLinks) outState.putBoolean(CAN_EDIT_MEMBERS, canEditMembersAndLinks) - outState.putBoolean(CAN_READ_MEMBERS, canReadMembers) + outState.putBoolean(CAN_READ_MEMBERS, canReadMembersAndLinks) } override fun onRemoveMember(spaceMember: SpaceMember) { @@ -253,11 +254,14 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter spaceMember.roles.contains(OCRoleType.toString(OCRoleType.CAN_MANAGE)) } spaceMembers = it.members addMemberRoles = it.roles - if (canReadMembers) { + if (canReadMembersAndLinks) { showSpaceMembers() val hasLinks = it.links.isNotEmpty() showOrHideEmptyView(hasLinks) - if (hasLinks) { showSpaceLinks(it.links) } + if (hasLinks) { + spaceLinks = it.links + showSpaceLinks() + } } binding.indeterminateProgressBar.isVisible = false } @@ -280,8 +284,9 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter is UIResult.Success -> { uiResult.data?.let { spacePermissions -> checkPermissions(spacePermissions) - if (canReadMembers) { + if (canReadMembersAndLinks) { showSpaceMembers() + showSpaceLinks() } } } @@ -404,12 +409,12 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter val hasCreatePermission = DRIVES_CREATE_PERMISSION in spacePermissions canRemoveMembersAndLinks = DRIVES_DELETE_PERMISSION in spacePermissions canEditMembersAndLinks = DRIVES_UPDATE_PERMISSION in spacePermissions - canReadMembers = DRIVES_READ_PERMISSION in spacePermissions + canReadMembersAndLinks = DRIVES_READ_PERMISSION in spacePermissions binding.apply { addMemberButton.isVisible = hasCreatePermission addPublicLinkButton.isVisible = hasCreatePermission - membersListSection.isVisible = canReadMembers - publicLinksSection.isVisible = canReadMembers + membersListSection.isVisible = canReadMembersAndLinks + publicLinksSection.isVisible = canReadMembersAndLinks } } @@ -430,7 +435,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter ) } - private fun showSpaceLinks(spaceLinks: List) { + private fun showSpaceLinks() { val formatter = SimpleDateFormat(DisplayUtils.DATE_FORMAT_ISO, Locale.ROOT).apply { timeZone = TimeZone.getTimeZone("UTC") } From afc8e82a91e8a897eb43b307edb35a601f62fa2d Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Tue, 5 May 2026 17:51:39 +0200 Subject: [PATCH 2/2] chore: add calens file --- changelog/unreleased/4783 | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog/unreleased/4783 b/changelog/unreleased/4783 index 17862f8f240..3aa23cca02c 100644 --- a/changelog/unreleased/4783 +++ b/changelog/unreleased/4783 @@ -6,3 +6,4 @@ This new section shows information like public link names, types and expiration https://github.com/owncloud/android/issues/4752 https://github.com/owncloud/android/pull/4783 https://github.com/owncloud/android/pull/4834 +https://github.com/owncloud/android/pull/4845