Browse Source

Try to fix filtering

Mario Danic 8 years ago
parent
commit
7a36a45e5d

+ 16 - 15
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -402,7 +402,7 @@ public class FileDisplayActivity extends HookActivity
             /// First fragment
             OCFileListFragment listOfFiles = getListOfFilesFragment();
             if (listOfFiles != null && TextUtils.isEmpty(searchQuery)) {
-                listOfFiles.listDirectory(getCurrentDir(), MainApp.isOnlyOnDevice());
+                listOfFiles.listDirectory(getCurrentDir(), MainApp.isOnlyOnDevice(), false);
             } else {
                 Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
             }
@@ -528,10 +528,10 @@ public class FileDisplayActivity extends HookActivity
         updateActionBarTitleAndHomeButton(null);
     }
 
-    protected void refreshListOfFilesFragment() {
+    public void refreshListOfFilesFragment(boolean fromSearch) {
         OCFileListFragment fileListFragment = getListOfFilesFragment();
         if (fileListFragment != null) {
-            fileListFragment.listDirectory(MainApp.isOnlyOnDevice());
+            fileListFragment.listDirectory(MainApp.isOnlyOnDevice(), fromSearch);
         }
     }
 
@@ -944,10 +944,11 @@ public class FileDisplayActivity extends HookActivity
         super.onResume();
 
         // refresh list of files
-        refreshListOfFilesFragment();
 
         if (searchView != null && !TextUtils.isEmpty(searchQuery)) {
             searchView.setQuery(searchQuery, true);
+        } else {
+            refreshListOfFilesFragment(false);
         }
 
         // Listen for sync messages
@@ -1066,7 +1067,7 @@ public class FileDisplayActivity extends HookActivity
                                 OCFileListFragment fileListFragment = getListOfFilesFragment();
                                 if (fileListFragment != null) {
                                     fileListFragment.listDirectory(currentDir,
-                                    MainApp.isOnlyOnDevice());
+                                    MainApp.isOnlyOnDevice(), false);
                                 }
                             }
                             setFile(currentFile);
@@ -1165,7 +1166,7 @@ public class FileDisplayActivity extends HookActivity
                     String linkedToRemotePath =
                             intent.getStringExtra(FileUploader.EXTRA_LINKED_TO_PATH);
                     if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
-                        refreshListOfFilesFragment();
+                        refreshListOfFilesFragment(false);
                     }
                 }
 
@@ -1258,7 +1259,7 @@ public class FileDisplayActivity extends HookActivity
                     String linkedToRemotePath =
                             intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
                     if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
