Browse Source

Merge pull request #1613 from rhari991/file-list-actions

Add options for operations on single files
Andy Scherzinger 7 years ago
parent
commit
620f9db9b5
23 changed files with 185 additions and 70 deletions
  1. 12 6
      src/main/java/com/owncloud/android/files/FileMenuFilter.java
  2. 48 33
      src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java
  3. 1 0
      src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
  4. 2 1
      src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
  5. 45 9
      src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
  6. 10 1
      src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java
  7. 2 1
      src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java
  8. 2 1
      src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java
  9. 2 1
      src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java
  10. 0 0
      src/main/res/drawable-hdpi/ic_unshared.png
  11. BIN
      src/main/res/drawable-hdpi/shared_via_link.png
  12. 0 0
      src/main/res/drawable-mdpi/ic_unshared.png
  13. BIN
      src/main/res/drawable-mdpi/shared_via_link.png
  14. 0 0
      src/main/res/drawable-xhdpi/ic_unshared.png
  15. BIN
      src/main/res/drawable-xhdpi/shared_via_link.png
  16. 0 0
      src/main/res/drawable-xxhdpi/ic_unshared.png
  17. BIN
      src/main/res/drawable-xxhdpi/shared_via_link.png
  18. 0 0
      src/main/res/drawable-xxxhdpi/ic_unshared.png
  19. BIN
      src/main/res/drawable-xxxhdpi/shared_via_link.png
  20. 18 0
      src/main/res/drawable/shared_via_link.xml
  21. 12 0
      src/main/res/drawable/shared_via_users.xml
  22. 30 17
      src/main/res/layout/list_item.xml
  23. 1 0
      src/main/res/values/dims.xml

+ 12 - 6
src/main/java/com/owncloud/android/files/FileMenuFilter.java

