</intent-filter>
<meta-data
android:name="android.app.searchable"
+ android:value=".activities.SearchActivity"
android:resource="@xml/searchable" />
</activity>
android:layout_marginLeft="@dimen/default_margin"
android:singleLine="true"
android:textAppearance="@style/secondary_text_appearance" />
+
+ <Spinner
+ android:id="@+id/search_status_type_spinner"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:layout_marginBottom="@dimen/default_margin"
+ android:layout_marginRight="@dimen/default_margin"
+ android:gravity="left"
+ android:textColor="@android:color/white"
+ android:dropDownVerticalOffset="20dp" />
+
</RelativeLayout>
<com.cyanogenmod.filemanager.ui.widgets.FlingerListView
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+ -->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="left"
+ android:textColor="@android:color/white" />
\ No newline at end of file
<string name="category_audio">AUDIO</string>
<string name="category_video">VIDEO</string>
<string name="category_security">SECURITY</string>
+ <string name="category_all">ALL</string>
<!-- Compression - Compression modes dialog title -->
<string name="compression_mode_title">Compression mode</string>
<item name="android:colorPrimaryDark">@color/material_palette_blue_primary_dark</item>
<item name="android:colorControlHighlight">@color/material_palette_blue_accent_dark</item>
<item name="android:colorAccent">@color/material_palette_blue_primary_dark</item>
+ <item name="android:actionMenuTextColor">@android:color/white</item>
</style>
<!-- Base themes -->
<item name="android:colorAccent">@color/material_palette_blue_primary</item>
<item name="android:actionBarStyle">@style/FileManager.Widget.ActionBar.White</item>
<item name="android:homeAsUpIndicator">@drawable/material_ripple_up_arrow</item>
+ <item name="android:actionMenuTextColor">@android:color/white</item>
</style>
<style name="FileManager.Theme.Material.NoActionBar" parent="@android:style/Theme.Material.NoActionBar">
<item name="android:colorPrimaryDark">@color/material_palette_blue_primary_dark</item>
<item name="android:colorControlHighlight">@color/material_palette_blue_accent_dark</item>
<item name="android:colorAccent">@color/material_palette_blue_accent</item>
+ <item name="android:actionMenuTextColor">@android:color/white</item>
</style>
<style name="FileManager.Theme.Material" parent="@android:style/Theme.Material">
<item name="android:colorAccent">@color/material_palette_blue_primary</item>
<item name="android:actionBarStyle">@style/FileManager.Widget.ActionBar.White</item>
<item name="android:homeAsUpIndicator">@drawable/material_ripple_up_arrow</item>
+ <item name="android:actionMenuTextColor">@android:color/white</item>
</style>
<!-- A theme with overlay -->
@Override
protected void onResume() {
super.onResume();
+
+ if (mSearchView.getVisibility() == View.VISIBLE) {
+ closeSearch();
+ }
// Check restrictions
if (!FileManagerApplication.checkRestrictSecondaryUsersAccess(this, mChRooted)) {
return !this.mExitFlag;
}
- /**
- * {@inheritDoc}
- */
@Override
- public boolean onSearchRequested() {
- Bundle bundle = new Bundle();
- bundle.putString(
- SearchActivity.EXTRA_SEARCH_DIRECTORY,
- getCurrentNavigationView().getCurrentDir());
- startSearch(Preferences.getLastSearch(), true, bundle, false);
- closeSearch();
- return true;
+ public void startActivity(Intent intent) {
+ // check if search intent
+ if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
+ intent.putExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY,
+ getCurrentNavigationView().getCurrentDir());
+ }
+
+ super.startActivity(intent);
}
/**
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
+
+import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
+import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
-
import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.activities.preferences.SearchPreferenceFragment;
import com.cyanogenmod.filemanager.util.ExceptionUtil;
import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult;
import com.cyanogenmod.filemanager.util.FileHelper;
+import com.cyanogenmod.filemanager.util.MimeTypeHelper;
import com.cyanogenmod.filemanager.util.StorageHelper;
import java.io.FileNotFoundException;
* An activity for search files and folders.
*/
public class SearchActivity extends Activity
- implements OnItemClickListener, OnItemLongClickListener, OnRequestRefreshListener {
+ implements OnItemClickListener, OnItemLongClickListener, OnRequestRefreshListener,
+ AdapterView.OnItemSelectedListener {
private static final String TAG = "SearchActivity"; //$NON-NLS-1$
// Resolve the symlinks
FileHelper.resolveSymlinks(
- SearchActivity.this, SearchActivity.this.mResultList);
+ SearchActivity.this, SearchActivity.this.mResultList);
// Draw the results
drawResults();
restoreState(state);
}
- //Initialize action bars and search
+ //Initialize action bars and searc
initTitleActionBar();
initComponents();
*/
private void initTitleActionBar() {
//Configure the action bar options
- getActionBar().setBackgroundDrawable(
+ // Set up the action bar to show a dropdown list.
+ final ActionBar actionBar = getActionBar();
+ actionBar.setDisplayShowTitleEnabled(false);
+ actionBar.setBackgroundDrawable(
getResources().getDrawable(R.drawable.bg_material_titlebar));
- getActionBar().setDisplayOptions(
- ActionBar.DISPLAY_SHOW_CUSTOM);
- getActionBar().setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+
View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false);
TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title);
ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button1);
configuration.setImageResource(R.drawable.ic_material_light_config);
configuration.setVisibility(View.VISIBLE);
+ actionBar.setCustomView(customTitle);
+
+ // Specify a SpinnerAdapter to populate the dropdown list.
+ Spinner typeSpinner = (Spinner) findViewById(R.id.search_status_type_spinner);
- getActionBar().setCustomView(customTitle);
+ ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
+ R.layout.search_spinner_item,
+ MimeTypeHelper.MimeTypeCategory.getFriendlyLocalizedNames(this));
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ typeSpinner.setAdapter(adapter);
+ typeSpinner.setOnItemSelectedListener(this);
}
/**
/**NON BLOCK**/
}
- //Recovery the search directory
- Bundle bundle = getIntent().getBundleExtra(SearchManager.APP_DATA);
//If data is not present, use root directory to do the search
this.mSearchDirectory = FileHelper.ROOT_DIRECTORY;
- if (bundle != null) {
- this.mSearchDirectory =
- bundle.getString(EXTRA_SEARCH_DIRECTORY, FileHelper.ROOT_DIRECTORY);
+ String searchDirectory = getIntent()
+ .getStringExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY);
+
+ if (!TextUtils.isEmpty(searchDirectory)) {
+ this.mSearchDirectory = searchDirectory;
}
//Retrieve the query ¿from voice recognizer?
theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$
v = findViewById(R.id.search_status_query_terms);
theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$
+
//ListView
if (this.mSearchListView.getAdapter() != null) {
((SearchResultAdapter)this.mSearchListView.getAdapter()).notifyDataSetChanged();
theme.getDrawable(this, "horizontal_divider_drawable")); //$NON-NLS-1$
this.mSearchListView.invalidate();
}
+
+ @Override
+ public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
+ String category = MimeTypeHelper.MimeTypeCategory.names()[i];
+ SearchResultAdapter adapter = ((SearchResultAdapter) this.mSearchListView.getAdapter());
+ if (adapter != null) {
+ adapter.setMimeFilter(category);
+ }
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> adapterView) {
+ //ignore
+ }
}
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
+import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.model.FileSystemObject;
import com.cyanogenmod.filemanager.model.Query;
import com.cyanogenmod.filemanager.model.SearchResult;
+import com.cyanogenmod.filemanager.preferences.AccessMode;
+import com.cyanogenmod.filemanager.preferences.DisplayRestrictions;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.preferences.Preferences;
import com.cyanogenmod.filemanager.ui.IconHolder;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
import com.cyanogenmod.filemanager.ui.widgets.RelevanceView;
+import com.cyanogenmod.filemanager.util.FileHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper;
import com.cyanogenmod.filemanager.util.SearchHelper;
import java.io.File;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* An implementation of {@link ArrayAdapter} for display search results.
*/
public class SearchResultAdapter extends ArrayAdapter<SearchResult> {
+ private MimeTypeHelper.MimeTypeCategory mMimeFilter = MimeTypeHelper.MimeTypeCategory.NONE;
+
/**
* A class that conforms with the ViewHolder pattern to performance
* the list view rendering.
private final boolean mShowRelevanceWidget;
private final List<String> mQueries;
+ private final List<SearchResult> mOriginalList;
private boolean mDisposed;
public SearchResultAdapter(
Context context, List<SearchResult> files, int itemViewResourceId, Query queries) {
super(context, RESOURCE_ITEM_NAME, files);
+
+ mOriginalList = new ArrayList<SearchResult>(files);
+
this.mDisposed = false;
final boolean displayThumbs = Preferences.getSharedPreferences().getBoolean(
FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId(),
}
/**
+ * Method that allows filtering the results by {@link MimeTypeHelper.MimeTypeCategory}
+ * @param mimeFilter the MimeTypeCategory to filter by
+ */
+ public void setMimeFilter(String mimeFilter) {
+ // Are we in ChRooted environment?
+ boolean chRooted =
+ FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0;
+
+ // Create display restrictions
+ Map<DisplayRestrictions, Object> restrictions =
+ new HashMap<DisplayRestrictions, Object>();
+ restrictions.put(
+ DisplayRestrictions.MIME_TYPE_RESTRICTION, MimeTypeHelper.ALL_MIME_TYPES);
+
+ List<SearchResult> newResults = SearchHelper.convertToResults(
+ FileHelper.applyUserPreferences(
+ getFiles(), restrictions, true, chRooted), new Query().fillSlots(mQueries));
+
+ clear();
+ for (SearchResult result : newResults) {
+ // Only show results that are within our category, or all if no filter is set
+ if (TextUtils.equals(mimeFilter, MimeTypeHelper.MimeTypeCategory.NONE.name()) ||
+ MimeTypeHelper.getCategory(getContext(), result.getFso()) ==
+ MimeTypeHelper.MimeTypeCategory.valueOf(mimeFilter)) {
+ add(result);
+ }
+ }
+
+ this.notifyDataSetChanged();
+ }
+
+ /**
* Method that dispose the elements of the adapter.
*/
public void dispose() {
}
this.mDisposed = true;
clear();
+ this.mOriginalList.clear();
this.mData = null;
this.mIconHolder = null;
}
}
/**
+ * Method that returns the files of the adapter.
+ *
+ * @return List<FileSystemObject> The adapter data
+ */
+ public List<FileSystemObject> getFiles() {
+ final List<FileSystemObject> data = new ArrayList<FileSystemObject>();
+ for (SearchResult result : mOriginalList) {
+ data.add(result.getFso());
+ }
+ return data;
+ }
+
+ /**
* Returns the position of the specified item in the array.
*
* @param item The item to retrieve the position of.
/**
* Security file (certificate, keys, ...)
*/
- SECURITY
+ SECURITY;
+
+ public static String[] names() {
+ MimeTypeCategory[] categories = values();
+ String[] names = new String[categories.length];
+
+ for (int i = 0; i < categories.length; i++) {
+ names[i] = categories[i].name();
+ }
+
+ return names;
+ }
+
+ public static String[] getFriendlyLocalizedNames(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]);
+ if (TextUtils.equals("-", description)) {
+ description = context.getString(R.string.category_all);
+ }
+ description = description.substring(0, 1).toUpperCase()
+ + description.substring(1).toLowerCase();
+ localizedNames[i] = description;
+ }
+
+ return localizedNames;
+ }
}
/**