/* * 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. */ package com.cyanogenmod.filemanager.tasks; import android.os.AsyncTask; import android.view.View; import android.widget.ListView; import android.widget.ProgressBar; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.adapters.SearchResultAdapter; 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.NavigationSortMode; import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.preferences.SearchSortResultMode; import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.SearchHelper; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; /** * A class for paint the resulting file system object of a search. */ public class SearchResultDrawingAsyncTask extends AsyncTask<Object, Integer, Boolean> { /** * @hide */ final ListView mSearchListView; /** * @hide */ final ProgressBar mSearchWaiting; private final List<FileSystemObject> mFiles; /** * @hide */ final Query mQueries; private boolean mRunning; /** * Constructor of <code>SearchResultDrawingAsyncTask</code>. * * @param searchListView The {@link ListView} reference * @param searchWaiting A {@link ProgressBar} reference * @param files The files to draw * @param queries The terms of the search */ public SearchResultDrawingAsyncTask( ListView searchListView, ProgressBar searchWaiting, List<FileSystemObject> files, Query queries) { super(); this.mSearchListView = searchListView; this.mSearchWaiting = searchWaiting; this.mFiles = files; this.mQueries = queries; this.mRunning = false; } /** * Method that returns if there is a task running. * * @return boolean If there is a task running */ public boolean isRunning() { return this.mRunning; } /** * {@inheritDoc} */ @Override protected Boolean doInBackground(Object... params) { try { //Running this.mRunning = true; showHideWaiting(true); // Get sort mode String defaultValue = ((ObjectStringIdentifier)FileManagerSettings. SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId(); String value = Preferences.getSharedPreferences().getString( FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(), defaultValue); SearchSortResultMode mode = SearchSortResultMode.fromId(value); // 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); //Process all the data final List<SearchResult> result = SearchHelper.convertToResults( FileHelper.applyUserPreferences( this.mFiles, restrictions, true, chRooted), this.mQueries); if (mode.compareTo(SearchSortResultMode.NAME) == 0) { Collections.sort(result, new Comparator<SearchResult>() { @Override public int compare(SearchResult lhs, SearchResult rhs) { return FileHelper.doCompare( lhs.getFso(), rhs.getFso(), NavigationSortMode.NAME_ASC); } }); } else if (mode.compareTo(SearchSortResultMode.RELEVANCE) == 0) { Collections.sort(result); } this.mSearchListView.post(new Runnable() { @Override public void run() { //Add list to the listview if (SearchResultDrawingAsyncTask.this.mSearchListView.getAdapter() != null) { ((SearchResultAdapter)SearchResultDrawingAsyncTask.this. mSearchListView.getAdapter()).clear(); } // Recreate the adapter SearchResultAdapter adapter = new SearchResultAdapter( SearchResultDrawingAsyncTask.this.mSearchListView.getContext(), result, R.layout.search_item, SearchResultDrawingAsyncTask.this.mQueries); // Configure the listview SearchResultDrawingAsyncTask.this.mSearchListView.setAdapter(adapter); SearchResultDrawingAsyncTask.this.mSearchListView.setSelection(0); } }); //Operation complete return Boolean.TRUE; } catch (Throwable ex) { //Capture and show the exception ExceptionUtil.translateException(this.mSearchListView.getContext(), ex); } finally { this.mRunning = false; showHideWaiting(false); } //Something went wrong return Boolean.FALSE; } /** * {@inheritDoc} */ @Override protected void onCancelled(Boolean result) { this.mRunning = false; super.onCancelled(result); } /** * {@inheritDoc} */ @Override protected void onCancelled() { this.mRunning = false; super.onCancelled(); } /** * Method that shows or hides the waiting icon. * * @param show If the waiting icon must be shown */ private void showHideWaiting(final boolean show) { if (this.mSearchWaiting != null) { this.mSearchWaiting.post(new Runnable() { @Override public void run() { SearchResultDrawingAsyncTask.this.mSearchWaiting.setVisibility( show ? View.VISIBLE : View.GONE); } }); } } }