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