@@ -52,6 +52,7 @@ public class FileMenuFilter {
     private ComponentsGetter mComponentsGetter;
     private Account mAccount;
     private Context mContext;
+    private boolean mOverflowMenu;
 
     /**
      * Constructor
@@ -61,14 +62,16 @@ public class FileMenuFilter {
      * @param account           ownCloud {@link Account} holding targetFile.
      * @param cg                Accessor to app components, needed to access synchronization services
      * @param context           Android {@link Context}, needed to access build setup resources.
+     * @param overflowMenu      true if the overflow menu items are being filtered
      */
     public FileMenuFilter(int numberOfAllFiles, Collection<OCFile> targetFiles, Account account,
-                          ComponentsGetter cg, Context context) {
+                          ComponentsGetter cg, Context context, boolean overflowMenu) {
         mNumberOfAllFiles = numberOfAllFiles;
         mFiles = targetFiles;
         mAccount = account;
         mComponentsGetter = cg;
         mContext = context;
+        mOverflowMenu = overflowMenu;
     }
 
     /**
@@ -78,9 +81,11 @@ public class FileMenuFilter {
      * @param account           ownCloud {@link Account} holding targetFile.
      * @param cg                Accessor to app components, needed to access synchronization services
      * @param context           Android {@link Context}, needed to access build setup resources.
+     * @param overflowMenu      true if the overflow menu items are being filtered
      */
-    public FileMenuFilter(OCFile targetFile, Account account, ComponentsGetter cg, Context context) {
-        this(1, Collections.singletonList(targetFile), account, cg, context);
+    public FileMenuFilter(OCFile targetFile, Account account, ComponentsGetter cg, Context context,
+                          boolean overflowMenu) {
+        this(1, Collections.singletonList(targetFile), account, cg, context, overflowMenu);
     }
 
     /**
@@ -178,7 +183,7 @@ public class FileMenuFilter {
         // SELECT ALL
         if (!inSingleFileFragment) {
             // Show only if at least one item isn't selected.
-            if (mFiles.size() >= mNumberOfAllFiles) {
+            if (mFiles.size() >= mNumberOfAllFiles || mOverflowMenu) {
                 toHide.add(R.id.action_select_all_action_menu);
             } else {
                 toShow.add(R.id.action_select_all_action_menu);
@@ -191,7 +196,7 @@ public class FileMenuFilter {
         // DESELECT ALL
         if (!inSingleFileFragment) {
             // Show only if at least one item is selected.
-            if (mFiles.isEmpty()) {
+            if (mFiles.isEmpty() || mOverflowMenu) {
                 toHide.add(R.id.action_deselect_all_action_menu);
             } else {
                 toShow.add(R.id.action_deselect_all_action_menu);
@@ -235,7 +240,8 @@ public class FileMenuFilter {
                 (capability.getFilesSharingApiEnabled().isTrue() ||
                         capability.getFilesSharingApiEnabled().isUnknown()
                 );
-        if ((!shareViaLinkAllowed && !shareWithUsersAllowed) || !isSingleSelection() || !shareApiEnabled) {
+        if ((!shareViaLinkAllowed && !shareWithUsersAllowed) ||
+                !isSingleSelection() || !shareApiEnabled || mOverflowMenu) {
             toHide.add(R.id.action_share_file);
         } else {
             toShow.add(R.id.action_share_file);

+ 48 - 33
src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -26,7 +26,6 @@ package com.owncloud.android.ui.adapter;
 import android.accounts.Account;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.os.Handler;
@@ -62,8 +61,6 @@ import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.operations.RemoteOperationFailedException;
 import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
 import com.owncloud.android.ui.activity.ComponentsGetter;
-import com.owncloud.android.ui.activity.FileActivity;
-import com.owncloud.android.ui.activity.ShareActivity;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
 import com.owncloud.android.utils.DisplayUtils;
@@ -234,10 +231,6 @@ public class FileListListAdapter extends BaseAdapter {
 
         if (file != null) {
             ImageView fileIcon = (ImageView) view.findViewById(R.id.thumbnail);
-            ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon);
-            if (file.isSharedWithSharee() || file.isSharedWithMe()) {
-                sharedIconV.setImageResource(R.drawable.shared_via_users);
-            }
 
             fileIcon.setTag(file.getFileId());
             TextView fileName;
@@ -258,21 +251,6 @@ public class FileListListAdapter extends BaseAdapter {
                     fileSizeV.setVisibility(View.VISIBLE);
                     fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));
 
-                    // Shared icon clickable
-                    if (file.isSharedViaLink() || file.isSharedWithSharee()) {
-                        final OCFile temp = file;
-                        sharedIconV.setOnClickListener(new View.OnClickListener() {
-                            @Override
-                            public void onClick(View view) {
-                                Intent intent = new Intent(mContext, ShareActivity.class);
-                                intent.putExtra(FileActivity.EXTRA_FILE, temp);
-                                intent.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount);
-                                mContext.startActivity(intent);
-                            }
-                        });
-                    }
-
-
                 case GRID_ITEM:
                     // filename
                     fileName = (TextView) view.findViewById(R.id.Filename);
@@ -284,16 +262,6 @@ public class FileListListAdapter extends BaseAdapter {
                     }
 
                 case GRID_IMAGE:
-                    // sharedIcon
-                    if (file.isSharedViaLink()) {
-                        sharedIconV.setVisibility(View.VISIBLE);
-                        sharedIconV.bringToFront();
-                    } else if (file.isSharedWithSharee() || file.isSharedWithMe()) {
-                        sharedIconV.setVisibility(View.VISIBLE);
-                        sharedIconV.bringToFront();
-                    } else {
-                        sharedIconV.setVisibility(View.GONE);
-                    }
 
                     // local state
                     ImageView localStateView = (ImageView) view.findViewById(R.id.localFileIndicator);
@@ -340,7 +308,6 @@ public class FileListListAdapter extends BaseAdapter {
             }
 
             ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox);
-            checkBoxV.setVisibility(View.GONE);
             view.setBackgroundColor(Color.WHITE);
 
             AbsListView parentList = (AbsListView) parent;
@@ -355,6 +322,12 @@ public class FileListListAdapter extends BaseAdapter {
                     checkBoxV.setImageResource(R.drawable.ic_checkbox_blank_outline);
                 }
                 checkBoxV.setVisibility(View.VISIBLE);
+                hideShareIcon(view);
+                hideOverflowMenuIcon(view, viewType);
+            } else {
+                checkBoxV.setVisibility(View.GONE);
+                showShareIcon(view, file);
+                showOverflowMenuIcon(view, file, viewType);
             }
 
             // this if-else is needed even though kept-in-sync icon is visible by default
@@ -430,6 +403,48 @@ public class FileListListAdapter extends BaseAdapter {
         return view;
     }
 
+    private void showShareIcon(View view, OCFile file) {
+        ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon);
+        sharedIconV.setVisibility(View.VISIBLE);
+        if (file.isSharedWithSharee() || file.isSharedWithMe()) {
+            sharedIconV.setImageResource(R.drawable.shared_via_users);
+        } else if (file.isSharedViaLink()) {
+            sharedIconV.setImageResource(R.drawable.shared_via_link);
+        } else {
+            sharedIconV.setImageResource(R.drawable.ic_unshared);
+        }
+        sharedIconV.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                OCFileListFragmentInterface.onShareIconClick(file);
+            }
+        });
+    }
+
+    private void hideShareIcon(View view) {
+        view.findViewById(R.id.sharedIcon).setVisibility(View.GONE);
+    }
+
+    private void showOverflowMenuIcon(View view, OCFile file, ViewType viewType) {
+        if (ViewType.LIST_ITEM.equals(viewType)) {
+            ImageView overflowIndicatorV = (ImageView) view.findViewById(R.id.overflow_menu);
+            overflowIndicatorV.setVisibility(View.VISIBLE);
+            overflowIndicatorV.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    OCFileListFragmentInterface.onOverflowIconClick(v, file);
+                }
+            });
+        }
+    }
+
+    private void hideOverflowMenuIcon(View view, ViewType viewType) {
+        if (ViewType.LIST_ITEM.equals(viewType)) {
+            ImageView overflowIndicatorV = (ImageView) view.findViewById(R.id.overflow_menu);
+            overflowIndicatorV.setVisibility(View.GONE);
+        }
+    }
+
     @Override
     public int getViewTypeCount() {
         return 1;

+ 1 - 0
src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -178,6 +178,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                 TextView lastModV = (TextView) view.findViewById(R.id.last_mod);
                 lastModV.setVisibility(View.VISIBLE);
                 lastModV.setText(DisplayUtils.getRelativeTimestamp(mContext, file.lastModified()));
+                view.findViewById(R.id.overflow_menu).setVisibility(View.GONE);
             }
 
             if (!file.isDirectory()) {

+ 2 - 1
src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -216,7 +216,8 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
                 getFile(),
                 mContainerActivity.getStorageManager().getAccount(),
                 mContainerActivity,
-                getActivity()
+                getActivity(),
+                false
             );
             mf.filter(menu, true);
         }

+ 45 - 9
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -53,6 +53,7 @@ import android.view.ViewGroup;
 import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.ListView;
+import android.widget.PopupMenu;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -107,6 +108,7 @@ import org.parceler.Parcels;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -513,6 +515,34 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
         updateFooter();
     }
 
+    @Override
+    public void onShareIconClick(OCFile file) {
+        shareFile(file);
+    }
+
+    @Override
+    public void onOverflowIconClick(View view, OCFile file) {
+        PopupMenu popup = new PopupMenu(getActivity(), view);
+        popup.inflate(R.menu.file_actions_menu);
+        FileMenuFilter mf = new FileMenuFilter(
+                mAdapter.getFiles().size(),
+                Collections.singleton(file),
+                ((FileActivity) getActivity()).getAccount(),
+                mContainerActivity,
+                getActivity(),
+                true
+        );
+        mf.filter(popup.getMenu(), true);
+        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+            @Override
+            public boolean onMenuItemClick(MenuItem item) {
+                ArrayList<OCFile> checkedFiles = new ArrayList<>(Collections.singletonList(file));
+                return onFileActionChosen(item.getItemId(), checkedFiles);
+            }
+        });
+        popup.show();
+    }
+
     /**
      * Handler for multiple selection mode.
      *
@@ -632,7 +662,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
                     checkedFiles,
                     ((FileActivity) getActivity()).getAccount(),
                     mContainerActivity,
-                    getActivity()
+                    getActivity(),
+                    false
             );
             mf.filter(menu, false);
             return true;
@@ -643,7 +674,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
          */
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            return onFileActionChosen(item.getItemId());
+            ArrayList<OCFile> checkedFiles = mAdapter.getCheckedItems(getListView());
+            return onFileActionChosen(item.getItemId(), checkedFiles);
         }
 
         /**
@@ -902,10 +934,10 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
      * Start the appropriate action(s) on the currently selected files given menu selected by the user.
      *
      * @param menuId Identifier of the action menu selected by the user
+     * @param checkedFiles List of files selected by the user on which the action should be performed
      * @return 'true' if the menu selection started any action, 'false' otherwise.
      */
-    public boolean onFileActionChosen(int menuId) {
-        final ArrayList<OCFile> checkedFiles = mAdapter.getCheckedItems(getListView());
+    public boolean onFileActionChosen(int menuId, ArrayList<OCFile> checkedFiles) {
         if (checkedFiles.size() <= 0) {
             return false;
         }
@@ -915,11 +947,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
             OCFile singleFile = checkedFiles.get(0);
             switch (menuId) {
                 case R.id.action_share_file: {
-                    if(singleFile.isSharedWithMe() && !singleFile.canReshare()){
-                        Snackbar.make(getView(), R.string.resharing_is_not_allowed, Snackbar.LENGTH_LONG).show();
-                    } else {
-                        mContainerActivity.getFileOperationsHelper().showShareFile(singleFile);
-                    }
+                    shareFile(singleFile);
                     return true;
                 }
                 case R.id.action_open_file_with: {
@@ -1019,6 +1047,14 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
         }
     }
 
+    private void shareFile(OCFile file) {
+        if(file.isSharedWithMe() && !file.canReshare()){
+            Snackbar.make(getView(), R.string.resharing_is_not_allowed, Snackbar.LENGTH_LONG).show();
+        } else {
+            mContainerActivity.getFileOperationsHelper().showShareFile(file);
+        }
+    }
+
     /**
      * Use this to query the {@link OCFile} that is currently
      * being displayed by this fragment

+ 10 - 1
src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java

@@ -20,12 +20,21 @@
  */
 package com.owncloud.android.ui.interfaces;
 
+import android.view.View;
+
+import com.owncloud.android.datamodel.OCFile;
+
 /**
- * Interface for signaling filter finish
+ * Interface for communication between {@link com.owncloud.android.ui.fragment.OCFileListFragment}
+ * and {@link com.owncloud.android.ui.adapter.FileListListAdapter}
  */
 
 public interface OCFileListFragmentInterface {
     void finishedFiltering();
 
     int getColumnSize();
+
+    void onShareIconClick(OCFile file);
+
+    void onOverflowIconClick(View view, OCFile file);
 }

+ 2 - 1
src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -275,7 +275,8 @@ public class PreviewImageFragment extends FileFragment {
                     getFile(),
                     mContainerActivity.getStorageManager().getAccount(),
                     mContainerActivity,
-                    getActivity()
+                    getActivity(),
+                    false
             );
             mf.filter(menu, true);
         }

+ 2 - 1
src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java

@@ -375,7 +375,8 @@ public class PreviewMediaFragment extends FileFragment implements
                 getFile(),
                 mContainerActivity.getStorageManager().getAccount(),
                 mContainerActivity,
-                getActivity()
+                getActivity(),
+                false
             );
             mf.filter(menu, true);
         }

