SearchManager.java revision 0b49ab5cae98d5f27b490b6de35d92e7a63a2e64
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.Manifest; 203c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.ActivityNotFoundException; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 22875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.ContentResolver; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 253c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.Intent; 263c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.pm.ActivityInfo; 273c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.pm.PackageManager; 283c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringertimport android.content.pm.ResolveInfo; 29875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.database.Cursor; 30875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.net.Uri; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 33875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.os.RemoteException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 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. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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} 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods and the the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}. This class does provide a basic 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overview of search services and how to integrate them with your activities. 498c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * If you do require direct access to the SearchManager, do not instantiate 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this class directly; instead, retrieve it through 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context.getSystemService(Context.SEARCH_SERVICE)}. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here: 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#DeveloperGuide">Developer Guide</a> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#HowSearchIsInvoked">How Search Is Invoked</a> 588c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <li><a href="#ImplementingSearchForYourApp">Implementing Search for Your App</a> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Suggestions">Search Suggestions</a> 60590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <li><a href="#ExposingSearchSuggestionsToQuickSearchBox">Exposing Search Suggestions to 61590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Quick Search Box</a></li> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActionKeys">Action Keys</a> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SearchabilityMetadata">Searchability Metadata</a> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#PassingSearchContext">Passing Search Context</a> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProtectingUserPrivacy">Protecting User Privacy</a> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="DeveloperGuide"></a> 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Developer Guide</h3> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to search for user, system, or network based data is considered to be 728c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * a core user-level feature of the Android platform. At any time, the user should be 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * able to use a familiar command, button, or keystroke to invoke search, and the user 748c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * should be able to search any data which is available to them. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 768c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p>To make search appear to the user as a seamless system-wide feature, the application 778c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * framework centrally controls it, offering APIs to individual applications to control how they 788c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * are searched. Applications can customize how search is invoked, how the search dialog looks, 798c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * and what type of search results are available, including suggestions that are available as the 808c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * user types. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 828c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p>Even applications which are not searchable will by default support the invocation of 838c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * search to trigger Quick Search Box, the system's 'global search'. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="HowSearchIsInvoked"></a> 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>How Search Is Invoked</h3> 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless impossible or inapplicable, all applications should support 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoking the search UI. This means that when the user invokes the search command, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search UI will be presented to them. The search command is currently defined as a menu 918c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * item called "Search" (with an alphabetic shortcut key of "S"), or on many devices, a dedicated 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search button key. 938c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p>If your application is not inherently searchable, the default implementation will cause 948c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * the search UI to be invoked in a "global search" mode known as Quick Search Box. As the user 958c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * types, search suggestions from across the device and the web will be surfaced, and if they 968c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * click the "Search" button, this will bring the browser to the front and will launch a web-based 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search. The user will be able to click the "Back" button and return to your application. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general this is implemented by your activity, or the {@link android.app.Activity Activity} 998c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * base class, which captures the search command and invokes the SearchManager to 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display and operate the search UI. You can also cause the search UI to be presented in response 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to user keystrokes in your activity (for example, to instantly start filter searching while 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * viewing a list and typing any key). 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The search UI is presented as a floating 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window and does not cause any change in the activity stack. If the user 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cancels search, the previous activity re-emerges. If the user launches a 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search, this will be done by sending a search {@link android.content.Intent Intent} (see below), 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the normal intent-handling sequence will take place (your activity will pause, 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * etc.) 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>What you need to do:</b> First, you should consider the way in which you want to 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handle invoking search. There are four broad (and partially overlapping) categories for 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you to choose from. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>You can capture the search command yourself, by including a <i>search</i> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * button or menu item - and invoking the search UI directly.</li> 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can provide a <i>type-to-search</i> feature, in which search is invoked automatically 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the user enters any characters.</li> 1168c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <li>Even if your application is not inherently searchable, you can allow global search, 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * via the search key (or even via a search menu item). 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can disable search entirely. This should only be used in very rare circumstances, 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as search is a system-wide feature and users will expect it to be available in all contexts.</li> 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to define a search menu.</b> The system provides the following resources which may 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be useful when adding a search item to your menu: 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>android.R.drawable.ic_search_category_default is an icon you can use in your menu.</li> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link #MENU_KEY SearchManager.MENU_KEY} is the recommended alphabetic shortcut.</li> 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to invoke search directly.</b> In order to invoke search directly, from a button 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or menu item, you can launch a generic search by calling 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested onSearchRequested} as shown: 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onSearchRequested();</pre> 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to implement type-to-search.</b> While setting up your activity, call 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setDefaultKeyMode setDefaultKeyMode}: 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); // search within your activity 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL); // search using platform global search</pre> 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1406cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * <p><b>How to start global search.</b> In addition to searching within 1418c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * your activity or application, you can also use the Search Manager to invoke a platform-global 1426cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * search, which uses Quick Search Box to search across the device and the web. 1436cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * Override {@link android.app.Activity#onSearchRequested} and call 1446cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * {@link android.app.Activity#startSearch} with {@code globalSearch} set to {@code true}. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1468c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p><b>How to disable search from your activity.</b> Search is a system-wide feature and users 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will expect it to be available in all contexts. If your UI design absolutely precludes 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launching search, override {@link android.app.Activity#onSearchRequested onSearchRequested} 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as shown: 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @Override 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public boolean onSearchRequested() { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return false; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1568c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p><b>Managing focus and knowing if search is active.</b> The search UI is not a separate 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity, and when the UI is invoked or dismissed, your activity will not typically be paused, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resumed, or otherwise notified by the methods defined in 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html#actlife">Application Fundamentals: 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Lifecycle</a>. The search UI is 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handled in the same way as other system UI elements which may appear from time to time, such as 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notifications, screen locks, or other system alerts: 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When the search UI appears, your activity will lose input focus. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When the search activity is dismissed, there are three possible outcomes: 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>If the user simply canceled the search UI, your activity will regain input focus and 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proceed as before. See {@link #setOnDismissListener} and {@link #setOnCancelListener} if you 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required direct notification of search dialog dismissals.</li> 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user launched a search, and this required switching to another activity to receive 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and process the search {@link android.content.Intent Intent}, your activity will receive the 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * normal sequence of activity pause or stop notifications.</li> 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user launched a search, and the current activity is the recipient of the search 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, you will receive notification via the 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onNewIntent onNewIntent()} method.</li></ul> 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This list is provided in order to clarify the ways in which your activities will interact with 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search UI. More details on searchable activities and search intents are provided in the 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sections below. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1788c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <a name="ImplementingSearchForYourApp"></a> 1798c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <h3>Implementing Search for Your App</h3> 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1818c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p>The following steps are necessary in order to implement search. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement search invocation as described above. (Strictly speaking, 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these are decoupled, but it would make little sense to be "searchable" but not 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "search-invoking".)</li> 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Your application should have an activity that takes a search string and 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * converts it to a list of results. This could be your primary display activity 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or it could be a dedicated search results activity. This is your <i>searchable</i> 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity and every query-search application must have one.</li> 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In the searchable activity, in onCreate(), you must receive and handle the 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}. The text to search (query string) for is provided by 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calling 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #QUERY getStringExtra(SearchManager.QUERY)}.</li> 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To identify and support your searchable activity, you'll need to 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide an XML file providing searchability configuration parameters, a reference to that 1978c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * in your searchable activity's 1988c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry, and an 1998c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * intent-filter declaring that you can receive ACTION_SEARCH intents. This is described in more 2008c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * detail in the <a href="#SearchabilityMetadata">Searchability Metadata</a> section.</li> 2018c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <li>Your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> also needs a 2028c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * metadata entry providing a global reference to the searchable activity. This is the "glue" 2038c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * directing the search UI, when invoked from any of your <i>other</i> activities, to use your 2048c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * application as the default search context. This is also described in more detail in the 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.</li> 2068c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <li>Finally, you may want to define your search results activity as single-top with the 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#launchMode singleTop} launchMode flag. This allows the system 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch searches from/to the same activity without creating a pile of them on the 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity stack. If you do this, be sure to also override 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onNewIntent onNewIntent} to handle the 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * updated intents (with new queries) as they arrive.</li> 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Code snippet showing handling of intents in your search activity: 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @Override 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final Intent queryIntent = getIntent(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final String queryAction = queryIntent.getAction(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if (Intent.ACTION_SEARCH.equals(queryAction)) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doSearchWithIntent(queryIntent); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private void doSearchWithIntent(final Intent queryIntent) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final String queryString = queryIntent.getStringExtra(SearchManager.QUERY); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doSearchWithQuery(queryString); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Suggestions"></a> 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Search Suggestions</h3> 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2358c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p>A powerful feature of the search system is the ability of any application to easily provide 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * live "suggestions" in order to prompt the user. Each application implements suggestions in a 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different, unique, and appropriate way. Suggestions be drawn from many sources, including but 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not limited to: 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Actual searchable results (e.g. names in the address book)</li> 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Recently entered queries</li> 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Recently viewed data or results</li> 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Contextually appropriate queries or results</li> 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Summaries of possible results</li> 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 247590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <p>Once an application is configured to provide search suggestions, those same suggestions can 248590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * easily be made available to the system-wide Quick Search Box, providing faster access to its 24905b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * content from one central prominent place. See 250590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <a href="#ExposingSearchSuggestionsToQuickSearchBox">Exposing Search Suggestions to Quick Search 251590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Box</a> for more details. 252590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The primary form of suggestions is known as <i>queried suggestions</i> and is based on query 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text that the user has already typed. This would generally be based on partial matches in 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the available data. In certain situations - for example, when no query text has been typed yet - 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application may also opt to provide <i>zero-query suggestions</i>. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These would typically be drawn from the same data source, but because no partial query text is 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available, they should be weighted based on other factors - for example, most recent queries 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or most recent results. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2618c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * <p><b>Overview of how suggestions are provided.</b> Suggestions are accessed via a 2628c91dd7ec8b3d277a42bccab075241468c9f980dMike LeBeau * {@link android.content.ContentProvider Content Provider}. When the search manager identifies a 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * particular activity as searchable, it will check for certain metadata which indicates that 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is also a source of suggestions. If suggestions are provided, the following steps are 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taken. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>Using formatting information found in the metadata, the user's query text (whatever 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been typed so far) will be formatted into a query and sent to the suggestions 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.ContentProvider Content Provider}.</li> 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The suggestions {@link android.content.ContentProvider Content Provider} will create a 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.database.Cursor Cursor} which can iterate over the possible suggestions.</li> 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The search manager will populate a list using display data found in each row of the cursor, 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and display these suggestions to the user.</li> 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user types another key, or changes the query in any way, the above steps are repeated 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the suggestions list is updated or repopulated.</li> 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user clicks or touches the "GO" button, the suggestions are ignored and the search is 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launched using the normal {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} type of 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}.</li> 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user uses the directional controls to navigate the focus into the suggestions list, 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the query text will be updated while the user navigates from suggestion to suggestion. The user 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can then click or touch the updated query and edit it further. If the user navigates back to 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the edit field, the original typed query is restored.</li> 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user clicks or touches a particular suggestion, then a combination of data from the 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cursor and 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values found in the metadata are used to synthesize an Intent and send it to the application. 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Depending on the design of the activity and the way it implements search, this might be a 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} (in order to launch a query), or it 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * might be a {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}, in order to proceed directly 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to display of specific data.</li> 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Simple Recent-Query-Based Suggestions.</b> The Android framework provides a simple Search 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suggestions provider, which simply records and replays recent queries. For many applications, 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will be sufficient. The basic steps you will need to 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * do, in order to use the built-in recent queries suggestions provider, are as follows: 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement and test query search, as described in the previous sections.</li> 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a Provider within your application by extending 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}.</li> 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a manifest entry describing your provider.</li> 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Update your searchable activity's XML configuration file with information about your 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider.</li> 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In your searchable activities, capture any user-generated queries and record them 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for future searches by calling {@link android.provider.SearchRecentSuggestions#saveRecentQuery}. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For complete implementation details, please refer to 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}. The rest of the information in this 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section should not be necessary, as it refers to custom suggestions providers. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Creating a Customized Suggestions Provider:</b> In order to create more sophisticated 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion providers, you'll need to take the following steps: 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement and test query search, as described in the previous sections.</li> 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Decide how you wish to <i>receive</i> suggestions. Just like queries that the user enters, 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions will be delivered to your searchable activity as 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} messages; Unlike simple queries, you have quite a bit of 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flexibility in forming those intents. A query search application will probably 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wish to continue receiving the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, which will launch a query search using query text as 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided by the suggestion. A filter search application will probably wish to 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive the {@link android.content.Intent#ACTION_VIEW ACTION_VIEW} 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, which will take the user directly to a selected entry. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Other interesting suggestions, including hybrids, are possible, and the suggestion provider 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can easily mix-and-match results to provide a richer set of suggestions for the user. Finally, 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you'll need to update your searchable activity (or other activities) to receive the intents 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as you've defined them.</li> 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement a Content Provider that provides suggestions. If you already have one, and it 3286b13bc043e715b5415b701e93141daa0d49fa364Dirk Dougherty * has access to your suggestions data, you can use that provider. If not, you'll have to create 3296b13bc043e715b5415b701e93141daa0d49fa364Dirk Dougherty * one. You'll also provide information about your Content Provider in your 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * package's <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>.</li> 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Update your searchable activity's XML configuration file. There are two categories of 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information used for suggestions: 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>The first is (required) data that the search manager will 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use to format the queries which are sent to the Content Provider.</li> 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The second is (optional) parameters to configure structure 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if intents generated by suggestions.</li></li> 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Configuring your Content Provider to Receive Suggestion Queries.</b> The basic job of 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search suggestions {@link android.content.ContentProvider Content Provider} is to provide 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "live" (while-you-type) conversion of the user's query text into a set of zero or more 343479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * suggestions. Each application is free to define the conversion, and as described above there are 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * many possible solutions. This section simply defines how to communicate with the suggestion 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Search Manager must first determine if your package provides suggestions. This is done 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by examination of your searchable meta-data XML file. The android:searchSuggestAuthority 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute, if provided, is the signal to obtain & display suggestions. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Every query includes a Uri, and the Search Manager will format the Uri as shown: 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><pre class="prettyprint"> 353479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * content:// your.suggest.authority / your.suggest.path / SearchManager.SUGGEST_URI_PATH_QUERY 354479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * </pre> 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Your Content Provider can receive the query text in one of two ways. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query provided as a selection argument.</b> If you define the attribute value 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection and include a string, this string will be passed as the 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>selection</i> parameter to your Content Provider's query function. You must define a single 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection argument, using the '?' character. The user's query text will be passed to you 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the first element of the selection arguments array.</li> 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query provided with Data Uri.</b> If you <i>do not</i> define the attribute value 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection, then the Search Manager will append another "/" followed by 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's query to the query Uri. The query will be encoding using Uri encoding rules - don't 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forget to decode it. (See {@link android.net.Uri#getPathSegments} and 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.net.Uri#getLastPathSegment} for helpful utilities you can use here.)</li> 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 369b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * 370b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <p><b>Providing access to Content Providers that require permissions.</b> If your content 371b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * provider declares an android:readPermission in your application's manifest, you must provide 372b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * access to the search infrastructure to the search suggestion path by including a path-permission 373479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * that grants android:readPermission access to "android.permission.GLOBAL_SEARCH". Granting access 374b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * explicitly to the search infrastructure ensures it will be able to access the search suggestions 375b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * without needing to know ahead of time any other details of the permissions protecting your 376b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * provider. Content providers that require no permissions are already available to the search 377b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * infrastructure. Here is an example of a provider that protects access to it with permissions, 378b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * and provides read access to the search infrastructure to the path that it expects to receive the 379b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * suggestion query on: 380b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <pre class="prettyprint"> 381b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <provider android:name="MyProvider" android:authorities="myprovider" 382b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * android:readPermission="android.permission.READ_MY_DATA" 383b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * android:writePermission="android.permission.WRITE_MY_DATA"> 384b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <path-permission android:path="/search_suggest_query" 385b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * android:readPermission="android.permission.GLOBAL_SEARCH" /> 386b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * </provider> 387b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * </pre> 388b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Handling empty queries.</b> Your application should handle the "empty query" 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (no user text entered) case properly, and generate useful suggestions in this case. There are a 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * number of ways to do this; Two are outlined here: 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>For a simple filter search of local data, you could simply present the entire dataset, 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unfiltered. (example: People)</li> 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>For a query search, you could simply present the most recent queries. This allows the user 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to quickly repeat a recent search.</li></ul> 396b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>The Format of Individual Suggestions.</b> Your suggestions are communicated back to the 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Search Manager by way of a {@link android.database.Cursor Cursor}. The Search Manager will 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * usually pass a null Projection, which means that your provider can simply return all appropriate 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * columns for each suggestion. The columns currently defined are: 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Column Name</th> <th>Description</th> <th>Required?</th></tr> 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_FORMAT}</th> 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td><i>Unused - can be null.</i></td> 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_TEXT_1}</th> 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This is the line of text that will be presented to the user as the suggestion.</td> 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_TEXT_2}</th> 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If your cursor includes this column, then all suggestions will be provided in a 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * two-line format. The data in this column will be displayed as a second, smaller 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * line of text below the primary suggestion, or it can be null or empty to indicate no 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text in this row's suggestion.</td> 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_ICON_1}</th> 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If your cursor includes this column, then all suggestions will be provided in an 429875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * icons+text format. This value should be a reference to the icon to 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * draw on the left side, or it can be null or zero to indicate no icon in this row. 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </td> 432875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <td align="center">No.</td> 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_ICON_2}</th> 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If your cursor includes this column, then all suggestions will be provided in an 437875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * icons+text format. This value should be a reference to the icon to 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * draw on the right side, or it can be null or zero to indicate no icon in this row. 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </td> 440875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <td align="center">No.</td> 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_INTENT_ACTION}</th> 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, this is the 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action that will be used when forming the suggestion's intent. If the element is 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not provided, the action will be taken from the android:searchSuggestIntentAction 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field in your XML metadata. <i>At least one of these must be present for the 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion to generate an intent.</i> Note: If your action is the same for all 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions, it is more efficient to specify it using XML metadata and omit it from 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the cursor.</td> 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_INTENT_DATA}</th> 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, this is the 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data that will be used when forming the suggestion's intent. If the element is not 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided, the data will be taken from the android:searchSuggestIntentData field in 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your XML metadata. If neither source is provided, the Intent's data field will be 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. Note: If your data is the same for all suggestions, or can be described 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using a constant part and a specific ID, it is more efficient to specify it using 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XML metadata and omit it from the cursor.</td> 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_INTENT_DATA_ID}</th> 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, then "/" and 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this value will be appended to the data field in the Intent. This should only be 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used if the data field has already been set to an appropriate base string.</td> 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 472b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <tr><th>{@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA}</th> 473b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <td>If this column exists <i>and</i> this element exists at a given row, this is the 474b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * data that will be used when forming the suggestion's intent. If not provided, 475b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * the Intent's extra data field will be null. This column allows suggestions to 476b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * provide additional arbitrary data which will be included as an extra under the 477b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * key {@link #EXTRA_DATA_KEY}.</td> 478b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * <td align="center">No.</td> 479b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * </tr> 480b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_QUERY}</th> 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, this is the 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data that will be used when forming the suggestion's query.</td> 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Required if suggestion's action is 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</td> 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 487b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * 488590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>{@link #SUGGEST_COLUMN_SHORTCUT_ID}</th> 489590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td>This column is used to indicate whether a search suggestion should be stored as a 490590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * shortcut, and whether it should be validated. Shortcuts are usually formed when the 491590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * user clicks a suggestion from Quick Search Box. If missing, the result will be 492590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * stored as a shortcut and never refreshed. If set to 493590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. 494590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Otherwise, the shortcut id will be used to check back for for an up to date 495590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * suggestion using {@link #SUGGEST_URI_PATH_SHORTCUT}. Read more about shortcut 496590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * refreshing in the section about 497590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <a href="#ExposingSearchSuggestionsToQuickSearchBox">exposing search suggestions to 498590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Quick Search Box</a>.</td> 499590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td align="center">No. Only applicable to sources included in Quick Search Box.</td> 500590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tr> 501590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 502590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>{@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING}</th> 503590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td>This column is used to specify that a spinner should be shown in lieu of an icon2 50405b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * while the shortcut of this suggestion is being refreshed in Quick Search Box.</td> 505590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td align="center">No. Only applicable to sources included in Quick Search Box.</td> 506590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tr> 507590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th><i>Other Columns</i></th> 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>Finally, if you have defined any <a href="#ActionKeys">Action Keys</a> and you wish 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for them to have suggestion-specific definitions, you'll need to define one 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * additional column per action key. The action key will only trigger if the 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently-selection suggestion has a non-empty string in the corresponding column. 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the section on <a href="#ActionKeys">Action Keys</a> for additional details and 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementation steps.</td> 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clearly there are quite a few permutations of your suggestion data, but in the next section 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we'll look at a few simple combinations that you'll select from. 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>The Format Of Intents Sent By Search Suggestions.</b> Although there are many ways to 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configure these intents, this document will provide specific information on just a few of them. 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li><b>Launch a query.</b> In this model, each suggestion represents a query that your 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity can perform, and the {@link android.content.Intent Intent} will be formatted 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exactly like those sent when the user enters query text and clicks the "GO" button: 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Action:</b> {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} provided 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using your XML metadata (android:searchSuggestIntentAction).</li> 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Data:</b> empty (not used).</li> 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query:</b> query text supplied by the cursor.</li> 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Go directly to a result, using a complete Data Uri.</b> In this model, the user will be 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taken directly to a specific result. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Action:</b> {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}</li> 540479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * <li><b>Data:</b> a complete Uri, supplied by the cursor, that identifies the desired data. 541479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * </li> 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query:</b> query text supplied with the suggestion (probably ignored)</li> 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Go directly to a result, using a synthesized Data Uri.</b> This has the same result 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the previous suggestion, but provides the Data Uri in a different way. 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Action:</b> {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}</li> 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Data:</b> The search manager will assemble a Data Uri using the following elements: 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Uri fragment provided in your XML metadata (android:searchSuggestIntentData), followed by 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single "/", followed by the value found in the {@link #SUGGEST_COLUMN_INTENT_DATA_ID} 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry in your cursor.</li> 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query:</b> query text supplied with the suggestion (probably ignored)</li> 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This list is not meant to be exhaustive. Applications should feel free to define other types 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of suggestions. For example, you could reduce long lists of results to summaries, and use one 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the above intents (or one of your own) with specially formatted Data Uri's to display more 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detailed results. Or you could display textual shortcuts as suggestions, but launch a display 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in a more data-appropriate format such as media artwork. 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Suggestion Rewriting.</b> If the user navigates through the suggestions list, the UI 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may temporarily rewrite the user's query with a query that matches the currently selected 565479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * suggestion. This enables the user to see what query is being suggested, and also allows the user 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to click or touch in the entry EditText element and make further edits to the query before 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatching it. In order to perform this correctly, the Search UI needs to know exactly what 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text to rewrite the query with. 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For each suggestion, the following logic is used to select a new query string: 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>If the suggestion provides an explicit value in the {@link #SUGGEST_COLUMN_QUERY} 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, this value will be used.</li> 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the metadata includes the queryRewriteFromData flag, and the suggestion provides an 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit value for the intent Data field, this Uri will be used. Note that this should only be 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used with Uri's that are intended to be user-visible, such as HTTP. Internal Uri schemes should 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be used in this way.</li> 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the metadata includes the queryRewriteFromText flag, the text in 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #SUGGEST_COLUMN_TEXT_1} will be used. This should be used for suggestions in which no 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * query text is provided and the SUGGEST_COLUMN_INTENT_DATA values are not suitable for user 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inspection and editing.</li></ul> 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 582590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <a name="ExposingSearchSuggestionsToQuickSearchBox"></a> 583590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <h3>Exposing Search Suggestions to Quick Search Box</h3> 584590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 58505b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * <p>Once your application is set up to provide search suggestions, making them available to the 586590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * globally accessable Quick Search Box is as easy as setting android:includeInGlobalSearch to 587590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * "true" in your searchable metadata file. Beyond that, here are some more details of how 588590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * suggestions interact with Quick Search Box, and optional ways that you may customize suggestions 589590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * for your application. 59005b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * 59105b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * <p><b>Important Note:</b> By default, your application will not be enabled as a suggestion 59205b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * provider (or "searchable item") in Quick Search Box. Once your app is installed, the user must 59305b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * enable it as a "searchable item" in the Search settings in order to receive your app's 59405b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * suggestions in Quick Search Box. You should consider how to message this to users of your app - 59505b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * perhaps with a note to the user the first time they launch the app about how to enable search 59605b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * suggestions. This gives your app a chance to be queried for suggestions as the user types into 59705b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * Quick Search Box, though exactly how or if your suggestions will be surfaced is decided by Quick 59805b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * Search Box. 599590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 600590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <p><b>Source Ranking:</b> Once your application's search results are made available to Quick 60105b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * Search Box, how they surface to the user for a particular query will be determined as appropriate 60205b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * by Quick Search Box ranking. This may depend on how many other apps have results for that query, 60305b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * and how often the user has clicked on your results compared to the other apps - but there is no 60405b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * guarantee about how ranking will occur, or whether your app's suggestions will show at all for 60505b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * a given query. In general, you can expect that providing quality results will increase the 60605b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * likelihood that your app's suggestions are provided in a prominent position, and apps that 60705b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * provide lower quality suggestions will be more likely to be ranked lower and/or not displayed. 608590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 609590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <p><b>Search Settings:</b> Each app that is available to Quick Search Box has an entry in the 610590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * system settings where the user can enable or disable the inclusion of its results. Below the 611590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * name of the application, each application may provide a brief description of what kind of 612590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * information will be made available via a search settings description string pointed to by the 61305b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * android:searchSettingsDescription attribute in the searchable metadata. Note that the 61405b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * user will need to visit this settings menu to enable search suggestions for your app before your 61505b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * app will have a chance to provide search suggestions to Quick Search Box - see the section 61605b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * called "Important Note" above. 617590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 61805b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * <p><b>Shortcuts:</b> Suggestions that are clicked on by the user may be automatically made into 61905b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * shortcuts, which are suggestions that have been copied from your provider in order to be quickly 62005b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * displayed without the need to re-query the original sources. Shortcutted suggestions may be 62105b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * displayed for the query that yielded the suggestion and for any prefixes of that query. You can 62205b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * request how to have your app's suggestions made into shortcuts, and whether they should be 62305b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * refreshed, using the {@link #SUGGEST_COLUMN_SHORTCUT_ID} column: 624590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <ul><li>Suggestions that do not include a shortcut id column will be made into shortcuts and 625590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * never refreshed. This makes sense for suggestions that refer to data that will never be changed 626590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * or removed.</li> 627590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <li>Suggestions that include a shortcut id will be re-queried for a fresh version of the 628590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * suggestion each time the shortcut is displayed. The shortcut will be quickly displayed with 629590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * whatever data was most recently available until the refresh query returns, after which the 630590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * suggestion will be dynamically refreshed with the up to date information. The shortcut refresh 631590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * query will be sent to your suggestion provider with a uri of {@link #SUGGEST_URI_PATH_SHORTCUT}. 632590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * The result should contain one suggestion using the same columns as the suggestion query, or be 633590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * empty, indicating that the shortcut is no longer valid. Shortcut ids make sense when referring 634590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * to data that may change over time, such as a contact's presence status. If a suggestion refers 635590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * to data that could take longer to refresh, such as a network based refresh of a stock quote, you 636590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * may include {@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING} to show a progress spinner for the 637590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * right hand icon until the refresh is complete.</li> 638590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <li>Finally, to prevent a suggestion from being copied into a shortcut, you may provide a 639590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * shortcut id with a value of {@link #SUGGEST_NEVER_MAKE_SHORTCUT}.</li></ul> 640590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 64105b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * Note that Quick Search Box will ultimately decide whether to shortcut your app's suggestions, 64205b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * considering these values as a strong request from your application. 64305b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActionKeys"></a> 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Action Keys</h3> 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Searchable activities may also wish to provide shortcuts based on the various action keys 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available on the device. The most basic example of this is the contacts app, which enables the 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * green "dial" key for quick access during searching. Not all action keys are available on 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * every device, and not all are allowed to be overriden in this way. (For example, the "Home" 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key must always return to the home screen, with no exceptions.) 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In order to define action keys for your searchable application, you must do two things. 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You'll add one or more <i>actionkey</i> elements to your searchable metadata configuration 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. Each element defines one of the keycodes you are interested in, 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defines the conditions under which they are sent, and provides details 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on how to communicate the action key event back to your searchable activity.</li> 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In your broadcast receiver, if you wish, you can check for action keys by checking the 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extras field of the {@link android.content.Intent Intent}.</li> 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Updating metadata.</b> For each keycode of interest, you must add an <actionkey> 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element. Within this element you must define two or three attributes. The first attribute, 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <android:keycode>, is required; It is the key code of the action key event, as defined in 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.KeyEvent}. The remaining two attributes define the value of the actionkey's 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>message</i>, which will be passed to your searchable activity in the 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} (see below for more details). Although each of these 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes is optional, you must define one or both for the action key to have any effect. 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <android:queryActionMsg> provides the message that will be sent if the action key is 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pressed while the user is simply entering query text. <android:suggestActionMsgColumn> 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is used when action keys are tied to specific suggestions. This attribute provides the name 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of a <i>column</i> in your suggestion cursor; The individual suggestion, in that column, 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provides the message. (If the cell is empty or null, that suggestion will not work with that 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action key.) 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="#SearchabilityMetadata">Searchability Metadata</a> section for more details 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and examples. 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Receiving Action Keys</b> Intents launched by action keys will be specially marked 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using a combination of values. This enables your searchable application to examine the intent, 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if necessary, and perform special processing. For example, clicking a suggested contact might 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display them; Selecting a suggested contact and clicking the dial button might 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * immediately call them. 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When a search {@link android.content.Intent Intent} is launched by an action key, two values 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be added to the extras field. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To examine the key code, use {@link android.content.Intent#getIntExtra 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getIntExtra(SearchManager.ACTION_KEY)}.</li> 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To examine the message string, use {@link android.content.Intent#getStringExtra 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}</li> 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SearchabilityMetadata"></a> 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Searchability Metadata</h3> 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Every activity that is searchable must provide a small amount of additional information 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to properly configure the search system. This controls the way that your search 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is presented to the user, and controls for the various modalities described previously. 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If your application is not searchable, 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then you do not need to provide any search metadata, and you can skip the rest of this section. 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When this search metadata cannot be found, the search manager will assume that the activity 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not implement search. (Note: to implement web-based search, you will need to add 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the android.app.default_searchable metadata to your manifest, as shown below.) 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Values you supply in metadata apply only to each local searchable activity. Each 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity can define a completely unique search experience relevant to its own 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capabilities and user experience requirements, and a single application can even define multiple 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activities. 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Metadata for searchable activity.</b> As with your search implementations described 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above, you must first identify which of your activities is searchable. In the 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry for this activity, you must 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide two elements: 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>An intent-filter specifying that you can receive and process the 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} {@link android.content.Intent Intent}. 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>A reference to a small XML file (typically called "searchable.xml") which contains the 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remaining configuration information for how your application implements search.</li></ul> 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is a snippet showing the necessary elements in the 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry for your searchable activity. 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Search Activity - searchable --> 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <activity android:name="MySearchActivity" 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:label="Search" 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:launchMode="singleTop"> 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <intent-filter> 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <action android:name="android.intent.action.SEARCH" /> 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <category android:name="android.intent.category.DEFAULT" /> 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </intent-filter> 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <meta-data android:name="android.app.searchable" 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:resource="@xml/searchable" /> 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </activity></pre> 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Next, you must provide the rest of the searchability configuration in 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the small XML file, stored in the ../xml/ folder in your build. The XML file is a 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple enumeration of the search configuration parameters for searching within this activity, 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, or package. Here is a sample XML file (named searchable.xml, for use with 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the above manifest) for a query-search activity. 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <searchable xmlns:android="http://schemas.android.com/apk/res/android" 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:label="@string/search_label" 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:hint="@string/search_hint" > 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </searchable></pre> 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note that all user-visible strings <i>must</i> be provided in the form of "@string" 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * references. Hard-coded strings, which cannot be localized, will not work properly in search 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metadata. 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Attributes you can set in search metadata: 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:label</th> 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This is the name for your application that will be presented to the user in a 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list of search targets, or in the search box as a label.</td> 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:icon</th> 769dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * <td><strong>This is deprecated.</strong><br/>The default 770dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * application icon is now always used, so this attribute is 771dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * obsolete.</td> 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:hint</th> 776dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * <td>This is the text to display in the search text field when no text 777dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * has been entered by the user.</td> 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchMode</th> 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided and non-zero, sets additional modes for control of the search 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * presentation. The following mode bits are defined: 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" align="center" frame="hsides" rules="rows"> 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>showSearchLabelAsBadge</th> 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag enables the display of the search target (label) 788dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * above the search box. As an alternative, you may 789dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * want to instead use "hint" text in the search box. 790dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * See the "android:hint" attribute above.</td> 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>showSearchIconAsBadge</th> 793dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * <td><strong>This is deprecated.</strong><br/>The default 794dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * application icon is now always used, so this 795dbc7e27ef10349f11ac940d59ff4f812319fce51Scott Main * option is obsolete.</td> 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>queryRewriteFromData</th> 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag causes the suggestion column SUGGEST_COLUMN_INTENT_DATA 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be considered as the text for suggestion query rewriting. This should 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only be used when the values in SUGGEST_COLUMN_INTENT_DATA are suitable 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for user inspection and editing - typically, HTTP/HTTPS Uri's.</td> 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>queryRewriteFromText</th> 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag causes the suggestion column SUGGEST_COLUMN_TEXT_1 to 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be considered as the text for suggestion query rewriting. This should 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be used for suggestions in which no query text is provided and the 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SUGGEST_COLUMN_INTENT_DATA values are not suitable for user inspection 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and editing.</td> 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 81105b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * </table> 81205b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * Note that the icon of your app will likely be shown alongside any badge you specify, 81305b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * to differentiate search in your app from Quick Search Box. The display of this icon 81405b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * is not under the app's control. 81505b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * </td> 81605b775e0b7180e33df0303b9e132931f4895357cMike LeBeau * 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:inputType</th> 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, supplies a hint about the type of search text the user will be 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entering. For most searches, in which free form text is expected, this attribute 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need not be provided. Suitable values for this attribute are described in the 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="../R.attr.html#inputType">inputType</a> attribute.</td> 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:imeOptions</th> 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, supplies additional options for the input method. 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For most searches, in which free form text is expected, this attribute 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need not be provided, and will default to "actionSearch". 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suitable values for this attribute are described in the 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="../R.attr.html#imeOptions">imeOptions</a> attribute.</td> 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Styleable Resources in your Metadata.</b> It's possible to provide alternate strings 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your searchable application, in order to provide localization and/or to better visual 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * presentation on different device configurations. Each searchable activity has a single XML 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metadata file, but any resource references can be replaced at runtime based on device 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration, language setting, and other system inputs. 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A concrete example is the "hint" text you supply using the android:searchHint attribute. 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In portrait mode you'll have less screen space and may need to provide a shorter string, but 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in landscape mode you can provide a longer, more descriptive hint. To do this, you'll need to 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define two or more strings.xml files, in the following directories: 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>.../res/values-land/strings.xml</li> 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>.../res/values-port/strings.xml</li> 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>.../res/values/strings.xml</li></ul> 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For more complete documentation on this capability, see 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">Resources and 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internationalization: Alternate Resources</a>. 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Metadata for non-searchable activities.</b> Activities which are part of a searchable 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, but don't implement search itself, require a bit of "glue" in order to cause 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * them to invoke search using your searchable activity as their primary context. If this is not 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided, then searches from these activities will use the system default search context. 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The simplest way to specify this is to add a <i>search reference</i> element to the 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application entry in the <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> file. 8646cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * The value of this reference should be the name of your searchable activity. 8656cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * It is typically prefixed by '.' to indicate that it's in the same package. 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is a snippet showing the necessary addition to the manifest entry for your 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * non-searchable activities. 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <application> 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <meta-data android:name="android.app.default_searchable" 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:value=".MySearchActivity" /> 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- followed by activities, providers, etc... --> 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </application></pre> 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You can also specify android.app.default_searchable on a per-activity basis, by including 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the meta-data element (as shown above) in one or more activity sections. If found, these will 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override the reference in the application section. The only reason to configure your application 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this way would be if you wish to partition it into separate sections with different search 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * behaviors; Otherwise this configuration is not recommended. 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8834c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p><b>Additional metadata for search suggestions.</b> If you have defined a content provider 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to generate search suggestions, you'll need to publish it to the system, and you'll need to 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide a bit of additional XML metadata in order to configure communications with it. 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>First, in your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>, you'll add the 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * following lines. 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Content provider for search suggestions --> 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <provider android:name="YourSuggestionProviderClass" 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:authorities="your.suggestion.authority" /></pre> 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Next, you'll add a few lines to your XML metadata file, as shown: 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Required attribute for any suggestions provider --> 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestAuthority="your.suggestion.authority" 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Optional attribute for configuring queries --> 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection="field =?" 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Optional attributes for configuring intent construction --> 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestIntentAction="intent action string" 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestIntentData="intent data Uri" /></pre> 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Elements of search metadata that support suggestions: 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestAuthority</th> 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This value must match the authority string provided in the <i>provider</i> section 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>.</td> 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestPath</th> 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, this will be inserted in the suggestions query Uri, after the authority 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you have provide but before the standard suggestions path. This is only required if 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you have a single content provider issuing different types of suggestions (e.g. for 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different data types) and you need a way to disambiguate the suggestions queries 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when they are received.</td> 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestSelection</th> 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, this value will be passed into your query function as the 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>selection</i> parameter. Typically this will be a WHERE clause for your database, 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will contain a single question mark, which represents the actual query string 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that has been typed by the user. However, you can also use any non-null value 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to simply trigger the delivery of the query text (via selection arguments), and then 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use the query text in any way appropriate for your provider (ignoring the actual 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text of the selection parameter.)</td> 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestIntentAction</th> 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, and not overridden by the selected suggestion, this value will be 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * placed in the action field of the {@link android.content.Intent Intent} when the 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user clicks a suggestion.</td> 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestIntentData</th> 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, and not overridden by the selected suggestion, this value will be 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * placed in the data field of the {@link android.content.Intent Intent} when the user 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clicks a suggestion.</td> 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 955b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * 956590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <p>Elements of search metadata that configure search suggestions being available to Quick Search 957590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Box: 958590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 959590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 960590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <thead> 961590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 962590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </thead> 963590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 964590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>android:includeInGlobalSearch</th> 965590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td>If true, indicates the search suggestions provided by your application should be 966590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * included in the globally accessible Quick Search Box. The attributes below are only 967590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * applicable if this is set to true.</td> 968590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td align="center">Yes</td> 969590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tr> 970590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 971590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>android:searchSettingsDescription</th> 972590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td>If provided, provides a brief description of the search suggestions that are provided 973590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * by your application to Quick Search Box, and will be displayed in the search settings 974590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * entry for your application.</td> 975590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td align="center">No</td> 976590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tr> 977590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 978590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>android:queryAfterZeroResults</th> 979590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td>Indicates whether a source should be invoked for supersets of queries it has 980590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * returned zero results for in the past. For example, if a source returned zero 981590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * results for "bo", it would be ignored for "bob". If set to false, this source 982590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * will only be ignored for a single session; the next time the search dialog is 983590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * invoked, all sources will be queried. The default value is false.</td> 984590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td align="center">No</td> 985590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tr> 986590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 987590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <tr><th>android:searchSuggestThreshold</th> 988590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td>Indicates the minimum number of characters needed to trigger a source from Quick 989590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Search Box. Only guarantees that a source will not be queried for anything shorter 990590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * than the threshold. The default value is 0.</td> 991590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * <td align="center">No</td> 992590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tr> 993590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 994590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </tbody> 995590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * </table> 996590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * 9974c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p><b>Additional metadata for search action keys.</b> For each action key that you would like to 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define, you'll need to add an additional element defining that key, and using the attributes 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * discussed in <a href="#ActionKeys">Action Keys</a>. A simple example is shown here: 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"><actionkey 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:keycode="KEYCODE_CALL" 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:queryActionMsg="call" 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:suggestActionMsg="call" 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:suggestActionMsgColumn="call_column" /></pre> 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Elements of search metadata that support search action keys. Note that although each of the 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action message elements are marked as <i>optional</i>, at least one must be present for the 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action key to have any effect. 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:keycode</th> 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This attribute denotes the action key you wish to respond to. Note that not 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all action keys are actually supported using this mechanism, as many of them are 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used for typing, navigation, or system functions. This will be added to the 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your searchable activity. To examine the key code, use 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra getIntExtra(SearchManager.ACTION_KEY)}. 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note, in addition to the keycode, you must also provide one or more of the action 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifier attributes.</td> 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:queryActionMsg</th> 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If you wish to handle an action key during normal search query entry, you 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must define an action string here. This will be added to the 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to your 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity. To examine the string, use 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}.</td> 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:suggestActionMsg</th> 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If you wish to handle an action key while a suggestion is being displayed <i>and 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected</i>, there are two ways to handle this. If <i>all</i> of your suggestions 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can handle the action key, you can simply define the action message using this 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute. This will be added to the 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your searchable activity. To examine the string, use 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}.</td> 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:suggestActionMsgColumn</th> 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If you wish to handle an action key while a suggestion is being displayed <i>and 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected</i>, but you do not wish to enable this action key for every suggestion, 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then you can use this attribute to control it on a suggestion-by-suggestion basis. 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * First, you must define a column (and name it here) where your suggestions will 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * include the action string. Then, in your content provider, you must provide this 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, and when desired, provide data in this column. 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The search manager will look at your suggestion cursor, using the string 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided here in order to select a column, and will use that to select a string from 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the cursor. That string will be added to the 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your searchable activity. To examine the string, use 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}. <i>If the data does not exist for the 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection suggestion, the action key will be ignored.</i></td> 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10734c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p><b>Additional metadata for enabling voice search.</b> To enable voice search for your 10744c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * activity, you can add fields to the metadata that enable and configure voice search. When 10754c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * enabled (and available on the device), a voice search button will be displayed in the 10764c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * Search UI. Clicking this button will launch a voice search activity. When the user has 10774c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * finished speaking, the voice search phrase will be transcribed into text and presented to the 10784c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * searchable activity as if it were a typed query. 10794c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10804c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p>Elements of search metadata that support voice search: 10814c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 10824c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10834c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <thead> 10844c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 10854c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </thead> 10864c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10874c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceSearchMode</th> 10884c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided and non-zero, enables voice search. (Voice search may not be 10894c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * provided by the device, in which case these flags will have no effect.) The 10904c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * following mode bits are defined: 10914c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <table border="2" align="center" frame="hsides" rules="rows"> 10924c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tbody> 10934c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>showVoiceSearchButton</th> 10944c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If set, display a voice search button. This only takes effect if voice 10954c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * search is available on the device. If set, then launchWebSearch or 10964c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * launchRecognizer must also be set.</td> 10974c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10984c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>launchWebSearch</th> 10994c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If set, the voice search button will take the user directly to a 11004c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * built-in voice web search activity. Most applications will not use this 11014c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * flag, as it will take the user away from the activity in which search 11024c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * was invoked.</td> 11034c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11044c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>launchRecognizer</th> 11054c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If set, the voice search button will take the user directly to a 11064c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * built-in voice recording activity. This activity will prompt the user 11074c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * to speak, transcribe the spoken text, and forward the resulting query 11084c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * text to the searchable activity, just as if the user had typed it into 11094c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * the search UI and clicked the search button.</td> 11104c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11114c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tbody> 11124c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </table></td> 11134c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 11144c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11154c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 11164c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceLanguageModel</th> 11174c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, this specifies the language model that should be used by the voice 11184c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * recognition system. 11194c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * See {@link android.speech.RecognizerIntent#EXTRA_LANGUAGE_MODEL} 11204c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * for more information. If not provided, the default value 11214c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * {@link android.speech.RecognizerIntent#LANGUAGE_MODEL_FREE_FORM} will be used.</td> 11224c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 11234c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11244c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 11254c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voicePromptText</th> 11264c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, this specifies a prompt that will be displayed during voice input. 11274c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * (If not provided, a default prompt will be displayed.)</td> 11284c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 11294c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11304c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 11314c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceLanguage</th> 11324c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, this specifies the spoken language to be expected. This is only 11334c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * needed if it is different from the current value of 11344c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * {@link java.util.Locale#getDefault()}. 11354c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </td> 11364c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 11374c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11384c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 11394c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceMaxResults</th> 11404c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, enforces the maximum number of results to return, including the "best" 11414c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * result which will always be provided as the SEARCH intent's primary query. Must be 11424c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * one or greater. Use {@link android.speech.RecognizerIntent#EXTRA_RESULTS} 11434c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * to get the results from the intent. If not provided, the recognizer will choose 11444c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * how many results to return.</td> 11454c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 11464c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 11474c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 11484c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tbody> 11494c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </table> 11504c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="PassingSearchContext"></a> 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Passing Search Context</h3> 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In order to improve search experience, an application may wish to specify 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * additional data along with the search, such as local history or context. For 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, a maps search would be improved by including the current location. 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In order to simplify the structure of your activities, this can be done using 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search manager. 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Any data can be provided at the time the search is launched, as long as it 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be stored in a {@link android.os.Bundle Bundle} object. 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To pass application data into the Search Manager, you'll need to override 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested onSearchRequested} as follows: 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @Override 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public boolean onSearchRequested() { 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bundle appData = new Bundle(); 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.put...(); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.put...(); 11726b13bc043e715b5415b701e93141daa0d49fa364Dirk Dougherty * startSearch(null, false, appData, false); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return true; 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To receive application data from the Search Manager, you'll extract it from 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} as follows: 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final Bundle appData = queryIntent.getBundleExtra(SearchManager.APP_DATA); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if (appData != null) { 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.get...(); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.get...(); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProtectingUserPrivacy"></a> 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Protecting User Privacy</h3> 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Many users consider their activities on the phone, including searches, to be private 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information. Applications that implement search should take steps to protect users' privacy 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wherever possible. This section covers two areas of concern, but you should consider your search 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * design carefully and take any additional steps necessary. 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Don't send personal information to servers, and if you do, don't log it.</b> 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Personal information" is information that can personally identify your users, such as name, 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * email address or billing information, or other data which can be reasonably linked to such 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information. If your application implements search with the assistance of a server, try to 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * avoid sending personal information with your searches. For example, if you are searching for 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * businesses near a zip code, you don't need to send the user ID as well - just send the zip code 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the server. If you do need to send personal information, you should take steps to avoid 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * logging it. If you must log it, you should protect that data very carefully, and erase it as 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * soon as possible. 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Provide the user with a way to clear their search history.</b> The Search Manager helps 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your application provide context-specific suggestions. Sometimes these suggestions are based 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on previous searches, or other actions taken by the user in an earlier session. A user may not 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wish for previous searches to be revealed to other users, for instance if they share their phone 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a friend. If your application provides suggestions that can reveal previous activities, 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you should implement a "Clear History" menu, preference, or button. If you are using 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.provider.SearchRecentSuggestions}, you can simply call its 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.provider.SearchRecentSuggestions#clearHistory() clearHistory()} method from 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your "Clear History" UI. If you are implementing your own form of recent suggestions, you'll 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to provide a similar a "clear history" API in your provider, and call it from your 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Clear History" UI. 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SearchManager 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12208d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 12218d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static final boolean DBG = false; 12228d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static final String TAG = "SearchManager"; 12238d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a shortcut definition for the default menu key to use for invoking search. 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Menu.Item.setAlphabeticShortcut() for more information. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static char MENU_KEY = 's'; 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a shortcut definition for the default menu key to use for invoking search. 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Menu.Item.setAlphabeticShortcut() for more information. 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int MENU_KEYCODE = KeyEvent.KEYCODE_S; 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getStringExtra()} 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the query string from Intent.ACTION_SEARCH. 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String QUERY = "query"; 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12475f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * Intent extra data key: Use this key with 12485f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link android.content.Intent#getStringExtra 12495f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * content.Intent.getStringExtra()} 12505f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * to obtain the query string typed in by the user. 12515f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * This may be different from the value of {@link #QUERY} 12525f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * if the intent is the result of selecting a suggestion. 12535f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * In that case, {@link #QUERY} will contain the value of 12545f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link #SUGGEST_COLUMN_QUERY} for the suggestion, and 12555f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link #USER_QUERY} will contain the string typed by the 12565f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * user. 12575f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert */ 12585f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert public final static String USER_QUERY = "user_query"; 12595f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert 12605f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert /** 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getBundleExtra 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getBundleExtra()} 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain any additional app-specific data that was inserted by the 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity that launched the search. 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String APP_DATA = "app_data"; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1270be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * Intent extra data key: Use {@link android.content.Intent#getBundleExtra 1271be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * content.Intent.getBundleExtra(SEARCH_MODE)} to get the search mode used 1272be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * to launch the intent. 1273be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * The only current value for this is {@link #MODE_GLOBAL_SEARCH_SUGGESTION}. 1274be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * 1275be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert * @hide 1276be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert */ 1277be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert public final static String SEARCH_MODE = "search_mode"; 1278be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert 1279be5b73c5926cbebd508d8323bdeaafa2e048a93cBjorn Bringert /** 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra content.Intent.getIntExtra()} 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the keycode that the user used to trigger this query. It will be zero if the 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user simply pressed the "GO" button on the search UI. This is primarily used in conjunction 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the keycode attribute in the actionkey element of your searchable.xml configuration 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_KEY = "action_key"; 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1290875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Intent extra data key: This key will be used for the extra populated by the 1291875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column. 1292875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1293875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static String EXTRA_DATA_KEY = "intent_extra_data_key"; 1294a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 1295a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen /** 129655f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * Boolean extra data key for {@link #INTENT_ACTION_GLOBAL_SEARCH} intents. If {@code true}, 129755f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * the initial query should be selected when the global search activity is started, so 129855f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * that the user can easily replace it with another query. 12993c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert */ 130055f3ac5f293e78618995202274f8555f2481994dBjorn Bringert public final static String EXTRA_SELECT_QUERY = "select_query"; 130132d580c360da0a0f15e7a080f4ebd0b7b514fe4cBjorn Bringert 13023c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert /** 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra content.Intent.getStringExtra()} 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the action message that was defined for a particular search action key and/or 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion. It will be null if the search was launched by typing "enter", touched the the 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "GO" button, or other means not involving any action key. 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_MSG = "action_msg"; 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Uri path for queried suggestions data. This is the path that the search manager 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use when querying your content provider for suggestions data based on user input 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (e.g. looking for partial matches). 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Typically you'll use this with a URI matcher. 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_URI_PATH_QUERY = "search_suggest_query"; 1318b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 1319b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 1320b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * MIME type for suggestions data. You'll use this in your suggestions content provider 1321b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * in the getType() function. 1322b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen */ 1323b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen public final static String SUGGEST_MIME_TYPE = 1324b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen "vnd.android.cursor.dir/vnd.android.search.suggest"; 1325b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen 1326b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen /** 1327b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Uri path for shortcut validation. This is the path that the search manager will use when 1328b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * querying your content provider to refresh a shortcutted suggestion result and to check if it 1329b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * is still valid. When asked, a source may return an up to date result, or no result. No 1330b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * result indicates the shortcut refers to a no longer valid sugggestion. 1331b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * 1332b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * @see #SUGGEST_COLUMN_SHORTCUT_ID 1333b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 1334b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut"; 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1337b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * MIME type for shortcut validation. You'll use this in your suggestions content provider 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the getType() function. 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1340b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen public final static String SHORTCUT_MIME_TYPE = 1341b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen "vnd.android.cursor.item/vnd.android.search.suggest"; 1342d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Unused - can be null or column can be omitted.</i> 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_FORMAT = "suggest_format"; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Required.</i> This is the primary line of text that 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be presented to the user as the suggestion. 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1"; 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then all suggestions will be provided in a two-line format. The second line of text is in 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a much smaller appearance. 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2"; 13580b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert 13590b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert /** 13600b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * Column name for suggestions cursor. <i>Optional.</i> This is a URL that will be shown 13610b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * as the second line of text instead of {@link #SUGGEST_COLUMN_TEXT_2}. This is a separate 13620b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * column so that the search UI knows to display the text as a URL, e.g. by using a different 13630b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * color. If this column is absent, or has the value {@code null}, 13640b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert * {@link #SUGGEST_COLUMN_TEXT_2} will be used instead. 13650b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert */ 13660b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert public final static String SUGGEST_COLUMN_TEXT_2_URL = "suggest_text_2_url"; 13670b49ab5cae98d5f27b490b6de35d92e7a63a2e64Bjorn Bringert 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 1370875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * then all suggestions will be provided in a format that includes space for two small icons, 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one at the left and one at the right of each suggestion. The data in the column must 1372875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be a resource ID of a drawable, or a URI in one of the following formats: 1373875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1374875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <ul> 1375875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 1376875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 1377875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> 1378875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </ul> 1379875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1380875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)} 1381875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * for more information on these schemes. 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1"; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 1386875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * then all suggestions will be provided in a format that includes space for two small icons, 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one at the left and one at the right of each suggestion. The data in the column must 1388875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be a resource ID of a drawable, or a URI in one of the following formats: 1389875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1390875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <ul> 1391875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 1392875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 1393875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> 1394875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </ul> 1395875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1396875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)} 1397875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * for more information on these schemes. 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2"; 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, this is the action that will be used when 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forming the suggestion's intent. If the element is not provided, the action will be taken 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the android:searchSuggestIntentAction field in your XML metadata. <i>At least one of 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these must be present for the suggestion to generate an intent.</i> Note: If your action is 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same for all suggestions, it is more efficient to specify it using XML metadata and omit 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it from the cursor. 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action"; 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, this is the data that will be used when 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forming the suggestion's intent. If the element is not provided, the data will be taken 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the android:searchSuggestIntentData field in your XML metadata. If neither source 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is provided, the Intent's data field will be null. Note: If your data is 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same for all suggestions, or can be described using a constant part and a specific ID, 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is more efficient to specify it using XML metadata and omit it from the cursor. 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data"; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1421bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 1422bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * this element exists at the given row, this is the data that will be used when 1423bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * forming the suggestion's intent. If not provided, the Intent's extra data field will be null. 1424bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * This column allows suggestions to provide additional arbitrary data which will be included as 1425131234c6f134c586208ec94bfe4ae021b057cf66Mike LeBeau * an extra under the key {@link #EXTRA_DATA_KEY}. 1426bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath */ 1427bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data"; 1428bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath /** 1429479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani * TODO: Remove 1430a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * 1431590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * @hide 1432875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1433bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath public final static String SUGGEST_COLUMN_INTENT_COMPONENT_NAME = "suggest_intent_component"; 1434875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, then "/" and this value will be appended to the data 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field in the Intent. This should only be used if the data field has already been set to an 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate base string. 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id"; 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Required if action is 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</i> If this 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column exists <i>and</i> this element exists at the given row, this is the data that will be 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used when forming the suggestion's query. 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_QUERY = "suggest_intent_query"; 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 1450b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Column name for suggestions cursor. <i>Optional.</i> This column is used to indicate whether 1451b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * a search suggestion should be stored as a shortcut, and whether it should be refreshed. If 1452b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * missing, the result will be stored as a shortcut and never validated. If set to 1453b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. 1454b5041368524045b6714081d14ff3c6b22598aab1Karl Rosaen * Otherwise, the shortcut id will be used to check back for an up to date suggestion using 1455b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * {@link #SUGGEST_URI_PATH_SHORTCUT}. 1456b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 1457b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id"; 1458b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 1459b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 14601c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify the 14611c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * cursor item's background color if it needs a non-default background color. A non-zero value 14621c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * indicates a valid background color to override the default. 14631c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * 1464590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * @hide For internal use, not part of the public API. 14651c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath */ 14661c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath public final static String SUGGEST_COLUMN_BACKGROUND_COLOR = "suggest_background_color"; 1467ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau 1468ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau /** 1469ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify 1470ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion 1471ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * is being refreshed. 1472ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau */ 1473ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = 1474ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau "suggest_spinner_while_refreshing"; 14751c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath 14761c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath /** 1477b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion 1478b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * should not be stored as a shortcut in global search. 1479b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 1480b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1"; 1481b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 1482b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 14833fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * Query parameter added to suggestion queries to limit the number of suggestions returned. 148486917dbb9554e3e05be4ca8845a409b730120022Bjorn Bringert * This limit is only advisory and suggestion providers may chose to ignore it. 14853fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert */ 14863fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert public final static String SUGGEST_PARAMETER_LIMIT = "limit"; 14873fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert 14883fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert /** 148955f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * Intent action for starting the global search activity. 149074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * The global search provider should handle this intent. 149155f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * 149255f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * Supported extra data keys: {@link #QUERY}, 149355f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * {@link #EXTRA_SELECT_QUERY}, 149455f3ac5f293e78618995202274f8555f2481994dBjorn Bringert * {@link #APP_DATA}. 149574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert */ 149674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert public final static String INTENT_ACTION_GLOBAL_SEARCH 149774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert = "android.search.action.GLOBAL_SEARCH"; 149874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert 149974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /** 1500875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Intent action for starting the global search settings activity. 1501875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The global search provider should handle this intent. 1502875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1503875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static String INTENT_ACTION_SEARCH_SETTINGS 1504875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen = "android.search.action.SEARCH_SETTINGS"; 15053a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau 15063a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau /** 15073a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * Intent action for starting a web search provider's settings activity. 15083a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * Web search providers should handle this intent if they have provider-specific 15093a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * settings to implement. 15103a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau */ 15113a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS 15123a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau = "android.search.action.WEB_SEARCH_SETTINGS"; 1513a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 1514a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen /** 1515f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Intent action broadcasted to inform that the searchables list or default have changed. 1516f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Components should handle this intent if they cache any searchable data and wish to stay 1517f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * up to date on changes. 1518f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 1519f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath public final static String INTENT_ACTION_SEARCHABLES_CHANGED 1520f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath = "android.search.action.SEARCHABLES_CHANGED"; 1521d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau 1522d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau /** 1523d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau * Intent action broadcasted to inform that the search settings have changed in some way. 1524590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * Either searchables have been enabled or disabled, or a different web search provider 1525590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * has been chosen. 1526d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau */ 1527d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED 1528d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau = "android.search.action.SETTINGS_CHANGED"; 1529f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1530f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1531a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION}, 1532a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * the search dialog will take no action. 1533a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * 1534590f63433ce786722d263c7e913a88d3101e5cbcKarl Rosaen * @hide 1535a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen */ 1536a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen public final static String INTENT_ACTION_NONE = "android.search.action.ZILCH"; 1537479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani 1538875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 1539875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Reference to the shared system search service. 1540875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 15418d1538237847baf381787b881141f8c0478bef5bBjorn Bringert private static ISearchManager mService; 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 15448d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 1545d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen /** 1546d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * The package associated with this seach manager. 1547d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen */ 1548d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen private String mAssociatedPackage; 1549b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn 15508d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert // package private since they are used by the inner class SearchManagerCallback 15518d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ final Handler mHandler; 15528d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ OnDismissListener mDismissListener = null; 15538d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ OnCancelListener mCancelListener = null; 15548d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 1555e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani private SearchDialog mSearchDialog; 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ SearchManager(Context context, Handler handler) { 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = handler; 15608d1538237847baf381787b881141f8c0478bef5bBjorn Bringert mService = ISearchManager.Stub.asInterface( 15618d1538237847baf381787b881141f8c0478bef5bBjorn Bringert ServiceManager.getService(Context.SEARCH_SERVICE)); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1563b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Launch search UI. 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The search manager will open a search widget in an overlapping 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window, and the underlying activity may be obscured. The search 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry state will remain in effect until one of the following events: 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The user completes the search. In most cases this will launch 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search intent.</li> 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The user uses the back, home, or other keys to exit the search.</li> 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The application calls the {@link #stopSearch} 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method, which will hide the search window and return focus to the 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity from which it was launched.</li> 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most applications will <i>not</i> use this interface to invoke search. 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The primary method for invoking search is to call 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested Activity.onSearchRequested()} or 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startSearch Activity.startSearch()}. 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param initialQuery A search string can be pre-entered here, but this 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is typically null or empty. 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectInitialQuery If true, the intial query will be preselected, which means that 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any further typing will replace it. This is useful for cases where an entire pre-formed 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * query is being inserted. If false, the selection point will be placed at the end of the 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inserted query. This is useful when the inserted query is text that the user entered, 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the user would expect to be able to keep typing. <i>This parameter is only meaningful 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if initialQuery is a non-empty string.</i> 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param launchActivity The ComponentName of the activity that has launched this search. 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param appSearchData An application can insert application-specific 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context here, in order to improve quality or specificity of its own 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searches. This data will be returned with SEARCH intent(s). Null if 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no extra data is required. 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param globalSearch If false, this will only launch the search that has been specifically 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defined by the application (which is usually defined as a local search). If no default 1598cfa419b754332e12f8cd45244c2f3bee9d6a74bbMike LeBeau * search is defined in the current application or activity, global search will be launched. 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If true, this will always launch a platform-global (e.g. web-based) search instead. 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.Activity#onSearchRequested 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #stopSearch 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startSearch(String initialQuery, 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selectInitialQuery, 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName launchActivity, 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle appSearchData, 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean globalSearch) { 16093c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (globalSearch) { 16103c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert startGlobalSearch(initialQuery, selectInitialQuery, appSearchData); 16113c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert return; 16123c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16133c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert 1614479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani ensureSearchDialog(); 1615479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani 1616479ae0a28099eb77299fe0f44d4dfabce3115fb6Amith Yamasani mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData); 1617e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani } 1618e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani 1619e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani private void ensureSearchDialog() { 1620e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mSearchDialog == null) { 1621e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog = new SearchDialog(mContext, this); 1622e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.setOnCancelListener(this); 1623e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.setOnDismissListener(this); 1624d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 1625d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 1626d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen 1627d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen /** 16283c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert * Starts the global search activity. 16293c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert */ 1630e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani /* package */ void startGlobalSearch(String initialQuery, boolean selectInitialQuery, 16313c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert Bundle appSearchData) { 16323c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert ComponentName globalSearchActivity = getGlobalSearchActivity(); 16333c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (globalSearchActivity == null) { 16343c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert Log.w(TAG, "No global search activity found."); 16353c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert return; 16363c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 1637a94e7afb28c6bd9af6f2b0142a577086399066b2Bjorn Bringert Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH); 1638b8144a9c18f23c91b836736a2fcea30917153002Bjorn Bringert intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 16393c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert intent.setComponent(globalSearchActivity); 16403c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert // TODO: Always pass name of calling package as an extra? 16413c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (appSearchData != null) { 16423c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert intent.putExtra(APP_DATA, appSearchData); 16433c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16443c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (!TextUtils.isEmpty(initialQuery)) { 164555f3ac5f293e78618995202274f8555f2481994dBjorn Bringert intent.putExtra(QUERY, initialQuery); 16463c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16473c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (selectInitialQuery) { 164855f3ac5f293e78618995202274f8555f2481994dBjorn Bringert intent.putExtra(EXTRA_SELECT_QUERY, selectInitialQuery); 16493c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16503c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert try { 16513c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert if (DBG) Log.d(TAG, "Starting global search: " + intent.toUri(0)); 16523c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert mContext.startActivity(intent); 16533c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } catch (ActivityNotFoundException ex) { 16543c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert Log.e(TAG, "Global search activity not found: " + globalSearchActivity); 16553c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16563c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16573c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert 16583c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert /** 16593c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert * Gets the name of the global search activity. 16603c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert * 166138015f3663dcf3765d0998f8f5398b3068dfc326Bjorn Bringert * @hide 16623c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert */ 166338015f3663dcf3765d0998f8f5398b3068dfc326Bjorn Bringert public ComponentName getGlobalSearchActivity() { 16646cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert try { 16656cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mService.getGlobalSearchActivity(); 16666cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert } catch (RemoteException ex) { 16676cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert Log.e(TAG, "getGlobalSearchActivity() failed: " + ex); 16686cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return null; 16693c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16703c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert } 16713c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert 16723c50ef6f665ab22cdb50c76bb31283e6bac47fc6Bjorn Bringert /** 1673ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * Gets the name of the web search activity. 1674ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * 1675ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * @return The name of the default activity for web searches. This activity 1676ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * can be used to get web search suggestions. Returns {@code null} if 1677ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * there is no default web search activity. 1678ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * 1679ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert * @hide 1680ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert */ 1681ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert public ComponentName getWebSearchActivity() { 16826cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert try { 16836cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mService.getWebSearchActivity(); 16846cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert } catch (RemoteException ex) { 16856cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert Log.e(TAG, "getWebSearchActivity() failed: " + ex); 1686ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert return null; 1687ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert } 1688ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert } 1689ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert 1690ea125f45ebf25494ae190b2f338f359f830674dfBjorn Bringert /** 1691d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * Similar to {@link #startSearch} but actually fires off the search query after invoking 1692d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * the search dialog. Made available for testing purposes. 1693d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * 1694d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @param query The query to trigger. If empty, request will be ignored. 1695d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @param launchActivity The ComponentName of the activity that has launched this search. 1696d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @param appSearchData An application can insert application-specific 1697d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * context here, in order to improve quality or specificity of its own 1698d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * searches. This data will be returned with SEARCH intent(s). Null if 1699d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * no extra data is required. 1700d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * 1701d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen * @see #startSearch 1702d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen */ 1703d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen public void triggerSearch(String query, 1704d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen ComponentName launchActivity, 1705b782a2f4f0a3072f2677f6f10fb255c77468ae66Bjorn Bringert Bundle appSearchData) { 1706d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen if (!mAssociatedPackage.equals(launchActivity.getPackageName())) { 1707d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen throw new IllegalArgumentException("invoking app search on a different package " + 1708d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen "not associated with this search manager"); 1709d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 1710d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen if (query == null || TextUtils.getTrimmedLength(query) == 0) { 1711d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen Log.w(TAG, "triggerSearch called with empty query, ignoring."); 1712d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen return; 1713d2d6014f715f12f6263f61ba3eeb6f8cba6d0fa6krosaen } 1714e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani startSearch(query, false, launchActivity, appSearchData, false); 1715e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.launchQuerySearch(); 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Terminate search UI. 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Typically the user will terminate the search UI by launching a 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search or by canceling. This function allows the underlying application 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or activity to cancel the search prematurely (for any reason). 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This function can be safely called at any time (even if no search is active.) 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #startSearch 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17298d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void stopSearch() { 1730e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mSearchDialog != null) { 1731e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mSearchDialog.cancel(); 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determine if the Search UI is currently displayed. 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is provided primarily for application test purposes. 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the search UI is currently displayed. 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17448d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public boolean isVisible() { 1745e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani return mSearchDialog == null? false : mSearchDialog.isShowing(); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17478d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * See {@link SearchManager#setOnDismissListener} for configuring your activity to monitor 1750a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * search UI state. 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDismissListener { 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1754a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * This method will be called when the search UI is dismissed. To make use of it, you must 1755a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * implement this method in your activity, and call 1756a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * {@link SearchManager#setOnDismissListener} to register it. 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDismiss(); 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1762a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * See {@link SearchManager#setOnCancelListener} for configuring your activity to monitor 1763a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * search UI state. 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnCancelListener { 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will be called when the search UI is canceled. To make use if it, you must 1768a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * implement this method in your activity, and call 1769a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * {@link SearchManager#setOnCancelListener} to register it. 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCancel(); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the callback that will be invoked whenever the search UI is dismissed. 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The {@link OnDismissListener} to use, or null. 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnDismissListener(final OnDismissListener listener) { 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDismissListener = listener; 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the callback that will be invoked whenever the search UI is canceled. 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The {@link OnCancelListener} to use, or null. 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17888d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void setOnCancelListener(OnCancelListener listener) { 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCancelListener = listener; 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17918d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 17920e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert /** 17930e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert * @deprecated This method is an obsolete internal implementation detail. Do not use. 17940e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert */ 17954a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn @Deprecated 17968d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onCancel(DialogInterface dialog) { 1797e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mCancelListener != null) { 1798e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mCancelListener.onCancel(); 1799e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani } 18008d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 18010e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert 18020e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert /** 18030e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert * @deprecated This method is an obsolete internal implementation detail. Do not use. 18040e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert */ 18054a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn @Deprecated 18068d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onDismiss(DialogInterface dialog) { 1807e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani if (mDismissListener != null) { 1808e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani mDismissListener.onDismiss(); 1809e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18130408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * Gets information about a searchable activity. 18140408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * 18150408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * @param componentName The activity to get searchable information for. 18160408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * @return Searchable information, or <code>null</code> if the activity does not 18170408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert * exist, or is not searchable. 18180408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert */ 18190408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert public SearchableInfo getSearchableInfo(ComponentName componentName) { 18200408675d8770fc55c40631cdfa87d79fc00f0a3cBjorn Bringert try { 18216cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mService.getSearchableInfo(componentName); 18228d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } catch (RemoteException ex) { 18238d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchableInfo() failed: " + ex); 1824875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 1825875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1826875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 18278d1538237847baf381787b881141f8c0478bef5bBjorn Bringert 1828875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 182997325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * Gets a cursor with search suggestions. 183097325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * 183197325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @param searchable Information about how to get the suggestions. 183297325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @param query The search text entered (so far). 183397325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @return a cursor with suggestions, or <code>null</null> the suggestion query failed. 183497325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * 183597325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @hide because SearchableInfo is not part of the API. 183697325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert */ 183797325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert public Cursor getSuggestions(SearchableInfo searchable, String query) { 18383fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert return getSuggestions(searchable, query, -1); 18393fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert } 18403fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert 18413fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert /** 18423fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * Gets a cursor with search suggestions. 18433fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * 18443fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @param searchable Information about how to get the suggestions. 18453fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @param query The search text entered (so far). 18463fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @param limit The query limit to pass to the suggestion provider. This is advisory, 18473fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * the returned cursor may contain more rows. Pass {@code -1} for no limit. 18483fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @return a cursor with suggestions, or <code>null</null> the suggestion query failed. 18493fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * 18503fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert * @hide because SearchableInfo is not part of the API. 18513fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert */ 18523fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert public Cursor getSuggestions(SearchableInfo searchable, String query, int limit) { 1853875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (searchable == null) { 1854875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 1855875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1856875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1857875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String authority = searchable.getSuggestAuthority(); 1858875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (authority == null) { 1859875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 1860875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1861875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1862875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen Uri.Builder uriBuilder = new Uri.Builder() 1863875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .scheme(ContentResolver.SCHEME_CONTENT) 18643fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert .authority(authority) 18653fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() 18663fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() 1867875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1868875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // if content path provided, insert it now 1869875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen final String contentPath = searchable.getSuggestPath(); 1870875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (contentPath != null) { 1871875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendEncodedPath(contentPath); 1872875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1873875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 18743fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert // append standard suggestion query path 1875875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); 1876875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1877875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // get the query selection, may be null 1878875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String selection = searchable.getSuggestSelection(); 1879875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // inject query, either as selection args or inline 1880875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String[] selArgs = null; 1881875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (selection != null) { // use selection if provided 1882875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen selArgs = new String[] { query }; 1883875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { // no selection, use REST pattern 1884875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendPath(query); 1885875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1886875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 18873fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert if (limit > 0) { 18883fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert uriBuilder.appendQueryParameter(SUGGEST_PARAMETER_LIMIT, String.valueOf(limit)); 18893fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert } 18903fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert 18913fc7c67de192a5baee2b4510fdb464b0fec72dcaBjorn Bringert Uri uri = uriBuilder.build(); 1892875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1893875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // finally, make the query 18948d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mContext.getContentResolver().query(uri, null, selection, selArgs, null); 1895875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1896875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 18976d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert /** 18986d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * Returns a list of the searchable activities that can be included in global search. 18996d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * 19006d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * @return a list containing searchable information for all searchable activities 190113107bb186d72bc80dc5609b20c71b7e77a9784dBjorn Bringert * that have the <code>android:includeInGlobalSearch</code> attribute set 190213107bb186d72bc80dc5609b20c71b7e77a9784dBjorn Bringert * in their searchable meta-data. 19036d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert */ 19048d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public List<SearchableInfo> getSearchablesInGlobalSearch() { 19056d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert try { 19068d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mService.getSearchablesInGlobalSearch(); 19076d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } catch (RemoteException e) { 19088d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchablesInGlobalSearch() failed: " + e); 19096d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert return null; 19106d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 19116d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 1912f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1913e9ce3f01d42769f03f10e70c3244500e92d7eee1Amith Yamasani} 1914