瀏覽代碼

multi-select-fix-rotate-899

David Wiesner 9 年之前
父節點
當前提交
fda8708ce1

+ 30 - 83
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -27,6 +27,8 @@ package com.owncloud.android.ui.adapter;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Vector;
 
@@ -35,7 +37,7 @@ import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.os.Build;
-import android.os.Bundle;
+import android.text.format.DateUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -61,9 +63,6 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimetypeIconUtil;
 
-import java.util.Vector;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
 
 
 /**
@@ -72,8 +71,6 @@ import java.util.LinkedHashSet;
  */
 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;
@@ -90,17 +87,17 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
     private HashSet<Long> mSelection = new LinkedHashSet<Long>();
     
     public FileListListAdapter(
-            boolean justFolders, 
+            boolean justFolders,
             Context context,
             ComponentsGetter transferServiceGetter
             ) {
-        
+
         mJustFolders = justFolders;
         mContext = context;
         mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);
 
         mTransferServiceGetter = transferServiceGetter;
-        
+
         // Read sorting order, default to sort by name ascending
         FileStorageUtils.mSortOrder = PreferenceManager.getSortOrder(mContext);
         FileStorageUtils.mSortAscending = PreferenceManager.getSortAscending(mContext);
@@ -110,7 +107,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
 
         mGridMode = false;
     }
-    
+
     @Override
     public boolean areAllItemsEnabled() {
         return true;
@@ -310,13 +307,17 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
 
             AbsListView parentList = (AbsListView)parent;
             if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+                view.setBackgroundColor(Color.WHITE);
                 if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) {
                     checkBoxV.setVisibility(View.GONE);
                 } else if (parentList.getCheckedItemCount() > 0){
                     if (parentList.isItemChecked(position)) {
+                        view.setBackgroundColor(mContext.getResources().getColor(
+                                R.color.selected_item_background));
                         checkBoxV.setImageResource(
                                 R.drawable.ic_checkbox_marked);
                     } else {
+                        view.setBackgroundColor(Color.WHITE);
                         checkBoxV.setImageResource(
                                 R.drawable.ic_checkbox_blank_outline);
                     }
@@ -325,7 +326,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
             }
             
             // For all Views
-            
+
             // this if-else is needed even though favorite icon is visible by default
             // because android reuses views in listview
             if (!file.isFavorite()) {
@@ -333,7 +334,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
             } else {
                 view.findViewById(R.id.favoriteIcon).setVisibility(View.VISIBLE);
             }
-            
+
             // No Folder
             if (!file.isFolder()) {
                 if (file.isImage() && file.getRemoteId() != null){
@@ -355,9 +356,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
                             }
                             final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =
                                     new ThumbnailsCacheManager.AsyncDrawable(
-                                    mContext.getResources(), 
-                                    thumbnail, 
-                                    task
+                                            mContext.getResources(),
+                                            thumbnail,
+                                            task
                                     );
                             fileIcon.setImageDrawable(asyncDrawable);
                             task.execute(file);
@@ -386,13 +387,6 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
                 );
             }
         }
-
-        if (mSelection.contains(getItemId(position))) {
-            view.setBackgroundColor(mContext.getResources().getColor(R.color.selected_item_background));
-        } else {
-            view.setBackgroundColor(Color.WHITE);
-        }
-
         return view;
     }
 
@@ -413,9 +407,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
 
     /**
      * Change the adapted directory for a new one
-     * @param directory                 New file to adapt. Can be NULL, meaning 
+     * @param directory                 New file to adapt. Can be NULL, meaning
      *                                  "no content to adapt".
-     * @param updatedStorageManager     Optional updated storage manager; used to replace 
+     * @param updatedStorageManager     Optional updated storage manager; used to replace
      *                                  mStorageManager if is different (and not NULL)
      */
     public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager
@@ -430,7 +424,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
             mFiles = mStorageManager.getFolderContent(mFile/*, onlyOnDevice*/);
             mFilesOrig.clear();
             mFilesOrig.addAll(mFiles);
-            
+
             if (mJustFolders) {
                 mFiles = getFolders(mFiles);
             }
@@ -441,7 +435,6 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         mFiles = FileStorageUtils.sortFolder(mFiles);
         notifyDataSetChanged();
     }
-    
 
     /**
      * Filter for getting only the folders
@@ -449,9 +442,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
      * @return Vector<OCFile>
      */
     public Vector<OCFile> getFolders(Vector<OCFile> files) {
-        Vector<OCFile> ret = new Vector<OCFile>(); 
-        OCFile current = null; 
-        for (int i=0; i<files.size(); i++) {
+        Vector<OCFile> ret = new Vector<OCFile>();
+        OCFile current = null;
+        for (int i = 0; i < files.size(); i++) {
             current = files.get(i);
             if (current.isFolder()) {
                 ret.add(current);
@@ -459,9 +452,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         }
         return ret;
     }
-    
-    
+
+
     public void setSortOrder(Integer order, boolean ascending) {
+
         PreferenceManager.setSortOrder(order, mContext);
         PreferenceManager.setSortAscending(ascending, mContext);
         
@@ -472,61 +466,14 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         notifyDataSetChanged();
     }
 
-    public void setGridMode(boolean gridMode) {
-        mGridMode = gridMode;
-    }
-
-    // TODO Tobi: all methods needed?
-    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 removeSelection(){
-         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);
-            }
-        }
+    private CharSequence showRelativeTimestamp(OCFile file) {
+        return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(),
+                DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);
     }
 