+ 2 - 1
src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java

@@ -285,7 +285,8 @@ public class PreviewTextFragment extends FileFragment {
                     getFile(),
                     mContainerActivity.getStorageManager().getAccount(),
                     mContainerActivity,
-                    getActivity()
+                    getActivity(),
+                    false
             );
             mf.filter(menu, true);
         }

+ 0 - 0
src/main/res/drawable-hdpi/shared_via_users.png → src/main/res/drawable-hdpi/ic_unshared.png


BIN
src/main/res/drawable-hdpi/shared_via_link.png


+ 0 - 0
src/main/res/drawable-mdpi/shared_via_users.png → src/main/res/drawable-mdpi/ic_unshared.png


BIN
src/main/res/drawable-mdpi/shared_via_link.png


+ 0 - 0
src/main/res/drawable-xhdpi/shared_via_users.png → src/main/res/drawable-xhdpi/ic_unshared.png


BIN
src/main/res/drawable-xhdpi/shared_via_link.png


+ 0 - 0
src/main/res/drawable-xxhdpi/shared_via_users.png → src/main/res/drawable-xxhdpi/ic_unshared.png


BIN
src/main/res/drawable-xxhdpi/shared_via_link.png


+ 0 - 0
src/main/res/drawable-xxxhdpi/shared_via_users.png → src/main/res/drawable-xxxhdpi/ic_unshared.png


