aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2016-11-02 17:59:26 -0700
committerSteve Kondik <steve@cyngn.com>2016-11-02 17:59:28 -0700
commit38bfe4efa1ce6ef5f5a171544cd94614ec377756 (patch)
tree0e950bcaa29f57f24791888990a4dafd7e38e34c
parent039f7d06a2dca304788f3e6e3ecc358e223d712a (diff)
downloadandroid_packages_apps_CMFileManager-38bfe4efa1ce6ef5f5a171544cd94614ec377756.tar.gz
android_packages_apps_CMFileManager-38bfe4efa1ce6ef5f5a171544cd94614ec377756.tar.bz2
android_packages_apps_CMFileManager-38bfe4efa1ce6ef5f5a171544cd94614ec377756.zip
Revert "CMFM: improved search performance"
* Will revisit. This reverts commit 21560d809d52fbba94d55b1e6b8eb091c885b9fa. Change-Id: I665b6a5365eeb11d2f81ed229c81018d438e7e5e
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/activities/SearchActivity.java259
-rw-r--r--src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java196
-rw-r--r--src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java14
3 files changed, 196 insertions, 273 deletions
diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
index 6e6d7317..b68e34cf 100755
--- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
+++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
@@ -29,9 +29,7 @@ import android.content.IntentFilter;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcelable;
import android.preference.PreferenceActivity;
@@ -39,6 +37,7 @@ import android.provider.SearchRecentSuggestions;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
+import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
@@ -73,7 +72,6 @@ import com.cyanogenmod.filemanager.preferences.AccessMode;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.preferences.Preferences;
import com.cyanogenmod.filemanager.providers.RecentSearchesContentProvider;
-import com.cyanogenmod.filemanager.ui.IconHolder;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
import com.cyanogenmod.filemanager.ui.dialogs.ActionsDialog;
@@ -93,10 +91,8 @@ import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory;
import com.cyanogenmod.filemanager.util.SearchHelper;
import com.cyanogenmod.filemanager.util.StorageHelper;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.Serializable;
-import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -187,7 +183,7 @@ public class SearchActivity extends Activity
try {
// Response if the item can be removed
SearchResultAdapter adapter = (SearchResultAdapter)parent.getAdapter();
- SearchResult result = adapter.getItem(position).getSearchResult();
+ SearchResult result = adapter.getItem(position);
if (result != null && result.getFso() != null) {
if (result.getFso() instanceof ParentDirectory) {
// This is not possible ...
@@ -208,7 +204,7 @@ public class SearchActivity extends Activity
try {
// Response if the item can be removed
SearchResultAdapter adapter = (SearchResultAdapter)parent.getAdapter();
- SearchResult result = adapter.getItem(position).getSearchResult();
+ SearchResult result = adapter.getItem(position);
if (result != null && result.getFso() != null) {
DeleteActionPolicy.removeFileSystemObject(
SearchActivity.this,
@@ -362,12 +358,6 @@ public class SearchActivity extends Activity
private SearchResultAdapter mAdapter;
private ProgressBar mStreamingSearchProgress;
private boolean mSearchInProgress;
- private String mSearchFoundString;
- private boolean mHighlightTerms;
- private boolean mShowRelevanceWidget;
- private int mHighlightColor;
- private ArrayList<DataHolder> mAdapterList = new ArrayList<>();
- private IconHolder mIconHolder;
/**
* {@inheritDoc}
@@ -381,13 +371,6 @@ public class SearchActivity extends Activity
// Check if app is running in chrooted mode
this.mChRooted = FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0;
- final boolean displayThumbs = Preferences.getSharedPreferences().getBoolean(
- FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId(),
- ((Boolean)FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getDefaultValue()).booleanValue());
- mIconHolder = new IconHolder(this, displayThumbs);
- mIconHolder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$
- mIconHolder.getDrawable("ic_fso_default_drawable"); //$NON-NLS-1$
-
// Register the broadcast receiver
IntentFilter filter = new IntentFilter();
filter.addAction(FileManagerSettings.INTENT_SETTING_CHANGED);
@@ -429,10 +412,6 @@ public class SearchActivity extends Activity
}
}
- mSearchFoundString = getString(R.string.search_found_items_in_directory);
- //$NON-NLS-1$
- mHighlightColor = theme.getColor(this, "search_highlight_color");
-
//Save state
super.onCreate(state);
}
@@ -722,7 +701,6 @@ public class SearchActivity extends Activity
back(true, null, false);
}
});
- dialog.setCancelable(false);
DialogHelper.delegateDialogShow(this, dialog);
}
@@ -736,15 +714,6 @@ public class SearchActivity extends Activity
*/
void doSearch(
final boolean voiceQuery, final Query query, final String searchDirectory) {
- // Load settings
- this.mHighlightTerms = Preferences.getSharedPreferences().getBoolean(
- FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.getId(),
- ((Boolean)FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.
- getDefaultValue()).booleanValue());
- this.mShowRelevanceWidget = Preferences.getSharedPreferences().getBoolean(
- FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.getId(),
- ((Boolean)FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.
- getDefaultValue()).booleanValue());
// Recovers the user preferences about save suggestions
boolean saveSuggestions = Preferences.getSharedPreferences().getBoolean(
@@ -773,8 +742,7 @@ public class SearchActivity extends Activity
this.mResultList = new ArrayList<FileSystemObject>();
mAdapter =
new SearchResultAdapter(this,
- mAdapterList, R.layout.search_item,
- this.mQuery, mIconHolder);
+ new ArrayList<SearchResult>(), R.layout.search_item, this.mQuery);
this.mSearchListView.setAdapter(mAdapter);
//Set terms
@@ -824,93 +792,25 @@ public class SearchActivity extends Activity
});
}
- private static class ProcessSearchResult extends AsyncTask<FileSystemObject, Void, Boolean> {
-
- private WeakReference<SearchActivity> mActivity;
-
- private SearchResult mResult;
- private DataHolder mHolder;
-
- public ProcessSearchResult(SearchActivity parent) {
- super();
- mActivity = new WeakReference<SearchActivity>(parent);
- }
-
- @Override
- protected Boolean doInBackground(FileSystemObject... params) {
- SearchActivity activity = mActivity.get();
- if (activity == null) {
- return false;
- }
-
- FileSystemObject result = params[0];
- // check against user's display preferences
- if ( !FileHelper.compliesWithDisplayPreferences(result, null, activity.mChRooted) ) {
- return false;
- }
-
- // resolve sym links
- FileHelper.resolveSymlink(activity, result);
-
- // convert to search result
- mResult = SearchHelper.convertToResult(result, activity.mQuery);
-
- mHolder = activity.generateDataHolder(mResult);
-
- return mHolder != null && mResult != null;
- }
-
- @Override
- protected void onPostExecute(Boolean success) {
- SearchActivity activity = mActivity.get();
- if (activity == null) {
- return;
- }
- if (success) {
- // add to adapter
- if (mResult.getRelevance() > INVALID_RELEVANCE) {
- activity.mAdapter.addNewItem(mHolder);
- }
- int progress = activity.mAdapter.resultsSize();
- activity.toggleResults(progress > 0, false);
- String foundItems = activity.getResources().getQuantityString(
- R.plurals.search_found_items, progress, progress);
- activity.mSearchFoundItems.setText(activity.getString(
- R.string.search_found_items_in_directory,
- foundItems, activity.mSearchDirectory));
- }
- }
- }
-
/**
* Ensures the search result meets user preferences and passes it to the adapter for display
*
* @param result FileSystemObject that matches the search result criteria
*/
private void showSearchResult(FileSystemObject result) {
- new ProcessSearchResult(this).execute(result);
- }
-
- private DataHolder generateDataHolder(SearchResult result) {
- //Build the data holder
- final FileSystemObject fso = result.getFso();
- final Drawable icon = mIconHolder.getDrawable(
- MimeTypeHelper.getIcon(this, fso));
- final CharSequence highlightedName;
- if (mHighlightTerms) {
- highlightedName = SearchHelper.getHighlightedName(result, mQuery.getQueries(),
- mHighlightColor);
- } else {
- highlightedName = SearchHelper.getNonHighlightedName(result);
+ // check against user's display preferences
+ if ( !FileHelper.compliesWithDisplayPreferences(result, null, mChRooted) ) {
+ return;
}
- final String parent = new File(result.getFso().getFullPath()).getParent();
- Float relevance = mShowRelevanceWidget ? ((float)result.getRelevance() * 100)
- / SearchResult.MAX_RELEVANCE : null;
- final MimeTypeHelper.MimeTypeCategory category = MimeTypeHelper.getCategory(this, fso);
-
- SearchActivity.DataHolder holder = new SearchActivity.DataHolder(result, icon,
- highlightedName, parent, relevance, category);
- return holder;
+
+ // resolve sym links
+ FileHelper.resolveSymlink(this, result);
+
+ // convert to search result
+ SearchResult searchResult = SearchHelper.convertToResult(result, mQuery);
+
+ // add to adapter
+ mAdapter.addNewItem(searchResult);
}
/**
@@ -922,12 +822,6 @@ public class SearchActivity extends Activity
public void run() {
//Toggle results
List<SearchResult> list = SearchActivity.this.mRestoreState.getSearchResultList();
- mAdapterList.clear();
- for (SearchResult searchResult : list) {
- mAdapterList.add(generateDataHolder(searchResult));
- }
-
-
String directory = SearchActivity.this.mRestoreState.getSearchDirectory();
SearchActivity.this.toggleResults(list.size() > 0, true);
setFoundItems(list.size(), directory);
@@ -956,9 +850,9 @@ public class SearchActivity extends Activity
SearchResultAdapter adapter =
new SearchResultAdapter(
SearchActivity.this.mSearchListView.getContext(),
- mAdapterList,
+ list,
R.layout.search_item,
- query, mIconHolder);
+ query);
SearchActivity.this.mSearchListView.setAdapter(adapter);
SearchActivity.this.mSearchListView.setSelection(0);
@@ -1047,8 +941,11 @@ public class SearchActivity extends Activity
getResources().
getQuantityString(
R.plurals.search_found_items, items, Integer.valueOf(items));
- SearchActivity.this.mSearchFoundItems.setText(String.format(mSearchFoundString,
- foundItems, directory));
+ SearchActivity.this.mSearchFoundItems.setText(
+ getString(
+ R.string.search_found_items_in_directory,
+ foundItems,
+ directory));
}
});
}
@@ -1094,8 +991,7 @@ public class SearchActivity extends Activity
if (mSearchInProgress) mExecutable.end();
try {
- SearchResult result = ((SearchResultAdapter)parent.getAdapter()).getItem(position)
- .getSearchResult();
+ SearchResult result = ((SearchResultAdapter)parent.getAdapter()).getItem(position);
FileSystemObject fso = result.getFso();
if (fso instanceof Directory) {
back(false, fso, false);
@@ -1182,7 +1078,7 @@ public class SearchActivity extends Activity
// Get the adapter, the search result and the fso
SearchResultAdapter adapter = ((SearchResultAdapter)parent.getAdapter());
- SearchResult searchResult = adapter.getItem(position).getSearchResult();
+ SearchResult searchResult = adapter.getItem(position);
FileSystemObject fso = searchResult.getFso();
// Open the actions menu
@@ -1232,7 +1128,8 @@ public class SearchActivity extends Activity
if (adapter != null) {
int pos = adapter.getPosition(fso);
if (pos != -1) {
- adapter.remove(adapter.getItem(pos));
+ SearchResult sr = adapter.getItem(pos);
+ adapter.remove(sr);
}
// Toggle resultset?
@@ -1255,7 +1152,7 @@ public class SearchActivity extends Activity
FileSystemObject fso = (FileSystemObject)o;
int pos = adapter.getPosition(fso);
if (pos >= 0) {
- SearchResult sr = adapter.getItem(pos).getSearchResult();
+ SearchResult sr = adapter.getItem(pos);
sr.setFso(fso);
}
} else if (o == null) {
@@ -1391,6 +1288,7 @@ public class SearchActivity extends Activity
* Method that navigate to the file system used the intent (MainActivity)
*
* @param fso The file system object to navigate to
+ * @param intent The intent used to navigate to
* @return boolean If the action implies finish this activity
*/
boolean navigateTo(FileSystemObject fso) {
@@ -1465,57 +1363,12 @@ public class SearchActivity extends Activity
this.mSearchListView.invalidate();
}
- private class SearchResultFilterTask extends AsyncTask<MimeTypeCategory, Void,
- List<DataHolder>> {
-
- @Override
- protected List<DataHolder> doInBackground(MimeTypeCategory... params) {
- final MimeTypeCategory category = params.length == 0
- ? MimeTypeCategory.NONE : params[0];
-
- List<DataHolder> results = new ArrayList<DataHolder>();
- // Are we in ChRooted environment?
- boolean chRooted =
- FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0;
-
- List<SearchResult> newResults = SearchHelper.convertToResults(
- FileHelper.applyUserPreferences(
- mResultList, null, true, chRooted),
- new Query().fillSlots(mQuery.getQueries()));
-
- for (SearchResult result : newResults) {
- // Show all results that are relevant if no filter is set or show results that are
- // relevant and match the specified category
- if (result.getRelevance() > INVALID_RELEVANCE && (MimeTypeHelper.MimeTypeCategory
- .NONE.equals(category) || MimeTypeHelper.getCategory(SearchActivity.this,
- result.getFso()).equals(category))) {
- results.add(generateDataHolder(result));
- }
- }
- return results;
- }
-
- @Override
- protected void onPostExecute(List<DataHolder> results) {
- if (!isResumed()) {
- return;
- }
- mAdapterList.clear();
- mAdapterList.addAll(results);
- mAdapter.notifyDataSetChanged();
-
- String foundItems = getResources().getQuantityString(R.plurals.search_found_items,
- results.size(), results.size());
- mSearchFoundItems.setText(String.format(mSearchFoundString,
- foundItems, mSearchDirectory));
-
- }
- }
-
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
- if (mResultList != null && !mResultList.isEmpty()) {
- new SearchResultFilterTask().execute(MimeTypeHelper.MimeTypeCategory.values()[i]);
+ String category = MimeTypeHelper.MimeTypeCategory.names()[i];
+ SearchResultAdapter adapter = ((SearchResultAdapter) this.mSearchListView.getAdapter());
+ if (adapter != null) {
+ adapter.setMimeFilter(category);
}
}
@@ -1523,51 +1376,5 @@ public class SearchActivity extends Activity
public void onNothingSelected(AdapterView<?> adapterView) {
//ignore
}
-
- /**
- * A class that holds the full data information.
- */
- public static class DataHolder {
- private SearchResult mSearchResult;
- Drawable mDwIcon;
- CharSequence mName;
- String mParentDir;
- Float mRelevance;
- MimeTypeCategory mMimeTypeCategory;
-
- public DataHolder(SearchResult result, Drawable icon, CharSequence name, String parentDir,
- Float revelence, MimeTypeCategory category) {
- mSearchResult = result;
- mDwIcon = icon;
- mName = name;
- mParentDir = parentDir;
- mRelevance = revelence;
- mMimeTypeCategory = category;
- }
-
- public SearchResult getSearchResult() {
- return mSearchResult;
- }
-
- public Drawable getDwIcon() {
- return mDwIcon;
- }
-
- public CharSequence getName() {
- return mName;
- }
-
- public String getParentDir() {
- return mParentDir;
- }
-
- public Float getRelevance() {
- return mRelevance;
- }
-
- public MimeTypeCategory getMimeTypeCategory() {
- return mMimeTypeCategory;
- }
- }
}
diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java
index 92c73dbe..7cde6d61 100644
--- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java
+++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java
@@ -18,7 +18,6 @@ package com.cyanogenmod.filemanager.adapters;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.os.AsyncTask;
import android.os.Handler;
import android.text.TextUtils;
import android.view.LayoutInflater;
@@ -30,7 +29,6 @@ import android.widget.TextView;
import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.R;
-import com.cyanogenmod.filemanager.activities.SearchActivity;
import com.cyanogenmod.filemanager.model.FileSystemObject;
import com.cyanogenmod.filemanager.model.Query;
import com.cyanogenmod.filemanager.model.SearchResult;
@@ -51,6 +49,7 @@ import com.cyanogenmod.filemanager.util.SearchHelper;
import java.io.File;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -59,7 +58,7 @@ import java.util.Map;
/**
* An implementation of {@link ArrayAdapter} for display search results.
*/
-public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder> {
+public class SearchResultAdapter extends ArrayAdapter<SearchResult> {
//The resource of the item icon
private static final int RESOURCE_ITEM_ICON = R.id.search_item_icon;
@@ -90,26 +89,49 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
TextView mMimeType;
}
+ /**
+ * A class that holds the full data information.
+ */
+ private static class DataHolder {
+ /**
+ * @hide
+ */
+ public DataHolder() {
+ super();
+ }
+ Drawable mDwIcon;
+ CharSequence mName;
+ String mParentDir;
+ Float mRelevance;
+ MimeTypeHelper.MimeTypeCategory mimeTypeCategory;
+ }
+
// delay for when the new items, if any, will be incorporated
// used to ensure that UI remains responsive
private final int STREAMING_MODE_REFRESH_DELAY = 500; // in ms
+ private DataHolder[] mData;
private IconHolder mIconHolder;
private final int mItemViewResourceId;
+ private final boolean mHighlightTerms;
+ private final boolean mShowRelevanceWidget;
+
private final List<String> mQueries;
+ private final List<SearchResult> mOriginalList;
private boolean mDisposed;
private Handler mHandler;
private boolean mInStreamingMode;
+ private List<SearchResult> mNewItems = new ArrayList<SearchResult>();
private SearchSortResultMode mSearchSortResultMode;
- private Comparator<SearchActivity.DataHolder> mSearchResultComparator;
+ private Comparator<SearchResult> mSearchResultComparator;
private Runnable mParseNewResults = new Runnable() {
@Override
public void run() {
- sort(mSearchResultComparator);
+ addPendingSearchResults();
if (mInStreamingMode) {
mHandler.postDelayed(mParseNewResults, STREAMING_MODE_REFRESH_DELAY);
}
@@ -126,18 +148,35 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
* @param queries The query object used to make the result of this search
*/
public SearchResultAdapter(
- Context context, List<SearchActivity.DataHolder> files, int itemViewResourceId,
- Query queries, IconHolder iconHolder) {
+ Context context, List<SearchResult> files, int itemViewResourceId, Query queries) {
super(context, RESOURCE_ITEM_NAME, files);
mHandler = new Handler(context.getMainLooper());
+ mOriginalList = new ArrayList<SearchResult>(files);
this.mDisposed = false;
- this.mIconHolder = iconHolder;
+ final boolean displayThumbs = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getDefaultValue()).booleanValue());
+ this.mIconHolder = new IconHolder(context, displayThumbs);
this.mItemViewResourceId = itemViewResourceId;
this.mQueries = queries.getQueries();
+ // Load settings
+ this.mHighlightTerms = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.
+ getDefaultValue()).booleanValue());
+ this.mShowRelevanceWidget = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.
+ getDefaultValue()).booleanValue());
+
// determine the sort order of search results
setSortResultMode();
+
+ //Do cache of the data for better performance
+ loadDefaultIcons();
+ processData();
}
/**
@@ -159,6 +198,14 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
}
/**
+ * Method that loads the default icons (known icons and more common icons).
+ */
+ private void loadDefaultIcons() {
+ this.mIconHolder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$
+ this.mIconHolder.getDrawable("ic_fso_default_drawable"); //$NON-NLS-1$
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
@@ -166,25 +213,31 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
if (this.mDisposed) {
return;
}
+ processData();
super.notifyDataSetChanged();
}
-
/**
* Adds a new Search Result to the buffer
*/
- public void addNewItem(SearchActivity.DataHolder data) {
- if (mDisposed) {
- return;
- }
-
- add(data);
+ public synchronized void addNewItem(SearchResult newResult) {
+ mNewItems.add(newResult);
}
/**
* Adds search results in the buffer to the adapter list
*/
public synchronized void addPendingSearchResults() {
+ if (mNewItems.size() < 1) return;
+
+ // TODO: maintain a sorted buffer and implement Merge of two sorted lists
+ addAll(mNewItems);
+ sort(mSearchResultComparator);
+ mOriginalList.addAll(mNewItems); // cache files so enable mime type filtering later on
+ Collections.sort(mOriginalList, mSearchResultComparator);
+
+ // reset buffer
+ mNewItems.clear();
}
/**
@@ -199,20 +252,19 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
mSearchSortResultMode = SearchSortResultMode.fromId(currValue);
if (mSearchSortResultMode.compareTo(SearchSortResultMode.NAME) == 0) {
- mSearchResultComparator = new Comparator<SearchActivity.DataHolder>() {
+ mSearchResultComparator = new Comparator<SearchResult>() {
@Override
- public int compare(SearchActivity.DataHolder lhs, SearchActivity.DataHolder rhs) {
+ public int compare(SearchResult lhs, SearchResult rhs) {
return FileHelper.doCompare(
- lhs.getSearchResult().getFso(), rhs.getSearchResult().getFso(),
- NavigationSortMode.NAME_ASC);
+ lhs.getFso(), rhs.getFso(), NavigationSortMode.NAME_ASC);
}
};
} else if (mSearchSortResultMode.compareTo(SearchSortResultMode.RELEVANCE) == 0) {
- mSearchResultComparator = new Comparator<SearchActivity.DataHolder>() {
+ mSearchResultComparator = new Comparator<SearchResult>() {
@Override
- public int compare(SearchActivity.DataHolder lhs, SearchActivity.DataHolder rhs) {
- return lhs.getSearchResult().compareTo(rhs.getSearchResult());
+ public int compare(SearchResult lhs, SearchResult rhs) {
+ return lhs.compareTo(rhs);
}
};
}
@@ -222,7 +274,39 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
* Size of the search results list
*/
public synchronized int resultsSize() {
- return getCount();
+ return getCount() + mNewItems.size();
+ }
+
+ /**
+ * 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();
}
/**
@@ -234,10 +318,49 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
}
this.mDisposed = true;
clear();
+ this.mOriginalList.clear();
+ this.mData = null;
this.mIconHolder = null;
}
/**
+ * Method that process the data before use {@link #getView} method.
+ */
+ private void processData() {
+ Theme theme = ThemeManager.getCurrentTheme(getContext());
+ int highlightedColor =
+ theme.getColor(getContext(), "search_highlight_color"); //$NON-NLS-1$
+
+ this.mData = new DataHolder[getCount()];
+ int cc = getCount();
+ for (int i = 0; i < cc; i++) {
+ //File system object info
+ SearchResult result = getItem(i);
+
+ //Build the data holder
+ final FileSystemObject fso = result.getFso();
+ this.mData[i] = new SearchResultAdapter.DataHolder();
+ this.mData[i].mDwIcon = this.mIconHolder.getDrawable(
+ MimeTypeHelper.getIcon(getContext(), fso));
+ if (this.mHighlightTerms) {
+ this.mData[i].mName =
+ SearchHelper.getHighlightedName(result, this.mQueries, highlightedColor);
+ } else {
+ this.mData[i].mName = SearchHelper.getNonHighlightedName(result);
+ }
+ this.mData[i].mParentDir = new File(result.getFso().getFullPath()).getParent();
+ if (this.mShowRelevanceWidget) {
+ this.mData[i].mRelevance =
+ Float.valueOf(
+ (float)(result.getRelevance() * 100) / SearchResult.MAX_RELEVANCE);
+ } else {
+ this.mData[i].mRelevance = null;
+ }
+ this.mData[i].mimeTypeCategory = MimeTypeHelper.getCategory(getContext(), fso);
+ }
+ }
+
+ /**
* Method that returns the data of the adapter.
*
* @return List<SearchResult> The adapter data
@@ -246,7 +369,7 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
int cc = getCount();
final List<SearchResult> data = new ArrayList<SearchResult>(cc);
for (int i = 0; i < cc; i++) {
- data.add(getItem(i).getSearchResult());
+ data.add(getItem(i));
}
return data;
}
@@ -258,9 +381,8 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
*/
public List<FileSystemObject> getFiles() {
final List<FileSystemObject> data = new ArrayList<FileSystemObject>();
- int N = getCount();
- for(int i = 0; i < N; i++) {
- data.add(getItem(i).getSearchResult().getFso());
+ for (SearchResult result : mOriginalList) {
+ data.add(result.getFso());
}
return data;
}
@@ -274,7 +396,7 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
public int getPosition(FileSystemObject item) {
int cc = getCount();
for (int i = 0; i < cc; i++) {
- SearchResult sr = getItem(i).getSearchResult();
+ SearchResult sr = getItem(i);
if (sr.getFso().compareTo(item) == 0) {
return i;
}
@@ -315,25 +437,25 @@ public class SearchResultAdapter extends ArrayAdapter<SearchActivity.DataHolder>
}
//Retrieve data holder
- final SearchActivity.DataHolder dataHolder = getItem(position);
+ final DataHolder dataHolder = this.mData[position];
//Retrieve the view holder
ViewHolder viewHolder = (ViewHolder) v.getTag();
//Set the data
mIconHolder.loadDrawable(viewHolder.mIvIcon,
- dataHolder.getSearchResult().getFso(), dataHolder.getDwIcon());
+ getItem(position).getFso(), dataHolder.mDwIcon);
- viewHolder.mTvName.setText(dataHolder.getName(), TextView.BufferType.SPANNABLE);
- viewHolder.mTvParentDir.setText(dataHolder.getParentDir());
- if (dataHolder.getRelevance() != null) {
- viewHolder.mWgRelevance.setRelevance(dataHolder.getRelevance().floatValue());
+ viewHolder.mTvName.setText(dataHolder.mName, TextView.BufferType.SPANNABLE);
+ viewHolder.mTvParentDir.setText(dataHolder.mParentDir);
+ if (dataHolder.mRelevance != null) {
+ viewHolder.mWgRelevance.setRelevance(dataHolder.mRelevance.floatValue());
}
viewHolder.mWgRelevance.setVisibility(
- dataHolder.getRelevance() != null ? View.VISIBLE : View.GONE);
- if (dataHolder.getMimeTypeCategory() != MimeTypeHelper.MimeTypeCategory.NONE) {
+ dataHolder.mRelevance != null ? View.VISIBLE : View.GONE);
+ if (dataHolder.mimeTypeCategory != MimeTypeHelper.MimeTypeCategory.NONE) {
viewHolder.mMimeType.setVisibility(View.VISIBLE);
- viewHolder.mMimeType.setText(dataHolder.getMimeTypeCategory().name());
+ viewHolder.mMimeType.setText(dataHolder.mimeTypeCategory.name());
} else {
viewHolder.mMimeType.setVisibility(View.GONE);
}
diff --git a/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java b/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java
index b2975b27..c34cca37 100644
--- a/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java
+++ b/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java
@@ -484,8 +484,6 @@ public class NavigationFragment extends Fragment
private int mOrientation;
- private boolean mDisplayingSearchResults;
-
/**
* @hide
*/
@@ -581,8 +579,7 @@ public class NavigationFragment extends Fragment
public void onResume() {
super.onResume();
- if (mDisplayingSearchResults) {
- mDisplayingSearchResults = false;
+ if (mSearchView.getVisibility() == View.VISIBLE) {
closeSearch();
}
@@ -1524,16 +1521,14 @@ public class NavigationFragment extends Fragment
* @hide
*/
void initNavigation(final int viewId, final boolean restore, final Intent intent) {
- if (mDisplayingSearchResults || restore) {
- return;
- }
-
final NavigationView navigationView = getNavigationView(viewId);
this.mHandler.post(new Runnable() {
@Override
public void run() {
//Is necessary navigate?
- applyInitialDir(navigationView, intent);
+ if (!restore) {
+ applyInitialDir(navigationView, intent);
+ }
}
});
}
@@ -1725,7 +1720,6 @@ public class NavigationFragment extends Fragment
if (fso != null) {
//Goto to new directory
getCurrentNavigationView().open(fso, searchInfo);
- mDisplayingSearchResults = true;
}
}
} else if (resultCode == getActivity().RESULT_CANCELED) {