-                        refreshListOfFilesFragment();
+                        refreshListOfFilesFragment(false);
                     }
                     refreshSecondFragment(
                             intent.getAction(),
@@ -1311,7 +1312,7 @@ public class FileDisplayActivity extends HookActivity
         OCFileListFragment listOfFiles = getListOfFilesFragment();
         if (listOfFiles != null) {  // should never be null, indeed
             OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
-            listOfFiles.listDirectory(root, MainApp.isOnlyOnDevice());
+            listOfFiles.listDirectory(root, MainApp.isOnlyOnDevice(), false);
             setFile(listOfFiles.getCurrentFile());
             startSyncFolderOperation(root, false);
         }
@@ -1402,7 +1403,7 @@ public class FileDisplayActivity extends HookActivity
             // getFileDownloadBinder() - THIS IS A MESS
             OCFileListFragment listOfFiles = getListOfFilesFragment();
             if (listOfFiles != null) {
-                listOfFiles.listDirectory(MainApp.isOnlyOnDevice());
+                listOfFiles.listDirectory(MainApp.isOnlyOnDevice(), false);
             }
             FileFragment secondFragment = getSecondFragment();
             if (secondFragment instanceof FileDetailFragment) {
@@ -1503,7 +1504,7 @@ public class FileDisplayActivity extends HookActivity
                 cleanSecondFragment();
             }
             if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
-                refreshListOfFilesFragment();
+                refreshListOfFilesFragment(false);
             }
             invalidateOptionsMenu();
         } else {
@@ -1525,7 +1526,7 @@ public class FileDisplayActivity extends HookActivity
     private void onMoveFileOperationFinish(MoveFileOperation operation,
                                            RemoteOperationResult result) {
         if (result.isSuccess()) {
-            refreshListOfFilesFragment();
+            refreshListOfFilesFragment(false);
         } else {
             try {
                 Toast msg = Toast.makeText(FileDisplayActivity.this,
@@ -1548,7 +1549,7 @@ public class FileDisplayActivity extends HookActivity
      */
     private void onCopyFileOperationFinish(CopyFileOperation operation, RemoteOperationResult result) {
         if (result.isSuccess()) {
-            refreshListOfFilesFragment();
+            refreshListOfFilesFragment(false);
         } else {
             try {
                 Toast msg = Toast.makeText(FileDisplayActivity.this,
@@ -1601,7 +1602,7 @@ public class FileDisplayActivity extends HookActivity
             }
 
             if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
-                refreshListOfFilesFragment();
+                refreshListOfFilesFragment(false);
             }
 
         } else {
@@ -1638,7 +1639,7 @@ public class FileDisplayActivity extends HookActivity
     private void onCreateFolderOperationFinish(CreateFolderOperation operation,
                                                RemoteOperationResult result) {
         if (result.isSuccess()) {
-            refreshListOfFilesFragment();
+            refreshListOfFilesFragment(false);
         } else {
             try {
                 Toast msg = Toast.makeText(FileDisplayActivity.this,
@@ -1658,7 +1659,7 @@ public class FileDisplayActivity extends HookActivity
      */
     @Override
     public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) {
-        refreshListOfFilesFragment();
+        refreshListOfFilesFragment(false);
         FileFragment details = getSecondFragment();
         if (details instanceof FileDetailFragment &&
                 file.equals(details.getFile())) {

+ 4 - 4
src/com/owncloud/android/ui/activity/FolderPickerActivity.java

@@ -136,7 +136,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
             
             if (!stateWasRecovered) {
                 OCFileListFragment listOfFolders = getListOfFilesFragment(); 
-                listOfFolders.listDirectory(folder, false);
+                listOfFolders.listDirectory(folder, false, false);
                 
                 startSyncFolderOperation(folder, false);
             }
@@ -311,7 +311,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
     protected void refreshListOfFilesFragment() {
         OCFileListFragment fileListFragment = getListOfFilesFragment();
         if (fileListFragment != null) {
-            fileListFragment.listDirectory(false);
+            fileListFragment.listDirectory(false, false);
         }
     }
 
@@ -319,7 +319,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
         OCFileListFragment listOfFiles = getListOfFilesFragment(); 
         if (listOfFiles != null) {  // should never be null, indeed
             OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
-            listOfFiles.listDirectory(root, false);
+            listOfFiles.listDirectory(root, false, false);
             setFile(listOfFiles.getCurrentFile());
             updateNavigationElementsInActionBar();
             startSyncFolderOperation(root, false);
@@ -467,7 +467,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
                             if (currentDir.getRemotePath().equals(synchFolderRemotePath)) {
                                 OCFileListFragment fileListFragment = getListOfFilesFragment();
                                 if (fileListFragment != null) {
-                                    fileListFragment.listDirectory(currentDir, false);
+                                    fileListFragment.listDirectory(currentDir, false, false);
                                 }
                             }
                             setFile(currentFile);

+ 1 - 1
src/com/owncloud/android/ui/activity/UploadPathActivity.java

@@ -67,7 +67,7 @@ public class UploadPathActivity extends FolderPickerActivity implements FileFrag
 
             if (!stateWasRecovered) {
                 OCFileListFragment listOfFolders = getListOfFilesFragment();
-                listOfFolders.listDirectory(folder, false);
+                listOfFolders.listDirectory(folder, false, false);
 
                 startSyncFolderOperation(folder, false);
             }

+ 21 - 19
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -56,8 +56,6 @@ import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
 import java.util.Vector;
 
 
@@ -79,6 +77,7 @@ public class FileListListAdapter extends BaseAdapter {
     private ExtendedListFragmentInterface extendedListFragmentInterface;
 
     private FilesFilter mFilesFilter;
+    private OCFile currentDirectory;
 
     public FileListListAdapter(
             boolean justFolders,
@@ -284,7 +283,7 @@ public class FileListListAdapter extends BaseAdapter {
             AbsListView parentList = (AbsListView) parent;
             if (parentList.getChoiceMode() != AbsListView.CHOICE_MODE_NONE &&
                     parentList.getCheckedItemCount() > 0
-                ) {
+                    ) {
                 if (parentList.isItemChecked(position)) {
                     view.setBackgroundColor(mContext.getResources().getColor(
                             R.color.selected_item_background));
@@ -335,9 +334,9 @@ public class FileListListAdapter extends BaseAdapter {
                             }
                             final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable =
                                     new ThumbnailsCacheManager.AsyncThumbnailDrawable(
-                                    mContext.getResources(), 
-                                    thumbnail, 
-                                    task
+                                            mContext.getResources(),
+                                            thumbnail,
+                                            task
                                     );
                             fileIcon.setImageDrawable(asyncDrawable);
                             task.execute(file);
@@ -387,7 +386,7 @@ public class FileListListAdapter extends BaseAdapter {
     /**
      * Change the adapted directory for a new one
      *
-     * @param directory                New folder to adapt. Can be NULL, meaning
+     * @param directory             New folder to adapt. Can be NULL, meaning
      *                              "no content to adapt".
      * @param updatedStorageManager Optional updated storage manager; used to replace
      *                              mStorageManager if is different (and not NULL)
@@ -409,6 +408,8 @@ public class FileListListAdapter extends BaseAdapter {
             }
             mFiles = FileStorageUtils.sortOcFolder(mFiles);
             mFilesAll.addAll(mFiles);
+
+            currentDirectory = directory;
         } else {
             mFiles = null;
             mFilesAll.clear();
@@ -420,8 +421,8 @@ public class FileListListAdapter extends BaseAdapter {
     /**
      * Filter for getting only the folders
      *
-     * @param files             Collection of files to filter
-     * @return                  Folders in the input
+     * @param files Collection of files to filter
+     * @return Folders in the input
      */
     public Vector<OCFile> getFolders(Vector<OCFile> files) {
         Vector<OCFile> ret = new Vector<>();
@@ -440,7 +441,7 @@ public class FileListListAdapter extends BaseAdapter {
 
         PreferenceManager.setSortOrder(mContext, order);
         PreferenceManager.setSortAscending(mContext, ascending);
-        
+
         FileStorageUtils.mSortOrder = order;
         FileStorageUtils.mSortAscending = ascending;
 
@@ -453,11 +454,11 @@ public class FileListListAdapter extends BaseAdapter {
         SparseBooleanArray checkedPositions = parentList.getCheckedItemPositions();
         ArrayList<OCFile> files = new ArrayList<>();
         Object item;
-        for (int i=0; i < checkedPositions.size(); i++) {
+        for (int i = 0; i < checkedPositions.size(); i++) {
             if (checkedPositions.valueAt(i)) {
                 item = getItem(checkedPositions.keyAt(i));
                 if (item != null) {
-                    files.add((OCFile)item);
+                    files.add((OCFile) item);
                 }
             }
         }
@@ -481,16 +482,14 @@ public class FileListListAdapter extends BaseAdapter {
             if (!TextUtils.isEmpty(constraint)) {
                 for (int i = 0; i < mFilesAll.size(); i++) {
                     OCFile currentFile = mFilesAll.get(i);
-                    if (currentFile.getFileName().toLowerCase().contains(constraint) &&
+                    if (currentFile.getRemotePath().startsWith(currentDirectory.getRemotePath()) &&
+                            currentFile.getFileName().toLowerCase().contains(constraint) &&
                             !ocFileVector.contains(currentFile)) {
                         ocFileVector.add(currentFile);
                     }
                 }
-            } else {
-                Set<OCFile> unique = new HashSet<>();
-                unique.addAll(mFilesAll);
-                ocFileVector.addAll(unique);
             }
+
             results.values = ocFileVector;
             results.count = ocFileVector.size();
 
@@ -503,6 +502,9 @@ public class FileListListAdapter extends BaseAdapter {
             mFiles = new Vector<>();
             if (ocFiles != null && ocFiles.size() > 0) {
                 mFiles.addAll(ocFiles);
+                if (!mShowHiddenFiles) {
+                    mFiles = filterHiddenFiles(mFiles);
+                }
                 mFiles = FileStorageUtils.sortOcFolder(mFiles);
             }
 
@@ -516,8 +518,8 @@ public class FileListListAdapter extends BaseAdapter {
     /**
      * Filter for hidden files
      *
-     * @param files             Collection of files to filter
-     * @return                  Non-hidden files
+     * @param files Collection of files to filter
+     * @return Non-hidden files
      */
     public Vector<OCFile> filterHiddenFiles(Vector<OCFile> files) {
         Vector<OCFile> ret = new Vector<>();

+ 36 - 25
src/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -29,6 +29,7 @@ import android.support.v4.app.Fragment;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.widget.SearchView;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -50,6 +51,7 @@ import com.getbase.floatingactionbutton.FloatingActionsMenu;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.ExtendedListView;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
 import com.owncloud.android.ui.adapter.FileListListAdapter;
 import com.owncloud.android.ui.adapter.FilterableListAdapter;
@@ -59,6 +61,8 @@ import java.util.ArrayList;
 
 import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
 
+import static android.R.attr.delay;
+
 public class ExtendedListFragment extends Fragment
         implements OnItemClickListener, OnEnforceableRefreshListener, SearchView.OnQueryTextListener {
 
@@ -103,7 +107,7 @@ public class ExtendedListFragment extends Fragment
 
     private BaseAdapter mAdapter;
 
-    private SearchView searchView;
+    protected SearchView searchView;
     private Handler handler = new Handler();
 
     protected void setListAdapter(BaseAdapter listAdapter) {
@@ -198,34 +202,41 @@ public class ExtendedListFragment extends Fragment
     private void performSearch(final String query, boolean isSubmit) {
         handler.removeCallbacksAndMessages(null);
 
-        int delay = 500;
+        if (!TextUtils.isEmpty(query)) {
 
-        if (isSubmit) {
-            delay = 0;
-        }
+            int delay = 500;
 
-        if (mAdapter != null && mAdapter instanceof FileListListAdapter) {
-            handler.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    FileListListAdapter fileListListAdapter = (FileListListAdapter) mAdapter;
-                    fileListListAdapter.getFilter().filter(query);
-                }
-            }, delay);
-        } else if (mAdapter != null && mAdapter instanceof LocalFileListAdapter) {
-            handler.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    LocalFileListAdapter localFileListAdapter = (LocalFileListAdapter) mAdapter;
-                    localFileListAdapter.filter(query);
-                }
-            }, delay);
-        }
+            if (isSubmit) {
+                delay = 0;
+            }
 
-        if (searchView != null && delay == 0) {
-            searchView.clearFocus();
-        }
+            if (mAdapter != null && mAdapter instanceof FileListListAdapter) {
+                handler.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        FileListListAdapter fileListListAdapter = (FileListListAdapter) mAdapter;
+                        fileListListAdapter.getFilter().filter(query);
+                    }
+                }, delay);
+            } else if (mAdapter != null && mAdapter instanceof LocalFileListAdapter) {
+                handler.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        LocalFileListAdapter localFileListAdapter = (LocalFileListAdapter) mAdapter;
+                        localFileListAdapter.filter(query);
+                    }
+                }, delay);
+            }
 
+            if (searchView != null && delay == 0) {
+                searchView.clearFocus();
+            }
+        } else {
+            if (getActivity() != null) {
+                ((FileDisplayActivity) getActivity()).refreshListOfFilesFragment(true);
+
+            }
+        }
 
     }
 

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

@@ -593,7 +593,7 @@ public class OCFileListFragment extends ExtendedListFragment implements Extended
             }   // exit is granted because storageManager.getFileByPath("/") never returns null
             mFile = parentDir;
 
-            listDirectory(mFile, MainApp.isOnlyOnDevice());
+            listDirectory(mFile, MainApp.isOnlyOnDevice(), false);
 
             onRefresh(false);
 
@@ -611,7 +611,7 @@ public class OCFileListFragment extends ExtendedListFragment implements Extended
         if (file != null) {
             if (file.isFolder()) {
                 // update state and view of this fragment
-                listDirectory(file, MainApp.isOnlyOnDevice());
+                listDirectory(file, MainApp.isOnlyOnDevice(), false);
                 // then, notify parent activity to let it update its state and view
                 mContainerActivity.onBrowsedDownTo(file);
                 // save index and top position
@@ -749,12 +749,12 @@ public class OCFileListFragment extends ExtendedListFragment implements Extended
     /**
      * Calls {@link OCFileListFragment#listDirectory(OCFile, boolean)} with a null parameter
      */
-    public void listDirectory(boolean onlyOnDevice){
-        listDirectory(null, onlyOnDevice);
+    public void listDirectory(boolean onlyOnDevice, boolean fromSearch){
+        listDirectory(null, onlyOnDevice, fromSearch);
     }
 
     public void refreshDirectory(){
-        listDirectory(getCurrentFile(), MainApp.isOnlyOnDevice());
+        listDirectory(getCurrentFile(), MainApp.isOnlyOnDevice(), false);
     }
 
     /**
@@ -764,7 +764,7 @@ public class OCFileListFragment extends ExtendedListFragment implements Extended
      *
      * @param directory File to be listed
      */
-    public void listDirectory(OCFile directory, boolean onlyOnDevice) {
+    public void listDirectory(OCFile directory, boolean onlyOnDevice, boolean fromSearch) {
         FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
         if (storageManager != null) {
 
@@ -787,6 +787,11 @@ public class OCFileListFragment extends ExtendedListFragment implements Extended
                 directory = storageManager.getFileById(directory.getParentId());
             }
 
+            if (searchView != null && !searchView.isIconified() && !fromSearch) {
+                searchView.setQuery("", false);
+                searchView.onActionViewCollapsed();
+            }
+
             mAdapter.swapDirectory(directory, storageManager, onlyOnDevice);
             if (mFile == null || !mFile.equals(directory)) {
                 mCurrentListView.setSelection(0);