Browse Source

added the ability to select all within a folder for upload - selection is discarded when navigating folders

Andy Scherzinger 8 years ago
parent
commit
2c256bf53d

BIN
res/drawable-hdpi/ic_select_all.png


BIN
res/drawable-hdpi/ic_select_none.png


BIN
res/drawable-mdpi/ic_select_all.png


BIN
res/drawable-mdpi/ic_select_none.png


BIN
res/drawable-xhdpi/ic_select_all.png


BIN
res/drawable-xhdpi/ic_select_none.png


BIN
res/drawable-xxhdpi/ic_select_all.png


BIN
res/drawable-xxhdpi/ic_select_none.png


BIN
res/drawable-xxxhdpi/ic_select_all.png


BIN
res/drawable-xxxhdpi/ic_select_none.png


+ 29 - 0
res/menu/upload_files_picker.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Nextcloud Android client application
+
+  Copyright (C) 2016 Nextcloud
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License version 2,
+  as published by the Free Software Foundation.
+
+  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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/action_select_all"
+        android:checkable="true"
+        android:contentDescription="@string/select_all"
+        android:title="@string/select_all"
+        android:icon="@drawable/ic_select_all"
+        app:showAsAction="always"/>
+</menu>

+ 1 - 0
res/values/strings.xml

@@ -404,6 +404,7 @@
     <string name="prefs_instant_behaviour_title">Original file will be...</string>
     <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="pref_behaviour_entries_keep_file">kept in original folder</string>
     <string name="pref_behaviour_entries_move">moved to app folder</string>

+ 47 - 6
src/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -30,6 +30,7 @@ import android.os.Environment;
 import android.preference.PreferenceManager;
 import android.support.v4.app.DialogFragment;
 import android.support.v7.app.ActionBar;
+import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -62,11 +63,13 @@ public class UploadFilesActivity extends FileActivity implements
     
     private ArrayAdapter<String> mDirectories;
     private File mCurrentDir = null;
+    private boolean mSelectAll = false;
     private LocalFileListFragment mFileListFragment;
     private Button mCancelBtn;
     private Button mUploadBtn;
     private Account mAccountOnCreation;
     private DialogFragment mCurrentDialog;
+    private Menu mOptionsMenu;
     
     public static final String EXTRA_CHOSEN_FILES =
             UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES";
@@ -75,6 +78,9 @@ public class UploadFilesActivity extends FileActivity implements
     
     private static final String KEY_DIRECTORY_PATH =
             UploadFilesActivity.class.getCanonicalName() + ".KEY_DIRECTORY_PATH";
+    private static final String KEY_ALL_SELECTED =
+            UploadFilesActivity.class.getCanonicalName() + ".KEY_ALL_SELECTED";
+
     private static final String TAG = "UploadFilesActivity";
     private static final String WAIT_DIALOG_TAG = "WAIT";
     private static final String QUERY_TO_MOVE_DIALOG_TAG = "QUERY_TO_MOVE";
@@ -90,6 +96,9 @@ public class UploadFilesActivity extends FileActivity implements
         if(savedInstanceState != null) {
             mCurrentDir = new File(savedInstanceState.getString(
                     UploadFilesActivity.KEY_DIRECTORY_PATH));
+            mSelectAll = savedInstanceState.getBoolean(
+                    UploadFilesActivity.KEY_ALL_SELECTED, false);
+
         } else {
             mCurrentDir = Environment.getExternalStorageDirectory();
         }
@@ -168,6 +177,15 @@ public class UploadFilesActivity extends FileActivity implements
         activity.startActivityForResult(action, requestCode);
     }
 
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        mOptionsMenu = menu;
+        getMenuInflater().inflate(R.menu.upload_files_picker, menu);
+        MenuItem selectAll = menu.findItem(R.id.action_select_all);
+        setSelectAllMenuItem(selectAll, mSelectAll);
+        return super.onCreateOptionsMenu(menu);
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         boolean retval = true;
@@ -178,6 +196,13 @@ public class UploadFilesActivity extends FileActivity implements
                 }
                 break;
             }
