package org.openintents.filemanager.search;
import org.openintents.filemanager.FileManagerActivity;
import org.openintents.filemanager.R;
import org.openintents.filemanager.compatibility.HomeIconHelper;
import org.openintents.filemanager.util.UIUtils;
import org.openintents.intents.FileManagerIntents;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.support.v4.content.LocalBroadcastManager;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
/**
* The activity that handles queries and shows search results.
* Also handles search-suggestion triggered intents.
*
* @author George Venios
*
*/
public class SearchableActivity extends ListActivity {
private LocalBroadcastManager lbm;
private Cursor searchResults;
@Override
protected void onCreate(Bundle savedInstanceState) {
UIUtils.setThemeFor(this);
// Presentation settings
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
HomeIconHelper.activity_actionbar_setDisplayHomeAsUpEnabled(this);
}
lbm = LocalBroadcastManager.getInstance(getApplicationContext());
// Handle the search request.
handleIntent();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
HomeIconHelper.showHome(this);
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent();
}
private void handleIntent() {
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// Get the query.
String query = intent.getStringExtra(SearchManager.QUERY);
setTitle(query);
// Get the current path, which allows us to refine the search.
String path = null;
if (intent.getBundleExtra(SearchManager.APP_DATA) != null)
path = intent.getBundleExtra(SearchManager.APP_DATA).getString(
FileManagerIntents.EXTRA_SEARCH_INIT_PATH);
// Add query to recents.
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(
this, RecentsSuggestionsProvider.AUTHORITY,
RecentsSuggestionsProvider.MODE);
suggestions.saveRecentQuery(query, null);
// Register broadcast receivers
lbm.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
setProgressBarIndeterminateVisibility(false);
}
}, new IntentFilter(FileManagerIntents.ACTION_SEARCH_FINISHED));
lbm.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
setProgressBarIndeterminateVisibility(true);
}
}, new IntentFilter(FileManagerIntents.ACTION_SEARCH_STARTED));
// Set the list adapter.
searchResults = getSearchResults();
setListAdapter(new SearchListAdapter(this, searchResults));
// Start the search service.
Intent in = new Intent(this, SearchService.class);
in.putExtra(FileManagerIntents.EXTRA_SEARCH_INIT_PATH, path);
in.putExtra(FileManagerIntents.EXTRA_SEARCH_QUERY, query);
startService(in);
} // We're here because of a clicked suggestion
else if(Intent.ACTION_VIEW.equals(intent.getAction())){
browse(intent.getData());
}
else
// Intent contents error.
setTitle(R.string.query_error);
}
@Override
protected void onDestroy() {
super.onDestroy();
stopService(new Intent(this, SearchService.class));
}
/**
* Clear the recents' history.
*/
public static void clearSearchRecents(Context c) {
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(c,
RecentsSuggestionsProvider.AUTHORITY,
RecentsSuggestionsProvider.MODE);
suggestions.clearHistory();
}
private Cursor getSearchResults() {
return getContentResolver().query(SearchResultsProvider.CONTENT_URI, null, null, null, SearchResultsProvider.COLUMN_ID + " ASC");
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Cursor c = new CursorWrapper(searchResults);
c.moveToPosition(position);
String path = c.getString(c.getColumnIndex(SearchResultsProvider.COLUMN_PATH));
browse(Uri.parse(path));
}
private void browse(Uri path) {
Intent intent = new Intent(this, FileManagerActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setData(path);
startActivity(intent);
finish();
}
}