BIN
src/main/res/drawable-xxxhdpi/shared_via_link.png


+ 18 - 0
src/main/res/drawable/shared_via_link.xml

@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="16dp"
+        android:height="16dp"
+        android:viewportWidth="16.0"
+        android:viewportHeight="16.0">
+	<path
+        android:fillColor="#FF000000"
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.2"
+        android:strokeMiterLimit="4"
+        android:pathData="M5.99 5.318a3.332 3.332 0 0 0 0 4.693c 0.116 0.118 0.226 0.22 0.355 0.315l1.383-1.383A1.4 1.4 0 0 1 7.33 6.66l3.352-3.352c 0.568-0.57 1.442-0.57 2.01 0s 0.57 1.442 0 2.01l-1.13 1.132c 0.34 0.725 0.464 1.518 0.377 2.304l2.094-2.095c1.288-1.29 1.288-3.406 0-4.694s-3.405-1.288-4.693 0L5.99 5.318z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.2"
+        android:strokeMiterLimit="4"
+        android:pathData="M10.01 10.68a3.332 3.332 0 0 0 0-4.692 3.126 3.126 0 0 0-0.355-0.314L8.272 7.057A1.4 1.4 0 0 1 8.67 9.34l-3.35 3.35c-0.57 0.57-1.444 0.57-2.013 0.002s-0.568-1.442 0-2.01L4.44 9.55a4.288 4.288 0 0 1-0.38-2.305L1.967 9.34c-1.288 1.29-1.288 3.405 0 4.693s3.405 1.29 4.693 0l3.35-3.352z"/>
+</vector>

