David Wiesner 9 жил өмнө
parent
commit
b142de752c

+ 2 - 3
src/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -31,11 +31,10 @@ import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.IntentFilter;
 import android.content.DialogInterface.OnCancelListener;
 import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
-import android.content.SharedPreferences;
+import android.content.IntentFilter;
 import android.content.res.Resources.NotFoundException;
 import android.os.Bundle;
 import android.os.Parcelable;
@@ -68,9 +67,9 @@ import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.RefreshFolderOperation;
 import com.owncloud.android.syncadapter.FileSyncAdapter;
 import com.owncloud.android.ui.adapter.UploaderAdapter;
+import com.owncloud.android.ui.asynctasks.CopyAndUploadContentUrisTask;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
-import com.owncloud.android.ui.asynctasks.CopyAndUploadContentUrisTask;
 import com.owncloud.android.ui.fragment.TaskRetainerFragment;
 import com.owncloud.android.ui.helpers.UriUploader;
 import com.owncloud.android.utils.DisplayUtils;

+ 65 - 2
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -36,6 +36,7 @@ import android.accounts.Account;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.os.Bundle;
 import android.text.format.DateUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -61,6 +62,10 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimetypeIconUtil;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Vector;
 
 
 /**
@@ -69,6 +74,8 @@ import com.owncloud.android.utils.MimetypeIconUtil;
  */
 public class FileListListAdapter extends BaseAdapter implements ListAdapter {
 
+    private static final String SELECTION_KEY = "multiFileSelectionsKey";
+
     private Context mContext;
     private OCFile mFile = null;
     private Vector<OCFile> mFiles = null;
@@ -83,7 +90,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
     private enum ViewType {LIST_ITEM, GRID_IMAGE, GRID_ITEM };
 
     private HashSet<Long> mSelection = new LinkedHashSet<Long>();
-    
+
     public FileListListAdapter(
             boolean justFolders,
             Context context,
@@ -307,7 +314,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
             AbsListView parentList = (AbsListView)parent;
             if (parentList.getChoiceMode() != AbsListView.CHOICE_MODE_NONE
                     && parentList.getCheckedItemCount() > 0){
-                if (parentList.isItemChecked(position)) {
+                if (isItemSelected(position)) {
                     view.setBackgroundColor(mContext.getResources().getColor(
                             R.color.selected_item_background));
                     checkBoxV.setImageResource(
@@ -471,6 +478,62 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         mGridMode = gridMode;
     }
 
+    public boolean isItemSelected(int position){
+        return mSelection.contains(getItemId(position));
+    }
+
+    public void setNewSelection(int position, boolean checked) {
+        if(checked){
+            mSelection.add(getItemId(position));
+            notifyDataSetChanged();
+        } else {
+            removeSelection(position);
+        }
+    }
+
+    public void removeSelection(int position) {
+        mSelection.remove(getItemId(position));
+        notifyDataSetChanged();
+    }
+
+    public void clearSelection(){
+         mSelection.clear();
+        notifyDataSetChanged();
+    }
+
+    public ArrayList<OCFile> getCheckedItems() {
+        ArrayList<OCFile> files = new ArrayList<OCFile>();
+        if (mFiles != null && mFiles.size() != 0){
+            for(OCFile file: mFiles){
+                if(mSelection.contains(file.getFileId())){
+                    files.add(file);
+                }
+            }
+        }
+        return files;
+    }
+    public void restoreSelectionState(Bundle savedInstanceState){
+        if (savedInstanceState == null) {
+            return;
+        }
+        long[] selectionState = savedInstanceState.getLongArray(SELECTION_KEY);
+        mSelection.clear();
+        if(selectionState != null) {
+            for (long id : selectionState) {
+                mSelection.add(id);
+            }
+        }
+    }
+
+    public void saveSelectionState(Bundle outState) {
+        long[] selectionStatePrimitive = new long[mSelection.size()];
+        int i = 0;
+        for (Long id : mSelection) {
+            selectionStatePrimitive[i++] = id;
+        }
+        outState.putLongArray(SELECTION_KEY, selectionStatePrimitive);
+    }
+
     public boolean isGridMode() {
         return mGridMode;
     }

+ 6 - 3
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -184,6 +184,7 @@ public class OCFileListFragment extends ExtendedListFragment {
                 getActivity(),
                 mContainerActivity
         );
+        mAdapter.restoreSelectionState(savedInstanceState);
         setListAdapter(mAdapter);
 
         registerLongClickListener();
@@ -347,7 +348,7 @@ public class OCFileListFragment extends ExtendedListFragment {
 
             @Override
             public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
-                mAdapter.notifyDataSetChanged();
+                mAdapter.setNewSelection(position, checked);
                 mode.invalidate();
             }
 
@@ -376,7 +377,7 @@ public class OCFileListFragment extends ExtendedListFragment {
                 mode.setTitle(checkedCount + " selected");
 
                 if (checkedCount > 0) {
-                    List<OCFile> targetFiles = getCheckedItems();
+                    List<OCFile> targetFiles = mAdapter.getCheckedItems();
 
                     if (mContainerActivity.getStorageManager() != null) {
                         FileMenuFilter mf = new FileMenuFilter(
@@ -395,6 +396,7 @@ public class OCFileListFragment extends ExtendedListFragment {
             public void onDestroyActionMode(ActionMode mode) {
                 mActiveActionMode = null;
                 getListView().clearChoices();
+                mAdapter.clearSelection();
 
                 // reset to primary dark color
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@@ -416,6 +418,7 @@ public class OCFileListFragment extends ExtendedListFragment {
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putParcelable(KEY_FILE, mFile);
+        mAdapter.saveSelectionState(outState);
     }
 
     @Override
@@ -525,7 +528,7 @@ public class OCFileListFragment extends ExtendedListFragment {
     }
 
     public boolean onFileActionChosen(int menuId) {
-        final ArrayList<OCFile> checkedItems = getCheckedItems();
+        final ArrayList<OCFile> checkedItems = mAdapter.getCheckedItems();
         if (checkedItems.size() == 1){
             OCFile mTargetFile = checkedItems.get(0);