Browse Source

filter for oc file list and local file list

tobiasKaminsky 9 years ago
parent
commit
a3a6420ead

+ 4 - 0
res/menu/main_menu.xml

@@ -20,6 +20,10 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
 
+    <item android:id="@+id/action_search"
+          android:title="@string/actionbar_search"
+          app:actionViewClass="android.support.v7.widget.SearchView"
+          app:showAsAction="always"/>
     <item
     <item
         android:id="@+id/action_create_dir"
         android:id="@+id/action_create_dir"
         android:icon="@drawable/ic_action_create_dir"
         android:icon="@drawable/ic_action_create_dir"

+ 4 - 0
res/menu/upload_files_picker.xml

@@ -19,6 +19,10 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto">
       xmlns:app="http://schemas.android.com/apk/res-auto">
 
 
+    <item android:id="@+id/action_search"
+          android:title="@string/actionbar_search"
+          app:actionViewClass="android.support.v7.widget.SearchView"
+          app:showAsAction="always"/>
     <item
     <item
         android:id="@+id/action_select_all"
         android:id="@+id/action_select_all"
         android:checkable="true"
         android:checkable="true"

+ 1 - 0
res/values/strings.xml

@@ -457,6 +457,7 @@
     <string name="local_file_not_found_toast">The file was not found in the local file system</string>
     <string name="local_file_not_found_toast">The file was not found in the local file system</string>
     <string name="confirmation_remove_files_alert">Do you really want to remove the selected items?</string>
     <string name="confirmation_remove_files_alert">Do you really want to remove the selected items?</string>
     <string name="confirmation_remove_folders_alert">Do you really want to remove the selected items and their contents?</string>
     <string name="confirmation_remove_folders_alert">Do you really want to remove the selected items and their contents?</string>
+    <string name="actionbar_search">Search</string>
     <plurals name="items_selected_count">
     <plurals name="items_selected_count">
         <!--
         <!--
              As a developer, you should always supply "one" and "other"
              As a developer, you should always supply "one" and "other"

+ 23 - 1
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -61,9 +61,10 @@ import java.util.Vector;
  * This Adapter populates a ListView with all files and folders in an ownCloud
  * This Adapter populates a ListView with all files and folders in an ownCloud
  * instance.
  * instance.
  */
  */
-public class FileListListAdapter extends BaseAdapter implements ListAdapter {
+public class FileListListAdapter extends BaseAdapter implements FilterableListAdapter {
 
 
     private Context mContext;
     private Context mContext;
+    private Vector<OCFile> mFilesAll = new Vector<OCFile>();
     private Vector<OCFile> mFiles = null;
     private Vector<OCFile> mFiles = null;
     private boolean mJustFolders;
     private boolean mJustFolders;
 
 
@@ -402,6 +403,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         }
         }
 
 
         mFiles = FileStorageUtils.sortOcFolder(mFiles);
         mFiles = FileStorageUtils.sortOcFolder(mFiles);
+
+        mFilesAll.clear();
+        mFilesAll.addAll(mFiles);
+
         notifyDataSetChanged();
         notifyDataSetChanged();
     }
     }
 
 
@@ -452,4 +457,21 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         return files;
         return files;
     }
     }
 
 
+    public void filter(String text){
+        if(text.isEmpty()){
+            mFiles.clear();
+            mFiles.addAll(mFilesAll);
+        } else {
+            ArrayList<OCFile> result = new ArrayList<>();
+            text = text.toLowerCase();
+            for(OCFile file: mFilesAll){
+                if(file.getFileName().toLowerCase().contains(text)){
+                    result.add(file);
+                }
+            }
+            mFiles.clear();
+            mFiles.addAll(result);
+        }
+        notifyDataSetChanged();
+    }
 }
 }

+ 27 - 0
src/com/owncloud/android/ui/adapter/FilterableListAdapter.java

@@ -0,0 +1,27 @@
+/**
+ *   Nextcloud Android client application
+ *
+ *   Copyright (C) 2016 Tobias Kaminsky
+ *   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/>.
+ *
+ */
+
+package com.owncloud.android.ui.adapter;
+
+import android.widget.ListAdapter;
+
+public interface FilterableListAdapter extends ListAdapter {
+    void filter(String text);
+}

+ 27 - 3
src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -27,7 +27,6 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.BaseAdapter;
 import android.widget.ImageView;
 import android.widget.ImageView;
-import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.TextView;
 
 
@@ -41,21 +40,24 @@ import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimetypeIconUtil;
 import com.owncloud.android.utils.MimetypeIconUtil;
 
 
 import java.io.File;
 import java.io.File;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Comparator;
+import java.util.Vector;
 
 
 /**
 /**
  * This Adapter populates a ListView with all files and directories contained
  * This Adapter populates a ListView with all files and directories contained
  * in a local directory
  * in a local directory
  */
  */