+ 12 - 0
src/main/res/drawable/shared_via_users.xml

@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="16dp"
+        android:height="16dp"
+        android:viewportWidth="16.0"
+        android:viewportHeight="16.0">
+    <path
+        android:fillColor="#FF000000"
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.2"
+        android:strokeMiterLimit="4"
+        android:pathData="M12.228 1a2.457 2.457 0 0 0-2.46 2.454c0 0.075 0.01 0.15 0.016 0.224L5.05 6.092a2.445 2.445 0 0 0-1.596-0.586A2.453 2.453 0 0 0 1 7.96a2.453 2.453 0 0 0 2.454 2.455 2.45 2.45 0 0 0 1.46-0.477l4.865 2.474c-0.004 0.044-0.01 0.09-0.01 0.134a2.457 2.457 0 1 0 0.804-1.818l-4.696-2.4c 0.02-0.123 0.035-0.25 0.035-0.378 0-0.072-0.01-0.144-0.015-0.214l4.74-2.414A2.457 2.457 0 1 0 12.228 0.99z"/>
+</vector>

+ 30 - 17
src/main/res/layout/list_item.xml

@@ -30,7 +30,6 @@
         android:layout_height="match_parent"
         android:orientation="horizontal">
 
-
         <RelativeLayout
             android:layout_width="72dp"
             android:layout_height="@dimen/standard_list_item_size"
