Browse Source

Merge pull request #152 from nextcloud/filter

filter for oc file list and local file list
Andy Scherzinger 9 năm trước cách đây
mục cha
commit
b6e755da65

BIN
res/drawable-hdpi/ic_search.png


BIN
res/drawable-hdpi/ic_search_grey.png


BIN
res/drawable-mdpi/ic_search.png


BIN
res/drawable-mdpi/ic_search_grey.png


BIN
res/drawable-xhdpi/ic_search.png


BIN
res/drawable-xhdpi/ic_search_grey.png


BIN
res/drawable-xxhdpi/ic_search.png


BIN
res/drawable-xxhdpi/ic_search_grey.png


BIN
res/drawable-xxxhdpi/ic_search.png


BIN
res/drawable-xxxhdpi/ic_search_grey.png


+ 6 - 0
res/menu/main_menu.xml

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

+ 8 - 2
res/menu/upload_files_picker.xml

@@ -19,18 +19,24 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto">
 
+    <item android:id="@+id/action_search"
+          android:icon="@drawable/ic_search"
+          android:title="@string/actionbar_search"
+          android:contentDescription="@string/actionbar_search"
+          app:actionViewClass="android.support.v7.widget.SearchView"
+          app:showAsAction="ifRoom|collapseActionView"/>
     <item
         android:id="@+id/action_select_all"
         android:checkable="true"
         android:contentDescription="@string/select_all"
         android:title="@string/select_all"
         android:icon="@drawable/ic_select_all"
-        app:showAsAction="always"/>
+        app:showAsAction="never"/>
     <item
         android:id="@+id/action_sort"
         android:icon="@drawable/ic_sort_variant"
         android:orderInCategory="2"
-        app:showAsAction="ifRoom"
+        app:showAsAction="never"
         android:title="@string/actionbar_sort"
         android:contentDescription="@string/actionbar_sort"/>
 </menu>

+ 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="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="actionbar_search">Search</string>
     <plurals name="items_selected_count">
         <!--
              As a developer, you should always supply "one" and "other"

+ 1 - 1
res/values/styles.xml

@@ -85,7 +85,7 @@
 		<!-- Close button icon -->
 		<item name="closeIcon">@drawable/ic_close</item>
 		<!-- Search button icon -->
-		<item name="searchIcon">@drawable/ic_search</item>
+		<item name="searchIcon">@drawable/ic_search_grey</item>
 		<!-- Layout for query suggestion rows // unused for now, staying with the standard layout -->
 		<!--<item name="suggestionRowLayout">...</item>-->
 	</style>

+ 14 - 3
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -133,6 +133,8 @@ public class FileDisplayActivity extends HookActivity
 
     private OCFile mWaitingToSend;
 
+    private Collection<MenuItem> mDrawerMenuItemstoShowHideList;
+
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -518,9 +520,10 @@ public class FileDisplayActivity extends HookActivity
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         boolean drawerOpen = isDrawerOpen();
-        menu.findItem(R.id.action_sort).setVisible(!drawerOpen);
-        menu.findItem(R.id.action_sync_account).setVisible(!drawerOpen);
-        menu.findItem(R.id.action_switch_view).setVisible(!drawerOpen);
+
+        for (MenuItem menuItem:mDrawerMenuItemstoShowHideList) {
+            menuItem.setVisible(!drawerOpen);
+        }
 
         return super.onPrepareOptionsMenu(menu);
     }
@@ -530,6 +533,14 @@ public class FileDisplayActivity extends HookActivity
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.main_menu, menu);
         menu.findItem(R.id.action_create_dir).setVisible(false);
+
+        // populate list of menu items to show/hide when drawer is opened/closed
+        mDrawerMenuItemstoShowHideList = new ArrayList<>(4);
+        mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_sort));
+        mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_sync_account));
+        mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_switch_view));
+        mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_search));
+
         return true;
     }
 

+ 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
  * instance.
  */
-public class FileListListAdapter extends BaseAdapter implements ListAdapter {
+public class FileListListAdapter extends BaseAdapter implements FilterableListAdapter {
 
     private Context mContext;
+    private Vector<OCFile> mFilesAll = new Vector<OCFile>();
     private Vector<OCFile> mFiles = null;
     private boolean mJustFolders;
 
@@ -402,6 +403,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         }
 
         mFiles = FileStorageUtils.sortOcFolder(mFiles);
+
+        mFilesAll.clear();
+        mFilesAll.addAll(mFiles);
+
         notifyDataSetChanged();
     }
 
@@ -452,4 +457,21 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         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 AFFERO GENERAL PUBLIC LICENSE
+ *   License as published by the Free Software Foundation; either
+ *   version 3 of the License, or any later version.
+ *
+ *   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 AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ *   You should have received a copy of the GNU Affero 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.widget.BaseAdapter;
 import android.widget.ImageView;
-import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
 
@@ -41,21 +40,24 @@ import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimetypeIconUtil;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.Vector;
 
 /**
  * This Adapter populates a ListView with all files and directories contained
  * 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 Context mContext;
     private File mDirectory;
     private File[] mFiles = null;
-    
+    private Vector<File> mFilesAll = new Vector<File>();
+
     public LocalFileListAdapter(File directory, Context context) {
         mContext = context;
 
@@ -245,6 +247,12 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
             });
 
             mFiles = FileStorageUtils.sortLocalFolder(mFiles);
+
+            mFilesAll.clear();
+
+            for (File mFile : mFiles) {
+                mFilesAll.add(mFile);
+            }
         }
         notifyDataSetChanged();
     }
@@ -259,4 +267,20 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
         mFiles = FileStorageUtils.sortLocalFolder(mFiles);
         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.support.v4.app.Fragment;
+import android.support.v4.view.MenuItemCompat;
 import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.SearchView;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 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.ui.ExtendedListView;
 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 third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
 
 public class ExtendedListFragment extends Fragment
-        implements OnItemClickListener, OnEnforceableRefreshListener {
+        implements OnItemClickListener, OnEnforceableRefreshListener, SearchView.OnQueryTextListener {
 
     protected static final String TAG = ExtendedListFragment.class.getSimpleName();
 
@@ -83,9 +88,9 @@ public class ExtendedListFragment extends Fragment
     private GridViewWithHeaderAndFooter mGridView;
     private View mGridFooterView;
 
-    private ListAdapter mAdapter;
+    private FilterableListAdapter mAdapter;
 
-    protected void setListAdapter(ListAdapter listAdapter) {
+    protected void setListAdapter(FilterableListAdapter listAdapter) {
         mAdapter = listAdapter;
         mCurrentListView.setAdapter(listAdapter);
         mCurrentListView.invalidateViews();
@@ -134,8 +139,25 @@ public class ExtendedListFragment extends Fragment
     public boolean isGridEnabled(){
         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
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              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 */
     private LocalFileListAdapter mAdapter = null;
 
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setHasOptionsMenu(true);
+    }
+
     /**
      * {@inheritDoc}
      */