diff --git a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java index f42feb760680..1aed05bc7b8d 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -105,7 +105,7 @@ public class OCFile implements Parcelable, Comparable, ServerFileInterfa private String ownerId; private String ownerDisplayName; String note; - private List sharees; + private List sharees = new ArrayList<>(); private String richWorkspace; private boolean locked; @Nullable @@ -988,7 +988,7 @@ public void setNote(String note) { } public void setSharees(List sharees) { - this.sharees = sharees; + this.sharees = (sharees == null) ? new ArrayList<>() : new ArrayList<>(sharees); } public void setRichWorkspace(String richWorkspace) { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 352bc6472b8d..8da468e266ce 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -1,6 +1,7 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2023 TSI-mc * SPDX-FileCopyrightText: 2020 Chris Narkiewicz * SPDX-FileCopyrightText: 2018 Tobias Kaminsky @@ -75,7 +76,6 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; @@ -594,29 +594,44 @@ private void handleListMode(ListGridItemViewHolder holder, } private void bindSharedAvatars(ListItemViewHolder holder, OCFile file) { + final var sharedAvatars = holder.getSharedAvatars(); + if (!(file.isSharedWithMe() || file.isSharedWithSharee()) || isMultiSelect() || gridView || hideItemOptions) { - holder.getSharedAvatars().setVisibility(View.GONE); - holder.getSharedAvatars().removeAllViews(); + sharedAvatars.setVisibility(View.GONE); + if (sharedAvatars.getChildCount() > 0) { + sharedAvatars.removeAllViews(); + } return; } - final var sharees = new ArrayList<>(file.getSharees()); + sharedAvatars.setVisibility(View.VISIBLE); + sharedAvatars.setAvatars(user, avatarSharees(file), viewThemeUtils); + sharedAvatars.setOnClickListener(view -> ocFileListFragmentInterface.onShareIconClick(file)); + } + + private List avatarSharees(OCFile file) { + final List sharees = file.getSharees(); + ShareeUser owner = null; final String ownerId = file.getOwnerId(); if (!TextUtils.isEmpty(ownerId) && !ownerId.equals(userId)) { final var ownerSharee = new ShareeUser(ownerId, file.getOwnerDisplayName(), ShareType.USER); if (!sharees.contains(ownerSharee)) { - sharees.add(ownerSharee); + owner = ownerSharee; } } - Collections.reverse(sharees); + final var ordered = new ArrayList(sharees.size() + (owner == null ? 0 : 1)); + if (owner != null) { + ordered.add(owner); + } - final var sharedAvatars = holder.getSharedAvatars(); - sharedAvatars.setVisibility(View.VISIBLE); - sharedAvatars.removeAllViews(); - sharedAvatars.setAvatars(user, sharees, viewThemeUtils); - sharedAvatars.setOnClickListener(view -> ocFileListFragmentInterface.onShareIconClick(file)); + // count from last to first to get desired order + for (int i = sharees.size() - 1; i >= 0; i--) { + ordered.add(sharees.get(i)); + } + + return ordered; } private void bindListItemViewHolder(ListItemViewHolder holder, OCFile file) { diff --git a/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt b/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt index 030623b04de5..939e1a3d73f5 100644 --- a/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt +++ b/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt @@ -1,17 +1,41 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2022 Tobias Kaminsky * SPDX-FileCopyrightText: 2022 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ package com.owncloud.android.datamodel +import com.owncloud.android.lib.resources.shares.ShareType +import com.owncloud.android.lib.resources.shares.ShareeUser import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertTrue import org.junit.Test class OCFileTest { + @Test + fun testShareesDefaultsToEmptyMutableList() { + val sut = OCFile("/") + + assertTrue(sut.sharees.isEmpty()) + + sut.sharees.add(ShareeUser("alice", "Alice", ShareType.USER)) + assertEquals(1, sut.sharees.size) + } + + @Test + fun testShareesStayMutableWhenSetFromImmutableList() { + val sut = OCFile("/") + + sut.sharees = listOf(ShareeUser("alice", "Alice", ShareType.USER)) + + sut.sharees.add(ShareeUser("bob", "Bob", ShareType.USER)) + assertEquals(2, sut.sharees.size) + } + @Test fun testLongIds() { val sut = OCFile("/")