+            case R.id.action_select_all: {
+                item.setChecked(!item.isChecked());
+                mSelectAll = item.isChecked();
+                setSelectAllMenuItem(item, mSelectAll);
+                mFileListFragment.selectAllFiles(item.isChecked());
+                break;
+            }
             default:
                 retval = super.onOptionsItemSelected(item);
         }
@@ -213,7 +238,10 @@ public class UploadFilesActivity extends FileActivity implements
         if(mCurrentDir.getParentFile() == null){
             ActionBar actionBar = getSupportActionBar(); 
             actionBar.setDisplayHomeAsUpEnabled(false);
-        } 
+        }
+
+        // invalidate checked state when navigating directories
+        setSelectAllMenuItem(mOptionsMenu.findItem(R.id.action_select_all), false);
     }
 
     
@@ -224,9 +252,10 @@ public class UploadFilesActivity extends FileActivity implements
         Log_OC.d(TAG, "onSaveInstanceState() start");
         super.onSaveInstanceState(outState);
         outState.putString(UploadFilesActivity.KEY_DIRECTORY_PATH, mCurrentDir.getAbsolutePath());
+        outState.putBoolean(UploadFilesActivity.KEY_ALL_SELECTED,
+                mOptionsMenu.findItem(R.id.action_select_all).isChecked());
         Log_OC.d(TAG, "onSaveInstanceState() end");
     }
-
     
     /**
      * Pushes a directory to the drop down list
@@ -250,7 +279,16 @@ public class UploadFilesActivity extends FileActivity implements
         return !mDirectories.isEmpty();
     }
 
-    
+    private void setSelectAllMenuItem(MenuItem selectAll, boolean checked) {
+        selectAll.setChecked(checked);
+        if(checked) {
+            selectAll.setIcon(R.drawable.ic_select_none);
+        } else {
+            selectAll.setIcon(R.drawable.ic_select_all);
+        }
+    }
+
+
     // Custom array adapter to override text colors
     private class CustomArrayAdapter<T> extends ArrayAdapter<T> {
     
@@ -283,6 +321,11 @@ public class UploadFilesActivity extends FileActivity implements
      */
     @Override
     public void onDirectoryClick(File directory) {
+        // invalidate checked state when navigating directories
+        MenuItem selectAll = mOptionsMenu.findItem(R.id.action_select_all);
+        selectAll.setChecked(false);
+        selectAll.setIcon(R.drawable.ic_select_all);
+
         pushDirname(directory);
         ActionBar actionBar = getSupportActionBar();
         actionBar.setDisplayHomeAsUpEnabled(true);
@@ -447,7 +490,5 @@ public class UploadFilesActivity extends FileActivity implements
             setResult(RESULT_CANCELED);
             finish();
         }
-    }    
-
-    
+    }
 }

+ 15 - 0
src/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -113,6 +113,7 @@ public class LocalFileListFragment extends ExtendedListFragment {
                 listDirectory(file);
                 // notify the click to container Activity
                 mContainerActivity.onDirectoryClick(file);
+                Log_OC.e(TAG, "onItemClick directory");
                 // save index and top position
                 saveIndexAndTopPosition(position);
             
@@ -228,6 +229,20 @@ public class LocalFileListFragment extends ExtendedListFragment {
         return result.toArray(new String[result.size()]);
     }
 
+    /**
+     * De-/select all elements in the local file list.
+     *
+     * @param select <code>true</code> to select all, <code>false</code> to deselect all
+     */
+    public void selectAllFiles(boolean select) {
+        ListView listView = (ListView) getListView();
+        for (int position = 0; position < listView.getCount(); position++) {
+            File file = (File) mAdapter.getItem(position);
+            if (file.isFile()) {
+                listView.setItemChecked(position, select);
+            }
+        }
+    }
     
     /**
      * Interface to implement by any Activity that includes some instance of LocalFileListFragment