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