@@ -53,9 +52,8 @@
                 android:layout_alignParentTop="true"
                 android:layout_alignParentRight="true"
                 android:layout_marginRight="4dp"
-                android:src="@drawable/ic_favorite"
-                />
-
+                android:contentDescription="@string/favorite_switch"
+                android:src="@drawable/ic_favorite" />
 
             <ImageView
                 android:id="@+id/keptOfflineIcon"
@@ -74,6 +72,7 @@
                 android:layout_alignParentBottom="true"
                 android:layout_alignParentRight="true"
                 android:scaleType="fitCenter"
+                android:contentDescription="@string/downloader_download_succeeded_ticker"
                 android:layout_marginRight="4dp"/>
 
         </RelativeLayout>
@@ -141,36 +140,50 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
-            android:paddingRight="@dimen/standard_padding">
+            android:paddingLeft="@dimen/alternate_padding"
+            android:paddingRight="@dimen/alternate_padding">
 
             <ImageView
                 android:id="@+id/sharedIcon"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_marginTop="@dimen/standard_quarter_margin"
-                android:layout_marginLeft="@dimen/standard_quarter_margin"
-                android:layout_marginBottom="@dimen/standard_quarter_margin"
-                android:layout_marginRight="@dimen/standard_quarter_margin"
-                android:src="@drawable/shared_via_link" />
+                android:layout_centerVertical="true"
+                android:layout_marginRight="@dimen/list_item_share_right_margin"
+                android:padding="@dimen/standard_quarter_padding"
+                android:clickable="true"
+                android:focusable="true"
+                android:src="@drawable/ic_unshared" />
 
             <ImageView
                 android:id="@+id/custom_checkbox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_marginLeft="@dimen/standard_quarter_margin"
+                android:layout_centerVertical="true"
+                android:layout_marginLeft="@dimen/standard_half_margin"
+                android:layout_marginRight="@dimen/standard_half_margin"
+                android:layout_toRightOf="@id/sharedIcon"
+                android:clickable="true"
+                android:focusable="true"
+                android:src="@drawable/ic_checkbox_blank_outline" />
 
-                android:src="@drawable/ic_checkbox_blank_outline"
-                android:layout_toRightOf="@id/sharedIcon"/>
-        </RelativeLayout>
+            <ImageView
+                android:id="@+id/overflow_menu"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_marginLeft="@dimen/standard_half_margin"
+                android:layout_toRightOf="@id/custom_checkbox"
+                android:clickable="true"
+                android:focusable="true"
+                android:src="@drawable/ic_dots_vertical" />
 
+        </RelativeLayout>
 
     </LinearLayout>
 
     <View
         android:layout_width="match_parent"
         android:layout_height="1dp"
-        android:background="@color/list_divider_background"></View>
+        android:background="@color/list_divider_background" />
 
 </LinearLayout>

+ 1 - 0
src/main/res/values/dims.xml

@@ -47,6 +47,7 @@
     <dimen name="two_line_secondary_text_size">14sp</dimen>
     <dimen name="list_item_avatar_icon_margin">20dp</dimen>
     <dimen name="list_item_avatar_text_margin">20dp</dimen>
+    <dimen name="list_item_share_right_margin">10dp</dimen>
     <dimen name="account_action_layout_height">72dp</dimen>
     <dimen name="zero">0dp</dimen>
     <dimen name="account_item_layout_height">72dp</dimen>