-    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 void setGridMode(boolean gridMode) {
+        mGridMode = gridMode;
     }
 
     public boolean isGridMode() {

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

@@ -30,6 +30,7 @@ import android.os.Build;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.SparseBooleanArray;
 import android.view.ActionMode;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -186,7 +187,6 @@ public class OCFileListFragment extends ExtendedListFragment {
                 getActivity(),
                 mContainerActivity
         );
-        mAdapter.restoreSelectionState(savedInstanceState);
         setListAdapter(mAdapter);
 
         registerLongClickListener();
@@ -351,7 +351,7 @@ public class OCFileListFragment extends ExtendedListFragment {
 
             @Override
             public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
-                mAdapter.setNewSelection(position, checked);
+                mAdapter.notifyDataSetChanged();
                 mode.invalidate();
             }
 
@@ -380,7 +380,7 @@ public class OCFileListFragment extends ExtendedListFragment {
                 mode.setTitle(checkedCount + " selected");
 
                 if (checkedCount > 0) {
-                    List<OCFile> targetFiles = mAdapter.getCheckedItems();
+                    List<OCFile> targetFiles = getCheckedItems();
 
                     if (mContainerActivity.getStorageManager() != null) {
                         FileMenuFilter mf = new FileMenuFilter(
@@ -394,15 +394,10 @@ public class OCFileListFragment extends ExtendedListFragment {
                 return true;
             }
 
-            @Override
-            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-                return onFileActionChosen(item.getItemId());
-            }
-
             @Override
             public void onDestroyActionMode(ActionMode mode) {
-                mAdapter.removeSelection();
                 mActiveActionMode = null;
+                getListView().clearChoices();
 
                 // reset to primary dark color
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@@ -414,54 +409,9 @@ public class OCFileListFragment extends ExtendedListFragment {
                     setFabEnabled(true);
                 }
             }
-
         });
     }
 
-    // TODO Tobi needed?
-    private void showFileAction(int fileIndex) {
-        Bundle args = getArguments();
-        PopupMenu pm = new PopupMenu(getActivity(), null);
-        Menu menu = pm.getMenu();
-
-        boolean allowContextualActions =
-            (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true);
-
-        if (allowContextualActions) {
-            MenuInflater inflater = getActivity().getMenuInflater();
-
-            inflater.inflate(R.menu.file_actions_menu, menu);
-            OCFile targetFile = (OCFile) mAdapter.getItem(fileIndex);
-
-            if (mContainerActivity.getStorageManager() != null) {
-                FileMenuFilter mf = new FileMenuFilter(
-                    targetFile,
-                    mContainerActivity.getStorageManager().getAccount(),
-                    mContainerActivity,
-                    getActivity()
-                );
-                mf.filter(menu);
-            }
-
-            /// TODO break this direct dependency on FileDisplayActivity... if possible
-            MenuItem item = menu.findItem(R.id.action_open_file_with);
-            FileFragment frag = ((FileDisplayActivity) getActivity()).getSecondFragment();
-            if (frag != null && frag instanceof FileDetailFragment &&
-                frag.getFile().getFileId() == targetFile.getFileId()) {
-                item = menu.findItem(R.id.action_see_details);
-                if (item != null) {
-                    item.setVisible(false);
-                    item.setEnabled(false);
-                }
-            }
-
-            FileActionsDialogFragment dialog = FileActionsDialogFragment.newInstance(menu,
-                fileIndex, targetFile.getFileName());
-            dialog.setTargetFragment(this, 0);
-            dialog.show(getFragmentManager(), FileActionsDialogFragment.FTAG_FILE_ACTIONS);
-        }
-    }
-
     /**
      * Saves the current listed folder.
      */
@@ -469,7 +419,6 @@ public class OCFileListFragment extends ExtendedListFragment {
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putParcelable(KEY_FILE, mFile);
-        mAdapter.saveSelectionState(outState);
     }
 
     @Override
@@ -579,8 +528,9 @@ public class OCFileListFragment extends ExtendedListFragment {
     }
 
     public boolean onFileActionChosen(int menuId) {
-        if (mAdapter.getCheckedItems().size() == 1){
-            OCFile mTargetFile = mAdapter.getCheckedItems().get(0);
+        final ArrayList<OCFile> checkedItems = getCheckedItems();
+        if (checkedItems.size() == 1){
+            OCFile mTargetFile = checkedItems.get(0);
 
             switch (menuId) {
                 case R.id.action_share_file: {
@@ -652,7 +602,7 @@ public class OCFileListFragment extends ExtendedListFragment {
                     return false;
             }
         } else {
-            ArrayList<OCFile> mTargetFiles = mAdapter.getCheckedItems();
+            ArrayList<OCFile> mTargetFiles = checkedItems;
 
             switch (menuId) {
                 case R.id.action_remove_file: {
@@ -709,6 +659,22 @@ public class OCFileListFragment extends ExtendedListFragment {
         }
     }
 
+    /**
+     * Query all selected Files
+     * @return selected Files
+     */
+    public ArrayList<OCFile> getCheckedItems() {
+        ArrayList<OCFile> files = new ArrayList<OCFile>();
+        SparseBooleanArray mSelection = getListView().getCheckedItemPositions();
+        for (int i = 0; i < mSelection.size(); ++i) {
+            if (mSelection.valueAt(i)) {
+                final int position = mSelection.keyAt(i);
+                files.add((OCFile) mAdapter.getItem(position));
+            }
+        }
+        return files;
+    }
+
 
     /**
      * Use this to query the {@link OCFile} that is currently