1d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio/* 2d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * Copyright (C) 2014 The Android Open Source Project 3d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * 4d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License"); 5d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * you may not use this file except in compliance with the License. 6d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * You may obtain a copy of the License at 7d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * 8d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * http://www.apache.org/licenses/LICENSE-2.0 9d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * 10d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * Unless required by applicable law or agreed to in writing, software 11d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS, 12d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * See the License for the specific language governing permissions and 14d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * limitations under the License. 15d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio */ 16d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 17d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Megliopackage com.android.settings.dashboard; 18d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 19d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.content.ComponentName; 20d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.content.Context; 21d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.content.Intent; 22d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.content.pm.PackageManager; 23d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.content.res.Resources; 24d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.database.Cursor; 25d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.graphics.drawable.Drawable; 26d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.os.AsyncTask; 27d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.os.Bundle; 28d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.text.TextUtils; 29d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.util.Log; 30d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.view.LayoutInflater; 31d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.view.View; 32d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.view.ViewGroup; 33d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.widget.AdapterView; 34d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.widget.BaseAdapter; 35d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.widget.ImageView; 36d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.widget.ListView; 37d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglioimport android.widget.SearchView; 38d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport android.widget.TextView; 3939b467482d1bf256a111c757e9b7621c6f523271Jason Monk 408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 419d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 428a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.settings.InstrumentedFragment; 43d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport com.android.settings.R; 44d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport com.android.settings.SettingsActivity; 45769630c8956fa844545d964166da90cc802fabacFabrice Di Meglioimport com.android.settings.Utils; 46d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport com.android.settings.search.Index; 47d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 48d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglioimport java.util.HashMap; 49d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 508a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenpublic class SearchResultsSummary extends InstrumentedFragment { 51d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 52d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private static final String LOG_TAG = "SearchResultsSummary"; 53d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 54d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private static final String EMPTY_QUERY = ""; 5571a2ef3e7c9e8a4e1ec8fa84212dcb6816cb86fcFabrice Di Meglio private static char ELLIPSIS = '\u2026'; 5671a2ef3e7c9e8a4e1ec8fa84212dcb6816cb86fcFabrice Di Meglio 577e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio private static final String SAVE_KEY_SHOW_RESULTS = ":settings:show_results"; 588c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 59d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private SearchView mSearchView; 60d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 61d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private ListView mResultsListView; 62d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private SearchResultsAdapter mResultsAdapter; 63d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private UpdateSearchResultsTask mUpdateSearchResultsTask; 64d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 65d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private ListView mSuggestionsListView; 66d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private SuggestionsAdapter mSuggestionsAdapter; 67d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private UpdateSuggestionsTask mUpdateSuggestionsTask; 68d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 69d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private ViewGroup mLayoutSuggestions; 70d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private ViewGroup mLayoutResults; 71ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio 72d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private String mQuery; 7371a2ef3e7c9e8a4e1ec8fa84212dcb6816cb86fcFabrice Di Meglio 747e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio private boolean mShowResults; 758c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 76d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio /** 77d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio * A basic AsyncTask for updating the query results cursor 78d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio */ 79d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private class UpdateSearchResultsTask extends AsyncTask<String, Void, Cursor> { 80d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 81d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio protected Cursor doInBackground(String... params) { 82d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return Index.getInstance(getActivity()).search(params[0]); 83d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 84d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 85d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 86d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio protected void onPostExecute(Cursor cursor) { 87d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (!isCancelled()) { 889d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren MetricsLogger.action(getContext(), MetricsEvent.ACTION_SEARCH_RESULTS, 89cbbc69b823021fd261db4b5d1f43d6e322ee39c6Jason Monk cursor.getCount()); 90d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setResultsCursor(cursor); 917e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio setResultsVisibility(cursor.getCount() > 0); 92d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else if (cursor != null) { 93d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio cursor.close(); 94d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 95d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 96d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 97d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 98ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio /** 99d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio * A basic AsyncTask for updating the suggestions cursor 100ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio */ 101d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private class UpdateSuggestionsTask extends AsyncTask<String, Void, Cursor> { 102d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 103d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio protected Cursor doInBackground(String... params) { 104d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return Index.getInstance(getActivity()).getSuggestions(params[0]); 105d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 106ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio 107ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio @Override 108d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio protected void onPostExecute(Cursor cursor) { 109d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (!isCancelled()) { 110d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setSuggestionsCursor(cursor); 1117e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio setSuggestionsVisibility(cursor.getCount() > 0); 112d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } else if (cursor != null) { 113d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio cursor.close(); 114ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio } 115ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio } 116ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio } 117ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio 118d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 119d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public void onCreate(Bundle savedInstanceState) { 120d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio super.onCreate(savedInstanceState); 121d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 122d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mResultsAdapter = new SearchResultsAdapter(getActivity()); 123d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSuggestionsAdapter = new SuggestionsAdapter(getActivity()); 1248c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 1258c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio if (savedInstanceState != null) { 1267e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mShowResults = savedInstanceState.getBoolean(SAVE_KEY_SHOW_RESULTS); 1278c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio } 1288c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio } 1298c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 1308c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio @Override 1318c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio public void onSaveInstanceState(Bundle outState) { 1328c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio super.onSaveInstanceState(outState); 1338c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 1347e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio outState.putBoolean(SAVE_KEY_SHOW_RESULTS, mShowResults); 135d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 136d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 137d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 138d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public void onStop() { 139d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio super.onStop(); 140d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 141d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio clearSuggestions(); 142d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio clearResults(); 143d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 144d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 145d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 146d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public void onDestroy() { 147d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mResultsListView = null; 148d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mResultsAdapter = null; 149d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mUpdateSearchResultsTask = null; 150d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 151d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSuggestionsListView = null; 152d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSuggestionsAdapter = null; 153d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask = null; 154d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 155d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSearchView = null; 156d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 157d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio super.onDestroy(); 158d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 159d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 160d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 161d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public View onCreateView(LayoutInflater inflater, ViewGroup container, 162d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Bundle savedInstanceState) { 163d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 164d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio final View view = inflater.inflate(R.layout.search_panel, container, false); 165d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 166d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mLayoutSuggestions = (ViewGroup) view.findViewById(R.id.layout_suggestions); 167d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mLayoutResults = (ViewGroup) view.findViewById(R.id.layout_results); 168d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 169d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mResultsListView = (ListView) view.findViewById(R.id.list_results); 170d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mResultsListView.setAdapter(mResultsAdapter); 171d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mResultsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 172d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 173d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 17404cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio // We have a header, so we need to decrement the position by one 17504cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio position--; 17604cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio 177f24859cdb76c840a9ff97a4ccc1e4a2753d565a6Fabrice Di Meglio // Some Monkeys could create a case where they were probably clicking on the 178f24859cdb76c840a9ff97a4ccc1e4a2753d565a6Fabrice Di Meglio // List Header and thus the position passed was "0" and then by decrement was "-1" 179f24859cdb76c840a9ff97a4ccc1e4a2753d565a6Fabrice Di Meglio if (position < 0) { 180f24859cdb76c840a9ff97a4ccc1e4a2753d565a6Fabrice Di Meglio return; 181f24859cdb76c840a9ff97a4ccc1e4a2753d565a6Fabrice Di Meglio } 182f24859cdb76c840a9ff97a4ccc1e4a2753d565a6Fabrice Di Meglio 183d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio final Cursor cursor = mResultsAdapter.mCursor; 184d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio cursor.moveToPosition(position); 185d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 186d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String className = cursor.getString(Index.COLUMN_INDEX_CLASS_NAME); 187d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String screenTitle = cursor.getString(Index.COLUMN_INDEX_SCREEN_TITLE); 188d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String action = cursor.getString(Index.COLUMN_INDEX_INTENT_ACTION); 189c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio final String key = cursor.getString(Index.COLUMN_INDEX_KEY); 190d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 191d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final SettingsActivity sa = (SettingsActivity) getActivity(); 192d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio sa.needToRevertToInitialFragment(); 193d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 194d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (TextUtils.isEmpty(action)) { 195c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio Bundle args = new Bundle(); 196c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key); 197c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio 198a9e77993d1f82a230ff381134d4a22eff4a907cdFabrice Di Meglio Utils.startWithFragment(sa, className, args, null, 0, -1, screenTitle); 199d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else { 200d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final Intent intent = new Intent(action); 201d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 202d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String targetPackage = cursor.getString( 203d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Index.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE); 204d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String targetClass = cursor.getString( 205d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Index.COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS); 206d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (!TextUtils.isEmpty(targetPackage) && !TextUtils.isEmpty(targetClass)) { 207d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final ComponentName component = 208d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio new ComponentName(targetPackage, targetClass); 209d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio intent.setComponent(component); 210d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 211c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio intent.putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key); 212d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 213d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio sa.startActivity(intent); 214d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 215ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio 216ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio saveQueryToDatabase(); 217d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 218d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio }); 21904cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio mResultsListView.addHeaderView( 22004cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio LayoutInflater.from(getActivity()).inflate( 22147a25e76409aec1ae29b983779addf39722377f6Fabrice Di Meglio R.layout.search_panel_results_header, mResultsListView, false), 22247a25e76409aec1ae29b983779addf39722377f6Fabrice Di Meglio null, false); 223d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 224d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSuggestionsListView = (ListView) view.findViewById(R.id.list_suggestions); 225d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSuggestionsListView.setAdapter(mSuggestionsAdapter); 226d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSuggestionsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 227d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 228d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 22904cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio // We have a header, so we need to decrement the position by one 23004cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio position--; 231a8b4dcc8272ce4da23dfca62ef7593b26fcabeb1Fabrice Di Meglio // Some Monkeys could create a case where they were probably clicking on the 232a8b4dcc8272ce4da23dfca62ef7593b26fcabeb1Fabrice Di Meglio // List Header and thus the position passed was "0" and then by decrement was "-1" 233a8b4dcc8272ce4da23dfca62ef7593b26fcabeb1Fabrice Di Meglio if (position < 0) { 234a8b4dcc8272ce4da23dfca62ef7593b26fcabeb1Fabrice Di Meglio return; 235a8b4dcc8272ce4da23dfca62ef7593b26fcabeb1Fabrice Di Meglio } 236d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio final Cursor cursor = mSuggestionsAdapter.mCursor; 237d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio cursor.moveToPosition(position); 238d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 2397e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mShowResults = true; 240d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mQuery = cursor.getString(0); 241d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSearchView.setQuery(mQuery, false); 242d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 243d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio }); 24404cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio mSuggestionsListView.addHeaderView( 24504cde9853829b1f1ea6c528d0c11b76f2932982dFabrice Di Meglio LayoutInflater.from(getActivity()).inflate( 24647a25e76409aec1ae29b983779addf39722377f6Fabrice Di Meglio R.layout.search_panel_suggestions_header, mSuggestionsListView, false), 24747a25e76409aec1ae29b983779addf39722377f6Fabrice Di Meglio null, false); 248d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 249d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return view; 250d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 251d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 252d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 2538a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2549d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.DASHBOARD_SEARCH_RESULTS; 2558a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2568a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 2578a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 2587e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio public void onResume() { 2597e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio super.onResume(); 260d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 2617e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio if (!mShowResults) { 2628c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio showSomeSuggestions(); 2638c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio } 264d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 265d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 266d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public void setSearchView(SearchView searchView) { 267d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mSearchView = searchView; 268d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 269d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 270d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void setSuggestionsVisibility(boolean visible) { 271d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mLayoutSuggestions != null) { 272d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mLayoutSuggestions.setVisibility(visible ? View.VISIBLE : View.GONE); 273ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio } 274d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 275d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 276d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void setResultsVisibility(boolean visible) { 277d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mLayoutResults != null) { 278d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mLayoutResults.setVisibility(visible ? View.VISIBLE : View.GONE); 279ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio } 280ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio } 281ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio 282d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void saveQueryToDatabase() { 283d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio Index.getInstance(getActivity()).addSavedQuery(mQuery); 284d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 285d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 286d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public boolean onQueryTextSubmit(String query) { 287d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mQuery = getFilteredQueryString(query); 2887e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mShowResults = true; 2897e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio setSuggestionsVisibility(false); 290d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio updateSearchResults(); 2917e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio saveQueryToDatabase(); 292fe144d7b727136b17ed51b8d96149b9a57b38b50Fabrice Di Meglio 293fe144d7b727136b17ed51b8d96149b9a57b38b50Fabrice Di Meglio return false; 294d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 295d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 296a32707664f85b77602d1fe45458e92fce1448ce2Fabrice Di Meglio public boolean onQueryTextChange(String query) { 2978c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio final String newQuery = getFilteredQueryString(query); 2988c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 2998c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio mQuery = newQuery; 3008c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 3017e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio if (TextUtils.isEmpty(mQuery)) { 3027e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mShowResults = false; 3037e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio setResultsVisibility(false); 3048c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio updateSuggestions(); 3057e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio } else { 3067e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mShowResults = true; 3077e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio setSuggestionsVisibility(false); 3087e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio updateSearchResults(); 3098c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio } 3108c3b0ce7120da882082eed533462090c4feadff8Fabrice Di Meglio 311a32707664f85b77602d1fe45458e92fce1448ce2Fabrice Di Meglio return true; 312a32707664f85b77602d1fe45458e92fce1448ce2Fabrice Di Meglio } 313a32707664f85b77602d1fe45458e92fce1448ce2Fabrice Di Meglio 314d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public void showSomeSuggestions() { 315d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setResultsVisibility(false); 316d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mQuery = EMPTY_QUERY; 317d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio updateSuggestions(); 318d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 319d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 320d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void clearSuggestions() { 321d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mUpdateSuggestionsTask != null) { 322d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask.cancel(false); 323d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask = null; 324d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 325d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setSuggestionsCursor(null); 326d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 327d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 328d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void setSuggestionsCursor(Cursor cursor) { 329d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mSuggestionsAdapter == null) { 330d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return; 331d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 332d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio Cursor oldCursor = mSuggestionsAdapter.swapCursor(cursor); 333d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (oldCursor != null) { 334d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio oldCursor.close(); 335d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 336d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 337d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 338d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private void clearResults() { 339d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (mUpdateSearchResultsTask != null) { 340d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mUpdateSearchResultsTask.cancel(false); 341d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mUpdateSearchResultsTask = null; 342d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 343d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setResultsCursor(null); 344d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 345d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 346d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void setResultsCursor(Cursor cursor) { 347d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mResultsAdapter == null) { 348d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return; 349d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 350d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio Cursor oldCursor = mResultsAdapter.swapCursor(cursor); 351d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (oldCursor != null) { 352d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio oldCursor.close(); 353d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 354d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 355d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 356d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private String getFilteredQueryString(CharSequence query) { 357d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (query == null) { 358d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return null; 359d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 360d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final StringBuilder filtered = new StringBuilder(); 361d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio for (int n = 0; n < query.length(); n++) { 362d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio char c = query.charAt(n); 363d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) { 364d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio continue; 365d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 366d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio filtered.append(c); 367d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 368d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return filtered.toString(); 369d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 370d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 3717e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio private void clearAllTasks() { 3727e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio if (mUpdateSearchResultsTask != null) { 3737e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mUpdateSearchResultsTask.cancel(false); 3747e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio mUpdateSearchResultsTask = null; 3757e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio } 376d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mUpdateSuggestionsTask != null) { 377d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask.cancel(false); 378d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask = null; 379d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 3807e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio } 3817e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio 3827e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio private void updateSuggestions() { 3837e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio clearAllTasks(); 384d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mQuery == null) { 385d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setSuggestionsCursor(null); 386d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } else { 387d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask = new UpdateSuggestionsTask(); 388d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mUpdateSuggestionsTask.execute(mQuery); 389d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 390d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 391d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 392d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private void updateSearchResults() { 3937e4855e8f644bdecf68ec65b8c1b7c08624a4876Fabrice Di Meglio clearAllTasks(); 394ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio if (TextUtils.isEmpty(mQuery)) { 395d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setResultsVisibility(false); 396d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio setResultsCursor(null); 397d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else { 398d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mUpdateSearchResultsTask = new UpdateSearchResultsTask(); 399ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio mUpdateSearchResultsTask.execute(mQuery); 400d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 401d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 402d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 403d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private static class SuggestionItem { 404d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public String query; 405d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 406d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public SuggestionItem(String query) { 407d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio this.query = query; 408d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 409d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 410d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 411d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private static class SuggestionsAdapter extends BaseAdapter { 412d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 413d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private static final int COLUMN_SUGGESTION_QUERY = 0; 414d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private static final int COLUMN_SUGGESTION_TIMESTAMP = 1; 415d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 416d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private Context mContext; 417d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private Cursor mCursor; 418d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private LayoutInflater mInflater; 419d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private boolean mDataValid = false; 420d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 421d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public SuggestionsAdapter(Context context) { 422d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mContext = context; 423d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 424d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mDataValid = false; 425d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 426d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 427d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public Cursor swapCursor(Cursor newCursor) { 428d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (newCursor == mCursor) { 429d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return null; 430d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 431d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio Cursor oldCursor = mCursor; 432d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mCursor = newCursor; 433d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (newCursor != null) { 434d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mDataValid = true; 435d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio notifyDataSetChanged(); 436d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } else { 437d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mDataValid = false; 438d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio notifyDataSetInvalidated(); 439d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 440d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return oldCursor; 441d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 442d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 443d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 444d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public int getCount() { 445d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (!mDataValid || mCursor == null || mCursor.isClosed()) return 0; 446d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return mCursor.getCount(); 447d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 448d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 449d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 450d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public Object getItem(int position) { 451d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (mDataValid && mCursor.moveToPosition(position)) { 452d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio final String query = mCursor.getString(COLUMN_SUGGESTION_QUERY); 453d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 454d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return new SuggestionItem(query); 455d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 456d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return null; 457d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 458d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 459d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 460d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public long getItemId(int position) { 461d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return 0; 462d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 463d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 464d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio @Override 465d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio public View getView(int position, View convertView, ViewGroup parent) { 466d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (!mDataValid && convertView == null) { 467d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio throw new IllegalStateException( 468d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio "this should only be called when the cursor is valid"); 469d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 470d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (!mCursor.moveToPosition(position)) { 471d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio throw new IllegalStateException("couldn't move cursor to position " + position); 472d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 473d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 474d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio View view; 475d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 476d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio if (convertView == null) { 477d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio view = mInflater.inflate(R.layout.search_suggestion_item, parent, false); 478d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } else { 479d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio view = convertView; 480d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 481d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 482d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio TextView query = (TextView) view.findViewById(R.id.title); 483d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 484d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio SuggestionItem item = (SuggestionItem) getItem(position); 485d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio query.setText(item.query); 486d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 487d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio return view; 488d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 489d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio } 490d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio 491d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private static class SearchResult { 492c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio public Context context; 493d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public String title; 4949593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio public String summaryOn; 4959593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio public String summaryOff; 496a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio public String entries; 497d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public int iconResId; 498c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio public String key; 499d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 5009593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio public SearchResult(Context context, String title, String summaryOn, String summaryOff, 501c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio String entries, int iconResId, String key) { 502d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio this.context = context; 503d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio this.title = title; 5049593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio this.summaryOn = summaryOn; 5059593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio this.summaryOff = summaryOff; 506a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio this.entries = entries; 507d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio this.iconResId = iconResId; 508c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio this.key = key; 509d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 510d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 511d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 512d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private static class SearchResultsAdapter extends BaseAdapter { 513d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 514d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio private Context mContext; 515d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private Cursor mCursor; 516d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private LayoutInflater mInflater; 517d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private boolean mDataValid; 518d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio private HashMap<String, Context> mContextMap = new HashMap<String, Context>(); 519d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 520a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio private static final String PERCENT_RECLACE = "%s"; 521a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio private static final String DOLLAR_REPLACE = "$s"; 522a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio 523d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public SearchResultsAdapter(Context context) { 524d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mContext = context; 525d297a5840230b769a3c7ad8b85232968a7077f64Fabrice Di Meglio mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 526d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mDataValid = false; 527d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 528d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 529d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public Cursor swapCursor(Cursor newCursor) { 530d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (newCursor == mCursor) { 531d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return null; 532d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 533d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Cursor oldCursor = mCursor; 534d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mCursor = newCursor; 535d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (newCursor != null) { 536d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mDataValid = true; 537d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio notifyDataSetChanged(); 538d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else { 539d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mDataValid = false; 540d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio notifyDataSetInvalidated(); 541d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 542d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return oldCursor; 543d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 544d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 545d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 546d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public int getCount() { 547d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (!mDataValid || mCursor == null || mCursor.isClosed()) return 0; 548d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return mCursor.getCount(); 549d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 550d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 551d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 552d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public Object getItem(int position) { 553d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (mDataValid && mCursor.moveToPosition(position)) { 554d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String title = mCursor.getString(Index.COLUMN_INDEX_TITLE); 5559593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio final String summaryOn = mCursor.getString(Index.COLUMN_INDEX_SUMMARY_ON); 5569593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio final String summaryOff = mCursor.getString(Index.COLUMN_INDEX_SUMMARY_OFF); 557a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio final String entries = mCursor.getString(Index.COLUMN_INDEX_ENTRIES); 558d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String iconResStr = mCursor.getString(Index.COLUMN_INDEX_ICON); 559d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String className = mCursor.getString( 560d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Index.COLUMN_INDEX_CLASS_NAME); 561d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final String packageName = mCursor.getString( 562d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Index.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE); 563c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio final String key = mCursor.getString( 564c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio Index.COLUMN_INDEX_KEY); 565d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 566d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Context packageContext; 567d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (TextUtils.isEmpty(className) && !TextUtils.isEmpty(packageName)) { 568d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio packageContext = mContextMap.get(packageName); 569d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (packageContext == null) { 570d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio try { 571d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio packageContext = mContext.createPackageContext(packageName, 0); 572d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } catch (PackageManager.NameNotFoundException e) { 573d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Log.e(LOG_TAG, "Cannot create Context for package: " + packageName); 574d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return null; 575d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 576d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio mContextMap.put(packageName, packageContext); 577d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 578d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else { 579d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio packageContext = mContext; 580d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 581a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio 582d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final int iconResId = TextUtils.isEmpty(iconResStr) ? 583d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio R.drawable.empty_icon : Integer.parseInt(iconResStr); 584a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio 585a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio return new SearchResult(packageContext, title, summaryOn, summaryOff, 586c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio entries, iconResId, key); 587d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 588d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return null; 589d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 590d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 591d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 592d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public long getItemId(int position) { 593d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return 0; 594d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 595d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 596d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio @Override 597d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio public View getView(int position, View convertView, ViewGroup parent) { 598d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (!mDataValid && convertView == null) { 599d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio throw new IllegalStateException( 600d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio "this should only be called when the cursor is valid"); 601d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 602d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (!mCursor.moveToPosition(position)) { 603d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio throw new IllegalStateException("couldn't move cursor to position " + position); 604d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 605d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 606d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio View view; 607d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio TextView textTitle; 608d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio ImageView imageView; 609d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 610d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (convertView == null) { 611d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio view = mInflater.inflate(R.layout.search_result_item, parent, false); 612d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else { 613d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio view = convertView; 614d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 615302f75d6e6005e46e4500f3419bf1010202765e1Fabrice Di Meglio 616d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio textTitle = (TextView) view.findViewById(R.id.title); 617d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio imageView = (ImageView) view.findViewById(R.id.icon); 618d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 619302f75d6e6005e46e4500f3419bf1010202765e1Fabrice Di Meglio final SearchResult result = (SearchResult) getItem(position); 620d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio textTitle.setText(result.title); 621a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio 622d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio if (result.iconResId != R.drawable.empty_icon) { 623d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final Context packageContext = result.context; 624d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio final Drawable drawable; 625d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio try { 626d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio drawable = packageContext.getDrawable(result.iconResId); 627d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio imageView.setImageDrawable(drawable); 628d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } catch (Resources.NotFoundException nfe) { 629d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio // Not much we can do except logging 630d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio Log.e(LOG_TAG, "Cannot load Drawable for " + result.title); 631d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 632d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } else { 633d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio imageView.setImageDrawable(null); 634d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio imageView.setBackgroundResource(R.drawable.empty_icon); 635d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 636d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio 637d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio return view; 638d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 639d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio } 640d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio} 641