Browse Source

wip

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 4 years ago
parent
commit
996b0f0e67

+ 5 - 5
build.gradle

@@ -271,11 +271,11 @@ android {
 dependencies {
     // dependencies for app building
     implementation 'androidx.multidex:multidex:2.0.1'
-//    implementation project('nextcloud-android-library')
-    genericImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
-    gplayImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
-    versionDevImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
-    qaImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
+    implementation project('nextcloud-android-library')
+//    genericImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
+//    gplayImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
+//    versionDevImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
+//    qaImplementation "com.github.nextcloud:android-library:$androidLibraryVersion"
 
     kapt 'javax.xml.bind:jaxb-api:2.3.1'
     kapt 'org.glassfish.jaxb:jaxb-core:2.3.0.1'

+ 2 - 2
settings.gradle

@@ -1,2 +1,2 @@
-include ':'
-//include ':nextcloud-android-library'
+//include ':'
+include ':nextcloud-android-library'

+ 21 - 13
src/main/java/com/owncloud/android/ui/adapter/PublicShareViewHolder.java → src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java

@@ -27,38 +27,46 @@ import android.text.TextUtils;
 import android.view.View;
 
 import com.owncloud.android.R;
-import com.owncloud.android.databinding.FileDetailsSharePublicLinkItemBinding;
+import com.owncloud.android.databinding.FileDetailsShareLinkShareItemBinding;
 import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.utils.ThemeUtils;
 
 import androidx.annotation.NonNull;
+import androidx.core.content.res.ResourcesCompat;
 import androidx.recyclerview.widget.RecyclerView;
 
-class PublicShareViewHolder extends RecyclerView.ViewHolder {
-    private FileDetailsSharePublicLinkItemBinding binding;
+class LinkShareViewHolder extends RecyclerView.ViewHolder {
+    private FileDetailsShareLinkShareItemBinding binding;
     private Context context;
 
-    public PublicShareViewHolder(@NonNull View itemView) {
+    public LinkShareViewHolder(@NonNull View itemView) {
         super(itemView);
     }
 
-    public PublicShareViewHolder(FileDetailsSharePublicLinkItemBinding binding, Context context) {
+    public LinkShareViewHolder(FileDetailsShareLinkShareItemBinding binding, Context context) {
         this(binding.getRoot());
         this.binding = binding;
         this.context = context;
     }
 
     public void bind(OCShare publicShare, ShareeListAdapterListener listener) {
-        if (!TextUtils.isEmpty(publicShare.getLabel())) {
-            String text = String.format(context.getString(R.string.share_link), publicShare.getLabel());
-            binding.publicShareLabel.setText(text);
+        if (ShareType.EMAIL == publicShare.getShareType()) {
+            binding.name.setText(publicShare.getSharedWithDisplayName());
+            binding.icon.setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),
+                                                                      R.drawable.ic_email,
+                                                                      null));
+            binding.copyLink.setVisibility(View.GONE);
+        } else {
+            if (!TextUtils.isEmpty(publicShare.getLabel())) {
+                String text = String.format(context.getString(R.string.share_link), publicShare.getLabel());
+                binding.name.setText(text);
+            }
         }
 
-        ThemeUtils.colorIconImageViewWithBackground(binding.copyInternalLinkIcon, context);
+        ThemeUtils.colorIconImageViewWithBackground(binding.icon, context);
 
-        binding.shareLinkCopyIcon.setOnClickListener(v -> listener.copyLink(publicShare));
-
-        binding.overflowMenuShareLink.setOnClickListener(
-            v -> listener.showLinkOverflowMenu(publicShare, binding.overflowMenuShareLink));
+        binding.copyLink.setOnClickListener(v -> listener.copyLink(publicShare));
+        binding.overflowMenu.setOnClickListener(v -> listener.showLinkOverflowMenu(publicShare, binding.overflowMenu));
     }
 }

+ 13 - 14
src/main/java/com/owncloud/android/ui/adapter/UserViewHolder.java → src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java

@@ -27,7 +27,7 @@ import android.view.View;
 import android.widget.ImageView;
 
 import com.owncloud.android.R;
-import com.owncloud.android.databinding.FileDetailsShareUserItemBinding;
+import com.owncloud.android.databinding.FileDetailsShareShareItemBinding;
 import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.ui.TextDrawable;
 
@@ -37,16 +37,16 @@ import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
 
-class UserViewHolder extends RecyclerView.ViewHolder {
-    private FileDetailsShareUserItemBinding binding;
+class ShareViewHolder extends RecyclerView.ViewHolder {
+    private FileDetailsShareShareItemBinding binding;
     private float avatarRadiusDimension;
     private Context context;
 
-    public UserViewHolder(@NonNull View itemView) {
+    public ShareViewHolder(@NonNull View itemView) {
         super(itemView);
     }
 
-    public UserViewHolder(FileDetailsShareUserItemBinding binding, Context context) {
+    public ShareViewHolder(FileDetailsShareShareItemBinding binding, Context context) {
         this(binding.getRoot());
         this.binding = binding;
         this.context = context;
@@ -62,34 +62,33 @@ class UserViewHolder extends RecyclerView.ViewHolder {
         switch (share.getShareType()) {
             case GROUP:
                 name = context.getString(R.string.share_group_clarification, name);
-                setImage(binding.avatar, name, R.drawable.ic_group);
+                setImage(binding.icon, name, R.drawable.ic_group);
                 break;
             case EMAIL:
                 name = context.getString(R.string.share_email_clarification, name);
-                setImage(binding.avatar, name, R.drawable.ic_email);
+                setImage(binding.icon, name, R.drawable.ic_email);
                 break;
             case ROOM:
                 name = context.getString(R.string.share_room_clarification, name);
-                setImage(binding.avatar, name, R.drawable.ic_chat_bubble);
+                setImage(binding.icon, name, R.drawable.ic_chat_bubble);
                 break;
             case CIRCLE:
-                binding.avatar.setImageResource(R.drawable.ic_circles);
+                binding.icon.setImageResource(R.drawable.ic_circles);
                 break;
             default:
-                setImage(binding.avatar, name, R.drawable.ic_user);
+                setImage(binding.icon, name, R.drawable.ic_user);
                 break;
         }
 
         binding.name.setText(name);
 
         if (share.getShareWith().equalsIgnoreCase(userId) || share.getUserId().equalsIgnoreCase(userId)) {
-            binding.editShareButton.setVisibility(View.VISIBLE);
+            binding.overflowMenu.setVisibility(View.VISIBLE);
 
             // bind listener to edit privileges
-            binding.editShareButton.setOnClickListener(v -> listener.showUserOverflowMenu(share,
-                                                                                          binding.editShareButton));
+            binding.overflowMenu.setOnClickListener(v -> listener.showUserOverflowMenu(share, binding.overflowMenu));
         } else {
-            binding.editShareButton.setVisibility(View.GONE);
+            binding.overflowMenu.setVisibility(View.GONE);
         }
     }
 

+ 38 - 21
src/main/java/com/owncloud/android/ui/adapter/ShareeListAdapter.java

@@ -32,12 +32,13 @@ import android.view.ViewGroup;
 import android.widget.ImageView;
 
 import com.owncloud.android.R;
-import com.owncloud.android.databinding.FileDetailsSharePublicLinkItemBinding;
-import com.owncloud.android.databinding.FileDetailsShareUserItemBinding;
+import com.owncloud.android.databinding.FileDetailsShareLinkShareItemBinding;
+import com.owncloud.android.databinding.FileDetailsShareShareItemBinding;
 import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.utils.DisplayUtils;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -67,7 +68,7 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
         avatarRadiusDimension = context.getResources().getDimension(R.dimen.user_icon_radius);
 
-        sort(this.shares);
+        sortShares();
     }
 
     @Override
@@ -81,15 +82,15 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
         switch (ShareType.fromValue(viewType)) {
             case PUBLIC_LINK:
             case EMAIL:
-                return new PublicShareViewHolder(FileDetailsSharePublicLinkItemBinding.inflate(LayoutInflater.from(context),
-                                                                                               parent,
-                                                                                               false),
-                                                 context);
+                return new LinkShareViewHolder(FileDetailsShareLinkShareItemBinding.inflate(LayoutInflater.from(context),
+                                                                                            parent,
+                                                                                            false),
+                                               context);
             default:
-                return new UserViewHolder(FileDetailsShareUserItemBinding.inflate(LayoutInflater.from(context),
-                                                                                  parent,
-                                                                                  false),
-                                          context);
+                return new ShareViewHolder(FileDetailsShareShareItemBinding.inflate(LayoutInflater.from(context),
+                                                                                    parent,
+                                                                                    false),
+                                           context);
         }
     }
 
@@ -101,11 +102,11 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
         final OCShare share = shares.get(position);
 
-        if (holder instanceof PublicShareViewHolder) {
-            PublicShareViewHolder publicShareViewHolder = (PublicShareViewHolder) holder;
+        if (holder instanceof LinkShareViewHolder) {
+            LinkShareViewHolder publicShareViewHolder = (LinkShareViewHolder) holder;
             publicShareViewHolder.bind(share, listener);
         } else {
-            UserViewHolder userViewHolder = (UserViewHolder) holder;
+            ShareViewHolder userViewHolder = (ShareViewHolder) holder;
             userViewHolder.bind(share, listener, userId, avatarRadiusDimension);
         }
     }
@@ -122,7 +123,7 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
     public void addShares(List<OCShare> sharesToAdd) {
         shares.addAll(sharesToAdd);
-        sort(shares);
+        sortShares();
         notifyDataSetChanged();
     }
 
@@ -148,13 +149,29 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
         notifyDataSetChanged();
     }
 
-    private void sort(List<OCShare> shares) {
-        Collections.sort(shares, (o1, o2) -> {
-            if (o1.getShareType() != o2.getShareType()) {
-                return o1.getShareType().compareTo(o2.getShareType());
+    /**
+     * sort all by creation time, then email/link shares on top
+     */
+    protected void sortShares() {
+        List<OCShare> links = new ArrayList<>();
+        List<OCShare> users = new ArrayList<>();
+
+        for (OCShare share : shares) {
+            if (ShareType.PUBLIC_LINK == share.getShareType() || ShareType.EMAIL == share.getShareType()) {
+                links.add(share);
+            } else {
+                users.add(share);
             }
+        }
+
+        Collections.sort(links, (o1, o2) -> Long.compare(o2.getSharedDate(), o1.getSharedDate()));
+        Collections.sort(users, (o1, o2) -> Long.compare(o2.getSharedDate(), o1.getSharedDate()));
+
+        shares = links;
+        shares.addAll(users);
+    }
 
-            return o1.getSharedWithDisplayName().compareTo(o2.getSharedWithDisplayName());
-        });
+    protected List<OCShare> getShares() {
+        return shares;
     }
 }

+ 44 - 74
src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java

@@ -38,13 +38,12 @@ import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
 
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
+import com.owncloud.android.databinding.FileDetailsSharingFragmentBinding;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.OwnCloudAccount;
@@ -77,14 +76,9 @@ import javax.inject.Inject;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.widget.PopupMenu;
-import androidx.appcompat.widget.SearchView;
 import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-import butterknife.BindView;
-import butterknife.ButterKnife;
 import butterknife.OnClick;
-import butterknife.Unbinder;
 
 public class FileDetailSharingFragment extends Fragment implements ShareeListAdapterListener,
     DisplayUtils.AvatarGenerationListener,
@@ -102,37 +96,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     private FileActivity fileActivity;
     private FileDataStorageManager fileDataStorageManager;
 
-    private Unbinder unbinder;
-
-    @BindView(R.id.searchView)
-    SearchView searchView;
-
-    @BindView(R.id.sharesList)
-    RecyclerView sharesList;
-
-    @BindView(R.id.new_public_share)
-    View addPublicShare;
-
-    @BindView(R.id.shared_with_you_container)
-    LinearLayout sharedWithYouContainer;
-
-    @BindView(R.id.shared_with_you_avatar)
-    ImageView sharedWithYouAvatar;
-
-    @BindView(R.id.shared_with_you_username)
-    TextView sharedWithYouUsername;
-
-    @BindView(R.id.shared_with_you_note_container)
-    View sharedWithYouNoteContainer;
-
-    @BindView(R.id.shared_with_you_note)
-    TextView sharedWithYouNote;
-
-    @BindView(R.id.copy_internal_link_icon)
-    ImageView internalLinkIcon;
-
-    @BindView(R.id.shareInternalLinkText)
-    TextView internalLinkText;
+    private FileDetailsSharingFragmentBinding binding;
 
     @Inject UserAccountManager accountManager;
 
@@ -185,8 +149,8 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
 
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.file_details_sharing_fragment, container, false);
-        unbinder = ButterKnife.bind(this, view);
+        binding = FileDetailsSharingFragmentBinding.inflate(inflater, container, false);
+        View view = binding.getRoot();
 
         fileOperationsHelper = fileActivity.getFileOperationsHelper();
         fileDataStorageManager = fileActivity.getStorageManager();
@@ -194,15 +158,15 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
         setupView();
 
         // todo extract
-        internalLinkIcon.getBackground().setColorFilter(getResources().getColor(R.color.grey_db),
-                                                        PorterDuff.Mode.SRC_IN);
-        internalLinkIcon.getDrawable().mutate().setColorFilter(getResources().getColor(R.color.black),
-                                                               PorterDuff.Mode.SRC_IN);
+        binding.copyInternalLinkIcon.getBackground().setColorFilter(getResources().getColor(R.color.grey_db),
+                                                                    PorterDuff.Mode.SRC_IN);
+        binding.copyInternalLinkIcon.getDrawable().mutate().setColorFilter(getResources().getColor(R.color.black),
+                                                                           PorterDuff.Mode.SRC_IN);
 
         if (file.isFolder()) {
-            internalLinkText.setText(getString(R.string.share_internal_link_to_folder_text));
+            binding.shareInternalLinkText.setText(getString(R.string.share_internal_link_to_folder_text));
         } else {
-            internalLinkText.setText(getString(R.string.share_internal_link_to_file_text));
+            binding.shareInternalLinkText.setText(getString(R.string.share_internal_link_to_file_text));
         }
 
         return view;
@@ -211,7 +175,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     @Override
     public void onDestroy() {
         super.onDestroy();
-        unbinder.unbind();
+        binding = null;
     }
 
     @Override
@@ -226,16 +190,17 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
         setShareWithYou();
 
         FileDetailSharingFragmentHelper.setupSearchView(
-            (SearchManager) fileActivity.getSystemService(Context.SEARCH_SERVICE), searchView,
+            (SearchManager) fileActivity.getSystemService(Context.SEARCH_SERVICE),
+            binding.searchView,
             fileActivity.getComponentName());
-        ThemeUtils.themeSearchView(searchView, requireContext());
+        ThemeUtils.themeSearchView(binding.searchView, requireContext());
 
         if (file.canReshare()) {
             setShareWithUserInfo();
         } else {
-            searchView.setQueryHint(getResources().getString(R.string.reshare_not_allowed));
-            searchView.setInputType(InputType.TYPE_NULL);
-            disableSearchView(searchView);
+            binding.searchView.setQueryHint(getResources().getString(R.string.reshare_not_allowed));
+            binding.searchView.setInputType(InputType.TYPE_NULL);
+            disableSearchView(binding.searchView);
         }
     }
 
@@ -253,22 +218,27 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
 
     private void setShareWithYou() {
         if (accountManager.userOwnsFile(file, user)) {
-            sharedWithYouContainer.setVisibility(View.GONE);
+            binding.sharedWithYouContainer.setVisibility(View.GONE);
         } else {
-            sharedWithYouUsername.setText(
+            binding.sharedWithYouUsername.setText(
                 String.format(getString(R.string.shared_with_you_by), file.getOwnerDisplayName()));
-            DisplayUtils.setAvatar(user, file.getOwnerId(), this, getResources().getDimension(
-                R.dimen.file_list_item_avatar_icon_radius), getResources(), sharedWithYouAvatar,
-                getContext());
-            sharedWithYouAvatar.setVisibility(View.VISIBLE);
+            DisplayUtils.setAvatar(user,
+                                   file.getOwnerId(),
+                                   this,
+                                   getResources().getDimension(
+                                       R.dimen.file_list_item_avatar_icon_radius),
+                                   getResources(),
+                                   binding.sharedWithYouAvatar,
+                                   getContext());
+            binding.sharedWithYouAvatar.setVisibility(View.VISIBLE);
 
             String note = file.getNote();
 
             if (!TextUtils.isEmpty(note)) {
-                sharedWithYouNote.setText(file.getNote());
-                sharedWithYouNoteContainer.setVisibility(View.VISIBLE);
+                binding.sharedWithYouNote.setText(file.getNote());
+                binding.sharedWithYouNoteContainer.setVisibility(View.VISIBLE);
             } else {
-                sharedWithYouNoteContainer.setVisibility(View.GONE);
+                binding.sharedWithYouNoteContainer.setVisibility(View.GONE);
             }
         }
     }
@@ -284,15 +254,15 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
             String userId = accountManager.getUserData(user.toPlatformAccount(),
                                                        com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID);
 
-            sharesList.setVisibility(View.VISIBLE);
-            sharesList.setAdapter(new ShareeListAdapter(fileActivity,
-                                                        shares,
-                                                        this,
-                                                        userId));
-            sharesList.setLayoutManager(new LinearLayoutManager(getContext()));
-            sharesList.addItemDecoration(new SimpleListItemDividerDecoration(getContext()));
+            binding.sharesList.setVisibility(View.VISIBLE);
+            binding.sharesList.setAdapter(new ShareeListAdapter(fileActivity,
+                                                                shares,
+                                                                this,
+                                                                userId));
+            binding.sharesList.setLayoutManager(new LinearLayoutManager(getContext()));
+            binding.sharesList.addItemDecoration(new SimpleListItemDividerDecoration(getContext()));
         } else {
-            sharesList.setVisibility(View.GONE);
+            binding.sharesList.setVisibility(View.GONE);
         }
     }
 
@@ -469,7 +439,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
             }
             case R.id.action_unshare: {
                 unshareWith(share);
-                ((ShareeListAdapter) sharesList.getAdapter()).remove(share);
+                ((ShareeListAdapter) binding.sharesList.getAdapter()).remove(share);
                 return true;
             }
             case R.id.action_password: {
@@ -642,7 +612,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
                                                                              "");
 
         if (shares.isEmpty()) {
-            addPublicShare.setVisibility(View.VISIBLE);
+            binding.fileDetailsSharePublicLinkAddNewItemInclude.addPublicShare.setVisibility(View.VISIBLE);
             ImageView icon = requireView().findViewById(R.id.copy_internal_link_icon);
             icon.getBackground().setColorFilter(requireContext()
                                                     .getResources()
@@ -652,8 +622,8 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
                                                        PorterDuff.Mode.SRC_IN);
             requireView().findViewById(R.id.add_new_public_share_link).setOnClickListener(v -> createShareLink());
         } else {
-            addPublicShare.setVisibility(View.GONE);
-            ((ShareeListAdapter) sharesList.getAdapter()).addShares(shares);
+            binding.fileDetailsSharePublicLinkAddNewItemInclude.addPublicShare.setVisibility(View.GONE);
+            ((ShareeListAdapter) binding.sharesList.getAdapter()).addShares(shares);
         }
     }
 
@@ -667,7 +637,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
 
     @Override
     public void avatarGenerated(Drawable avatarDrawable, Object callContext) {
-        sharedWithYouAvatar.setImageDrawable(avatarDrawable);
+        binding.sharedWithYouAvatar.setImageDrawable(avatarDrawable);
     }
 
     @Override

+ 10 - 10
src/main/res/layout/file_details_share_public_link_item.xml → src/main/res/layout/file_details_share_link_share_item.xml

@@ -29,7 +29,7 @@
     android:orientation="horizontal">
 
     <ImageView
-        android:id="@+id/copy_internal_link_icon"
+        android:id="@+id/icon"
         android:layout_width="@dimen/share_icon_size"
         android:layout_height="@dimen/share_icon_size"
         android:layout_gravity="center_vertical"
@@ -41,33 +41,33 @@
         android:src="@drawable/shared_via_link" />
 
     <TextView
-        android:id="@+id/public_share_label"
-        android:layout_width="wrap_content"
+        android:id="@+id/name"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
         android:textColor="@color/text_color"
         android:ellipsize="end"
         android:singleLine="true"
+        android:layout_weight="1"
         android:gravity="center_vertical"
         android:textSize="@dimen/file_details_username_text_size"
         android:text="@string/share_via_link_section_title" />
 
     <ImageView
-        android:id="@+id/share_link_copy_icon"
-        android:layout_width="0dp"
+        android:id="@+id/copy_link"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
-        android:layout_weight="1"
         android:contentDescription="@string/copy_link"
-        android:paddingStart="@dimen/standard_half_margin"
         android:paddingTop="@dimen/standard_quarter_margin"
-        android:paddingEnd="@dimen/standard_eighth_margin"
         android:paddingBottom="@dimen/standard_quarter_margin"
-        android:scaleType="fitStart"
+        android:scaleType="fitCenter"
+        android:paddingStart="@dimen/standard_padding"
+        android:paddingEnd="@dimen/standard_padding"
         android:src="@drawable/ic_content_copy" />
 
     <ImageView
-        android:id="@+id/overflow_menu_share_link"
+        android:id="@+id/overflow_menu"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:contentDescription="@string/overflow_menu"

+ 1 - 1
src/main/res/layout/file_details_share_public_link_add_new_item.xml

@@ -23,7 +23,7 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/new_public_share"
+    android:id="@+id/add_public_share"
     android:layout_width="match_parent"
     android:layout_height="@dimen/standard_list_item_size"
     android:orientation="horizontal"

+ 2 - 2
src/main/res/layout/file_details_share_user_item.xml → src/main/res/layout/file_details_share_share_item.xml

@@ -26,7 +26,7 @@
     tools:ignore="UseCompoundDrawables">
 
         <ImageView
-            android:id="@+id/avatar"
+            android:id="@+id/icon"
             android:layout_width="@dimen/user_icon_size"
             android:layout_height="@dimen/user_icon_size"
             android:layout_gravity="center_vertical"
@@ -53,7 +53,7 @@
             android:textSize="@dimen/file_details_username_text_size" />
 
         <ImageView
-            android:id="@+id/editShareButton"
+            android:id="@+id/overflow_menu"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"

+ 3 - 1
src/main/res/layout/file_details_sharing_fragment.xml

@@ -98,7 +98,9 @@
             </LinearLayout>
         </LinearLayout>
 
-        <include layout="@layout/file_details_share_public_link_add_new_item" />
+        <include
+            android:id="@+id/file_details_share_public_link_add_new_item_include"
+            layout="@layout/file_details_share_public_link_add_new_item" />
 
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/sharesList"

+ 101 - 0
src/test/java/com/owncloud/android/ui/adapter/ShareeListAdapterTest.java

@@ -0,0 +1,101 @@
+/*
+ *
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2020 Tobias Kaminsky
+ * Copyright (C) 2020 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package com.owncloud.android.ui.adapter;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.resources.shares.ShareType;
+
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertTrue;
+
+public class ShareeListAdapterTest {
+    @Mock
+    private Context context;
+
+    @Test
+    public void testSorting() {
+        MockitoAnnotations.initMocks(this);
+        Resources resources = Mockito.mock(Resources.class);
+        Mockito.when(context.getResources()).thenReturn(resources);
+
+        List<OCShare> expectedSortOrder = new ArrayList<>();
+        expectedSortOrder.add(new OCShare("/1")
+                                  .setShareType(ShareType.EMAIL)
+                                  .setSharedDate(1004));
+        expectedSortOrder.add(new OCShare("/2")
+                                  .setShareType(ShareType.PUBLIC_LINK)
+                                  .setSharedDate(1003));
+        expectedSortOrder.add(new OCShare("/3")
+                                  .setShareType(ShareType.PUBLIC_LINK)
+                                  .setSharedDate(1001));
+        expectedSortOrder.add(new OCShare("/4")
+                                  .setShareType(ShareType.EMAIL)
+                                  .setSharedDate(1000));
+        expectedSortOrder.add(new OCShare("/5")
+                                  .setShareType(ShareType.USER)
+                                  .setSharedDate(80));
+        expectedSortOrder.add(new OCShare("/6")
+                                  .setShareType(ShareType.CIRCLE)
+                                  .setSharedDate(20));
+
+        List<OCShare> randomOrder = new ArrayList<>(expectedSortOrder);
+        Collections.shuffle(randomOrder);
+
+        ShareeListAdapter sut = new ShareeListAdapter(context, randomOrder, null, null);
+
+        sut.sortShares();
+
+        // compare
+        boolean compare = true;
+        for (int i = 0; i < expectedSortOrder.size() && compare; i++) {
+            compare = expectedSortOrder.get(i) == sut.getShares().get(i);
+        }
+
+        if (!compare) {
+            System.out.println("Expected:");
+
+            for (OCShare item : expectedSortOrder) {
+                System.out.println(item.getPath() + " " + item.getShareType() + " " + item.getSharedDate());
+            }
+
+            System.out.println();
+            System.out.println("Actual:");
+            for (OCShare item : sut.getShares()) {
+                System.out.println(item.getPath() + " " + item.getShareType() + " " + item.getSharedDate());
+            }
+        }
+
+        assertTrue(compare);
+    }
+}