SearchManager.java revision ee69ff4eaee9342843d5f25338288865dda2d36a
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; 26875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.database.Cursor; 27875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.net.Uri; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 30875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.os.RemoteException; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 323fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringertimport android.text.TextUtils; 338d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.util.Log; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 366d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringertimport java.util.List; 376d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides access to the system search services. 40e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In practice, you won't interact with this class directly, as search 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * services are provided through methods in {@link android.app.Activity Activity} 438ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * and the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 448ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * {@link android.content.Intent Intent}. 458ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * If you do require direct access to the SearchManager, do not instantiate 468ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * this class directly. Instead, retrieve it through 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context.getSystemService(Context.SEARCH_SERVICE)}. 49590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 508ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * <div class="special"> 518ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * <p>For a guide to using the search dialog and adding search 528ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * suggestions in your application, see the Dev Guide topic about <strong><a 538ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * href="{@docRoot}guide/topics/search/index.html">Search</a></strong>.</p> 548ad6465ca4a54bf124ea65389132fd1084ac291fScott Main * </div> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 56e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasanipublic class SearchManager 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 598d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 608d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static final boolean DBG = false; 618d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static final String TAG = "SearchManager"; 628d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a shortcut definition for the default menu key to use for invoking search. 65e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Menu.Item.setAlphabeticShortcut() for more information. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static char MENU_KEY = 's'; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a shortcut definition for the default menu key to use for invoking search. 72e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Menu.Item.setAlphabeticShortcut() for more information. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int MENU_KEYCODE = KeyEvent.KEYCODE_S; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 78e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Intent extra data key: Use this key with 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getStringExtra()} 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the query string from Intent.ACTION_SEARCH. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String QUERY = "query"; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 865f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * Intent extra data key: Use this key with 875f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link android.content.Intent#getStringExtra 885f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * content.Intent.getStringExtra()} 895f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * to obtain the query string typed in by the user. 905f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * This may be different from the value of {@link #QUERY} 915f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * if the intent is the result of selecting a suggestion. 925f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * In that case, {@link #QUERY} will contain the value of 935f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link #SUGGEST_COLUMN_QUERY} for the suggestion, and 945f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link #USER_QUERY} will contain the string typed by the 955f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * user. 965f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert */ 975f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert public final static String USER_QUERY = "user_query"; 985f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert 995f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getBundleExtra 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getBundleExtra()} 103e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * to obtain any additional app-specific data that was inserted by the 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity that launched the search. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String APP_DATA = "app_data"; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 109be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * Intent extra data key: Use {@link android.content.Intent#getBundleExtra 110be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * content.Intent.getBundleExtra(SEARCH_MODE)} to get the search mode used 111be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * to launch the intent. 112be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * The only current value for this is {@link #MODE_GLOBAL_SEARCH_SUGGESTION}. 113be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * 114be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * @hide 115be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert */ 116be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert public final static String SEARCH_MODE = "search_mode"; 117be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert 118be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra content.Intent.getIntExtra()} 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the keycode that the user used to trigger this query. It will be zero if the 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user simply pressed the "GO" button on the search UI. This is primarily used in conjunction 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the keycode attribute in the actionkey element of your searchable.xml configuration 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_KEY = "action_key"; 127e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 129875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Intent extra data key: This key will be used for the extra populated by the 130875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column. 131875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 132875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static String EXTRA_DATA_KEY = "intent_extra_data_key"; 133a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 134a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen /** 13555f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * Boolean extra data key for {@link #INTENT_ACTION_GLOBAL_SEARCH} intents. If {@code true}, 13655f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * the initial query should be selected when the global search activity is started, so 13755f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * that the user can easily replace it with another query. 1383c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert */ 13955f3ac5f293e78618995202274f8555f2481994dBjorn Bringert public final static String EXTRA_SELECT_QUERY = "select_query"; 14032d580c360da0a0f15e7a080f4ebd0b7b514fe4cBjorn Bringert 1413c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert /** 142af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins * Boolean extra data key for {@link Intent#ACTION_WEB_SEARCH} intents. If {@code true}, 143af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins * this search should open a new browser window, rather than using an existing one. 144af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins */ 145af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins public final static String EXTRA_NEW_SEARCH = "new_search"; 146af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins 147af5b406ad62af6f9d9e9f9f278683fb42015a4a2Leon Scroggins /** 148c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani * Boolean extra data key for a suggestion provider to return in {@link Cursor#getExtras} to 149c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani * indicate that the search is not complete yet. This can be used by the search UI 150c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani * to indicate that a search is in progress. The suggestion provider can return partial results 151c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani * this way and send a change notification on the cursor when more results are available. 152c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani */ 153c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani public final static String CURSOR_EXTRA_KEY_IN_PROGRESS = "in_progress"; 154c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani 155c37cb2469578f7d240615affb042e808b32ba5b2Amith Yamasani /** 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra content.Intent.getStringExtra()} 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the action message that was defined for a particular search action key and/or 159e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * suggestion. It will be null if the search was launched by typing "enter", touched the the 160e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * "GO" button, or other means not involving any action key. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_MSG = "action_msg"; 163e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 164e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani /** 165e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Flag to specify that the entry can be used for query refinement, i.e., the query text 166e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * in the search field can be replaced with the text in this entry, when a query refinement 167e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * icon is clicked. The suggestion list should show such a clickable icon beside the entry. 168e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * <p>Use this flag as a bit-field for {@link #SUGGEST_COLUMN_FLAGS}. 169e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani */ 170e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani public final static int FLAG_QUERY_REFINEMENT = 1 << 0; 171e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Uri path for queried suggestions data. This is the path that the search manager 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use when querying your content provider for suggestions data based on user input 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (e.g. looking for partial matches). 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Typically you'll use this with a URI matcher. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_URI_PATH_QUERY = "search_suggest_query"; 179b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 180b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 181b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * MIME type for suggestions data. You'll use this in your suggestions content provider 182b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * in the getType() function. 183b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen */ 184b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen public final static String SUGGEST_MIME_TYPE = 185b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen "vnd.android.cursor.dir/vnd.android.search.suggest"; 186b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen 187b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen /** 188b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Uri path for shortcut validation. This is the path that the search manager will use when 189b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * querying your content provider to refresh a shortcutted suggestion result and to check if it 190b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * is still valid. When asked, a source may return an up to date result, or no result. No 191b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * result indicates the shortcut refers to a no longer valid sugggestion. 192b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * 193b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * @see #SUGGEST_COLUMN_SHORTCUT_ID 194b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 195b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut"; 196e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 198b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * MIME type for shortcut validation. You'll use this in your suggestions content provider 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the getType() function. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 201e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani public final static String SHORTCUT_MIME_TYPE = 202b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen "vnd.android.cursor.item/vnd.android.search.suggest"; 203d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Unused - can be null or column can be omitted.</i> 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_FORMAT = "suggest_format"; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 209e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Column name for suggestions cursor. <i>Required.</i> This is the primary line of text that 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be presented to the user as the suggestion. 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1"; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then all suggestions will be provided in a two-line format. The second line of text is in 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a much smaller appearance. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2"; 2190b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert 2200b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert /** 2210b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * Column name for suggestions cursor. <i>Optional.</i> This is a URL that will be shown 2220b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * as the second line of text instead of {@link #SUGGEST_COLUMN_TEXT_2}. This is a separate 2230b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * column so that the search UI knows to display the text as a URL, e.g. by using a different 2240b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * color. If this column is absent, or has the value {@code null}, 2250b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * {@link #SUGGEST_COLUMN_TEXT_2} will be used instead. 2260b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert */ 2270b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert public final static String SUGGEST_COLUMN_TEXT_2_URL = "suggest_text_2_url"; 2280b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 231875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * then all suggestions will be provided in a format that includes space for two small icons, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one at the left and one at the right of each suggestion. The data in the column must 233875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be a resource ID of a drawable, or a URI in one of the following formats: 234875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 235875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <ul> 236875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 237875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 238875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> 239875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </ul> 240875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 241e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)} 242e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * for more information on these schemes. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1"; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 247875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * then all suggestions will be provided in a format that includes space for two small icons, 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one at the left and one at the right of each suggestion. The data in the column must 249875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be a resource ID of a drawable, or a URI in one of the following formats: 250875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 251875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <ul> 252875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 253875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 254875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> 255875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </ul> 256875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 257e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)} 258e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * for more information on these schemes. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2"; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, this is the action that will be used when 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forming the suggestion's intent. If the element is not provided, the action will be taken 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the android:searchSuggestIntentAction field in your XML metadata. <i>At least one of 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these must be present for the suggestion to generate an intent.</i> Note: If your action is 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same for all suggestions, it is more efficient to specify it using XML metadata and omit 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it from the cursor. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action"; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, this is the data that will be used when 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forming the suggestion's intent. If the element is not provided, the data will be taken 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the android:searchSuggestIntentData field in your XML metadata. If neither source 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is provided, the Intent's data field will be null. Note: If your data is 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same for all suggestions, or can be described using a constant part and a specific ID, 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is more efficient to specify it using XML metadata and omit it from the cursor. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data"; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 282bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 283bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * this element exists at the given row, this is the data that will be used when 284bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * forming the suggestion's intent. If not provided, the Intent's extra data field will be null. 285bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * This column allows suggestions to provide additional arbitrary data which will be included as 286131234c6f134c586208ec94bfe4ae021b057cf66Mike LeBeau * an extra under the key {@link #EXTRA_DATA_KEY}. 287bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath */ 288bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data"; 289bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, then "/" and this value will be appended to the data 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field in the Intent. This should only be used if the data field has already been set to an 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate base string. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id"; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 297e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Column name for suggestions cursor. <i>Required if action is 298e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</i> If this 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column exists <i>and</i> this element exists at the given row, this is the data that will be 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used when forming the suggestion's query. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_QUERY = "suggest_intent_query"; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 304875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 305b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Column name for suggestions cursor. <i>Optional.</i> This column is used to indicate whether 306b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * a search suggestion should be stored as a shortcut, and whether it should be refreshed. If 307b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * missing, the result will be stored as a shortcut and never validated. If set to 308b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. 309b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * Otherwise, the shortcut id will be used to check back for an up to date suggestion using 310b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * {@link #SUGGEST_URI_PATH_SHORTCUT}. 311b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 312b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id"; 313b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 314b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 315ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify 316ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion 317ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * is being refreshed. 318ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau */ 319ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = 320ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau "suggest_spinner_while_refreshing"; 3211c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath 3221c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath /** 323e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify 324e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * additional flags per item. Multiple flags can be specified. 325e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * <p> 326e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Must be one of {@link #FLAG_QUERY_REFINEMENT} or 0 to indicate no flags. 327e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * </p> 328e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani */ 329e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani public final static String SUGGEST_COLUMN_FLAGS = "suggest_flags"; 330e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 331e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani /** 332b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion 333b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * should not be stored as a shortcut in global search. 334b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 335b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1"; 336b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 337b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 3383fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * Query parameter added to suggestion queries to limit the number of suggestions returned. 33986917dbb9554e3e05be4ca8845a409b730120022Bjorn Bringert * This limit is only advisory and suggestion providers may chose to ignore it. 3403fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert */ 3413fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert public final static String SUGGEST_PARAMETER_LIMIT = "limit"; 3423fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert 3433fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert /** 34455f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * Intent action for starting the global search activity. 34574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * The global search provider should handle this intent. 34655f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * 34755f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * Supported extra data keys: {@link #QUERY}, 34855f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * {@link #EXTRA_SELECT_QUERY}, 34955f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * {@link #APP_DATA}. 35074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert */ 351e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani public final static String INTENT_ACTION_GLOBAL_SEARCH 35274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert = "android.search.action.GLOBAL_SEARCH"; 353e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 35474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /** 355875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Intent action for starting the global search settings activity. 356875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The global search provider should handle this intent. 357875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 358e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani public final static String INTENT_ACTION_SEARCH_SETTINGS 359875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen = "android.search.action.SEARCH_SETTINGS"; 360e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 3613a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau /** 3623a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * Intent action for starting a web search provider's settings activity. 3633a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * Web search providers should handle this intent if they have provider-specific 3643a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * settings to implement. 3653a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau */ 3663a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS 3673a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau = "android.search.action.WEB_SEARCH_SETTINGS"; 368a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 369a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen /** 370f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Intent action broadcasted to inform that the searchables list or default have changed. 371f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Components should handle this intent if they cache any searchable data and wish to stay 372f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * up to date on changes. 373f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 374f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath public final static String INTENT_ACTION_SEARCHABLES_CHANGED 375f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath = "android.search.action.SEARCHABLES_CHANGED"; 376e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 377d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau /** 378ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * Intent action to be broadcast to inform that the global search provider 379ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * has changed. Normal components will have no need to handle this intent since 380ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * they should be using API methods from this class to access the global search 381ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * activity 382ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * 383ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * @hide 384ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath */ 385ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath public final static String INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED 386ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath = "android.search.action.GLOBAL_SEARCH_ACTIVITY_CHANGED"; 387ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath 388ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath /** 389d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau * Intent action broadcasted to inform that the search settings have changed in some way. 390590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Either searchables have been enabled or disabled, or a different web search provider 391590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * has been chosen. 392d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau */ 393d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED 394d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau = "android.search.action.SETTINGS_CHANGED"; 395f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 396f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 3974f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins * This means that context is voice, and therefore the SearchDialog should 3984f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins * continue showing the microphone until the user indicates that he/she does 3994f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins * not want to re-speak (e.g. by typing). 4004f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins * 4014f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins * @hide 4024f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins */ 4034f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins public final static String CONTEXT_IS_VOICE = "android.search.CONTEXT_IS_VOICE"; 4044f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins 4054f22a545552d308377e178d5df5557cfe15252f9Leon Scroggins /** 4064a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III * This means that the voice icon should not be shown at all, because the 4074a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III * current search engine does not support voice search. 4084a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III * @hide 4094a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III */ 4104a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III public final static String DISABLE_VOICE_SEARCH 4114a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III = "android.search.DISABLE_VOICE_SEARCH"; 4124a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III 4134a028009468a95e932fc4fcd9ccdd358e02b1b0aLeon Scroggins III /** 414875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Reference to the shared system search service. 415875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 4168d1538237847baf381787b881141f8c0478bef5bBjorn Bringert private static ISearchManager mService; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 4198d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 420d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen /** 421d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * The package associated with this seach manager. 422d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen */ 423d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen private String mAssociatedPackage; 424e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 4258d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert // package private since they are used by the inner class SearchManagerCallback 4268d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ final Handler mHandler; 4278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ OnDismissListener mDismissListener = null; 4288d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ OnCancelListener mCancelListener = null; 4298d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 430e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani private SearchDialog mSearchDialog; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ SearchManager(Context context, Handler handler) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = handler; 4358d1538237847baf381787b881141f8c0478bef5bBjorn Bringert mService = ISearchManager.Stub.asInterface( 4368d1538237847baf381787b881141f8c0478bef5bBjorn Bringert ServiceManager.getService(Context.SEARCH_SERVICE)); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 438e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Launch search UI. 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The search manager will open a search widget in an overlapping 443e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * window, and the underlying activity may be obscured. The search 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry state will remain in effect until one of the following events: 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 446e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * <li>The user completes the search. In most cases this will launch 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search intent.</li> 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The user uses the back, home, or other keys to exit the search.</li> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The application calls the {@link #stopSearch} 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method, which will hide the search window and return focus to the 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity from which it was launched.</li> 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most applications will <i>not</i> use this interface to invoke search. 454e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * The primary method for invoking search is to call 455e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * {@link android.app.Activity#onSearchRequested Activity.onSearchRequested()} or 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startSearch Activity.startSearch()}. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param initialQuery A search string can be pre-entered here, but this 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is typically null or empty. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectInitialQuery If true, the intial query will be preselected, which means that 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any further typing will replace it. This is useful for cases where an entire pre-formed 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * query is being inserted. If false, the selection point will be placed at the end of the 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inserted query. This is useful when the inserted query is text that the user entered, 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the user would expect to be able to keep typing. <i>This parameter is only meaningful 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if initialQuery is a non-empty string.</i> 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param launchActivity The ComponentName of the activity that has launched this search. 467e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * @param appSearchData An application can insert application-specific 468e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * context here, in order to improve quality or specificity of its own 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searches. This data will be returned with SEARCH intent(s). Null if 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no extra data is required. 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param globalSearch If false, this will only launch the search that has been specifically 472e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * defined by the application (which is usually defined as a local search). If no default 473cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau * search is defined in the current application or activity, global search will be launched. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If true, this will always launch a platform-global (e.g. web-based) search instead. 475e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.Activity#onSearchRequested 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #stopSearch 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani public void startSearch(String initialQuery, 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selectInitialQuery, 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName launchActivity, 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle appSearchData, 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean globalSearch) { 4843c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (globalSearch) { 4853c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert startGlobalSearch(initialQuery, selectInitialQuery, appSearchData); 4863c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert return; 4873c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 4883c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert 489479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani ensureSearchDialog(); 490479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani 491479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData); 492e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani } 493e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani 494e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani private void ensureSearchDialog() { 495e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mSearchDialog == null) { 496e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog = new SearchDialog(mContext, this); 497e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.setOnCancelListener(this); 498e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.setOnDismissListener(this); 499d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 500d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 501d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen 502d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen /** 5033c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert * Starts the global search activity. 5043c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert */ 505e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani /* package */ void startGlobalSearch(String initialQuery, boolean selectInitialQuery, 5063c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert Bundle appSearchData) { 5073c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert ComponentName globalSearchActivity = getGlobalSearchActivity(); 5083c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (globalSearchActivity == null) { 5093c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert Log.w(TAG, "No global search activity found."); 5103c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert return; 5113c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 512a94e7afb28c6bd9af6f2b0142a577086399066b2Bjorn Bringert Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH); 513b8144a9c18f23c91b836736a2fcea30917153002Bjorn Bringert intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 5143c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert intent.setComponent(globalSearchActivity); 5153c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert // Make sure that we have a Bundle to put source in 5163c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert if (appSearchData == null) { 5173c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert appSearchData = new Bundle(); 5183c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert } else { 5193c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert appSearchData = new Bundle(appSearchData); 5203c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5213c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert // Set source to package name of app that starts global search, if not set already. 5223c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert if (!appSearchData.containsKey("source")) { 5233c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert appSearchData.putString("source", mContext.getPackageName()); 5243c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert } 5253c24cb77e7c2ab641b9147a02ce997f3356b7b69Bjorn Bringert intent.putExtra(APP_DATA, appSearchData); 5263c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (!TextUtils.isEmpty(initialQuery)) { 52755f3ac5f293e78618995202274f8555f2481994dBjorn Bringert intent.putExtra(QUERY, initialQuery); 5283c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5293c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (selectInitialQuery) { 53055f3ac5f293e78618995202274f8555f2481994dBjorn Bringert intent.putExtra(EXTRA_SELECT_QUERY, selectInitialQuery); 5313c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5323c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert try { 5333c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (DBG) Log.d(TAG, "Starting global search: " + intent.toUri(0)); 5343c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert mContext.startActivity(intent); 5353c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } catch (ActivityNotFoundException ex) { 5363c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert Log.e(TAG, "Global search activity not found: " + globalSearchActivity); 5373c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5383c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5393c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert 5403c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert /** 541ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * Returns a list of installed apps that handle the global search 542ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * intent. 543ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * 544ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath * @hide 545ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath */ 546ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath public List<ResolveInfo> getGlobalSearchActivities() { 547ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath try { 548ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath return mService.getGlobalSearchActivities(); 549ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath } catch (RemoteException ex) { 550ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath Log.e(TAG, "getGlobalSearchActivities() failed: " + ex); 551ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath return null; 552ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath } 553ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath } 554ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath 555ee69ff4eaee9342843d5f25338288865dda2d36aNarayan Kamath /** 5563c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert * Gets the name of the global search activity. 5573c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert * 55838015f3663dcf3765d0998f8f5398b3068dfc326Bjorn Bringert * @hide 5593c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert */ 56038015f3663dcf3765d0998f8f5398b3068dfc326Bjorn Bringert public ComponentName getGlobalSearchActivity() { 5616cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert try { 5626cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mService.getGlobalSearchActivity(); 5636cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert } catch (RemoteException ex) { 5646cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert Log.e(TAG, "getGlobalSearchActivity() failed: " + ex); 5656cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return null; 5663c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5673c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 5683c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert 5693c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert /** 570ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * Gets the name of the web search activity. 571ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * 572ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * @return The name of the default activity for web searches. This activity 573ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * can be used to get web search suggestions. Returns {@code null} if 574ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * there is no default web search activity. 575ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * 576ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * @hide 577ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert */ 578ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert public ComponentName getWebSearchActivity() { 5796cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert try { 5806cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mService.getWebSearchActivity(); 5816cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert } catch (RemoteException ex) { 5826cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert Log.e(TAG, "getWebSearchActivity() failed: " + ex); 583ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert return null; 584ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert } 585ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert } 586ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert 587ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert /** 588d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * Similar to {@link #startSearch} but actually fires off the search query after invoking 589d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * the search dialog. Made available for testing purposes. 590d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * 591d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @param query The query to trigger. If empty, request will be ignored. 592d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @param launchActivity The ComponentName of the activity that has launched this search. 593d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @param appSearchData An application can insert application-specific 594d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * context here, in order to improve quality or specificity of its own 595d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * searches. This data will be returned with SEARCH intent(s). Null if 596d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * no extra data is required. 597d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * 598d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @see #startSearch 599d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen */ 600d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen public void triggerSearch(String query, 601d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen ComponentName launchActivity, 602b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert Bundle appSearchData) { 603d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen if (!mAssociatedPackage.equals(launchActivity.getPackageName())) { 604d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen throw new IllegalArgumentException("invoking app search on a different package " + 605d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen "not associated with this search manager"); 606d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 607d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen if (query == null || TextUtils.getTrimmedLength(query) == 0) { 608d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen Log.w(TAG, "triggerSearch called with empty query, ignoring."); 609d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen return; 610d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 611e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani startSearch(query, false, launchActivity, appSearchData, false); 612e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.launchQuerySearch(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Terminate search UI. 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Typically the user will terminate the search UI by launching a 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search or by canceling. This function allows the underlying application 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or activity to cancel the search prematurely (for any reason). 621e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This function can be safely called at any time (even if no search is active.) 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #startSearch 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6268d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void stopSearch() { 627e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mSearchDialog != null) { 628e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.cancel(); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 633e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * Determine if the Search UI is currently displayed. 634e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is provided primarily for application test purposes. 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the search UI is currently displayed. 638e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6418d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public boolean isVisible() { 642e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani return mSearchDialog == null? false : mSearchDialog.isShowing(); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6448d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 646a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * See {@link SearchManager#setOnDismissListener} for configuring your activity to monitor 647a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * search UI state. 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDismissListener { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 651a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * This method will be called when the search UI is dismissed. To make use of it, you must 652a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * implement this method in your activity, and call 653a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * {@link SearchManager#setOnDismissListener} to register it. 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDismiss(); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 657e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * See {@link SearchManager#setOnCancelListener} for configuring your activity to monitor 660a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * search UI state. 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnCancelListener { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will be called when the search UI is canceled. To make use if it, you must 665a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * implement this method in your activity, and call 666a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * {@link SearchManager#setOnCancelListener} to register it. 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCancel(); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the callback that will be invoked whenever the search UI is dismissed. 673e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The {@link OnDismissListener} to use, or null. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnDismissListener(final OnDismissListener listener) { 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDismissListener = listener; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the callback that will be invoked whenever the search UI is canceled. 682e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The {@link OnCancelListener} to use, or null. 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6858d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void setOnCancelListener(OnCancelListener listener) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCancelListener = listener; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6888d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 6890e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert /** 6900e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert * @deprecated This method is an obsolete internal implementation detail. Do not use. 6910e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert */ 6924a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn @Deprecated 6938d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onCancel(DialogInterface dialog) { 694e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mCancelListener != null) { 695e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mCancelListener.onCancel(); 696e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani } 6978d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 6980e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert 6990e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert /** 7000e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert * @deprecated This method is an obsolete internal implementation detail. Do not use. 7010e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert */ 7024a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn @Deprecated 7038d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onDismiss(DialogInterface dialog) { 704e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mDismissListener != null) { 705e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mDismissListener.onDismiss(); 706e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7100408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * Gets information about a searchable activity. 7110408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * 7120408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * @param componentName The activity to get searchable information for. 7130408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * @return Searchable information, or <code>null</code> if the activity does not 7140408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * exist, or is not searchable. 7150408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert */ 7160408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert public SearchableInfo getSearchableInfo(ComponentName componentName) { 7170408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert try { 7186cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mService.getSearchableInfo(componentName); 7198d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } catch (RemoteException ex) { 7208d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchableInfo() failed: " + ex); 721875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 722875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 723875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 7248d1538237847baf381787b881141f8c0478bef5bBjorn Bringert 725875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 72697325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * Gets a cursor with search suggestions. 72797325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * 72897325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @param searchable Information about how to get the suggestions. 72997325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @param query The search text entered (so far). 73097325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @return a cursor with suggestions, or <code>null</null> the suggestion query failed. 73197325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * 73297325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @hide because SearchableInfo is not part of the API. 73397325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert */ 73497325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert public Cursor getSuggestions(SearchableInfo searchable, String query) { 7353fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert return getSuggestions(searchable, query, -1); 7363fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert } 7373fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert 7383fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert /** 7393fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * Gets a cursor with search suggestions. 7403fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * 7413fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @param searchable Information about how to get the suggestions. 7423fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @param query The search text entered (so far). 7433fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @param limit The query limit to pass to the suggestion provider. This is advisory, 7443fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * the returned cursor may contain more rows. Pass {@code -1} for no limit. 7453fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @return a cursor with suggestions, or <code>null</null> the suggestion query failed. 7463fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * 7473fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @hide because SearchableInfo is not part of the API. 7483fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert */ 7493fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert public Cursor getSuggestions(SearchableInfo searchable, String query, int limit) { 750875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (searchable == null) { 751875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 752875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 753875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 754875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String authority = searchable.getSuggestAuthority(); 755875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (authority == null) { 756875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 757875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 758875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 759875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen Uri.Builder uriBuilder = new Uri.Builder() 760875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .scheme(ContentResolver.SCHEME_CONTENT) 7613fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert .authority(authority) 7623fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() 7633fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() 764875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 765875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // if content path provided, insert it now 766875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen final String contentPath = searchable.getSuggestPath(); 767875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (contentPath != null) { 768875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendEncodedPath(contentPath); 769875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 770875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 7713fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert // append standard suggestion query path 772875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); 773875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 774875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // get the query selection, may be null 775875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String selection = searchable.getSuggestSelection(); 776875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // inject query, either as selection args or inline 777875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String[] selArgs = null; 778875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (selection != null) { // use selection if provided 779875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen selArgs = new String[] { query }; 780875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { // no selection, use REST pattern 781875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendPath(query); 782875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 783875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 7843fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert if (limit > 0) { 7853fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert uriBuilder.appendQueryParameter(SUGGEST_PARAMETER_LIMIT, String.valueOf(limit)); 7863fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert } 7873fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert 7883fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert Uri uri = uriBuilder.build(); 789875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 790875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // finally, make the query 7918d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mContext.getContentResolver().query(uri, null, selection, selArgs, null); 792875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 793e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani 7946d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert /** 7956d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * Returns a list of the searchable activities that can be included in global search. 796e678f46ec45076203f6260f8a26f56d838c6b6ffAmith Yamasani * 7976d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * @return a list containing searchable information for all searchable activities 79813107bb186d72bc80dc5609b20c71b7e77a9784dBjorn Bringert * that have the <code>android:includeInGlobalSearch</code> attribute set 79913107bb186d72bc80dc5609b20c71b7e77a9784dBjorn Bringert * in their searchable meta-data. 8006d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert */ 8018d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public List<SearchableInfo> getSearchablesInGlobalSearch() { 8026d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert try { 8038d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mService.getSearchablesInGlobalSearch(); 8046d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } catch (RemoteException e) { 8058d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchablesInGlobalSearch() failed: " + e); 8066d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert return null; 8076d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 8086d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 809f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 810e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani} 811