diff options
author | Steve Kondik <steve@cyngn.com> | 2016-11-02 17:59:26 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-11-02 17:59:28 -0700 |
commit | 38bfe4efa1ce6ef5f5a171544cd94614ec377756 (patch) | |
tree | 0e950bcaa29f57f24791888990a4dafd7e38e34c | |
parent | 039f7d06a2dca304788f3e6e3ecc358e223d712a (diff) | |
download | android_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
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) { |