19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
193c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.ActivityNotFoundException;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
21875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.ContentResolver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
243c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.Intent;
25ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamathimport android.content.pm.ResolveInfo;
2699e9095430b84e49bda50c831e320dada8bca109Tim Kilbournimport android.content.res.Configuration;
27875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.database.Cursor;
28050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwoodimport android.graphics.Rect;
29875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.net.Uri;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
32875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.os.RemoteException;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
34f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
353fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringertimport android.text.TextUtils;
368d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.util.Log;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
396d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringertimport java.util.List;
406d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides access to the system search services.
43e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani *
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In practice, you won't interact with this class directly, as search
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * services are provided through methods in {@link android.app.Activity Activity}
468ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * and the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}
478ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * {@link android.content.Intent Intent}.
488ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * If you do require direct access to the SearchManager, do not instantiate
498ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * this class directly. Instead, retrieve it through
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context.getSystemService(Context.SEARCH_SERVICE)}.
52590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen *
533aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
543aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
553aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using the search dialog and adding search
563aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * suggestions in your application, read the
573aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/search/index.html">Search</a> developer guide.</p>
588ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * </div>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
60e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasanipublic class SearchManager
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
638d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
648d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private static final boolean DBG = false;
658d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private static final String TAG = "SearchManager";
668d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a shortcut definition for the default menu key to use for invoking search.
69e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See Menu.Item.setAlphabeticShortcut() for more information.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static char MENU_KEY = 's';
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a shortcut definition for the default menu key to use for invoking search.
76e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See Menu.Item.setAlphabeticShortcut() for more information.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int MENU_KEYCODE = KeyEvent.KEYCODE_S;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
82e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Intent extra data key: Use this key with
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getStringExtra
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  content.Intent.getStringExtra()}
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain the query string from Intent.ACTION_SEARCH.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String QUERY = "query";
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
905f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * Intent extra data key: Use this key with
915f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * {@link android.content.Intent#getStringExtra
925f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     *  content.Intent.getStringExtra()}
935f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * to obtain the query string typed in by the user.
945f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * This may be different from the value of {@link #QUERY}
955f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * if the intent is the result of selecting a suggestion.
965f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * In that case, {@link #QUERY} will contain the value of
975f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * {@link #SUGGEST_COLUMN_QUERY} for the suggestion, and
985f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * {@link #USER_QUERY} will contain the string typed by the
995f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     * user.
1005f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert     */
1015f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert    public final static String USER_QUERY = "user_query";
1025f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert
1035f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert    /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with Intent.ACTION_SEARCH and
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getBundleExtra
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  content.Intent.getBundleExtra()}
107e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * to obtain any additional app-specific data that was inserted by the
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that launched the search.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String APP_DATA = "app_data";
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
113be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     * Intent extra data key: Use {@link android.content.Intent#getBundleExtra
114be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     * content.Intent.getBundleExtra(SEARCH_MODE)} to get the search mode used
115be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     * to launch the intent.
116be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     * The only current value for this is {@link #MODE_GLOBAL_SEARCH_SUGGESTION}.
117be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     *
118be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     * @hide
119be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert     */
120be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert    public final static String SEARCH_MODE = "search_mode";
121be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert
122be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with Intent.ACTION_SEARCH and
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getIntExtra content.Intent.getIntExtra()}
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain the keycode that the user used to trigger this query.  It will be zero if the
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user simply pressed the "GO" button on the search UI.  This is primarily used in conjunction
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the keycode attribute in the actionkey element of your searchable.xml configuration
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * file.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_KEY = "action_key";
131e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
133875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * Intent extra data key: This key will be used for the extra populated by the
134875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column.
135875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     */
136875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    public final static String EXTRA_DATA_KEY = "intent_extra_data_key";
137a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen
138a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen    /**
13955f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * Boolean extra data key for {@link #INTENT_ACTION_GLOBAL_SEARCH} intents. If {@code true},
14055f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * the initial query should be selected when the global search activity is started, so
14155f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * that the user can easily replace it with another query.
1423c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert     */
14355f3ac5f293e78618995202274f8555f2481994dBjorn Bringert    public final static String EXTRA_SELECT_QUERY = "select_query";
14432d580c360da0a0f15e7a080f4ebd0b7b514fe4cBjorn Bringert
1453c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert    /**
146af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins     * Boolean extra data key for {@link Intent#ACTION_WEB_SEARCH} intents.  If {@code true},
147af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins     * this search should open a new browser window, rather than using an existing one.
148af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins     */
149af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins    public final static String EXTRA_NEW_SEARCH = "new_search";
150af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins
151af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins    /**
1524519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert     * Extra data key for {@link Intent#ACTION_WEB_SEARCH}. If set, the value must be a
1534519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert     * {@link PendingIntent}. The search activity handling the {@link Intent#ACTION_WEB_SEARCH}
1544519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert     * intent will fill in and launch the pending intent. The data URI will be filled in with an
1554519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert     * http or https URI, and {@link android.provider.Browser#EXTRA_HEADERS} may be filled in.
1564519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert     */
1574519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert    public static final String EXTRA_WEB_SEARCH_PENDINGINTENT = "web_search_pendingintent";
1584519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert
1594519ff6aa35b82e4d401f8af92257ffd4b176bd5Bjorn Bringert    /**
160c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani     * Boolean extra data key for a suggestion provider to return in {@link Cursor#getExtras} to
161c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani     * indicate that the search is not complete yet. This can be used by the search UI
162c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani     * to indicate that a search is in progress. The suggestion provider can return partial results
163c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani     * this way and send a change notification on the cursor when more results are available.
164c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani     */
165c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani    public final static String CURSOR_EXTRA_KEY_IN_PROGRESS = "in_progress";
166c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani
167c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani    /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with Intent.ACTION_SEARCH and
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getStringExtra content.Intent.getStringExtra()}
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain the action message that was defined for a particular search action key and/or
171e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * suggestion.  It will be null if the search was launched by typing "enter", touched the the
172e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * "GO" button, or other means not involving any action key.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_MSG = "action_msg";
175e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
176e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    /**
177e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Flag to specify that the entry can be used for query refinement, i.e., the query text
178e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * in the search field can be replaced with the text in this entry, when a query refinement
179e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * icon is clicked. The suggestion list should show such a clickable icon beside the entry.
180e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * <p>Use this flag as a bit-field for {@link #SUGGEST_COLUMN_FLAGS}.
181e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     */
182e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    public final static int FLAG_QUERY_REFINEMENT = 1 << 0;
183e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Uri path for queried suggestions data.  This is the path that the search manager
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will use when querying your content provider for suggestions data based on user input
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (e.g. looking for partial matches).
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Typically you'll use this with a URI matcher.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_URI_PATH_QUERY = "search_suggest_query";
191b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen
192b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen    /**
193b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen     * MIME type for suggestions data.  You'll use this in your suggestions content provider
194b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen     * in the getType() function.
195b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen     */
196b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen    public final static String SUGGEST_MIME_TYPE =
197b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen            "vnd.android.cursor.dir/vnd.android.search.suggest";
198b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen
199b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen    /**
200b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * Uri path for shortcut validation.  This is the path that the search manager will use when
201b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * querying your content provider to refresh a shortcutted suggestion result and to check if it
202b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * is still valid.  When asked, a source may return an up to date result, or no result.  No
203b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * result indicates the shortcut refers to a no longer valid sugggestion.
204b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     *
205b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * @see #SUGGEST_COLUMN_SHORTCUT_ID
206b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     */
207b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen    public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut";
208e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
210b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen     * MIME type for shortcut validation.  You'll use this in your suggestions content provider
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the getType() function.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
213e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    public final static String SHORTCUT_MIME_TYPE =
214b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen            "vnd.android.cursor.item/vnd.android.search.suggest";
215d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Unused - can be null or column can be omitted.</i>
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_FORMAT = "suggest_format";
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
221e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Column name for suggestions cursor.  <i>Required.</i>  This is the primary line of text that
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be presented to the user as the suggestion.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1";
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  then all suggestions will be provided in a two-line format.  The second line of text is in
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  a much smaller appearance.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
2310b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert
2320b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert    /**
2330b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert     * Column name for suggestions cursor.  <i>Optional.</i> This is a URL that will be shown
2340b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert     * as the second line of text instead of {@link #SUGGEST_COLUMN_TEXT_2}. This is a separate
2350b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert     * column so that the search UI knows to display the text as a URL, e.g. by using a different
2360b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert     * color. If this column is absent, or has the value {@code null},
2370b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert     * {@link #SUGGEST_COLUMN_TEXT_2} will be used instead.
2380b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert     */
2390b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert    public final static String SUGGEST_COLUMN_TEXT_2_URL = "suggest_text_2_url";
2400b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
243875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *  then all suggestions will be provided in a format that includes space for two small icons,
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  one at the left and one at the right of each suggestion.  The data in the column must
245875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *  be a resource ID of a drawable, or a URI in one of the following formats:
246875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *
247875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <ul>
248875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
249875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
250875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
251875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * </ul>
252875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *
253e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)}
254e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * for more information on these schemes.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1";
257b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
260875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *  then all suggestions will be provided in a format that includes space for two small icons,
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  one at the left and one at the right of each suggestion.  The data in the column must
262875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *  be a resource ID of a drawable, or a URI in one of the following formats:
263875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *
264875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <ul>
265875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
266875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
267875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
268875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * </ul>
269875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     *
270e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)}
271e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * for more information on these schemes.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2";
274b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
275b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
276b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
277b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * then the image will be displayed when forming the suggestion. The suggested dimension for
278b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * the image is 270x400 px for portrait mode and 400x225 px for landscape mode. The data in the
279b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * column must be a resource ID of a drawable, or a URI in one of the following formats:
280b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     *
281b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * <ul>
282b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
283b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
284b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
285b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * </ul>
286b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     *
287b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)}
288b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * for more information on these schemes.
289b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
290b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_RESULT_CARD_IMAGE = "suggest_result_card_image";
291b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this element exists at the given row, this is the action that will be used when
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * forming the suggestion's intent.  If the element is not provided, the action will be taken
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the android:searchSuggestIntentAction field in your XML metadata.  <i>At least one of
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * these must be present for the suggestion to generate an intent.</i>  Note:  If your action is
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same for all suggestions, it is more efficient to specify it using XML metadata and omit
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it from the cursor.
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action";
302b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this element exists at the given row, this is the data that will be used when
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * forming the suggestion's intent.  If the element is not provided, the data will be taken
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the android:searchSuggestIntentData field in your XML metadata.  If neither source
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is provided, the Intent's data field will be null.  Note:  If your data is
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same for all suggestions, or can be described using a constant part and a specific ID,
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is more efficient to specify it using XML metadata and omit it from the cursor.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
313b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
315bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
316bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath     * this element exists at the given row, this is the data that will be used when
317bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath     * forming the suggestion's intent. If not provided, the Intent's extra data field will be null.
318bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath     * This column allows suggestions to provide additional arbitrary data which will be included as
319131234c6f134c586208ec94bfe4ae021b057cf66Mike LeBeau     * an extra under the key {@link #EXTRA_DATA_KEY}.
320bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath     */
321bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath    public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
322b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
323bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath    /**
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this element exists at the given row, then "/" and this value will be appended to the data
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field in the Intent.  This should only be used if the data field has already been set to an
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * appropriate base string.
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id";
330b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
332e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Column name for suggestions cursor.  <i>Required if action is
333e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</i>  If this
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * column exists <i>and</i> this element exists at the given row, this is the data that will be
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used when forming the suggestion's query.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    /**
340b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * Column name for suggestions cursor. <i>Optional.</i>  This column is used to indicate whether
341b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen     * a search suggestion should be stored as a shortcut, and whether it should be refreshed.  If
342b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * missing, the result will be stored as a shortcut and never validated.  If set to
343b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut.
344b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen     * Otherwise, the shortcut id will be used to check back for an up to date suggestion using
345b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * {@link #SUGGEST_URI_PATH_SHORTCUT}.
346b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     */
347b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen    public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
348b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen
349b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen    /**
350ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau     * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify
351ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau     * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion
352ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau     * is being refreshed.
353ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau     */
354ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau    public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING =
355ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau            "suggest_spinner_while_refreshing";
3561c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath
3571c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath    /**
358b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is media type, you
359b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column so search app could understand more about your content. The data
360b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * in the column must specify the MIME type of the content.
361b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
362b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_CONTENT_TYPE = "suggest_content_type";
363b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
364b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
365b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is media type, you
366b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify whether your content is live media such as live video
367b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * or live audio. The value in the column is of integer type with value of either 0 indicating
368b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * non-live content or 1 indicating live content.
369b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
370b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_IS_LIVE = "suggest_is_live";
371b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
372b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
373b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is video, you should
374b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * provide this column to specify the number of vertical lines. The data in the column is of
375b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * integer type.
376b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
377b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_VIDEO_WIDTH = "suggest_video_width";
378b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
379b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
380b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is video, you should
381b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * provide this column to specify the number of horizontal lines. The data in the column is of
382b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * integer type.
383b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
384b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_VIDEO_HEIGHT = "suggest_video_height";
385b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
386b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
387b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content contains audio, you
388b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify the audio channel configuration. The data in the
389b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * column is string with format like "channels.subchannels" such as "1.0" or "5.1".
390b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
391b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG = "suggest_audio_channel_config";
392b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
393b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
394b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is purchasable, you
395b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify the displayable string representation of the purchase
396b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * price of your content including the currency and the amount. If it's free, you should
397b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * provide localized string to specify that it's free. This column can be omitted if the content
398b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * is not applicable to purchase.
399b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
400b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_PURCHASE_PRICE = "suggest_purchase_price";
401b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
402b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
403b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is rentable, you
404b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify the displayable string representation of the rental
405b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * price of your content including the currency and the amount. If it's free, you should
406b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * provide localized string to specify that it's free. This column can be ommitted if the
407b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * content is not applicable to rent.
408b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
409b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_RENTAL_PRICE = "suggest_rental_price";
410b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
411b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
412b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content has a rating, you
413b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify the rating style of your content. The data in the
414b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * column must be one of the constant values specified in {@link android.media.Rating}
415b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
416b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_RATING_STYLE = "suggest_rating_style";
417b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
418b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
419b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content has a rating, you
420b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify the rating score of your content. The data in the
421b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * column is of float type. See {@link android.media.Rating} about valid rating scores for each
422b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * rating style.
423b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
424b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_RATING_SCORE = "suggest_rating_score";
425b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
426b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
427b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is video or audio and
428b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * has a known production year, you should provide this column to specify the production year
429b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * of your content. The data in the column is of integer type.
430b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
431b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_PRODUCTION_YEAR = "suggest_production_year";
432b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
433b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
434b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * Column name for suggestions cursor. <i>Optional.</i>  If your content is video or audio, you
435b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * should provide this column to specify the duration of your content in milliseconds. The data
436b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     * in the column is of long type.
437b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang     */
438b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    public final static String SUGGEST_COLUMN_DURATION = "suggest_duration";
439b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang
440b2b2ac1287bd1ae5042344f11accae7a46149d54Xiaolei Wang    /**
441e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify
442e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * additional flags per item. Multiple flags can be specified.
443e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * <p>
444e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Must be one of {@link #FLAG_QUERY_REFINEMENT} or 0 to indicate no flags.
445e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * </p>
446e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     */
447e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    public final static String SUGGEST_COLUMN_FLAGS = "suggest_flags";
448e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
449e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    /**
450a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy     * Column name for suggestions cursor. <i>Optional.</i> This column may be
451de2ba4c8688bc32b1058433aac2f58872c8db1bfMark Brophy     * used to specify the time in {@link System#currentTimeMillis
452a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy     * System.currentTImeMillis()} (wall time in UTC) when an item was last
453a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy     * accessed within the results-providing application. If set, this may be
454a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy     * used to show more-recently-used items first.
455a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy     */
456a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy    public final static String SUGGEST_COLUMN_LAST_ACCESS_HINT = "suggest_last_access_hint";
457a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy
458a31c7aadcd0371e973000826b5998c9af8816d7fMark Brophy    /**
459b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion
460b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     * should not be stored as a shortcut in global search.
461b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen     */
462b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen    public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1";
463b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen
464b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen    /**
4653fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * Query parameter added to suggestion queries to limit the number of suggestions returned.
46686917dbb9554e3e05be4ca8845a409b730120022Bjorn Bringert     * This limit is only advisory and suggestion providers may chose to ignore it.
4673fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     */
4683fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert    public final static String SUGGEST_PARAMETER_LIMIT = "limit";
4693fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert
4703fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert    /**
47155f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * Intent action for starting the global search activity.
47274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert     * The global search provider should handle this intent.
47355f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     *
47455f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * Supported extra data keys: {@link #QUERY},
47555f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * {@link #EXTRA_SELECT_QUERY},
47655f3ac5f293e78618995202274f8555f2481994dBjorn Bringert     * {@link #APP_DATA}.
47774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert     */
478e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    public final static String INTENT_ACTION_GLOBAL_SEARCH
47974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert            = "android.search.action.GLOBAL_SEARCH";
480e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
48174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert    /**
482875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * Intent action for starting the global search settings activity.
483875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * The global search provider should handle this intent.
484875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     */
485e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    public final static String INTENT_ACTION_SEARCH_SETTINGS
486875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            = "android.search.action.SEARCH_SETTINGS";
487e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
4883a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau    /**
4893a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau     * Intent action for starting a web search provider's settings activity.
4903a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau     * Web search providers should handle this intent if they have provider-specific
4913a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau     * settings to implement.
4923a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau     */
4933a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau    public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS
4943a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau            = "android.search.action.WEB_SEARCH_SETTINGS";
495a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen
496a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen    /**
497f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * Intent action broadcasted to inform that the searchables list or default have changed.
498f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * Components should handle this intent if they cache any searchable data and wish to stay
499f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * up to date on changes.
500f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     */
501f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    public final static String INTENT_ACTION_SEARCHABLES_CHANGED
502f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath            = "android.search.action.SEARCHABLES_CHANGED";
503e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
504d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau    /**
505ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     * Intent action to be broadcast to inform that the global search provider
5063f5cfcf2d9d60bf12127dee3be54faaf7150ff69Michael Jurka     * has changed.
507ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     */
508ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath    public final static String INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED
509ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath            = "android.search.action.GLOBAL_SEARCH_ACTIVITY_CHANGED";
510ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath
511ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath    /**
512d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau     * Intent action broadcasted to inform that the search settings have changed in some way.
513590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen     * Either searchables have been enabled or disabled, or a different web search provider
514590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen     * has been chosen.
515d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau     */
516d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau    public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED
517d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau            = "android.search.action.SETTINGS_CHANGED";
518f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
519f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    /**
5204f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins     * This means that context is voice, and therefore the SearchDialog should
5214f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins     * continue showing the microphone until the user indicates that he/she does
5224f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins     * not want to re-speak (e.g. by typing).
5234f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins     *
5244f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins     * @hide
5254f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins     */
5264f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins    public final static String CONTEXT_IS_VOICE = "android.search.CONTEXT_IS_VOICE";
5274f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins
5284f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins    /**
5294a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III     * This means that the voice icon should not be shown at all, because the
5304a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III     * current search engine does not support voice search.
5314a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III     * @hide
5324a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III     */
5334a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III    public final static String DISABLE_VOICE_SEARCH
5344a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III            = "android.search.DISABLE_VOICE_SEARCH";
5354a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III
5364a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III    /**
537875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * Reference to the shared system search service.
538875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     */
5398d1538237847baf381787b881141f8c0478bef5bBjorn Bringert    private static ISearchManager mService;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
5428d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
543d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    /**
544d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * The package associated with this seach manager.
545d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     */
546d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    private String mAssociatedPackage;
547e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
5488d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    // package private since they are used by the inner class SearchManagerCallback
5498d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    /* package */ final Handler mHandler;
5508d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    /* package */ OnDismissListener mDismissListener = null;
5518d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    /* package */ OnCancelListener mCancelListener = null;
5528d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
553e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani    private SearchDialog mSearchDialog;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ SearchManager(Context context, Handler handler)  {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler = handler;
5588d1538237847baf381787b881141f8c0478bef5bBjorn Bringert        mService = ISearchManager.Stub.asInterface(
5598d1538237847baf381787b881141f8c0478bef5bBjorn Bringert                ServiceManager.getService(Context.SEARCH_SERVICE));
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
561e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch search UI.
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The search manager will open a search widget in an overlapping
566e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * window, and the underlying activity may be obscured.  The search
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entry state will remain in effect until one of the following events:
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
569e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * <li>The user completes the search.  In most cases this will launch
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a search intent.</li>
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The user uses the back, home, or other keys to exit the search.</li>
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The application calls the {@link #stopSearch}
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method, which will hide the search window and return focus to the
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity from which it was launched.</li>
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Most applications will <i>not</i> use this interface to invoke search.
577e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * The primary method for invoking search is to call
578e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * {@link android.app.Activity#onSearchRequested Activity.onSearchRequested()} or
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.app.Activity#startSearch Activity.startSearch()}.
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery A search string can be pre-entered here, but this
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is typically null or empty.
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param launchActivity The ComponentName of the activity that has launched this search.
590e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * @param appSearchData An application can insert application-specific
591e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * context here, in order to improve quality or specificity of its own
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
595e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * defined by the application (which is usually defined as a local search).  If no default
596cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau     * search is defined in the current application or activity, global search will be launched.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
598e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.Activity#onSearchRequested
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopSearch
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
602e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani    public void startSearch(String initialQuery,
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean selectInitialQuery,
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ComponentName launchActivity,
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Bundle appSearchData,
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean globalSearch) {
607050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood        startSearch(initialQuery, selectInitialQuery, launchActivity,
608050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood                appSearchData, globalSearch, null);
609050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood    }
610050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood
611050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood    /**
612050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood     * As {@link #startSearch(String, boolean, ComponentName, Bundle, boolean)} but including
613050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood     * source bounds for the global search intent.
614050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood     *
615050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood     * @hide
616050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood     */
617050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood    public void startSearch(String initialQuery,
618050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood                            boolean selectInitialQuery,
619050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood                            ComponentName launchActivity,
620050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood                            Bundle appSearchData,
621050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood                            boolean globalSearch,
622050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood                            Rect sourceBounds) {
6233c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        if (globalSearch) {
624050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood            startGlobalSearch(initialQuery, selectInitialQuery, appSearchData, sourceBounds);
6253c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert            return;
6263c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
6273c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert
62899e9095430b84e49bda50c831e320dada8bca109Tim Kilbourn        UiModeManager uiModeManager = new UiModeManager();
62999e9095430b84e49bda50c831e320dada8bca109Tim Kilbourn        // Don't show search dialog on televisions.
63099e9095430b84e49bda50c831e320dada8bca109Tim Kilbourn        if (uiModeManager.getCurrentModeType() != Configuration.UI_MODE_TYPE_TELEVISION) {
63199e9095430b84e49bda50c831e320dada8bca109Tim Kilbourn            ensureSearchDialog();
632479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani
63399e9095430b84e49bda50c831e320dada8bca109Tim Kilbourn            mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData);
63499e9095430b84e49bda50c831e320dada8bca109Tim Kilbourn        }
635e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani    }
636e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani
637e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani    private void ensureSearchDialog() {
638e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        if (mSearchDialog == null) {
639e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani            mSearchDialog = new SearchDialog(mContext, this);
640e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani            mSearchDialog.setOnCancelListener(this);
641e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani            mSearchDialog.setOnDismissListener(this);
642d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        }
643d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    }
644d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen
645d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    /**
6463c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert     * Starts the global search activity.
6473c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert     */
648e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani    /* package */ void startGlobalSearch(String initialQuery, boolean selectInitialQuery,
649050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood            Bundle appSearchData, Rect sourceBounds) {
6503c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        ComponentName globalSearchActivity = getGlobalSearchActivity();
6513c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        if (globalSearchActivity == null) {
6523c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert            Log.w(TAG, "No global search activity found.");
6533c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert            return;
6543c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
655a94e7afb28c6bd9af6f2b0142a577086399066b2Bjorn Bringert        Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH);
656b8144a9c18f23c91b836736a2fcea30917153002Bjorn Bringert        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
6573c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        intent.setComponent(globalSearchActivity);
6583c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        // Make sure that we have a Bundle to put source in
6593c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        if (appSearchData == null) {
6603c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert            appSearchData = new Bundle();
6613c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        } else {
6623c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert            appSearchData = new Bundle(appSearchData);
6633c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
6643c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        // Set source to package name of app that starts global search, if not set already.
6653c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        if (!appSearchData.containsKey("source")) {
6663c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert            appSearchData.putString("source", mContext.getPackageName());
6673c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        }
6683c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert        intent.putExtra(APP_DATA, appSearchData);
6693c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        if (!TextUtils.isEmpty(initialQuery)) {
67055f3ac5f293e78618995202274f8555f2481994dBjorn Bringert            intent.putExtra(QUERY, initialQuery);
6713c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
6723c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        if (selectInitialQuery) {
67355f3ac5f293e78618995202274f8555f2481994dBjorn Bringert            intent.putExtra(EXTRA_SELECT_QUERY, selectInitialQuery);
6743c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
675050453eaf51bb3a267680dc1db2b53cb2fbfcefcMathew Inwood        intent.setSourceBounds(sourceBounds);
6763c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        try {
6773c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert            if (DBG) Log.d(TAG, "Starting global search: " + intent.toUri(0));
6783c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert            mContext.startActivity(intent);
6793c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        } catch (ActivityNotFoundException ex) {
6803c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert            Log.e(TAG, "Global search activity not found: " + globalSearchActivity);
6813c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
6823c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert    }
6833c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert
6843c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert    /**
685ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     * Returns a list of installed apps that handle the global search
686ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     * intent.
687ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     *
688ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     * @hide
689ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath     */
690ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath    public List<ResolveInfo> getGlobalSearchActivities() {
691ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath        try {
692ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath            return mService.getGlobalSearchActivities();
693ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath        } catch (RemoteException ex) {
694ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath            Log.e(TAG, "getGlobalSearchActivities() failed: " + ex);
695ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath            return null;
696ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath        }
697ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath    }
698ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath
699ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath    /**
7003c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert     * Gets the name of the global search activity.
7013c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert     */
70238015f3663dcf3765d0998f8f5398b3068dfc326Bjorn Bringert    public ComponentName getGlobalSearchActivity() {
7036cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert        try {
7046cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert            return mService.getGlobalSearchActivity();
7056cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert        } catch (RemoteException ex) {
7066cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert            Log.e(TAG, "getGlobalSearchActivity() failed: " + ex);
7076cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert            return null;
7083c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert        }
7093c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert    }
7103c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert
7113c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert    /**
712ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     * Gets the name of the web search activity.
713ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     *
714ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     * @return The name of the default activity for web searches. This activity
715ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     *         can be used to get web search suggestions. Returns {@code null} if
716ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     *         there is no default web search activity.
717ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     *
718ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     * @hide
719ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert     */
720ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert    public ComponentName getWebSearchActivity() {
7216cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert        try {
7226cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert            return mService.getWebSearchActivity();
7236cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert        } catch (RemoteException ex) {
7246cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert            Log.e(TAG, "getWebSearchActivity() failed: " + ex);
725ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert            return null;
726ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert        }
727ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert    }
728ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert
729ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert    /**
730d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * Similar to {@link #startSearch} but actually fires off the search query after invoking
731d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * the search dialog.  Made available for testing purposes.
732d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     *
733d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param query The query to trigger.  If empty, request will be ignored.
734d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param launchActivity The ComponentName of the activity that has launched this search.
735d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @param appSearchData An application can insert application-specific
736d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * context here, in order to improve quality or specificity of its own
737d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * searches.  This data will be returned with SEARCH intent(s).  Null if
738d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * no extra data is required.
739d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     *
740d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     * @see #startSearch
741d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen     */
742d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen    public void triggerSearch(String query,
743d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen                              ComponentName launchActivity,
744b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert                              Bundle appSearchData) {
745d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        if (!mAssociatedPackage.equals(launchActivity.getPackageName())) {
746d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen            throw new IllegalArgumentException("invoking app search on a different package " +
747d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen                    "not associated with this search manager");
748d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        }
749d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        if (query == null || TextUtils.getTrimmedLength(query) == 0) {
750d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen            Log.w(TAG, "triggerSearch called with empty query, ignoring.");
751d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen            return;
752d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen        }
753e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        startSearch(query, false, launchActivity, appSearchData, false);
754e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        mSearchDialog.launchQuerySearch();
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Terminate search UI.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Typically the user will terminate the search UI by launching a
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search or by canceling.  This function allows the underlying application
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or activity to cancel the search prematurely (for any reason).
763e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can be safely called at any time (even if no search is active.)
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startSearch
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7688d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    public void stopSearch() {
769e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        if (mSearchDialog != null) {
770e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani            mSearchDialog.cancel();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
775e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     * Determine if the Search UI is currently displayed.
776e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is provided primarily for application test purposes.
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the search UI is currently displayed.
780e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7838d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    public boolean isVisible() {
784e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        return mSearchDialog == null? false : mSearchDialog.isShowing();
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7868d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
788a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen     * See {@link SearchManager#setOnDismissListener} for configuring your activity to monitor
789a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen     * search UI state.
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnDismissListener {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
793a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen         * This method will be called when the search UI is dismissed. To make use of it, you must
794a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen         * implement this method in your activity, and call
795a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen         * {@link SearchManager#setOnDismissListener} to register it.
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onDismiss();
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
799e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
801a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen     * See {@link SearchManager#setOnCancelListener} for configuring your activity to monitor
802a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen     * search UI state.
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnCancelListener {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This method will be called when the search UI is canceled. To make use if it, you must
807a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen         * implement this method in your activity, and call
808a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen         * {@link SearchManager#setOnCancelListener} to register it.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onCancel();
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the callback that will be invoked whenever the search UI is dismissed.
815e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The {@link OnDismissListener} to use, or null.
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnDismissListener(final OnDismissListener listener) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDismissListener = listener;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the callback that will be invoked whenever the search UI is canceled.
824e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The {@link OnCancelListener} to use, or null.
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    public void setOnCancelListener(OnCancelListener listener) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCancelListener = listener;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8308d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
8310e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert    /**
8320e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert     * @deprecated This method is an obsolete internal implementation detail. Do not use.
8330e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert     */
8344a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn    @Deprecated
8358d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    public void onCancel(DialogInterface dialog) {
836e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        if (mCancelListener != null) {
837e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani            mCancelListener.onCancel();
838e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        }
8398d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    }
8400e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert
8410e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert    /**
8420e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert     * @deprecated This method is an obsolete internal implementation detail. Do not use.
8430e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert     */
8444a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn    @Deprecated
8458d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    public void onDismiss(DialogInterface dialog) {
846e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        if (mDismissListener != null) {
847e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani            mDismissListener.onDismiss();
848e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani        }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8520408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert     * Gets information about a searchable activity.
8530408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert     *
8540408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert     * @param componentName The activity to get searchable information for.
8550408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert     * @return Searchable information, or <code>null</code> if the activity does not
8560408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert     *         exist, or is not searchable.
8570408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert     */
8580408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert    public SearchableInfo getSearchableInfo(ComponentName componentName) {
8590408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert        try {
8606cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert            return mService.getSearchableInfo(componentName);
8618d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert        } catch (RemoteException ex) {
8628d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            Log.e(TAG, "getSearchableInfo() failed: " + ex);
863875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            return null;
864875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        }
865875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    }
8668d1538237847baf381787b881141f8c0478bef5bBjorn Bringert
867875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    /**
86897325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     * Gets a cursor with search suggestions.
86997325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     *
87097325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     * @param searchable Information about how to get the suggestions.
87197325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     * @param query The search text entered (so far).
87297325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     * @return a cursor with suggestions, or <code>null</null> the suggestion query failed.
87397325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     *
87497325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     * @hide because SearchableInfo is not part of the API.
87597325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert     */
87697325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert    public Cursor getSuggestions(SearchableInfo searchable, String query) {
8773fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert        return getSuggestions(searchable, query, -1);
8783fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert    }
8793fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert
8803fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert    /**
8813fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * Gets a cursor with search suggestions.
8823fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     *
8833fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * @param searchable Information about how to get the suggestions.
8843fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * @param query The search text entered (so far).
8853fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * @param limit The query limit to pass to the suggestion provider. This is advisory,
8863fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     *        the returned cursor may contain more rows. Pass {@code -1} for no limit.
8873fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * @return a cursor with suggestions, or <code>null</null> the suggestion query failed.
8883fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     *
8893fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     * @hide because SearchableInfo is not part of the API.
8903fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert     */
8913fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert    public Cursor getSuggestions(SearchableInfo searchable, String query, int limit) {
892875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        if (searchable == null) {
893875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            return null;
894875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        }
895875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
896875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        String authority = searchable.getSuggestAuthority();
897875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        if (authority == null) {
898875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            return null;
899875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        }
900875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
901875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        Uri.Builder uriBuilder = new Uri.Builder()
902875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen                .scheme(ContentResolver.SCHEME_CONTENT)
9033fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert                .authority(authority)
9043fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert                .query("")  // TODO: Remove, workaround for a bug in Uri.writeToParcel()
9053fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert                .fragment("");  // TODO: Remove, workaround for a bug in Uri.writeToParcel()
906875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
907875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // if content path provided, insert it now
908875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        final String contentPath = searchable.getSuggestPath();
909875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        if (contentPath != null) {
910875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            uriBuilder.appendEncodedPath(contentPath);
911875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        }
912875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
9133fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert        // append standard suggestion query path
914875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY);
915875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
916875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // get the query selection, may be null
917875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        String selection = searchable.getSuggestSelection();
918875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // inject query, either as selection args or inline
919875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        String[] selArgs = null;
920875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        if (selection != null) {    // use selection if provided
921875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            selArgs = new String[] { query };
922875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        } else {                    // no selection, use REST pattern
923875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            uriBuilder.appendPath(query);
924875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        }
925875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
9263fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert        if (limit > 0) {
9273fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert            uriBuilder.appendQueryParameter(SUGGEST_PARAMETER_LIMIT, String.valueOf(limit));
9283fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert        }
9293fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert
9303fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert        Uri uri = uriBuilder.build();
931875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
932875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // finally, make the query
9338d1538237847baf381787b881141f8c0478bef5bBjorn Bringert        return mContext.getContentResolver().query(uri, null, selection, selArgs, null);
934875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    }
935e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani
9366d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert    /**
9376d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert     * Returns a list of the searchable activities that can be included in global search.
938e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani     *
9396d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert     * @return a list containing searchable information for all searchable activities
94013107bb186d72bc80dc5609b20c71b7e77a9784dBjorn Bringert     *         that have the <code>android:includeInGlobalSearch</code> attribute set
94113107bb186d72bc80dc5609b20c71b7e77a9784dBjorn Bringert     *         in their searchable meta-data.
9426d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert     */
9438d1538237847baf381787b881141f8c0478bef5bBjorn Bringert    public List<SearchableInfo> getSearchablesInGlobalSearch() {
9446d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert        try {
9458d1538237847baf381787b881141f8c0478bef5bBjorn Bringert            return mService.getSearchablesInGlobalSearch();
9466d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert        } catch (RemoteException e) {
9478d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            Log.e(TAG, "getSearchablesInGlobalSearch() failed: " + e);
9486d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert            return null;
9496d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert        }
9506d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert    }
951f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
952de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown    /**
95345308b1b3b1582d048845df2ee5301241e52a5cfJim Miller     * Gets an intent for launching installed assistant activity, or null if not available.
954de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown     * @return The assist intent.
955de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown     *
956de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown     * @hide
957de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown     */
958f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    public Intent getAssistIntent(Context context, boolean inclContext) {
959f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        return getAssistIntent(context, inclContext, UserHandle.myUserId());
960c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani    }
961c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani
962c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani    /**
963c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani     * Gets an intent for launching installed assistant activity, or null if not available.
964c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani     * @return The assist intent.
965c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani     *
966c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani     * @hide
967c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani     */
968f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    public Intent getAssistIntent(Context context, boolean inclContext, int userHandle) {
969c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani        try {
97043d84518f2380e45659fbb31455479ef018b9329John Spurlock            if (mService == null) {
97143d84518f2380e45659fbb31455479ef018b9329John Spurlock                return null;
97243d84518f2380e45659fbb31455479ef018b9329John Spurlock            }
973c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            ComponentName comp = mService.getAssistIntent(userHandle);
974c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            if (comp == null) {
975c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani                return null;
976c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            }
977c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            Intent intent = new Intent(Intent.ACTION_ASSIST);
978c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            intent.setComponent(comp);
979f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (inclContext) {
980f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                IActivityManager am = ActivityManagerNative.getDefault();
981dfc7fd7818cda46b914c8a9d69d1ba00443ffe5bAdam Skory                Bundle extras = am.getAssistContextExtras(0);
982f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                if (extras != null) {
983f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                    intent.replaceExtras(extras);
984f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                }
985f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
986de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown            return intent;
987c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani        } catch (RemoteException re) {
988c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            Log.e(TAG, "getAssistIntent() failed: " + re);
989c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani            return null;
990de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown        }
991de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown    }
992fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn
993fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn    /**
994fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn     * Launch an assist action for the current top activity.
995fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn     * @hide
996fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn     */
997fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn    public boolean launchAssistAction(int requestType, String hint, int userHandle) {
998fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn        try {
999fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn            if (mService == null) {
1000fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn                return false;
1001fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn            }
1002fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn            return mService.launchAssistAction(requestType, hint, userHandle);
1003fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn        } catch (RemoteException re) {
1004fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn            Log.e(TAG, "launchAssistAction() failed: " + re);
1005fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn            return false;
1006fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn        }
1007fdf5b35ab46639759d6389a4e2a4d5799cb6814bDianne Hackborn    }
1008e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani}
1009