SearchManager.java revision d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 20875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.ContentResolver; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 23875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.database.Cursor; 24875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.net.Uri; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 27875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.os.RemoteException; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 29875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.server.search.SearchableInfo; 308d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.util.Log; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 336d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringertimport java.util.List; 346d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides access to the system search services. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In practice, you won't interact with this class directly, as search 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * services are provided through methods in {@link android.app.Activity Activity} 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods and the the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}. This class does provide a basic 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overview of search services and how to integrate them with your activities. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you do require direct access to the Search Manager, do not instantiate 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this class directly; instead, retrieve it through 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context.getSystemService(Context.SEARCH_SERVICE)}. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here: 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#DeveloperGuide">Developer Guide</a> 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#HowSearchIsInvoked">How Search Is Invoked</a> 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#QuerySearchApplications">Query-Search Applications</a> 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#FilterSearchApplications">Filter-Search Applications</a> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Suggestions">Search Suggestions</a> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActionKeys">Action Keys</a> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SearchabilityMetadata">Searchability Metadata</a> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#PassingSearchContext">Passing Search Context</a> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProtectingUserPrivacy">Protecting User Privacy</a> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="DeveloperGuide"></a> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Developer Guide</h3> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to search for user, system, or network based data is considered to be 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a core user-level feature of the android platform. At any time, the user should be 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * able to use a familiar command, button, or keystroke to invoke search, and the user 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be able to search any data which is available to them. The goal is to make search 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appear to the user as a seamless, system-wide feature. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In terms of implementation, there are three broad classes of Applications: 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Applications that are not inherently searchable</li> 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Query-Search Applications</li> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Filter-Search Applications</li> 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>These categories, as well as related topics, are discussed in 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the sections below. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Even if your application is not <i>searchable</i>, it can still support the invocation of 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search. Please review the section <a href="#HowSearchIsInvoked">How Search Is Invoked</a> 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for more information on how to support this. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Many applications are <i>searchable</i>. These are 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the applications which can convert a query string into a list of results. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Within this subset, applications can be grouped loosely into two families: 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li><i>Query Search</i> applications perform batch-mode searches - each query string is 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * converted to a list of results.</li> 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><i>Filter Search</i> applications provide live filter-as-you-type searches.</li></ul> 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Generally speaking, you would use query search for network-based data, and filter 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search for local data, but this is not a hard requirement and applications 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are free to use the model that fits them best (or invent a new model). 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It should be clear that the search implementation decouples "search 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invocation" from "searchable". This satisfies the goal of making search appear 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be "universal". The user should be able to launch any search from 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * almost any context. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="HowSearchIsInvoked"></a> 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>How Search Is Invoked</h3> 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless impossible or inapplicable, all applications should support 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoking the search UI. This means that when the user invokes the search command, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search UI will be presented to them. The search command is currently defined as a menu 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item called "Search" (with an alphabetic shortcut key of "S"), or on some devices, a dedicated 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search button key. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If your application is not inherently searchable, you can also allow the search UI 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be invoked in a "web search" mode. If the user enters a search term and clicks the 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Search" button, this will bring the browser to the front and will launch a web-based 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search. The user will be able to click the "Back" button and return to your application. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general this is implemented by your activity, or the {@link android.app.Activity Activity} 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * base class, which captures the search command and invokes the Search Manager to 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display and operate the search UI. You can also cause the search UI to be presented in response 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to user keystrokes in your activity (for example, to instantly start filter searching while 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * viewing a list and typing any key). 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The search UI is presented as a floating 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window and does not cause any change in the activity stack. If the user 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cancels search, the previous activity re-emerges. If the user launches a 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search, this will be done by sending a search {@link android.content.Intent Intent} (see below), 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the normal intent-handling sequence will take place (your activity will pause, 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * etc.) 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>What you need to do:</b> First, you should consider the way in which you want to 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handle invoking search. There are four broad (and partially overlapping) categories for 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you to choose from. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>You can capture the search command yourself, by including a <i>search</i> 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * button or menu item - and invoking the search UI directly.</li> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can provide a <i>type-to-search</i> feature, in which search is invoked automatically 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the user enters any characters.</li> 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Even if your application is not inherently searchable, you can allow web search, 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * via the search key (or even via a search menu item). 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can disable search entirely. This should only be used in very rare circumstances, 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as search is a system-wide feature and users will expect it to be available in all contexts.</li> 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to define a search menu.</b> The system provides the following resources which may 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be useful when adding a search item to your menu: 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>android.R.drawable.ic_search_category_default is an icon you can use in your menu.</li> 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link #MENU_KEY SearchManager.MENU_KEY} is the recommended alphabetic shortcut.</li> 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to invoke search directly.</b> In order to invoke search directly, from a button 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or menu item, you can launch a generic search by calling 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested onSearchRequested} as shown: 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onSearchRequested();</pre> 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to implement type-to-search.</b> While setting up your activity, call 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setDefaultKeyMode setDefaultKeyMode}: 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); // search within your activity 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL); // search using platform global search</pre> 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to enable web-based search.</b> In addition to searching within your activity or 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, you can also use the Search Manager to invoke a platform-global search, typically 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a web search. There are two ways to do this: 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>You can simply define "search" within your application or activity to mean global search. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is described in more detail in the 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section. Briefly, you will 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * add a single meta-data entry to your manifest, declaring that the default search 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your application is "*". This indicates to the system that no application-specific 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search activity is provided, and that it should launch web-based search instead.</li> 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can specify this at invocation time via default keys (see above), overriding 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested}, or via a direct call to 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startSearch}. This is most useful if you wish to provide local 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchability <i>and</i> access to global search.</li></ul> 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to disable search from your activity.</b> search is a system-wide feature and users 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will expect it to be available in all contexts. If your UI design absolutely precludes 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launching search, override {@link android.app.Activity#onSearchRequested onSearchRequested} 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as shown: 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @Override 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public boolean onSearchRequested() { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return false; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Managing focus and knowing if Search is active.</b> The search UI is not a separate 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity, and when the UI is invoked or dismissed, your activity will not typically be paused, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resumed, or otherwise notified by the methods defined in 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html#actlife">Application Fundamentals: 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Lifecycle</a>. The search UI is 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handled in the same way as other system UI elements which may appear from time to time, such as 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notifications, screen locks, or other system alerts: 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When the search UI appears, your activity will lose input focus. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When the search activity is dismissed, there are three possible outcomes: 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>If the user simply canceled the search UI, your activity will regain input focus and 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proceed as before. See {@link #setOnDismissListener} and {@link #setOnCancelListener} if you 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required direct notification of search dialog dismissals.</li> 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user launched a search, and this required switching to another activity to receive 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and process the search {@link android.content.Intent Intent}, your activity will receive the 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * normal sequence of activity pause or stop notifications.</li> 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user launched a search, and the current activity is the recipient of the search 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, you will receive notification via the 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onNewIntent onNewIntent()} method.</li></ul> 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This list is provided in order to clarify the ways in which your activities will interact with 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search UI. More details on searchable activities and search intents are provided in the 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sections below. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="QuerySearchApplications"></a> 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Query-Search Applications</h3> 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Query-search applications are those that take a single query (e.g. a search 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string) and present a set of results that may fit. Primary examples include 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * web queries, map lookups, or email searches (with the common thread being 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network query dispatch). It may also be the case that certain local searches 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are treated this way. It's up to the application to decide. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>What you need to do:</b> The following steps are necessary in order to 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implement query search. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement search invocation as described above. (Strictly speaking, 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these are decoupled, but it would make little sense to be "searchable" but not 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "search-invoking".)</li> 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Your application should have an activity that takes a search string and 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * converts it to a list of results. This could be your primary display activity 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or it could be a dedicated search results activity. This is your <i>searchable</i> 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity and every query-search application must have one.</li> 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In the searchable activity, in onCreate(), you must receive and handle the 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}. The text to search (query string) for is provided by 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calling 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #QUERY getStringExtra(SearchManager.QUERY)}.</li> 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To identify and support your searchable activity, you'll need to 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide an XML file providing searchability configuration parameters, a reference to that 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in your searchable activity's <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry, and an intent-filter declaring that you can 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive ACTION_SEARCH intents. This is described in more detail in the 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.</li> 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> also needs a metadata entry 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providing a global reference to the searchable activity. This is the "glue" directing the search 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * UI, when invoked from any of your <i>other</i> activities, to use your application as the 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default search context. This is also described in more detail in the 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.</li> 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Finally, you may want to define your search results activity as with the 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#launchMode singleTop} launchMode flag. This allows the system 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch searches from/to the same activity without creating a pile of them on the 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity stack. If you do this, be sure to also override 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onNewIntent onNewIntent} to handle the 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * updated intents (with new queries) as they arrive.</li> 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Code snippet showing handling of intents in your search activity: 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @Override 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final Intent queryIntent = getIntent(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final String queryAction = queryIntent.getAction(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if (Intent.ACTION_SEARCH.equals(queryAction)) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doSearchWithIntent(queryIntent); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private void doSearchWithIntent(final Intent queryIntent) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final String queryString = queryIntent.getStringExtra(SearchManager.QUERY); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doSearchWithQuery(queryString); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="FilterSearchApplications"></a> 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Filter-Search Applications</h3> 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Filter-search applications are those that use live text entry (e.g. keystrokes)) to 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display and continuously update a list of results. Primary examples include applications 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that use locally-stored data. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Filter search is not directly supported by the Search Manager. Most filter search 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementations will use variants of {@link android.widget.Filterable}, such as a 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ListView} bound to a {@link android.widget.SimpleCursorAdapter}. However, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may find it useful to mix them together, by declaring your filtered view searchable. With 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this configuration, you can still present the standard search dialog in all activities 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within your application, but transition to a filtered search when you enter the activity 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and display the results. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Suggestions"></a> 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Search Suggestions</h3> 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A powerful feature of the Search Manager is the ability of any application to easily provide 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * live "suggestions" in order to prompt the user. Each application implements suggestions in a 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different, unique, and appropriate way. Suggestions be drawn from many sources, including but 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not limited to: 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Actual searchable results (e.g. names in the address book)</li> 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Recently entered queries</li> 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Recently viewed data or results</li> 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Contextually appropriate queries or results</li> 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Summaries of possible results</li> 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Another feature of suggestions is that they can expose queries or results before the user 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ever visits the application. This reduces the amount of context switching required, and helps 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user access their data quickly and with less context shifting. In order to provide this 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capability, suggestions are accessed via a 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.ContentProvider Content Provider}. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The primary form of suggestions is known as <i>queried suggestions</i> and is based on query 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text that the user has already typed. This would generally be based on partial matches in 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the available data. In certain situations - for example, when no query text has been typed yet - 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application may also opt to provide <i>zero-query suggestions</i>. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These would typically be drawn from the same data source, but because no partial query text is 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available, they should be weighted based on other factors - for example, most recent queries 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or most recent results. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Overview of how suggestions are provided.</b> When the search manager identifies a 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * particular activity as searchable, it will check for certain metadata which indicates that 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is also a source of suggestions. If suggestions are provided, the following steps are 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taken. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>Using formatting information found in the metadata, the user's query text (whatever 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been typed so far) will be formatted into a query and sent to the suggestions 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.ContentProvider Content Provider}.</li> 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The suggestions {@link android.content.ContentProvider Content Provider} will create a 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.database.Cursor Cursor} which can iterate over the possible suggestions.</li> 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The search manager will populate a list using display data found in each row of the cursor, 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and display these suggestions to the user.</li> 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user types another key, or changes the query in any way, the above steps are repeated 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the suggestions list is updated or repopulated.</li> 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user clicks or touches the "GO" button, the suggestions are ignored and the search is 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launched using the normal {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} type of 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}.</li> 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user uses the directional controls to navigate the focus into the suggestions list, 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the query text will be updated while the user navigates from suggestion to suggestion. The user 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can then click or touch the updated query and edit it further. If the user navigates back to 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the edit field, the original typed query is restored.</li> 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user clicks or touches a particular suggestion, then a combination of data from the 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cursor and 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values found in the metadata are used to synthesize an Intent and send it to the application. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Depending on the design of the activity and the way it implements search, this might be a 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} (in order to launch a query), or it 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * might be a {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}, in order to proceed directly 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to display of specific data.</li> 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Simple Recent-Query-Based Suggestions.</b> The Android framework provides a simple Search 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suggestions provider, which simply records and replays recent queries. For many applications, 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will be sufficient. The basic steps you will need to 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * do, in order to use the built-in recent queries suggestions provider, are as follows: 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement and test query search, as described in the previous sections.</li> 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a Provider within your application by extending 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}.</li> 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a manifest entry describing your provider.</li> 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Update your searchable activity's XML configuration file with information about your 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider.</li> 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In your searchable activities, capture any user-generated queries and record them 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for future searches by calling {@link android.provider.SearchRecentSuggestions#saveRecentQuery}. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For complete implementation details, please refer to 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}. The rest of the information in this 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section should not be necessary, as it refers to custom suggestions providers. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Creating a Customized Suggestions Provider:</b> In order to create more sophisticated 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion providers, you'll need to take the following steps: 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement and test query search, as described in the previous sections.</li> 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Decide how you wish to <i>receive</i> suggestions. Just like queries that the user enters, 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions will be delivered to your searchable activity as 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} messages; Unlike simple queries, you have quite a bit of 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flexibility in forming those intents. A query search application will probably 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wish to continue receiving the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, which will launch a query search using query text as 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided by the suggestion. A filter search application will probably wish to 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive the {@link android.content.Intent#ACTION_VIEW ACTION_VIEW} 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, which will take the user directly to a selected entry. 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Other interesting suggestions, including hybrids, are possible, and the suggestion provider 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can easily mix-and-match results to provide a richer set of suggestions for the user. Finally, 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you'll need to update your searchable activity (or other activities) to receive the intents 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as you've defined them.</li> 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement a Content Provider that provides suggestions. If you already have one, and it 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has access to your suggestions data. If not, you'll have to create one. 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You'll also provide information about your Content Provider in your 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * package's <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>.</li> 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Update your searchable activity's XML configuration file. There are two categories of 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information used for suggestions: 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>The first is (required) data that the search manager will 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use to format the queries which are sent to the Content Provider.</li> 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The second is (optional) parameters to configure structure 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if intents generated by suggestions.</li></li> 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Configuring your Content Provider to Receive Suggestion Queries.</b> The basic job of 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search suggestions {@link android.content.ContentProvider Content Provider} is to provide 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "live" (while-you-type) conversion of the user's query text into a set of zero or more 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions. Each application is free to define the conversion, and as described above there are 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * many possible solutions. This section simply defines how to communicate with the suggestion 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Search Manager must first determine if your package provides suggestions. This is done 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by examination of your searchable meta-data XML file. The android:searchSuggestAuthority 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute, if provided, is the signal to obtain & display suggestions. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Every query includes a Uri, and the Search Manager will format the Uri as shown: 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><pre class="prettyprint"> 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content:// your.suggest.authority / your.suggest.path / SearchManager.SUGGEST_URI_PATH_QUERY</pre> 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Your Content Provider can receive the query text in one of two ways. 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query provided as a selection argument.</b> If you define the attribute value 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection and include a string, this string will be passed as the 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>selection</i> parameter to your Content Provider's query function. You must define a single 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection argument, using the '?' character. The user's query text will be passed to you 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the first element of the selection arguments array.</li> 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query provided with Data Uri.</b> If you <i>do not</i> define the attribute value 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection, then the Search Manager will append another "/" followed by 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's query to the query Uri. The query will be encoding using Uri encoding rules - don't 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forget to decode it. (See {@link android.net.Uri#getPathSegments} and 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.net.Uri#getLastPathSegment} for helpful utilities you can use here.)</li> 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Handling empty queries.</b> Your application should handle the "empty query" 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (no user text entered) case properly, and generate useful suggestions in this case. There are a 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * number of ways to do this; Two are outlined here: 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>For a simple filter search of local data, you could simply present the entire dataset, 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unfiltered. (example: People)</li> 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>For a query search, you could simply present the most recent queries. This allows the user 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to quickly repeat a recent search.</li></ul> 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>The Format of Individual Suggestions.</b> Your suggestions are communicated back to the 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Search Manager by way of a {@link android.database.Cursor Cursor}. The Search Manager will 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * usually pass a null Projection, which means that your provider can simply return all appropriate 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * columns for each suggestion. The columns currently defined are: 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Column Name</th> <th>Description</th> <th>Required?</th></tr> 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_FORMAT}</th> 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td><i>Unused - can be null.</i></td> 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_TEXT_1}</th> 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This is the line of text that will be presented to the user as the suggestion.</td> 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_TEXT_2}</th> 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If your cursor includes this column, then all suggestions will be provided in a 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * two-line format. The data in this column will be displayed as a second, smaller 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * line of text below the primary suggestion, or it can be null or empty to indicate no 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text in this row's suggestion.</td> 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_ICON_1}</th> 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If your cursor includes this column, then all suggestions will be provided in an 449875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * icons+text format. This value should be a reference to the icon to 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * draw on the left side, or it can be null or zero to indicate no icon in this row. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </td> 452875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <td align="center">No.</td> 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_ICON_2}</th> 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If your cursor includes this column, then all suggestions will be provided in an 457875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * icons+text format. This value should be a reference to the icon to 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * draw on the right side, or it can be null or zero to indicate no icon in this row. 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </td> 460875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <td align="center">No.</td> 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_INTENT_ACTION}</th> 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, this is the 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action that will be used when forming the suggestion's intent. If the element is 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not provided, the action will be taken from the android:searchSuggestIntentAction 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field in your XML metadata. <i>At least one of these must be present for the 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion to generate an intent.</i> Note: If your action is the same for all 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions, it is more efficient to specify it using XML metadata and omit it from 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the cursor.</td> 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_INTENT_DATA}</th> 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, this is the 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data that will be used when forming the suggestion's intent. If the element is not 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided, the data will be taken from the android:searchSuggestIntentData field in 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your XML metadata. If neither source is provided, the Intent's data field will be 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. Note: If your data is the same for all suggestions, or can be described 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using a constant part and a specific ID, it is more efficient to specify it using 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XML metadata and omit it from the cursor.</td> 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_INTENT_DATA_ID}</th> 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, then "/" and 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this value will be appended to the data field in the Intent. This should only be 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used if the data field has already been set to an appropriate base string.</td> 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SUGGEST_COLUMN_QUERY}</th> 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this column exists <i>and</i> this element exists at the given row, this is the 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data that will be used when forming the suggestion's query.</td> 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Required if suggestion's action is 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</td> 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th><i>Other Columns</i></th> 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>Finally, if you have defined any <a href="#ActionKeys">Action Keys</a> and you wish 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for them to have suggestion-specific definitions, you'll need to define one 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * additional column per action key. The action key will only trigger if the 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently-selection suggestion has a non-empty string in the corresponding column. 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the section on <a href="#ActionKeys">Action Keys</a> for additional details and 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementation steps.</td> 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clearly there are quite a few permutations of your suggestion data, but in the next section 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we'll look at a few simple combinations that you'll select from. 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>The Format Of Intents Sent By Search Suggestions.</b> Although there are many ways to 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configure these intents, this document will provide specific information on just a few of them. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li><b>Launch a query.</b> In this model, each suggestion represents a query that your 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity can perform, and the {@link android.content.Intent Intent} will be formatted 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exactly like those sent when the user enters query text and clicks the "GO" button: 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Action:</b> {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} provided 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using your XML metadata (android:searchSuggestIntentAction).</li> 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Data:</b> empty (not used).</li> 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query:</b> query text supplied by the cursor.</li> 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Go directly to a result, using a complete Data Uri.</b> In this model, the user will be 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taken directly to a specific result. 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Action:</b> {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}</li> 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Data:</b> a complete Uri, supplied by the cursor, that identifies the desired data.</li> 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query:</b> query text supplied with the suggestion (probably ignored)</li> 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Go directly to a result, using a synthesized Data Uri.</b> This has the same result 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the previous suggestion, but provides the Data Uri in a different way. 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Action:</b> {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}</li> 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Data:</b> The search manager will assemble a Data Uri using the following elements: 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Uri fragment provided in your XML metadata (android:searchSuggestIntentData), followed by 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single "/", followed by the value found in the {@link #SUGGEST_COLUMN_INTENT_DATA_ID} 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry in your cursor.</li> 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query:</b> query text supplied with the suggestion (probably ignored)</li> 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This list is not meant to be exhaustive. Applications should feel free to define other types 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of suggestions. For example, you could reduce long lists of results to summaries, and use one 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the above intents (or one of your own) with specially formatted Data Uri's to display more 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detailed results. Or you could display textual shortcuts as suggestions, but launch a display 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in a more data-appropriate format such as media artwork. 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Suggestion Rewriting.</b> If the user navigates through the suggestions list, the UI 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may temporarily rewrite the user's query with a query that matches the currently selected 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion. This enables the user to see what query is being suggested, and also allows the user 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to click or touch in the entry EditText element and make further edits to the query before 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatching it. In order to perform this correctly, the Search UI needs to know exactly what 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text to rewrite the query with. 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For each suggestion, the following logic is used to select a new query string: 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>If the suggestion provides an explicit value in the {@link #SUGGEST_COLUMN_QUERY} 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, this value will be used.</li> 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the metadata includes the queryRewriteFromData flag, and the suggestion provides an 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit value for the intent Data field, this Uri will be used. Note that this should only be 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used with Uri's that are intended to be user-visible, such as HTTP. Internal Uri schemes should 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be used in this way.</li> 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the metadata includes the queryRewriteFromText flag, the text in 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #SUGGEST_COLUMN_TEXT_1} will be used. This should be used for suggestions in which no 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * query text is provided and the SUGGEST_COLUMN_INTENT_DATA values are not suitable for user 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inspection and editing.</li></ul> 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActionKeys"></a> 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Action Keys</h3> 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Searchable activities may also wish to provide shortcuts based on the various action keys 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available on the device. The most basic example of this is the contacts app, which enables the 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * green "dial" key for quick access during searching. Not all action keys are available on 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * every device, and not all are allowed to be overriden in this way. (For example, the "Home" 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key must always return to the home screen, with no exceptions.) 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In order to define action keys for your searchable application, you must do two things. 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You'll add one or more <i>actionkey</i> elements to your searchable metadata configuration 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. Each element defines one of the keycodes you are interested in, 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defines the conditions under which they are sent, and provides details 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on how to communicate the action key event back to your searchable activity.</li> 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In your broadcast receiver, if you wish, you can check for action keys by checking the 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extras field of the {@link android.content.Intent Intent}.</li> 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Updating metadata.</b> For each keycode of interest, you must add an <actionkey> 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element. Within this element you must define two or three attributes. The first attribute, 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <android:keycode>, is required; It is the key code of the action key event, as defined in 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.KeyEvent}. The remaining two attributes define the value of the actionkey's 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>message</i>, which will be passed to your searchable activity in the 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} (see below for more details). Although each of these 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes is optional, you must define one or both for the action key to have any effect. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <android:queryActionMsg> provides the message that will be sent if the action key is 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pressed while the user is simply entering query text. <android:suggestActionMsgColumn> 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is used when action keys are tied to specific suggestions. This attribute provides the name 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of a <i>column</i> in your suggestion cursor; The individual suggestion, in that column, 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provides the message. (If the cell is empty or null, that suggestion will not work with that 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action key.) 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="#SearchabilityMetadata">Searchability Metadata</a> section for more details 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and examples. 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Receiving Action Keys</b> Intents launched by action keys will be specially marked 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using a combination of values. This enables your searchable application to examine the intent, 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if necessary, and perform special processing. For example, clicking a suggested contact might 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display them; Selecting a suggested contact and clicking the dial button might 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * immediately call them. 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When a search {@link android.content.Intent Intent} is launched by an action key, two values 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be added to the extras field. 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To examine the key code, use {@link android.content.Intent#getIntExtra 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getIntExtra(SearchManager.ACTION_KEY)}.</li> 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To examine the message string, use {@link android.content.Intent#getStringExtra 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}</li> 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SearchabilityMetadata"></a> 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Searchability Metadata</h3> 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Every activity that is searchable must provide a small amount of additional information 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to properly configure the search system. This controls the way that your search 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is presented to the user, and controls for the various modalities described previously. 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If your application is not searchable, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then you do not need to provide any search metadata, and you can skip the rest of this section. 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When this search metadata cannot be found, the search manager will assume that the activity 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not implement search. (Note: to implement web-based search, you will need to add 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the android.app.default_searchable metadata to your manifest, as shown below.) 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Values you supply in metadata apply only to each local searchable activity. Each 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity can define a completely unique search experience relevant to its own 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capabilities and user experience requirements, and a single application can even define multiple 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activities. 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Metadata for searchable activity.</b> As with your search implementations described 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above, you must first identify which of your activities is searchable. In the 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry for this activity, you must 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide two elements: 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>An intent-filter specifying that you can receive and process the 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} {@link android.content.Intent Intent}. 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>A reference to a small XML file (typically called "searchable.xml") which contains the 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remaining configuration information for how your application implements search.</li></ul> 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is a snippet showing the necessary elements in the 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry for your searchable activity. 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Search Activity - searchable --> 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <activity android:name="MySearchActivity" 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:label="Search" 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:launchMode="singleTop"> 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <intent-filter> 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <action android:name="android.intent.action.SEARCH" /> 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <category android:name="android.intent.category.DEFAULT" /> 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </intent-filter> 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <meta-data android:name="android.app.searchable" 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:resource="@xml/searchable" /> 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </activity></pre> 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Next, you must provide the rest of the searchability configuration in 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the small XML file, stored in the ../xml/ folder in your build. The XML file is a 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple enumeration of the search configuration parameters for searching within this activity, 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, or package. Here is a sample XML file (named searchable.xml, for use with 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the above manifest) for a query-search activity. 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <searchable xmlns:android="http://schemas.android.com/apk/res/android" 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:label="@string/search_label" 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:hint="@string/search_hint" > 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </searchable></pre> 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note that all user-visible strings <i>must</i> be provided in the form of "@string" 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * references. Hard-coded strings, which cannot be localized, will not work properly in search 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metadata. 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Attributes you can set in search metadata: 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:label</th> 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This is the name for your application that will be presented to the user in a 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list of search targets, or in the search box as a label.</td> 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:icon</th> 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, this icon will be used <i>in place</i> of the label string. This 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is provided in order to present logos or other non-textual banners.</td> 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:hint</th> 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This is the text to display in the search text field when no user text has been 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entered.</td> 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchButtonText</th> 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, this text will replace the default text in the "Search" button.</td> 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchMode</th> 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided and non-zero, sets additional modes for control of the search 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * presentation. The following mode bits are defined: 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" align="center" frame="hsides" rules="rows"> 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>showSearchLabelAsBadge</th> 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag enables the display of the search target (label) 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within the search bar. If this flag and showSearchIconAsBadge 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (see below) are both not set, no badge will be shown.</td> 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>showSearchIconAsBadge</th> 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag enables the display of the search target (icon) within 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search bar. If this flag and showSearchLabelAsBadge 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (see above) are both not set, no badge will be shown. If both flags 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are set, showSearchIconAsBadge has precedence and the icon will be 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown.</td> 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>queryRewriteFromData</th> 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag causes the suggestion column SUGGEST_COLUMN_INTENT_DATA 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be considered as the text for suggestion query rewriting. This should 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only be used when the values in SUGGEST_COLUMN_INTENT_DATA are suitable 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for user inspection and editing - typically, HTTP/HTTPS Uri's.</td> 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>queryRewriteFromText</th> 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If set, this flag causes the suggestion column SUGGEST_COLUMN_TEXT_1 to 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be considered as the text for suggestion query rewriting. This should 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be used for suggestions in which no query text is provided and the 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SUGGEST_COLUMN_INTENT_DATA values are not suitable for user inspection 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and editing.</td> 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table></td> 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:inputType</th> 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, supplies a hint about the type of search text the user will be 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entering. For most searches, in which free form text is expected, this attribute 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need not be provided. Suitable values for this attribute are described in the 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="../R.attr.html#inputType">inputType</a> attribute.</td> 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:imeOptions</th> 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, supplies additional options for the input method. 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For most searches, in which free form text is expected, this attribute 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need not be provided, and will default to "actionSearch". 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suitable values for this attribute are described in the 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="../R.attr.html#imeOptions">imeOptions</a> attribute.</td> 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Styleable Resources in your Metadata.</b> It's possible to provide alternate strings 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your searchable application, in order to provide localization and/or to better visual 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * presentation on different device configurations. Each searchable activity has a single XML 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metadata file, but any resource references can be replaced at runtime based on device 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration, language setting, and other system inputs. 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A concrete example is the "hint" text you supply using the android:searchHint attribute. 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In portrait mode you'll have less screen space and may need to provide a shorter string, but 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in landscape mode you can provide a longer, more descriptive hint. To do this, you'll need to 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define two or more strings.xml files, in the following directories: 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>.../res/values-land/strings.xml</li> 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>.../res/values-port/strings.xml</li> 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>.../res/values/strings.xml</li></ul> 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For more complete documentation on this capability, see 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">Resources and 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internationalization: Alternate Resources</a>. 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Metadata for non-searchable activities.</b> Activities which are part of a searchable 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, but don't implement search itself, require a bit of "glue" in order to cause 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * them to invoke search using your searchable activity as their primary context. If this is not 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided, then searches from these activities will use the system default search context. 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The simplest way to specify this is to add a <i>search reference</i> element to the 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application entry in the <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> file. 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of this reference can be either of: 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>The name of your searchable activity. 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is typically prefixed by '.' to indicate that it's in the same package.</li> 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>A "*" indicates that the system may select a default searchable activity, in which 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * case it will typically select web-based search.</li> 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is a snippet showing the necessary addition to the manifest entry for your 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * non-searchable activities. 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <application> 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <meta-data android:name="android.app.default_searchable" 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:value=".MySearchActivity" /> 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- followed by activities, providers, etc... --> 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </application></pre> 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You can also specify android.app.default_searchable on a per-activity basis, by including 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the meta-data element (as shown above) in one or more activity sections. If found, these will 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override the reference in the application section. The only reason to configure your application 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this way would be if you wish to partition it into separate sections with different search 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * behaviors; Otherwise this configuration is not recommended. 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8154c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p><b>Additional metadata for search suggestions.</b> If you have defined a content provider 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to generate search suggestions, you'll need to publish it to the system, and you'll need to 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide a bit of additional XML metadata in order to configure communications with it. 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>First, in your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>, you'll add the 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * following lines. 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Content provider for search suggestions --> 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <provider android:name="YourSuggestionProviderClass" 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:authorities="your.suggestion.authority" /></pre> 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Next, you'll add a few lines to your XML metadata file, as shown: 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Required attribute for any suggestions provider --> 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestAuthority="your.suggestion.authority" 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Optional attribute for configuring queries --> 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection="field =?" 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <!-- Optional attributes for configuring intent construction --> 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestIntentAction="intent action string" 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestIntentData="intent data Uri" /></pre> 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Elements of search metadata that support suggestions: 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestAuthority</th> 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This value must match the authority string provided in the <i>provider</i> section 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>.</td> 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestPath</th> 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, this will be inserted in the suggestions query Uri, after the authority 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you have provide but before the standard suggestions path. This is only required if 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you have a single content provider issuing different types of suggestions (e.g. for 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different data types) and you need a way to disambiguate the suggestions queries 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when they are received.</td> 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestSelection</th> 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, this value will be passed into your query function as the 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>selection</i> parameter. Typically this will be a WHERE clause for your database, 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will contain a single question mark, which represents the actual query string 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that has been typed by the user. However, you can also use any non-null value 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to simply trigger the delivery of the query text (via selection arguments), and then 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use the query text in any way appropriate for your provider (ignoring the actual 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text of the selection parameter.)</td> 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestIntentAction</th> 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, and not overridden by the selected suggestion, this value will be 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * placed in the action field of the {@link android.content.Intent Intent} when the 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user clicks a suggestion.</td> 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:searchSuggestIntentData</th> 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If provided, and not overridden by the selected suggestion, this value will be 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * placed in the data field of the {@link android.content.Intent Intent} when the user 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clicks a suggestion.</td> 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8884c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p><b>Additional metadata for search action keys.</b> For each action key that you would like to 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define, you'll need to add an additional element defining that key, and using the attributes 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * discussed in <a href="#ActionKeys">Action Keys</a>. A simple example is shown here: 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"><actionkey 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:keycode="KEYCODE_CALL" 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:queryActionMsg="call" 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:suggestActionMsg="call" 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:suggestActionMsgColumn="call_column" /></pre> 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Elements of search metadata that support search action keys. Note that although each of the 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action message elements are marked as <i>optional</i>, at least one must be present for the 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action key to have any effect. 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:keycode</th> 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>This attribute denotes the action key you wish to respond to. Note that not 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all action keys are actually supported using this mechanism, as many of them are 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used for typing, navigation, or system functions. This will be added to the 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your searchable activity. To examine the key code, use 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra getIntExtra(SearchManager.ACTION_KEY)}. 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note, in addition to the keycode, you must also provide one or more of the action 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifier attributes.</td> 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">Yes</td> 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:queryActionMsg</th> 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If you wish to handle an action key during normal search query entry, you 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must define an action string here. This will be added to the 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to your 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity. To examine the string, use 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}.</td> 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:suggestActionMsg</th> 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If you wish to handle an action key while a suggestion is being displayed <i>and 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected</i>, there are two ways to handle this. If <i>all</i> of your suggestions 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can handle the action key, you can simply define the action message using this 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute. This will be added to the 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your searchable activity. To examine the string, use 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}.</td> 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>android:suggestActionMsgColumn</th> 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If you wish to handle an action key while a suggestion is being displayed <i>and 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected</i>, but you do not wish to enable this action key for every suggestion, 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then you can use this attribute to control it on a suggestion-by-suggestion basis. 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * First, you must define a column (and name it here) where your suggestions will 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * include the action string. Then, in your content provider, you must provide this 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, and when desired, provide data in this column. 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The search manager will look at your suggestion cursor, using the string 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided here in order to select a column, and will use that to select a string from 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the cursor. That string will be added to the 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your searchable activity. To examine the string, use 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}. <i>If the data does not exist for the 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection suggestion, the action key will be ignored.</i></td> 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td align="center">No</td> 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9644c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p><b>Additional metadata for enabling voice search.</b> To enable voice search for your 9654c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * activity, you can add fields to the metadata that enable and configure voice search. When 9664c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * enabled (and available on the device), a voice search button will be displayed in the 9674c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * Search UI. Clicking this button will launch a voice search activity. When the user has 9684c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * finished speaking, the voice search phrase will be transcribed into text and presented to the 9694c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * searchable activity as if it were a typed query. 9704c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 9714c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <p>Elements of search metadata that support voice search: 9724c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 9734c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 9744c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <thead> 9754c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> 9764c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </thead> 9774c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 9784c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceSearchMode</th> 9794c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided and non-zero, enables voice search. (Voice search may not be 9804c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * provided by the device, in which case these flags will have no effect.) The 9814c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * following mode bits are defined: 9824c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <table border="2" align="center" frame="hsides" rules="rows"> 9834c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tbody> 9844c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>showVoiceSearchButton</th> 9854c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If set, display a voice search button. This only takes effect if voice 9864c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * search is available on the device. If set, then launchWebSearch or 9874c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * launchRecognizer must also be set.</td> 9884c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 9894c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>launchWebSearch</th> 9904c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If set, the voice search button will take the user directly to a 9914c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * built-in voice web search activity. Most applications will not use this 9924c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * flag, as it will take the user away from the activity in which search 9934c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * was invoked.</td> 9944c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 9954c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>launchRecognizer</th> 9964c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If set, the voice search button will take the user directly to a 9974c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * built-in voice recording activity. This activity will prompt the user 9984c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * to speak, transcribe the spoken text, and forward the resulting query 9994c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * text to the searchable activity, just as if the user had typed it into 10004c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * the search UI and clicked the search button.</td> 10014c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10024c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tbody> 10034c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </table></td> 10044c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 10054c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10064c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10074c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceLanguageModel</th> 10084c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, this specifies the language model that should be used by the voice 10094c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * recognition system. 10104c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * See {@link android.speech.RecognizerIntent#EXTRA_LANGUAGE_MODEL} 10114c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * for more information. If not provided, the default value 10124c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * {@link android.speech.RecognizerIntent#LANGUAGE_MODEL_FREE_FORM} will be used.</td> 10134c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 10144c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10154c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10164c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voicePromptText</th> 10174c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, this specifies a prompt that will be displayed during voice input. 10184c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * (If not provided, a default prompt will be displayed.)</td> 10194c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 10204c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10214c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10224c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceLanguage</th> 10234c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, this specifies the spoken language to be expected. This is only 10244c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * needed if it is different from the current value of 10254c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * {@link java.util.Locale#getDefault()}. 10264c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </td> 10274c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 10284c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10294c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10304c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <tr><th>android:voiceMaxResults</th> 10314c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td>If provided, enforces the maximum number of results to return, including the "best" 10324c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * result which will always be provided as the SEARCH intent's primary query. Must be 10334c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * one or greater. Use {@link android.speech.RecognizerIntent#EXTRA_RESULTS} 10344c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * to get the results from the intent. If not provided, the recognizer will choose 10354c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * how many results to return.</td> 10364c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * <td align="center">No</td> 10374c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tr> 10384c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10394c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </tbody> 10404c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * </table> 10414c156ec6ec9adcb407189ee57e0c205039b60148Andy Stadler * 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="PassingSearchContext"></a> 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Passing Search Context</h3> 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In order to improve search experience, an application may wish to specify 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * additional data along with the search, such as local history or context. For 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, a maps search would be improved by including the current location. 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In order to simplify the structure of your activities, this can be done using 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search manager. 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Any data can be provided at the time the search is launched, as long as it 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be stored in a {@link android.os.Bundle Bundle} object. 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To pass application data into the Search Manager, you'll need to override 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested onSearchRequested} as follows: 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @Override 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public boolean onSearchRequested() { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bundle appData = new Bundle(); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.put...(); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.put...(); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * startSearch(null, false, appData); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return true; 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To receive application data from the Search Manager, you'll extract it from 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} as follows: 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final Bundle appData = queryIntent.getBundleExtra(SearchManager.APP_DATA); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if (appData != null) { 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.get...(); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appData.get...(); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre> 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProtectingUserPrivacy"></a> 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Protecting User Privacy</h3> 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Many users consider their activities on the phone, including searches, to be private 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information. Applications that implement search should take steps to protect users' privacy 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wherever possible. This section covers two areas of concern, but you should consider your search 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * design carefully and take any additional steps necessary. 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Don't send personal information to servers, and if you do, don't log it.</b> 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Personal information" is information that can personally identify your users, such as name, 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * email address or billing information, or other data which can be reasonably linked to such 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information. If your application implements search with the assistance of a server, try to 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * avoid sending personal information with your searches. For example, if you are searching for 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The 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 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the server. If you do need to send personal information, you should take steps to avoid 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * logging it. If you must log it, you should protect that data very carefully, and erase it as 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * soon as possible. 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Provide the user with a way to clear their search history.</b> The Search Manager helps 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your application provide context-specific suggestions. Sometimes these suggestions are based 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on previous searches, or other actions taken by the user in an earlier session. A user may not 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wish for previous searches to be revealed to other users, for instance if they share their phone 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a friend. If your application provides suggestions that can reveal previous activities, 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you should implement a "Clear History" menu, preference, or button. If you are using 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.provider.SearchRecentSuggestions}, you can simply call its 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.provider.SearchRecentSuggestions#clearHistory() clearHistory()} method from 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your "Clear History" UI. If you are implementing your own form of recent suggestions, you'll 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to provide a similar a "clear history" API in your provider, and call it from your 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Clear History" UI. 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SearchManager 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11118d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 11128d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static final boolean DBG = false; 11138d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static final String TAG = "SearchManager"; 11148d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a shortcut definition for the default menu key to use for invoking search. 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Menu.Item.setAlphabeticShortcut() for more information. 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static char MENU_KEY = 's'; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a shortcut definition for the default menu key to use for invoking search. 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Menu.Item.setAlphabeticShortcut() for more information. 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int MENU_KEYCODE = KeyEvent.KEYCODE_S; 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getStringExtra()} 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the query string from Intent.ACTION_SEARCH. 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String QUERY = "query"; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11385f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * Intent extra data key: Use this key with 11395f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link android.content.Intent#getStringExtra 11405f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * content.Intent.getStringExtra()} 11415f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * to obtain the query string typed in by the user. 11425f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * This may be different from the value of {@link #QUERY} 11435f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * if the intent is the result of selecting a suggestion. 11445f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * In that case, {@link #QUERY} will contain the value of 11455f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link #SUGGEST_COLUMN_QUERY} for the suggestion, and 11465f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * {@link #USER_QUERY} will contain the string typed by the 11475f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert * user. 11485f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert */ 11495f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert public final static String USER_QUERY = "user_query"; 11505f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert 11515f80605a0b866f34c74955e190909bd6ab5d992eBjorn Bringert /** 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getBundleExtra 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getBundleExtra()} 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain any additional app-specific data that was inserted by the 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity that launched the search. 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String APP_DATA = "app_data"; 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent app_data bundle key: Use this key with the bundle from 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getBundleExtra 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content.Intent.getBundleExtra(APP_DATA)} to obtain the source identifier 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set by the activity that launched the search. 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SOURCE = "source"; 1169a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra content.Intent.getIntExtra()} 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the keycode that the user used to trigger this query. It will be zero if the 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user simply pressed the "GO" button on the search UI. This is primarily used in conjunction 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the keycode attribute in the actionkey element of your searchable.xml configuration 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_KEY = "action_key"; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1181bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * Intent component name key: This key will be used for the extra populated by the 1182bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * {@link #SUGGEST_COLUMN_INTENT_COMPONENT_NAME} column. 1183bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * 1184bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * {@hide} 1185bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath */ 1186bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath public final static String COMPONENT_NAME_KEY = "intent_component_name_key"; 1187bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath 1188bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath /** 1189875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Intent extra data key: This key will be used for the extra populated by the 1190875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column. 1191875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1192875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static String EXTRA_DATA_KEY = "intent_extra_data_key"; 1193a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 1194a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen /** 11951c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * Defines the constants used in the communication between {@link android.app.SearchDialog} and 11961c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * the global search provider via {@link Cursor#respond(android.os.Bundle)}. 1197a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * 11981c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * @hide 1199a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen */ 12001c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public static class DialogCursorProtocol { 1201a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 12021c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen /** 12031c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * The sent bundle will contain this integer key, with a value set to one of the events 12041c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * below. 12051c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen */ 12061c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static String METHOD = "DialogCursorProtocol.method"; 1207a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 12081c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen /** 12091c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * After data has been refreshed. 12101c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen */ 12111c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static int POST_REFRESH = 0; 12121c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static String POST_REFRESH_RECEIVE_ISPENDING 12131c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen = "DialogCursorProtocol.POST_REFRESH.isPending"; 12141c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static String POST_REFRESH_RECEIVE_DISPLAY_NOTIFY 12151c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen = "DialogCursorProtocol.POST_REFRESH.displayNotify"; 12161c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen 12171c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen /** 12181c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * Just before closing the cursor. 12191c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen */ 12201c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static int PRE_CLOSE = 1; 12211c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static String PRE_CLOSE_SEND_MAX_DISPLAY_POS 12221c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen = "DialogCursorProtocol.PRE_CLOSE.sendDisplayPosition"; 12231c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen 12241c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen /** 12251c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * When a position has been clicked. 12261c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen */ 12271c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static int CLICK = 2; 12281c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static String CLICK_SEND_POSITION 12291c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen = "DialogCursorProtocol.CLICK.sendPosition"; 12301c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static String CLICK_RECEIVE_SELECTED_POS 12311c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen = "DialogCursorProtocol.CLICK.receiveSelectedPosition"; 12321c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen 12331c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen /** 12341c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen * When the threshold received in {@link #POST_REFRESH_RECEIVE_DISPLAY_NOTIFY} is displayed. 12351c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen */ 12361c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen public final static int THRESH_HIT = 3; 12371c54cf0903cd81467ca41ec6733c459e10b22763Karl Rosaen } 1238a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 1239875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent extra data key: Use this key with Intent.ACTION_SEARCH and 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra content.Intent.getStringExtra()} 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to obtain the action message that was defined for a particular search action key and/or 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion. It will be null if the search was launched by typing "enter", touched the the 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "GO" button, or other means not involving any action key. 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_MSG = "action_msg"; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Uri path for queried suggestions data. This is the path that the search manager 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use when querying your content provider for suggestions data based on user input 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (e.g. looking for partial matches). 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Typically you'll use this with a URI matcher. 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_URI_PATH_QUERY = "search_suggest_query"; 1255b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 1256b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 1257b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * MIME type for suggestions data. You'll use this in your suggestions content provider 1258b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * in the getType() function. 1259b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen */ 1260b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen public final static String SUGGEST_MIME_TYPE = 1261b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen "vnd.android.cursor.dir/vnd.android.search.suggest"; 1262b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen 1263b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen /** 1264b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Uri path for shortcut validation. This is the path that the search manager will use when 1265b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * querying your content provider to refresh a shortcutted suggestion result and to check if it 1266b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * is still valid. When asked, a source may return an up to date result, or no result. No 1267b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * result indicates the shortcut refers to a no longer valid sugggestion. 1268b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * 1269b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * @see #SUGGEST_COLUMN_SHORTCUT_ID 1270b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 1271b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut"; 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1274b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen * MIME type for shortcut validation. You'll use this in your suggestions content provider 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the getType() function. 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1277b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen public final static String SHORTCUT_MIME_TYPE = 1278b619c9198efa0108a692d352b0e7eaa534f922f3Karl Rosaen "vnd.android.cursor.item/vnd.android.search.suggest"; 1279d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 1280d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 1281d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen /** 1282d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * The authority of the provider to report clicks to when a click is detected after pivoting 1283d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * into a specific app's search from global search. 1284d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * 1285d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * In addition to the columns below, the suggestion columns are used to pass along the full 1286d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * suggestion so it can be shortcutted. 1287d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * 1288d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * @hide 1289d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen */ 1290d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen public final static String SEARCH_CLICK_REPORT_AUTHORITY = 1291d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen "com.android.globalsearch.stats"; 1292d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 1293d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen /** 1294d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * The path the write goes to. 1295d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * 1296d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * @hide 1297d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen */ 1298d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen public final static String SEARCH_CLICK_REPORT_URI_PATH = "click"; 1299d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 1300d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen /** 1301d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * The column storing the query for the click. 1302d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * 1303d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * @hide 1304d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen */ 1305d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen public final static String SEARCH_CLICK_REPORT_COLUMN_QUERY = "query"; 1306d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 1307d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen /** 1308d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * The column storing the component name of the application that was pivoted into. 1309d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * 1310d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen * @hide 1311d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen */ 1312d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen public final static String SEARCH_CLICK_REPORT_COLUMN_COMPONENT = "component"; 1313d4c98c4c450a95b67fe9746675984333b7653713Karl Rosaen 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Unused - can be null or column can be omitted.</i> 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_FORMAT = "suggest_format"; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Required.</i> This is the primary line of text that 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be presented to the user as the suggestion. 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1"; 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then all suggestions will be provided in a two-line format. The second line of text is in 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a much smaller appearance. 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2"; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 1331875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * then all suggestions will be provided in a format that includes space for two small icons, 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one at the left and one at the right of each suggestion. The data in the column must 1333875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be a resource ID of a drawable, or a URI in one of the following formats: 1334875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1335875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <ul> 1336875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 1337875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 1338875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> 1339875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </ul> 1340875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1341875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)} 1342875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * for more information on these schemes. 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1"; 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column, 1347875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * then all suggestions will be provided in a format that includes space for two small icons, 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one at the left and one at the right of each suggestion. The data in the column must 1349875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be a resource ID of a drawable, or a URI in one of the following formats: 1350875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1351875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <ul> 1352875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 1353875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 1354875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> 1355875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </ul> 1356875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1357875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)} 1358875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * for more information on these schemes. 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2"; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, this is the action that will be used when 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forming the suggestion's intent. If the element is not provided, the action will be taken 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the android:searchSuggestIntentAction field in your XML metadata. <i>At least one of 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these must be present for the suggestion to generate an intent.</i> Note: If your action is 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same for all suggestions, it is more efficient to specify it using XML metadata and omit 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it from the cursor. 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action"; 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, this is the data that will be used when 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forming the suggestion's intent. If the element is not provided, the data will be taken 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the android:searchSuggestIntentData field in your XML metadata. If neither source 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is provided, the Intent's data field will be null. Note: If your data is 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same for all suggestions, or can be described using a constant part and a specific ID, 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is more efficient to specify it using XML metadata and omit it from the cursor. 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data"; 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1382bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 1383bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * this element exists at the given row, this is the data that will be used when 1384bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * forming the suggestion's intent. If not provided, the Intent's extra data field will be null. 1385bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * This column allows suggestions to provide additional arbitrary data which will be included as 1386131234c6f134c586208ec94bfe4ae021b057cf66Mike LeBeau * an extra under the key {@link #EXTRA_DATA_KEY}. 1387bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath */ 1388bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data"; 1389bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath /** 1390875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Column name for suggestions cursor. <i>Optional.</i> This column allows suggestions 1391875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * to provide additional arbitrary data which will be included as an extra under the key 1392bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath * {@link #COMPONENT_NAME_KEY}. For use by the global search system only - if other providers 139321fd5f144a3e6919ff6b4e8a1a733c940d5dd6dfMike LeBeau * attempt to use this column, the value will be overwritten by global search. 1394a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * 139521fd5f144a3e6919ff6b4e8a1a733c940d5dd6dfMike LeBeau * @hide 1396875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1397bf23fe062ab4321143717c21827d329e087cc72fSatish Sampath public final static String SUGGEST_COLUMN_INTENT_COMPONENT_NAME = "suggest_intent_component"; 1398875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i> 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this element exists at the given row, then "/" and this value will be appended to the data 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field in the Intent. This should only be used if the data field has already been set to an 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate base string. 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id"; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Column name for suggestions cursor. <i>Required if action is 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</i> If this 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column exists <i>and</i> this element exists at the given row, this is the data that will be 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used when forming the suggestion's query. 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String SUGGEST_COLUMN_QUERY = "suggest_intent_query"; 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1413875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 1414b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Column name for suggestions cursor. <i>Optional.</i> This column is used to indicate whether 1415b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * a search suggestion should be stored as a shortcut, and whether it should be validated. If 1416b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * missing, the result will be stored as a shortcut and never validated. If set to 1417b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. 1418b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Otherwise, the shortcut id will be used to check back for validation via 1419b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * {@link #SUGGEST_URI_PATH_SHORTCUT}. 1420b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 1421b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id"; 1422b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 1423b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 14241c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify the 14251c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * cursor item's background color if it needs a non-default background color. A non-zero value 14261c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * indicates a valid background color to override the default. 14271c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * 14281c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath * @hide For internal use, not part of the public API. 14291c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath */ 14301c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath public final static String SUGGEST_COLUMN_BACKGROUND_COLOR = "suggest_background_color"; 1431ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau 1432ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau /** 1433ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify 1434ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion 1435ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau * is being refreshed. 1436ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau */ 1437ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = 1438ce0959df5ca49cf8f726adddb65978da83e42544Mike LeBeau "suggest_spinner_while_refreshing"; 14391c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath 14401c5fa0f31009502c539c65de99010b63cb617aacSatish Sampath /** 1441b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion 1442b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen * should not be stored as a shortcut in global search. 1443b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen */ 1444b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1"; 1445b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen 1446b2a5011578d4a64df2f39bdeeedfe9f37e7aecc4Karl Rosaen /** 1447875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION}, 1448875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * the search dialog will switch to a different suggestion source when the 1449875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * suggestion is clicked. 1450875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1451875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #SUGGEST_COLUMN_INTENT_DATA} must contain 1452875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * the flattened {@link ComponentName} of the activity which is to be searched. 1453875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1454875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * TODO: Should {@link #SUGGEST_COLUMN_INTENT_DATA} instead contain a URI in the format 1455875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * used by {@link android.provider.Applications}? 1456875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1457875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * TODO: This intent should be protected by the same permission that we use 1458875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * for replacing the global search provider. 1459875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1460875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The query text field will be set to the value of {@link #SUGGEST_COLUMN_QUERY}. 1461875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1462875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval. 1463875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1464875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static String INTENT_ACTION_CHANGE_SEARCH_SOURCE 1465875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen = "android.search.action.CHANGE_SEARCH_SOURCE"; 1466a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 1467875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 146874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * Intent action for finding the global search activity. 146974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * The global search provider should handle this intent. 147074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * 147174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * @hide Pending API council approval. 147274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert */ 147374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert public final static String INTENT_ACTION_GLOBAL_SEARCH 147474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert = "android.search.action.GLOBAL_SEARCH"; 147574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert 147674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /** 1477875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Intent action for starting the global search settings activity. 1478875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The global search provider should handle this intent. 1479875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1480875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval. 1481875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 1482875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static String INTENT_ACTION_SEARCH_SETTINGS 1483875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen = "android.search.action.SEARCH_SETTINGS"; 14843a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau 14853a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau /** 14863a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * Intent action for starting a web search provider's settings activity. 14873a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * Web search providers should handle this intent if they have provider-specific 14883a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau * settings to implement. 14893a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau */ 14903a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS 14913a27803b29dc739685e1e2465a0ca697e4b60d14Mike LeBeau = "android.search.action.WEB_SEARCH_SETTINGS"; 1492a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen 1493a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen /** 1494f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Intent action broadcasted to inform that the searchables list or default have changed. 1495f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Components should handle this intent if they cache any searchable data and wish to stay 1496f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * up to date on changes. 1497f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 1498f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath public final static String INTENT_ACTION_SEARCHABLES_CHANGED 1499f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath = "android.search.action.SEARCHABLES_CHANGED"; 1500d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau 1501d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau /** 1502d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau * Intent action broadcasted to inform that the search settings have changed in some way. 1503d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau * Either searchables have been enabled or disabled, or a different web search provider 1504d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau * has been chosen. 1505d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau */ 1506d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED 1507d4fb7a0d90b16e360b7a7b64cb7a6fd94f084c27Mike LeBeau = "android.search.action.SETTINGS_CHANGED"; 1508f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1509f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1510a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION}, 1511a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * the search dialog will take no action. 1512a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * 1513a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * @hide 1514a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen */ 1515a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen public final static String INTENT_ACTION_NONE = "android.search.action.ZILCH"; 1516875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1517875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 1518875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Reference to the shared system search service. 1519875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 15208d1538237847baf381787b881141f8c0478bef5bBjorn Bringert private static ISearchManager mService; 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 15238d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 1524b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn private int mIdent; 1525b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn 15268d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert // package private since they are used by the inner class SearchManagerCallback 15278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ final Handler mHandler; 15288d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ OnDismissListener mDismissListener = null; 15298d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert /* package */ OnCancelListener mCancelListener = null; 15308d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 15318d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private final SearchManagerCallback mSearchManagerCallback = new SearchManagerCallback(); 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ SearchManager(Context context, Handler handler) { 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = handler; 15368d1538237847baf381787b881141f8c0478bef5bBjorn Bringert mService = ISearchManager.Stub.asInterface( 15378d1538237847baf381787b881141f8c0478bef5bBjorn Bringert ServiceManager.getService(Context.SEARCH_SERVICE)); 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1540b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn /*package*/ void setIdent(int ident) { 1541b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn if (mIdent != 0) { 1542b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn throw new IllegalStateException("mIdent already set"); 1543b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn } 1544b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn mIdent = ident; 1545b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn } 1546b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Launch search UI. 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The search manager will open a search widget in an overlapping 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window, and the underlying activity may be obscured. The search 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry state will remain in effect until one of the following events: 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The user completes the search. In most cases this will launch 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search intent.</li> 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The user uses the back, home, or other keys to exit the search.</li> 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The application calls the {@link #stopSearch} 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method, which will hide the search window and return focus to the 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity from which it was launched.</li> 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most applications will <i>not</i> use this interface to invoke search. 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The primary method for invoking search is to call 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested Activity.onSearchRequested()} or 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startSearch Activity.startSearch()}. 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param initialQuery A search string can be pre-entered here, but this 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is typically null or empty. 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectInitialQuery If true, the intial query will be preselected, which means that 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any further typing will replace it. This is useful for cases where an entire pre-formed 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * query is being inserted. If false, the selection point will be placed at the end of the 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inserted query. This is useful when the inserted query is text that the user entered, 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the user would expect to be able to keep typing. <i>This parameter is only meaningful 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if initialQuery is a non-empty string.</i> 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param launchActivity The ComponentName of the activity that has launched this search. 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param appSearchData An application can insert application-specific 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context here, in order to improve quality or specificity of its own 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searches. This data will be returned with SEARCH intent(s). Null if 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no extra data is required. 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param globalSearch If false, this will only launch the search that has been specifically 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defined by the application (which is usually defined as a local search). If no default 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search is defined in the current application or activity, no search will be launched. 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If true, this will always launch a platform-global (e.g. web-based) search instead. 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.Activity#onSearchRequested 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #stopSearch 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startSearch(String initialQuery, 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selectInitialQuery, 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName launchActivity, 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle appSearchData, 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean globalSearch) { 1592b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn if (mIdent == 0) throw new IllegalArgumentException( 1593b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn "Called from outside of an Activity context"); 15948d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert try { 15958d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert // activate the search manager and start it up! 15968d1538237847baf381787b881141f8c0478bef5bBjorn Bringert mService.startSearch(initialQuery, selectInitialQuery, launchActivity, appSearchData, 1597b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn globalSearch, mSearchManagerCallback, mIdent); 15988d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } catch (RemoteException ex) { 15998d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "startSearch() failed: " + ex); 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Terminate search UI. 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Typically the user will terminate the search UI by launching a 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search or by canceling. This function allows the underlying application 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or activity to cancel the search prematurely (for any reason). 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This function can be safely called at any time (even if no search is active.) 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #startSearch 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16148d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void stopSearch() { 1615ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen if (DBG) debug("stopSearch()"); 16168d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert try { 16178d1538237847baf381787b881141f8c0478bef5bBjorn Bringert mService.stopSearch(); 16188d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } catch (RemoteException ex) { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determine if the Search UI is currently displayed. 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is provided primarily for application test purposes. 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the search UI is currently displayed. 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16318d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public boolean isVisible() { 1632ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen if (DBG) debug("isVisible()"); 1633ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen try { 1634ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen return mService.isVisible(); 1635ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen } catch (RemoteException e) { 1636ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen Log.e(TAG, "isVisible() failed: " + e); 1637ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen return false; 1638ea52d29bc46c306f3607d121aa1ad84f0e9eb473Karl Rosaen } 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16408d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1642a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * See {@link SearchManager#setOnDismissListener} for configuring your activity to monitor 1643a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * search UI state. 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDismissListener { 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1647a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * This method will be called when the search UI is dismissed. To make use of it, you must 1648a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * implement this method in your activity, and call 1649a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * {@link SearchManager#setOnDismissListener} to register it. 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDismiss(); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1655a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * See {@link SearchManager#setOnCancelListener} for configuring your activity to monitor 1656a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * search UI state. 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnCancelListener { 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will be called when the search UI is canceled. To make use if it, you must 1661a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * implement this method in your activity, and call 1662a058f02b591d971a829cb1e28d48a992e46ad85eKarl Rosaen * {@link SearchManager#setOnCancelListener} to register it. 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCancel(); 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the callback that will be invoked whenever the search UI is dismissed. 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The {@link OnDismissListener} to use, or null. 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnDismissListener(final OnDismissListener listener) { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDismissListener = listener; 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the callback that will be invoked whenever the search UI is canceled. 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The {@link OnCancelListener} to use, or null. 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16818d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void setOnCancelListener(OnCancelListener listener) { 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCancelListener = listener; 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16848d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 16858d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private class SearchManagerCallback extends ISearchManagerCallback.Stub { 16868d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 16878d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private final Runnable mFireOnDismiss = new Runnable() { 16888d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void run() { 16898d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert if (DBG) debug("mFireOnDismiss"); 16908d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert if (mDismissListener != null) { 16918d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert mDismissListener.onDismiss(); 16928d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 16938d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 16948d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert }; 16958d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 16968d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private final Runnable mFireOnCancel = new Runnable() { 16978d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void run() { 16988d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert if (DBG) debug("mFireOnCancel"); 16998d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert if (mCancelListener != null) { 17008d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert mCancelListener.onCancel(); 17018d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17038d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert }; 17048d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 17058d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onDismiss() { 17068d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert if (DBG) debug("onDismiss()"); 17078d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert mHandler.post(mFireOnDismiss); 17088d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 17098d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 17108d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onCancel() { 17118d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert if (DBG) debug("onCancel()"); 17128d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert mHandler.post(mFireOnCancel); 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17148d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 17158d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 17168d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 17170e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert /** 17180e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert * @deprecated This method is an obsolete internal implementation detail. Do not use. 17190e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert */ 17208d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onCancel(DialogInterface dialog) { 17218d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert throw new UnsupportedOperationException(); 17228d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 17230e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert 17240e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert /** 17250e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert * @deprecated This method is an obsolete internal implementation detail. Do not use. 17260e01ea41b215941128a4ea8dee454e6b35a4e798Bjorn Bringert */ 17278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert public void onDismiss(DialogInterface dialog) { 17288d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert throw new UnsupportedOperationException(); 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1732875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Gets information about a searchable activity. This method is static so that it can 1733875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be used from non-Activity contexts. 1734875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1735875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param componentName The activity to get searchable information for. 1736875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param globalSearch If <code>false</code>, return information about the given activity. 1737875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * If <code>true</code>, return information about the global search activity. 1738875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return Searchable information, or <code>null</code> if the activity is not searchable. 1739875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1740875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide because SearchableInfo is not part of the API. 1741875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 17428d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public SearchableInfo getSearchableInfo(ComponentName componentName, 1743875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen boolean globalSearch) { 1744875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen try { 17458d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mService.getSearchableInfo(componentName, globalSearch); 17468d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } catch (RemoteException ex) { 17478d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchableInfo() failed: " + ex); 1748875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 1749875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1750875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1751875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1752875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 1753875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Checks whether the given searchable is the default searchable. 1754875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 1755875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide because SearchableInfo is not part of the API. 1756875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 17578d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public boolean isDefaultSearchable(SearchableInfo searchable) { 17588d1538237847baf381787b881141f8c0478bef5bBjorn Bringert SearchableInfo defaultSearchable = getSearchableInfo(null, true); 1759875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return defaultSearchable != null 1760a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert && defaultSearchable.getSearchActivity().equals(searchable.getSearchActivity()); 1761875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 17628d1538237847baf381787b881141f8c0478bef5bBjorn Bringert 1763875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 176497325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * Gets a cursor with search suggestions. 176597325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * 176697325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @param searchable Information about how to get the suggestions. 176797325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @param query The search text entered (so far). 176897325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @return a cursor with suggestions, or <code>null</null> the suggestion query failed. 176997325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * 177097325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert * @hide because SearchableInfo is not part of the API. 177197325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert */ 177297325db8565ad503b86d9a0f602b2d001b5cee13Bjorn Bringert public Cursor getSuggestions(SearchableInfo searchable, String query) { 1773875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (searchable == null) { 1774875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 1775875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1776875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1777875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String authority = searchable.getSuggestAuthority(); 1778875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (authority == null) { 1779875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 1780875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1781875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1782875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen Uri.Builder uriBuilder = new Uri.Builder() 1783875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .scheme(ContentResolver.SCHEME_CONTENT) 1784875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .authority(authority); 1785875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1786875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // if content path provided, insert it now 1787875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen final String contentPath = searchable.getSuggestPath(); 1788875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (contentPath != null) { 1789875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendEncodedPath(contentPath); 1790875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1791875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1792875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // append standard suggestion query path 1793875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); 1794875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1795875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // get the query selection, may be null 1796875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String selection = searchable.getSuggestSelection(); 1797875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // inject query, either as selection args or inline 1798875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen String[] selArgs = null; 1799875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (selection != null) { // use selection if provided 1800875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen selArgs = new String[] { query }; 1801875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { // no selection, use REST pattern 1802875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen uriBuilder.appendPath(query); 1803875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1804875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1805875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen Uri uri = uriBuilder 1806875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() 1807875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .fragment("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() 1808875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen .build(); 1809875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1810875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // finally, make the query 18118d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mContext.getContentResolver().query(uri, null, selection, selArgs, null); 1812875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 1813875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 18146d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert /** 18156d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * Returns a list of the searchable activities that can be included in global search. 18166d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * 18176d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * @return a list containing searchable information for all searchable activities 18186d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * that have the <code>exported</code> attribute set in their searchable 18196d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * meta-data. 18206d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * 18216d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * @hide because SearchableInfo is not part of the API. 18226d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert */ 18238d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public List<SearchableInfo> getSearchablesInGlobalSearch() { 18246d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert try { 18258d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mService.getSearchablesInGlobalSearch(); 18266d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } catch (RemoteException e) { 18278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchablesInGlobalSearch() failed: " + e); 18286d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert return null; 18296d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 18306d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 1831f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1832f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1833f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Returns a list of the searchable activities that handle web searches. 1834f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * 18358d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert * @return a list of all searchable activities that handle 18368d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert * {@link android.content.Intent#ACTION_WEB_SEARCH}. 1837f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * 1838f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * @hide because SearchableInfo is not part of the API. 1839f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 18408d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public List<SearchableInfo> getSearchablesForWebSearch() { 1841f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath try { 18428d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mService.getSearchablesForWebSearch(); 1843f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } catch (RemoteException e) { 18448d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getSearchablesForWebSearch() failed: " + e); 1845f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath return null; 1846f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 1847f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 1848f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1849f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1850f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Returns the default searchable activity for web searches. 1851f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * 1852f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * @return searchable information for the activity handling web searches by default. 1853f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * 1854f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * @hide because SearchableInfo is not part of the API. 1855f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 18568d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public SearchableInfo getDefaultSearchableForWebSearch() { 1857f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath try { 18588d1538237847baf381787b881141f8c0478bef5bBjorn Bringert return mService.getDefaultSearchableForWebSearch(); 1859f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } catch (RemoteException e) { 18608d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "getDefaultSearchableForWebSearch() failed: " + e); 1861f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath return null; 1862f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 1863f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 1864f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1865f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1866f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * Sets the default searchable activity for web searches. 1867f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * 1868f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * @param component Name of the component to set as default activity for web searches. 1869f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * 1870f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath * @hide 1871f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 18728d1538237847baf381787b881141f8c0478bef5bBjorn Bringert public void setDefaultWebSearch(ComponentName component) { 1873f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath try { 18748d1538237847baf381787b881141f8c0478bef5bBjorn Bringert mService.setDefaultWebSearch(component); 1875f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } catch (RemoteException e) { 18768d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.e(TAG, "setDefaultWebSearch() failed: " + e); 1877f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 1878f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 18798d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert 18808d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert private static void debug(String msg) { 18818d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Thread thread = Thread.currentThread(); 18828d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert Log.d(TAG, msg + " (" + thread.getName() + "-" + thread.getId() + ")"); 18838d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert } 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1885