From 2892dc60c727ef3e9bd2d3118061ae07c4a20732 Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Fri, 31 Jul 2015 14:57:24 -0700 Subject: Quick Search: Bring Design up to par Change-Id: I5fd21e4bdc916e11a37e465d25ce040831190e34 --- res/layout/home_fragment.xml | 15 +- res/layout/quick_search_item.xml | 38 +++++ res/values/dimen.xml | 7 + res/values/strings.xml | 11 +- .../filemanager/activities/MainActivity.java | 136 ++--------------- .../filemanager/activities/SearchActivity.java | 3 +- .../filemanager/adapters/QuickSearchAdapter.java | 163 +++++++++++++++++++++ .../filemanager/util/MimeTypeHelper.java | 46 ++++++ 8 files changed, 290 insertions(+), 129 deletions(-) create mode 100644 res/layout/quick_search_item.xml create mode 100644 src/com/cyanogenmod/filemanager/adapters/QuickSearchAdapter.java diff --git a/res/layout/home_fragment.xml b/res/layout/home_fragment.xml index 383c8b15..2dc24c03 100644 --- a/res/layout/home_fragment.xml +++ b/res/layout/home_fragment.xml @@ -48,12 +48,23 @@ + + + + + + + + + + + diff --git a/res/values/dimen.xml b/res/values/dimen.xml index bdbe1035..f2b918fb 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -192,4 +192,11 @@ 48dp 24dp + + + 80dp + 16dp + 15dp + 16dp + diff --git a/res/values/strings.xml b/res/values/strings.xml index 98022ed3..203b819b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -922,7 +922,16 @@ Unable to complete action RETRY UPGRADE - + Unable to fetch file system info for this path + + + Quick Search + Images + Audio + Videos + Docs + Apps + Archives diff --git a/src/com/cyanogenmod/filemanager/activities/MainActivity.java b/src/com/cyanogenmod/filemanager/activities/MainActivity.java index 619f02bf..a6bba46e 100755 --- a/src/com/cyanogenmod/filemanager/activities/MainActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/MainActivity.java @@ -26,7 +26,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.nfc.NfcAdapter; import android.os.Bundle; @@ -51,16 +50,15 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.SearchView; import android.widget.TextView; -import android.widget.Toast; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences; +import com.cyanogenmod.filemanager.adapters.QuickSearchAdapter; import com.cyanogenmod.filemanager.controllers.NavigationDrawerController; import com.cyanogenmod.filemanager.model.Bookmark; import com.cyanogenmod.filemanager.model.FileSystemObject; @@ -71,8 +69,6 @@ import com.cyanogenmod.filemanager.ui.fragments.NavigationFragment; import com.cyanogenmod.filemanager.ui.fragments.NavigationFragment.OnGoHomeRequestListener; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnBackRequestListener; import com.cyanogenmod.filemanager.util.FileHelper; -import com.cyanogenmod.filemanager.util.MimeTypeHelper; -import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.File; @@ -80,13 +76,6 @@ import java.io.InvalidClassException; import java.util.ArrayList; import java.util.List; -import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.APP; -import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.AUDIO; -import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.DOCUMENT; -import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.IMAGE; -import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.NONE; -import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.VIDEO; - /** * The main navigation activity. This activity is the center of the application. * From this the user can navigate, search, make actions.
@@ -141,32 +130,8 @@ public class MainActivity extends ActionBarActivity public static final String EXTRA_ADD_TO_HISTORY = "extra_add_to_history"; //$NON-NLS-1$ - static java.util.Map EASY_MODE_ICONS = new - java.util.HashMap(); - - private static final List EASY_MODE_LIST = new ArrayList() { - { - add(NONE); - add(IMAGE); - add(VIDEO); - add(AUDIO); - add(DOCUMENT); - add(APP); - } - }; - private Toolbar mToolBar; - private ArrayAdapter mEasyModeAdapter; - - private View.OnClickListener mEasyModeItemClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - Integer position = (Integer) view.getTag(); - onClicked(position); - } - }; - /** * Fragment types */ @@ -178,8 +143,6 @@ public class MainActivity extends ActionBarActivity NAVIGATION, } - static String MIME_TYPE_LOCALIZED_NAMES[]; - private Fragment currentFragment; private DrawerLayout mDrawerLayout; private NavigationDrawerController mNavigationDrawerController; @@ -317,8 +280,6 @@ public class MainActivity extends ActionBarActivity (NavigationView) findViewById(R.id.navigation_view); mNavigationDrawerController = new NavigationDrawerController(this, navigationDrawer); - MIME_TYPE_LOCALIZED_NAMES = MimeTypeCategory.getFriendlyLocalizedNames(this); - showWelcomeMsg(); //FragmentManager.OnBackStackChangedListener @@ -330,7 +291,7 @@ public class MainActivity extends ActionBarActivity }); handleSearchBar(); - + initQuickSearch(); setHomeStatusBarColor(); //Initialize nfc adapter @@ -580,87 +541,13 @@ public class MainActivity extends ActionBarActivity getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu); - - initEasyModePlus(); - } - - private void initEasyModePlus() { - - MIME_TYPE_LOCALIZED_NAMES = MimeTypeCategory.getFriendlyLocalizedNames(this); - EASY_MODE_ICONS.put(MimeTypeHelper.MimeTypeCategory.NONE, getResources().getDrawable( - R.drawable.ic_em_all)); - EASY_MODE_ICONS.put(MimeTypeHelper.MimeTypeCategory.IMAGE, getResources().getDrawable( - R.drawable.ic_em_image)); - EASY_MODE_ICONS.put(MimeTypeHelper.MimeTypeCategory.VIDEO, getResources().getDrawable( - R.drawable.ic_em_video)); - EASY_MODE_ICONS.put(MimeTypeHelper.MimeTypeCategory.AUDIO, getResources().getDrawable( - R.drawable.ic_em_music)); - EASY_MODE_ICONS.put(MimeTypeHelper.MimeTypeCategory.DOCUMENT, getResources().getDrawable( - R.drawable.ic_em_document)); - EASY_MODE_ICONS.put(MimeTypeHelper.MimeTypeCategory.APP, getResources().getDrawable( - R.drawable.ic_em_application)); - - GridView gridview = (GridView) findViewById(R.id.easy_modeView); - - mEasyModeAdapter = new android.widget.ArrayAdapter(this, R.layout - .navigation_view_simple_item) { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - convertView = (convertView == null) ? getLayoutInflater().inflate(R.layout - .navigation_view_simple_item, parent, false) : convertView; - MimeTypeCategory item = getItem(position); - String typeTitle = MIME_TYPE_LOCALIZED_NAMES[item.ordinal()]; - TextView typeTitleTV = (TextView) convertView - .findViewById(R.id.navigation_view_item_name); - ImageView typeIconIV = (ImageView) convertView - .findViewById(R.id.navigation_view_item_icon); - - typeTitleTV.setText(typeTitle); - typeIconIV.setImageDrawable(EASY_MODE_ICONS.get(item)); - convertView.setOnClickListener(mEasyModeItemClickListener); - convertView.setTag(position); - return convertView; - } - }; - mEasyModeAdapter.addAll(EASY_MODE_LIST); - gridview.setAdapter(mEasyModeAdapter); - - gridview.setOnItemClickListener(new OnItemClickListener() { - public void onItemClick(AdapterView parent, View v, int position, long id) { - Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show(); - } - }); } - private void onClicked(int position) { - Intent intent = new Intent(this, SearchActivity.class); - intent.setAction(Intent.ACTION_SEARCH); - intent.putExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY, FileHelper.ROOT_DIRECTORY); - intent.putExtra(SearchManager.QUERY, "*"); // Use wild-card '*' - - if (position == 0) { - FragmentManager fragmentManager = getSupportFragmentManager(); - - fragmentManager.beginTransaction() - .replace(R.id.navigation_fragment_container, new NavigationFragment()) - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) - .commit(); - return; - - } else { - ArrayList searchCategories = new ArrayList(); - MimeTypeCategory selectedCategory = EASY_MODE_LIST.get(position); - searchCategories.add(selectedCategory); - // a one off case where we implicitly want to also search for TEXT mimetypes when the - // DOCUMENTS category is selected - if (selectedCategory == MimeTypeCategory.DOCUMENT) { - searchCategories.add( - MimeTypeCategory.TEXT); - } - intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, searchCategories); - } - - startActivity(intent); + private void initQuickSearch() { + GridView gridview = (GridView) findViewById(R.id.quick_search_view); + QuickSearchAdapter quickSearchAdapter = new QuickSearchAdapter(this, R.layout.quick_search_item); + quickSearchAdapter.addAll(quickSearchAdapter.QUICK_SEARCH_LIST); + gridview.setAdapter(quickSearchAdapter); } @Override @@ -733,19 +620,18 @@ public class MainActivity extends ActionBarActivity public void onActionBarItemClick(android.view.View view) { if (currentFragment instanceof NavigationFragment) { - + NavigationFragment navigationFragment = ((NavigationFragment)currentFragment); switch (view.getId()) { //###################### //Selection Actions //###################### - case com.cyanogenmod.filemanager.R.id.ab_selection_done: + case R.id.ab_selection_done: //Show information of the filesystem - ((NavigationFragment)currentFragment) - .getCurrentNavigationView().onDeselectAll(); + navigationFragment.getCurrentNavigationView().onDeselectAll(); break; case R.id.ab_actions: // Show the actions dialog - ((NavigationFragment) currentFragment).openActionsDialog(null, true); + navigationFragment.openActionsDialog(null, true); default: break; } diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 0449c999..b3f31554 100755 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -754,7 +754,8 @@ public class SearchActivity extends Activity ArrayList localizedNames = new ArrayList(mMimeTypeCategories.size()); for (MimeTypeCategory category : mMimeTypeCategories) { localizedNames - .add(MainActivity.MIME_TYPE_LOCALIZED_NAMES[category.ordinal()]); + .add(MimeTypeHelper.MimeTypeCategory + .getFriendlyLocalizedNames(this)[category.ordinal()]); } this.mSearchTerms.setText( Html.fromHtml(getString(R.string.search_terms, localizedNames))); diff --git a/src/com/cyanogenmod/filemanager/adapters/QuickSearchAdapter.java b/src/com/cyanogenmod/filemanager/adapters/QuickSearchAdapter.java new file mode 100644 index 00000000..15835522 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/adapters/QuickSearchAdapter.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.adapters; + +import android.app.SearchManager; +import android.content.Context; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.StateListDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.activities.SearchActivity; +import com.cyanogenmod.filemanager.ui.IconHolder; +import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.APP; +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.COMPRESS; +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.IMAGE; +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.AUDIO; +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.VIDEO; +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.DOCUMENT; + +public class QuickSearchAdapter extends ArrayAdapter + implements View.OnClickListener { + + static String MIME_TYPE_LOCALIZED_NAMES[]; + + static Map QUICK_SEARCH_ICONS + = new HashMap(); + static { + QUICK_SEARCH_ICONS.put(MimeTypeHelper.MimeTypeCategory.IMAGE, + R.drawable.ic_category_images); + QUICK_SEARCH_ICONS.put(MimeTypeHelper.MimeTypeCategory.AUDIO, R.drawable.ic_category_audio); + QUICK_SEARCH_ICONS.put(MimeTypeHelper.MimeTypeCategory.VIDEO, R.drawable.ic_category_video); + QUICK_SEARCH_ICONS.put(MimeTypeHelper.MimeTypeCategory.DOCUMENT, + R.drawable.ic_category_docs); + QUICK_SEARCH_ICONS.put(MimeTypeHelper.MimeTypeCategory.APP, R.drawable.ic_category_apps); + QUICK_SEARCH_ICONS.put(MimeTypeHelper.MimeTypeCategory.COMPRESS, + R.drawable.ic_category_archives); + } + + public static final List QUICK_SEARCH_LIST + = new ArrayList() { + { + add(IMAGE); + add(AUDIO); + add(VIDEO); + add(DOCUMENT); + add(APP); + add(COMPRESS); + } + }; + + IconHolder mIconHolder; + + public QuickSearchAdapter(Context context, int resource) { + super(context, resource); + + MIME_TYPE_LOCALIZED_NAMES = + MimeTypeHelper.MimeTypeCategory.getDefinedLocalizedNames(context); + mIconHolder = new IconHolder(context, false); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + convertView = (convertView == null) ? LayoutInflater.from(getContext()).inflate( + R.layout.quick_search_item, parent, false) : convertView; + + MimeTypeHelper.MimeTypeCategory item = getItem(position); + String typeTitle = MIME_TYPE_LOCALIZED_NAMES[item.ordinal()]; + TextView typeTitleTV = (TextView) convertView + .findViewById(R.id.navigation_view_item_name); + ImageView typeIconIV = (ImageView) convertView + .findViewById(R.id.navigation_view_item_icon); + + typeTitleTV.setText(typeTitle); + convertView.setOnClickListener(this); + convertView.setTag(position); + + int colorId = MimeTypeHelper.getIconColorFromIconId(getContext(), QUICK_SEARCH_ICONS.get(item)); + setIcon(typeIconIV, getContext().getResources().getDrawable(QUICK_SEARCH_ICONS.get(item)), + R.color.navigation_view_icon_unselected, R.drawable.ic_icon_background, + getContext().getResources().getColor(colorId)); + + return convertView; + } + + // Set drawable as icon + private void setIcon(ImageView view, Drawable iconDrawable, int iconColorId, int backgroundId, + int backgroundColor) { + + StateListDrawable stateListDrawable = new StateListDrawable(); + addUnselected(getContext().getResources(), stateListDrawable, iconDrawable, iconColorId); + + ColorStateList colorList = new ColorStateList( + new int[][]{new int[]{android.R.attr.state_selected}, + new int[]{}}, + new int[]{getContext().getResources() + .getColor(R.color.navigation_view_icon_selected), backgroundColor}); + + view.setBackgroundResource(backgroundId); + view.setBackgroundTintList(colorList); + view.setImageDrawable(stateListDrawable); + } + + // default + private void addUnselected(Resources res, StateListDrawable drawable, Drawable iconDrawable, + int colorId) { + iconDrawable.setTint(res.getColor(colorId)); + drawable.addState(new int[0], iconDrawable); + } + + @Override + public void onClick(View view) { + Integer position = (Integer) view.getTag(); + + Intent intent = new Intent(getContext(), SearchActivity.class); + intent.setAction(Intent.ACTION_SEARCH); + intent.putExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY, FileHelper.ROOT_DIRECTORY); + intent.putExtra(SearchManager.QUERY, "*"); // Use wild-card '*' + + ArrayList searchCategories = + new ArrayList(); + MimeTypeHelper.MimeTypeCategory selectedCategory = QUICK_SEARCH_LIST.get(position); + searchCategories.add(selectedCategory); + // a one off case where we implicitly want to also search for TEXT mimetypes when the + // DOCUMENTS category is selected + if (selectedCategory == MimeTypeHelper.MimeTypeCategory.DOCUMENT) { + searchCategories.add( + MimeTypeHelper.MimeTypeCategory.TEXT); + } + intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, searchCategories); + + getContext().startActivity(intent); + } +} \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index e6a945d6..5dcb81f8 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -115,6 +115,14 @@ public final class MimeTypeHelper { */ SECURITY; + private static final String CAT_IMAGE = "IMAGE"; + private static final String CAT_AUDIO = "AUDIO"; + private static final String CAT_VIDEO = "VIDEO"; + private static final String CAT_DOCUMENT = "DOCUMENT"; + private static final String CAT_APP = "APP"; + private static final String CAT_COMPRESS = "COMPRESS"; + private static final String CAT_ALL = "-"; + public static String[] names() { MimeTypeCategory[] categories = values(); String[] names = new String[categories.length]; @@ -142,6 +150,44 @@ public final class MimeTypeHelper { return localizedNames; } + + public static String[] getDefinedLocalizedNames(Context context) { + MimeTypeCategory[] categories = values(); + String[] localizedNames = new String[categories.length]; + + for (int i = 0; i < categories.length; i++) { + String description = getCategoryDescription(context, categories[i]); + switch (description) { + case CAT_IMAGE: + description = context.getString(R.string.images); + break; + case CAT_AUDIO: + description = context.getString(R.string.audio); + break; + case CAT_VIDEO: + description = context.getString(R.string.videos); + break; + case CAT_DOCUMENT: + description = context.getString(R.string.docs); + break; + case CAT_APP: + description = context.getString(R.string.apps); + break; + case CAT_COMPRESS: + description = context.getString(R.string.archives); + break; + case CAT_ALL: + description = context.getString(R.string.category_all); + break; + } + description = description.substring(0, 1).toUpperCase() + + description.substring(1).toLowerCase(); + localizedNames[i] = description; + } + + return localizedNames; + } + } /** -- cgit v1.2.3