Browse Source

Fix filtering a bit

Mario Danic 8 years ago
parent
commit
f47a7da793

+ 47 - 17
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -27,12 +27,14 @@ import android.accounts.Account;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.text.TextUtils;
 import android.util.SparseBooleanArray;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AbsListView;
 import android.widget.BaseAdapter;
+import android.widget.Filter;
 import android.widget.GridView;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -63,7 +65,7 @@ import java.util.Vector;
  * This Adapter populates a ListView with all files and folders in an ownCloud
  * instance.
  */
-public class FileListListAdapter extends BaseAdapter implements FilterableListAdapter {
+public class FileListListAdapter extends BaseAdapter {
 
     private Context mContext;
     private Vector<OCFile> mFilesAll = new Vector<OCFile>();
@@ -76,6 +78,8 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
     private ComponentsGetter mTransferServiceGetter;
     private ExtendedListFragmentInterface extendedListFragmentInterface;
 
+    private FilesFilter mFilesFilter;
+
     public FileListListAdapter(
             boolean justFolders,
             Context context,
@@ -460,29 +464,55 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
         return files;
     }
 
-    public void filter(String text){
+    public Filter getFilter() {
+        if (mFilesFilter == null) {
+            mFilesFilter = new FilesFilter();
+        }
+        return mFilesFilter;
+    }
 
-        mFiles = new Vector<>();
-        Set<OCFile> unique = new HashSet<>();
-        unique.addAll(mFilesAll);
+    private class FilesFilter extends Filter {
 
-        if(text.isEmpty()){
-            mFiles.addAll(unique);
-        } else {
-            ArrayList<OCFile> result = new ArrayList<>();
-            text = text.toLowerCase();
-            for(OCFile file: unique){
-                if(file.getFileName().toLowerCase().contains(text)){
-                    result.add(file);
+        @Override
+        protected FilterResults performFiltering(CharSequence constraint) {
+            FilterResults results = new FilterResults();
+            Vector<OCFile> ocFileVector = new Vector<>();
+
+            if (!TextUtils.isEmpty(constraint)) {
+                for (int i = 0; i < mFilesAll.size(); i++) {
+                    OCFile currentFile = mFilesAll.get(i);
+                    if (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();
+
+            return results;
+        }
+
+        @Override
+        protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
+            Vector<OCFile> ocFiles = (Vector<OCFile>) results.values;
+            mFiles = new Vector<>();
+            if (ocFiles != null && ocFiles.size() > 0) {
+                mFiles.addAll(ocFiles);
+                mFiles = FileStorageUtils.sortOcFolder(mFiles);
             }
-            mFiles.addAll(result);
+
+            notifyDataSetChanged();
+            extendedListFragmentInterface.finishedFiltering();
+
         }
-        mFiles = FileStorageUtils.sortOcFolder(mFiles);
-        notifyDataSetChanged();
-        extendedListFragmentInterface.finishedFiltering();
     }
 
+
     /**
      * Filter for hidden files
      *

+ 42 - 10
src/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -38,6 +38,7 @@ import android.view.ViewGroup;
 import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
 import android.widget.GridView;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -50,7 +51,9 @@ 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.OnEnforceableRefreshListener;
+import com.owncloud.android.ui.adapter.FileListListAdapter;
 import com.owncloud.android.ui.adapter.FilterableListAdapter;
+import com.owncloud.android.ui.adapter.LocalFileListAdapter;
 
 import java.util.ArrayList;
 
@@ -98,12 +101,12 @@ public class ExtendedListFragment extends Fragment
     private GridViewWithHeaderAndFooter mGridView;
     private View mGridFooterView;
 
-    private FilterableListAdapter mAdapter;
+    private BaseAdapter mAdapter;
 
     private SearchView searchView;
     private Handler handler = new Handler();
 
-    protected void setListAdapter(FilterableListAdapter listAdapter) {
+    protected void setListAdapter(BaseAdapter listAdapter) {
         mAdapter = listAdapter;
         mCurrentListView.setAdapter(listAdapter);
         mCurrentListView.invalidateViews();
@@ -182,22 +185,51 @@ public class ExtendedListFragment extends Fragment
     }
 
     public boolean onQueryTextChange(final String query) {
-        handler.removeCallbacksAndMessages(null);
-        handler.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                mAdapter.filter(query);
-            }
-        }, 500);
+        performSearch(query, false);
         return true;
     }
 
     @Override
     public boolean onQueryTextSubmit(String query) {
-        mAdapter.filter(query);
+        performSearch(query, true);
         return true;
     }
 
+    private void performSearch(final String query, boolean isSubmit) {
+        handler.removeCallbacksAndMessages(null);
+
+        int delay = 500;
+
+        if (isSubmit) {
+            delay = 0;
+        }
+
+        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();
+        }
+
+
+    }
+
+
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {