Browse Source

Feature request: Select all (particularly in search) #637

Jonas Sandrock 7 years ago
parent
commit
6d25c26a8a

+ 21 - 2
src/main/java/com/owncloud/android/files/FileMenuFilter.java

@@ -47,6 +47,7 @@ public class FileMenuFilter {
 
     private static final int SINGLE_SELECT_ITEMS = 1;
 
+    private int mNumberOfAllFiles;
     private Collection<OCFile> mFiles;
     private ComponentsGetter mComponentsGetter;
     private Account mAccount;
@@ -55,12 +56,14 @@ public class FileMenuFilter {
     /**
      * Constructor
      *
+     * @param numberOfAllFiles  Number of all displayed files
      * @param targetFiles       Collection of {@link OCFile} file targets of the action to filter in the {@link Menu}.
      * @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.
      */
-    public FileMenuFilter(Collection<OCFile> targetFiles, Account account, ComponentsGetter cg, Context context) {
+    public FileMenuFilter(int numberOfAllFiles, Collection<OCFile> targetFiles, Account account, ComponentsGetter cg, Context context) {
+        mNumberOfAllFiles = numberOfAllFiles;
         mFiles = targetFiles;
         mAccount = account;
         mComponentsGetter = cg;
@@ -76,7 +79,7 @@ public class FileMenuFilter {
      * @param context           Android {@link Context}, needed to access build setup resources.
      */
     public FileMenuFilter(OCFile targetFile, Account account, ComponentsGetter cg, Context context) {
-        this(Collections.singletonList(targetFile), account, cg, context);
+        this(1, Collections.singletonList(targetFile), account, cg, context);
     }
 
     /**
@@ -169,6 +172,22 @@ public class FileMenuFilter {
             toShow.add(R.id.action_remove_file);
         }
 
+        // SELECT ALL
+        // Show only if at least one item isn't selected.
+        if (mFiles.size() >= mNumberOfAllFiles) {
+            toHide.add(R.id.action_select_all);
+        } else {
+            toShow.add(R.id.action_select_all);
+        }
+
+        // DESELECT ALL
+        // Show only if at least one item is selected.
+        if (mFiles.isEmpty()) {
+            toHide.add(R.id.action_deselect_all);
+        } else {
+            toShow.add(R.id.action_deselect_all);
+        }
+
         // OPEN WITH (different to preview!)
         if (!isSingleFile() || !anyFileDown() || synchronizing) {
             toHide.add(R.id.action_open_file_with);

+ 4 - 0
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -786,6 +786,10 @@ public class FileDisplayActivity extends HookActivity
                 }
                 break;
             }
+            case R.id.action_select_all: {
+                getListOfFilesFragment().selectAllFiles(true);
+                break;
+            }
             default:
                 retval = super.onOptionsItemSelected(item);
                 break;

+ 4 - 0
src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -648,6 +648,10 @@ public class FileListListAdapter extends BaseAdapter {
         return files;
     }
 
+    public Vector<OCFile> getFiles() {
+        return mFiles;
+    }
+
     public Filter getFilter() {
         if (mFilesFilter == null) {
             mFilesFilter = new FilesFilter();

+ 24 - 1
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -625,6 +625,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
             );
             mode.setTitle(title);
             FileMenuFilter mf = new FileMenuFilter(
+                    mAdapter.getFiles().size(),
                     checkedFiles,
                     ((FileActivity) getActivity()).getAccount(),
                     mContainerActivity,
@@ -991,12 +992,21 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
                 getActivity().startActivityForResult(action, FileDisplayActivity.REQUEST_CODE__MOVE_FILES);
                 return true;
             }
-            case R.id.action_copy:
+            case R.id.action_copy: {
                 Intent action = new Intent(getActivity(), FolderPickerActivity.class);
                 action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, checkedFiles);
                 action.putExtra(FolderPickerActivity.EXTRA_ACTION, getResources().getText(R.string.copy_to));
                 getActivity().startActivityForResult(action, FileDisplayActivity.REQUEST_CODE__COPY_FILES);
                 return true;
+            }
+            case R.id.action_select_all: {
+                selectAllFiles(true);
+                return true;
+            }
+            case R.id.action_deselect_all: {
+                selectAllFiles(false);
+                return true;
+            }
             default:
                 return false;
         }
@@ -1594,4 +1604,17 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
     public boolean getIsSearchFragment() {
         return searchFragment;
     }
+
+    /**
+     * De-/select all elements in the current list view.
+     *
+     * @param select <code>true</code> to select all, <code>false</code> to deselect all
+     */
+    public void selectAllFiles(boolean select) {
+        AbsListView listView = getListView();
+        for (int position = 0; position < listView.getCount(); position++) {
+            listView.setItemChecked(position, select);
+        }
+    }
+
 }

+ 14 - 0
src/main/res/menu/file_actions_menu.xml

@@ -85,6 +85,20 @@
         app:showAsAction="never"
         android:showAsAction="never"
         android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_select_all"
+        android:title="@string/select_all"
+        android:icon="@drawable/ic_select_all"
+        app:showAsAction="never"
+        android:showAsAction="never"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_deselect_all"
+        android:title="@string/deselect_all"
+        android:icon="@drawable/ic_select_all"
+        app:showAsAction="never"
+        android:showAsAction="never"
+        android:orderInCategory="1" />
     <item
         android:id="@+id/action_send_file"
         android:title="@string/actionbar_send_file"

+ 7 - 0
src/main/res/menu/main_menu.xml

@@ -54,6 +54,13 @@
         app:showAsAction="never"
         android:title="@string/actionbar_sort"
         android:contentDescription="@string/actionbar_sort"/>
+    <item
+        android:id="@+id/action_select_all"
+        android:icon="@drawable/ic_select_all"
+        android:orderInCategory="1"
+        app:showAsAction="never"
+        android:title="@string/select_all"
+        android:contentDescription="@string/select_all"/>
 
     <!-- <item android:id="@+id/search"
     android:title="@string/actionbar_search"

+ 1 - 0
src/main/res/values-de-rDE/strings.xml

@@ -491,6 +491,7 @@
     <string name="upload_copy_files">kopiere Datei</string>
     <string name="upload_move_files">verschiebe Datei</string>
     <string name="select_all">Alle auswählen</string>
+    <string name="deselect_all">Auswahl aufheben</string>
 
     <string name="pref_behaviour_entries_keep_file">im Originalordner behalten</string>
     <string name="pref_behaviour_entries_move">in den App-Ordner verschoben</string>

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

@@ -492,6 +492,7 @@
     <string name="upload_copy_files">Copy file</string>
     <string name="upload_move_files">Move file</string>
     <string name="select_all">Select all</string>
+    <string name="deselect_all">Deselect all</string>
 
     <string name="pref_behaviour_entries_keep_file">kept in original folder</string>
     <string name="pref_behaviour_entries_move">moved to app folder</string>