-public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
+public class LocalFileListAdapter extends BaseAdapter implements FilterableListAdapter {
 
 
     private static final String TAG = LocalFileListAdapter.class.getSimpleName();
     private static final String TAG = LocalFileListAdapter.class.getSimpleName();
 
 
     private Context mContext;
     private Context mContext;
     private File mDirectory;
     private File mDirectory;
     private File[] mFiles = null;
     private File[] mFiles = null;
-    
+    private Vector<File> mFilesAll = new Vector<File>();
+
     public LocalFileListAdapter(File directory, Context context) {
     public LocalFileListAdapter(File directory, Context context) {
         mContext = context;
         mContext = context;
 
 
@@ -245,6 +247,12 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
             });
             });
 
 
             mFiles = FileStorageUtils.sortLocalFolder(mFiles);
             mFiles = FileStorageUtils.sortLocalFolder(mFiles);
+
+            mFilesAll.clear();
+
+            for (File mFile : mFiles) {
+                mFilesAll.add(mFile);
+            }
         }
         }
         notifyDataSetChanged();
         notifyDataSetChanged();
     }
     }
@@ -259,4 +267,20 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
         mFiles = FileStorageUtils.sortLocalFolder(mFiles);
         mFiles = FileStorageUtils.sortLocalFolder(mFiles);
         notifyDataSetChanged();
         notifyDataSetChanged();
     }
     }
+
+    public void filter(String text){
+        if(text.isEmpty()){
+            mFiles = mFilesAll.toArray(new File[1]);
+        } else {
+            ArrayList<File> result = new ArrayList<>();
+            text = text.toLowerCase();
+            for (File file: mFilesAll) {
+                if (file.getName().toLowerCase().contains(text)) {
+                    result.add(file);
+                }
+            }
+            mFiles = result.toArray(new File[1]);
+        }
+        notifyDataSetChanged();
+    }
 }
 }

+ 28 - 6
src/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -22,8 +22,13 @@ package com.owncloud.android.ui.fragment;
 
 
 import android.os.Bundle;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.Fragment;
+import android.support.v4.view.MenuItemCompat;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.SearchView;
 import android.view.LayoutInflater;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup;
 import android.widget.AbsListView;
 import android.widget.AbsListView;
@@ -39,14 +44,14 @@ import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.ExtendedListView;
 import com.owncloud.android.ui.ExtendedListView;
 import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
 import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
-import com.owncloud.android.ui.adapter.FileListListAdapter;
+import com.owncloud.android.ui.adapter.FilterableListAdapter;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 
 
 import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
 import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
 
 
 public class ExtendedListFragment extends Fragment
 public class ExtendedListFragment extends Fragment
-        implements OnItemClickListener, OnEnforceableRefreshListener {
+        implements OnItemClickListener, OnEnforceableRefreshListener, SearchView.OnQueryTextListener {
 
 
     protected static final String TAG = ExtendedListFragment.class.getSimpleName();
     protected static final String TAG = ExtendedListFragment.class.getSimpleName();
 
 
@@ -83,9 +88,9 @@ public class ExtendedListFragment extends Fragment
     private GridViewWithHeaderAndFooter mGridView;
     private GridViewWithHeaderAndFooter mGridView;
     private View mGridFooterView;
     private View mGridFooterView;
 
 
-    private ListAdapter mAdapter;
+    private FilterableListAdapter mAdapter;
 
 
-    protected void setListAdapter(ListAdapter listAdapter) {
+    protected void setListAdapter(FilterableListAdapter listAdapter) {
         mAdapter = listAdapter;
         mAdapter = listAdapter;
         mCurrentListView.setAdapter(listAdapter);
         mCurrentListView.setAdapter(listAdapter);
         mCurrentListView.invalidateViews();
         mCurrentListView.invalidateViews();
@@ -134,8 +139,25 @@ public class ExtendedListFragment extends Fragment
     public boolean isGridEnabled(){
     public boolean isGridEnabled(){
         return (mCurrentListView == mGridView);
         return (mCurrentListView == mGridView);
     }
     }
-    
-    
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        final MenuItem item = menu.findItem(R.id.action_search);
+        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
+        searchView.setOnQueryTextListener(this);
+    }
+
+    public boolean onQueryTextChange(String query) {
+        mAdapter.filter(query);
+        return true;
+    }
+
+    @Override
+    public boolean onQueryTextSubmit(String query) {
+        mAdapter.filter(query);
+        return true;
+    }
+
     @Override
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
                              Bundle savedInstanceState) {

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

@@ -55,6 +55,12 @@ public class LocalFileListFragment extends ExtendedListFragment {
     /** Adapter to connect the data from the directory with the View object */
     /** Adapter to connect the data from the directory with the View object */
     private LocalFileListAdapter mAdapter = null;
     private LocalFileListAdapter mAdapter = null;
 
 
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setHasOptionsMenu(true);
+    }
+
     /**
     /**
      * {@inheritDoc}
      * {@inheritDoc}
      */
      */