SearchManager.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides access to the system search services.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In practice, you won't interact with this class directly, as search
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * services are provided through methods in {@link android.app.Activity Activity}
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods and the the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}.  This class does provide a basic
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overview of search services and how to integrate them with your activities.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you do require direct access to the Search Manager, do not instantiate
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this class directly; instead, retrieve it through
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context.getSystemService(Context.SEARCH_SERVICE)}.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#DeveloperGuide">Developer Guide</a>
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#HowSearchIsInvoked">How Search Is Invoked</a>
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#QuerySearchApplications">Query-Search Applications</a>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#FilterSearchApplications">Filter-Search Applications</a>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Suggestions">Search Suggestions</a>
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ActionKeys">Action Keys</a>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#SearchabilityMetadata">Searchability Metadata</a>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#PassingSearchContext">Passing Search Context</a>
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProtectingUserPrivacy">Protecting User Privacy</a>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="DeveloperGuide"></a>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Developer Guide</h3>
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The ability to search for user, system, or network based data is considered to be
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a core user-level feature of the android platform.  At any time, the user should be
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * able to use a familiar command, button, or keystroke to invoke search, and the user
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be able to search any data which is available to them.  The goal is to make search
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appear to the user as a seamless, system-wide feature.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In terms of implementation, there are three broad classes of Applications:
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Applications that are not inherently searchable</li>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Query-Search Applications</li>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Filter-Search Applications</li>
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>These categories, as well as related topics, are discussed in
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the sections below.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Even if your application is not <i>searchable</i>, it can still support the invocation of
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search.  Please review the section <a href="#HowSearchIsInvoked">How Search Is Invoked</a>
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for more information on how to support this.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Many applications are <i>searchable</i>.  These are
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the applications which can convert a query string into a list of results.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Within this subset, applications can be grouped loosely into two families:
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li><i>Query Search</i> applications perform batch-mode searches - each query string is
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * converted to a list of results.</li>
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><i>Filter Search</i> applications provide live filter-as-you-type searches.</li></ul>
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Generally speaking, you would use query search for network-based data, and filter
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search for local data, but this is not a hard requirement and applications
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are free to use the model that fits them best (or invent a new model).
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It should be clear that the search implementation decouples "search
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invocation" from "searchable".  This satisfies the goal of making search appear
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be "universal".  The user should be able to launch any search from
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * almost any context.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="HowSearchIsInvoked"></a>
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>How Search Is Invoked</h3>
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unless impossible or inapplicable, all applications should support
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoking the search UI.  This means that when the user invokes the search command,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search UI will be presented to them.  The search command is currently defined as a menu
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item called "Search" (with an alphabetic shortcut key of "S"), or on some devices, a dedicated
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search button key.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If your application is not inherently searchable, you can also allow the search UI
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be invoked in a "web search" mode.  If the user enters a search term and clicks the
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Search" button, this will bring the browser to the front and will launch a web-based
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search.  The user will be able to click the "Back" button and return to your application.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In general this is implemented by your activity, or the {@link android.app.Activity Activity}
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * base class, which captures the search command and invokes the Search Manager to
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display and operate the search UI.  You can also cause the search UI to be presented in response
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to user keystrokes in your activity (for example, to instantly start filter searching while
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * viewing a list and typing any key).
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The search UI is presented as a floating
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window and does not cause any change in the activity stack.  If the user
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cancels search, the previous activity re-emerges.  If the user launches a
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search, this will be done by sending a search {@link android.content.Intent Intent} (see below),
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the normal intent-handling sequence will take place (your activity will pause,
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * etc.)
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>What you need to do:</b> First, you should consider the way in which you want to
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handle invoking search.  There are four broad (and partially overlapping) categories for
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you to choose from.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>You can capture the search command yourself, by including a <i>search</i>
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * button or menu item - and invoking the search UI directly.</li>
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can provide a <i>type-to-search</i> feature, in which search is invoked automatically
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the user enters any characters.</li>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Even if your application is not inherently searchable, you can allow web search,
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * via the search key (or even via a search menu item).
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can disable search entirely.  This should only be used in very rare circumstances,
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as search is a system-wide feature and users will expect it to be available in all contexts.</li>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to define a search menu.</b>  The system provides the following resources which may
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be useful when adding a search item to your menu:
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>android.R.drawable.ic_search_category_default is an icon you can use in your menu.</li>
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link #MENU_KEY SearchManager.MENU_KEY} is the recommended alphabetic shortcut.</li>
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to invoke search directly.</b>  In order to invoke search directly, from a button
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or menu item, you can launch a generic search by calling
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested onSearchRequested} as shown:
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onSearchRequested();</pre>
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to implement type-to-search.</b>  While setting up your activity, call
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setDefaultKeyMode setDefaultKeyMode}:
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);   // search within your activity
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL);  // search using platform global search</pre>
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to enable web-based search.</b>  In addition to searching within your activity or
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, you can also use the Search Manager to invoke a platform-global search, typically
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a web search.  There are two ways to do this:
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>You can simply define "search" within your application or activity to mean global search.
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is described in more detail in the
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.  Briefly, you will
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * add a single meta-data entry to your manifest, declaring that the default search
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your application is "*".  This indicates to the system that no application-specific
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * search activity is provided, and that it should launch web-based search instead.</li>
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You can specify this at invocation time via default keys (see above), overriding
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested}, or via a direct call to
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startSearch}.  This is most useful if you wish to provide local
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchability <i>and</i> access to global search.</li></ul>
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>How to disable search from your activity.</b>  search is a system-wide feature and users
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will expect it to be available in all contexts.  If your UI design absolutely precludes
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launching search, override {@link android.app.Activity#onSearchRequested onSearchRequested}
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as shown:
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &#64;Override
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public boolean onSearchRequested() {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *    return false;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre>
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Managing focus and knowing if Search is active.</b>  The search UI is not a separate
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity, and when the UI is invoked or dismissed, your activity will not typically be paused,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resumed, or otherwise notified by the methods defined in
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html#actlife">Application Fundamentals:
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Lifecycle</a>.  The search UI is
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handled in the same way as other system UI elements which may appear from time to time, such as
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notifications, screen locks, or other system alerts:
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When the search UI appears, your activity will lose input focus.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When the search activity is dismissed, there are three possible outcomes:
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>If the user simply canceled the search UI, your activity will regain input focus and
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proceed as before.  See {@link #setOnDismissListener} and {@link #setOnCancelListener} if you
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required direct notification of search dialog dismissals.</li>
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user launched a search, and this required switching to another activity to receive
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and process the search {@link android.content.Intent Intent}, your activity will receive the
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * normal sequence of activity pause or stop notifications.</li>
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user launched a search, and the current activity is the recipient of the search
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, you will receive notification via the
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onNewIntent onNewIntent()} method.</li></ul>
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This list is provided in order to clarify the ways in which your activities will interact with
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search UI.  More details on searchable activities and search intents are provided in the
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sections below.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="QuerySearchApplications"></a>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Query-Search Applications</h3>
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Query-search applications are those that take a single query (e.g. a search
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string) and present a set of results that may fit.  Primary examples include
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * web queries, map lookups, or email searches (with the common thread being
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network query dispatch).  It may also be the case that certain local searches
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are treated this way.  It's up to the application to decide.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>What you need to do:</b>  The following steps are necessary in order to
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implement query search.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement search invocation as described above.  (Strictly speaking,
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these are decoupled, but it would make little sense to be "searchable" but not
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "search-invoking".)</li>
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Your application should have an activity that takes a search string and
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * converts it to a list of results.  This could be your primary display activity
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or it could be a dedicated search results activity.  This is your <i>searchable</i>
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity and every query-search application must have one.</li>
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In the searchable activity, in onCreate(), you must receive and handle the
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}.  The text to search (query string) for is provided by
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calling
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #QUERY getStringExtra(SearchManager.QUERY)}.</li>
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To identify and support your searchable activity, you'll need to
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide an XML file providing searchability configuration parameters, a reference to that
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in your searchable activity's <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry, and an intent-filter declaring that you can
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive ACTION_SEARCH intents.  This is described in more detail in the
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.</li>
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> also needs a metadata entry
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providing a global reference to the searchable activity.  This is the "glue" directing the search
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * UI, when invoked from any of your <i>other</i> activities, to use your application as the
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default search context.  This is also described in more detail in the
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.</li>
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Finally, you may want to define your search results activity as with the
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#launchMode singleTop} launchMode flag.  This allows the system
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch searches from/to the same activity without creating a pile of them on the
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity stack.  If you do this, be sure to also override
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onNewIntent onNewIntent} to handle the
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * updated intents (with new queries) as they arrive.</li>
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Code snippet showing handling of intents in your search activity:
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &#64;Override
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     super.onCreate(icicle);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     final Intent queryIntent = getIntent();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     final String queryAction = queryIntent.getAction();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     if (Intent.ACTION_SEARCH.equals(queryAction)) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         doSearchWithIntent(queryIntent);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private void doSearchWithIntent(final Intent queryIntent) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     final String queryString = queryIntent.getStringExtra(SearchManager.QUERY);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     doSearchWithQuery(queryString);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre>
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="FilterSearchApplications"></a>
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Filter-Search Applications</h3>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Filter-search applications are those that use live text entry (e.g. keystrokes)) to
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display and continuously update a list of results.  Primary examples include applications
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that use locally-stored data.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Filter search is not directly supported by the Search Manager.  Most filter search
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementations will use variants of {@link android.widget.Filterable}, such as a
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ListView} bound to a {@link android.widget.SimpleCursorAdapter}.  However,
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may find it useful to mix them together, by declaring your filtered view searchable.  With
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this configuration, you can still present the standard search dialog in all activities
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within your application, but transition to a filtered search when you enter the activity
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and display the results.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Suggestions"></a>
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Search Suggestions</h3>
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A powerful feature of the Search Manager is the ability of any application to easily provide
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * live "suggestions" in order to prompt the user.  Each application implements suggestions in a
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different, unique, and appropriate way.  Suggestions be drawn from many sources, including but
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not limited to:
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Actual searchable results (e.g. names in the address book)</li>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Recently entered queries</li>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Recently viewed data or results</li>
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Contextually appropriate queries or results</li>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Summaries of possible results</li>
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Another feature of suggestions is that they can expose queries or results before the user
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ever visits the application.  This reduces the amount of context switching required, and helps
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user access their data quickly and with less context shifting.  In order to provide this
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capability, suggestions are accessed via a
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.ContentProvider Content Provider}.
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The primary form of suggestions is known as <i>queried suggestions</i> and is based on query
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text that the user has already typed.  This would generally be based on partial matches in
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the available data.  In certain situations - for example, when no query text has been typed yet -
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application may also opt to provide <i>zero-query suggestions</i>.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These would typically be drawn from the same data source, but because no partial query text is
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available, they should be weighted based on other factors - for example, most recent queries
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or most recent results.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Overview of how suggestions are provided.</b>  When the search manager identifies a
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * particular activity as searchable, it will check for certain metadata which indicates that
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is also a source of suggestions.  If suggestions are provided, the following steps are
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taken.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>Using formatting information found in the metadata, the user's query text (whatever
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been typed so far) will be formatted into a query and sent to the suggestions
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.ContentProvider Content Provider}.</li>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The suggestions {@link android.content.ContentProvider Content Provider} will create a
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.database.Cursor Cursor} which can iterate over the possible suggestions.</li>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The search manager will populate a list using display data found in each row of the cursor,
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and display these suggestions to the user.</li>
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user types another key, or changes the query in any way, the above steps are repeated
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the suggestions list is updated or repopulated.</li>
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user clicks or touches the "GO" button, the suggestions are ignored and the search is
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launched using the normal {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} type of
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}.</li>
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user uses the directional controls to navigate the focus into the suggestions list,
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the query text will be updated while the user navigates from suggestion to suggestion.  The user
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can then click or touch the updated query and edit it further.  If the user navigates back to
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the edit field, the original typed query is restored.</li>
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the user clicks or touches a particular suggestion, then a combination of data from the
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cursor and
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values found in the metadata are used to synthesize an Intent and send it to the application.
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Depending on the design of the activity and the way it implements search, this might be a
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} (in order to launch a query), or it
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * might be a {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}, in order to proceed directly
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to display of specific data.</li>
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Simple Recent-Query-Based Suggestions.</b>  The Android framework provides a simple Search
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suggestions provider, which simply records and replays recent queries.  For many applications,
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will be sufficient.  The basic steps you will need to
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * do, in order to use the built-in recent queries suggestions provider, are as follows:
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement and test query search, as described in the previous sections.</li>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a Provider within your application by extending
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}.</li>
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a manifest entry describing your provider.</li>
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Update your searchable activity's XML configuration file with information about your
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider.</li>
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In your searchable activities, capture any user-generated queries and record them
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for future searches by calling {@link android.provider.SearchRecentSuggestions#saveRecentQuery}.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li>
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For complete implementation details, please refer to
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}.  The rest of the information in this
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * section should not be necessary, as it refers to custom suggestions providers.
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Creating a Customized Suggestions Provider:</b>  In order to create more sophisticated
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion providers, you'll need to take the following steps:
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement and test query search, as described in the previous sections.</li>
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Decide how you wish to <i>receive</i> suggestions.  Just like queries that the user enters,
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions will be delivered to your searchable activity as
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} messages;  Unlike simple queries, you have quite a bit of
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flexibility in forming those intents.  A query search application will probably
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wish to continue receiving the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, which will launch a query search using query text as
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided by the suggestion.  A filter search application will probably wish to
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive the {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent}, which will take the user directly to a selected entry.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Other interesting suggestions, including hybrids, are possible, and the suggestion provider
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can easily mix-and-match results to provide a richer set of suggestions for the user.  Finally,
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you'll need to update your searchable activity (or other activities) to receive the intents
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as you've defined them.</li>
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Implement a Content Provider that provides suggestions.  If you already have one, and it
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has access to your suggestions data.  If not, you'll have to create one.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You'll also provide information about your Content Provider in your
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * package's <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>.</li>
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Update your searchable activity's XML configuration file.  There are two categories of
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information used for suggestions:
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>The first is (required) data that the search manager will
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use to format the queries which are sent to the Content Provider.</li>
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The second is (optional) parameters to configure structure
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if intents generated by suggestions.</li></li>
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Configuring your Content Provider to Receive Suggestion Queries.</b>  The basic job of
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a search suggestions {@link android.content.ContentProvider Content Provider} is to provide
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "live" (while-you-type) conversion of the user's query text into a set of zero or more
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions.  Each application is free to define the conversion, and as described above there are
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * many possible solutions.  This section simply defines how to communicate with the suggestion
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Search Manager must first determine if your package provides suggestions.  This is done
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by examination of your searchable meta-data XML file.  The android:searchSuggestAuthority
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute, if provided, is the signal to obtain & display suggestions.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Every query includes a Uri, and the Search Manager will format the Uri as shown:
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><pre class="prettyprint">
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content:// your.suggest.authority / your.suggest.path / SearchManager.SUGGEST_URI_PATH_QUERY</pre>
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Your Content Provider can receive the query text in one of two ways.
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query provided as a selection argument.</b>  If you define the attribute value
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection and include a string, this string will be passed as the
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>selection</i> parameter to your Content Provider's query function.  You must define a single
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection argument, using the '?' character.  The user's query text will be passed to you
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the first element of the selection arguments array.</li>
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Query provided with Data Uri.</b>  If you <i>do not</i> define the attribute value
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:searchSuggestSelection, then the Search Manager will append another "/" followed by
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user's query to the query Uri.  The query will be encoding using Uri encoding rules - don't
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forget to decode it.  (See {@link android.net.Uri#getPathSegments} and
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.net.Uri#getLastPathSegment} for helpful utilities you can use here.)</li>
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Handling empty queries.</b>  Your application should handle the "empty query"
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (no user text entered) case properly, and generate useful suggestions in this case.  There are a
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * number of ways to do this;  Two are outlined here:
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>For a simple filter search of local data, you could simply present the entire dataset,
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unfiltered.  (example: People)</li>
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>For a query search, you could simply present the most recent queries.  This allows the user
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to quickly repeat a recent search.</li></ul>
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>The Format of Individual Suggestions.</b>  Your suggestions are communicated back to the
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Search Manager by way of a {@link android.database.Cursor Cursor}.  The Search Manager will
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * usually pass a null Projection, which means that your provider can simply return all appropriate
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * columns for each suggestion.  The columns currently defined are:
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>Column Name</th> <th>Description</th> <th>Required?</th></tr>
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_FORMAT}</th>
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><i>Unused - can be null.</i></td>
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_TEXT_1}</th>
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>This is the line of text that will be presented to the user as the suggestion.</td>
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">Yes</td>
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_TEXT_2}</th>
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If your cursor includes this column, then all suggestions will be provided in a
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             two-line format.  The data in this column will be displayed as a second, smaller
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             line of text below the primary suggestion, or it can be null or empty to indicate no
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             text in this row's suggestion.</td>
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_ICON_1}</th>
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If your cursor includes this column, then all suggestions will be provided in an
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             icons+text format.  This value should be a reference (resource ID) of the icon to
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             draw on the left side, or it can be null or zero to indicate no icon in this row.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             You must provide both cursor columns, or neither.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             </td>
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No, but required if you also have {@link #SUGGEST_COLUMN_ICON_2}</td>
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_ICON_2}</th>
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If your cursor includes this column, then all suggestions will be provided in an
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             icons+text format.  This value should be a reference (resource ID) of the icon to
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             draw on the right side, or it can be null or zero to indicate no icon in this row.
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             You must provide both cursor columns, or neither.
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             </td>
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No, but required if you also have {@link #SUGGEST_COLUMN_ICON_1}</td>
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_INTENT_ACTION}</th>
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If this column exists <i>and</i> this element exists at the given row, this is the
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             action that will be used when forming the suggestion's intent.  If the element is
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             not provided, the action will be taken from the android:searchSuggestIntentAction
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             field in your XML metadata.  <i>At least one of these must be present for the
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             suggestion to generate an intent.</i>  Note:  If your action is the same for all
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             suggestions, it is more efficient to specify it using XML metadata and omit it from
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the cursor.</td>
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_INTENT_DATA}</th>
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If this column exists <i>and</i> this element exists at the given row, this is the
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             data that will be used when forming the suggestion's intent.  If the element is not
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provided, the data will be taken from the android:searchSuggestIntentData field in
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your XML metadata.  If neither source is provided, the Intent's data field will be
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             null.  Note:  If your data is the same for all suggestions, or can be described
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             using a constant part and a specific ID, it is more efficient to specify it using
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             XML metadata and omit it from the cursor.</td>
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_INTENT_DATA_ID}</th>
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If this column exists <i>and</i> this element exists at the given row, then "/" and
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             this value will be appended to the data field in the Intent.  This should only be
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             used if the data field has already been set to an appropriate base string.</td>
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SUGGEST_COLUMN_QUERY}</th>
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If this column exists <i>and</i> this element exists at the given row, this is the
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             data that will be used when forming the suggestion's query.</td>
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">Required if suggestion's action is
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</td>
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th><i>Other Columns</i></th>
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Finally, if you have defined any <a href="#ActionKeys">Action Keys</a> and you wish
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             for them to have suggestion-specific definitions, you'll need to define one
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             additional column per action key.  The action key will only trigger if the
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             currently-selection suggestion has a non-empty string in the corresponding column.
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             See the section on <a href="#ActionKeys">Action Keys</a> for additional details and
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             implementation steps.</td>
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clearly there are quite a few permutations of your suggestion data, but in the next section
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we'll look at a few simple combinations that you'll select from.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>The Format Of Intents Sent By Search Suggestions.</b>  Although there are many ways to
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configure these intents, this document will provide specific information on just a few of them.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li><b>Launch a query.</b>  In this model, each suggestion represents a query that your
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity can perform, and the {@link android.content.Intent Intent} will be formatted
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exactly like those sent when the user enters query text and clicks the "GO" button:
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <ul>
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Action:</b> {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} provided
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   using your XML metadata (android:searchSuggestIntentAction).</li>
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Data:</b> empty (not used).</li>
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Query:</b> query text supplied by the cursor.</li>
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   </ul>
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li>
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Go directly to a result, using a complete Data Uri.</b>  In this model, the user will be
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taken directly to a specific result.
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <ul>
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Action:</b> {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}</li>
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Data:</b> a complete Uri, supplied by the cursor, that identifies the desired data.</li>
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Query:</b> query text supplied with the suggestion (probably ignored)</li>
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   </ul>
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li>
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>Go directly to a result, using a synthesized Data Uri.</b>  This has the same result
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the previous suggestion, but provides the Data Uri in a different way.
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <ul>
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Action:</b> {@link android.content.Intent#ACTION_VIEW ACTION_VIEW}</li>
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Data:</b> The search manager will assemble a Data Uri using the following elements:
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   a Uri fragment provided in your XML metadata (android:searchSuggestIntentData), followed by
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   a single "/", followed by the value found in the {@link #SUGGEST_COLUMN_INTENT_DATA_ID}
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   entry in your cursor.</li>
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li><b>Query:</b> query text supplied with the suggestion (probably ignored)</li>
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   </ul>
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li>
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This list is not meant to be exhaustive.  Applications should feel free to define other types
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of suggestions.  For example, you could reduce long lists of results to summaries, and use one
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the above intents (or one of your own) with specially formatted Data Uri's to display more
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detailed results.  Or you could display textual shortcuts as suggestions, but launch a display
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in a more data-appropriate format such as media artwork.
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Suggestion Rewriting.</b>  If the user navigates through the suggestions list, the UI
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may temporarily rewrite the user's query with a query that matches the currently selected
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion.  This enables the user to see what query is being suggested, and also allows the user
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to click or touch in the entry EditText element and make further edits to the query before
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatching it.  In order to perform this correctly, the Search UI needs to know exactly what
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text to rewrite the query with.
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For each suggestion, the following logic is used to select a new query string:
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>If the suggestion provides an explicit value in the {@link #SUGGEST_COLUMN_QUERY}
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, this value will be used.</li>
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the metadata includes the queryRewriteFromData flag, and the suggestion provides an
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit value for the intent Data field, this Uri will be used.  Note that this should only be
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used with Uri's that are intended to be user-visible, such as HTTP.  Internal Uri schemes should
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be used in this way.</li>
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If the metadata includes the queryRewriteFromText flag, the text in
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #SUGGEST_COLUMN_TEXT_1} will be used.  This should be used for suggestions in which no
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * query text is provided and the SUGGEST_COLUMN_INTENT_DATA values are not suitable for user
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inspection and editing.</li></ul>
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ActionKeys"></a>
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Action Keys</h3>
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Searchable activities may also wish to provide shortcuts based on the various action keys
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available on the device.  The most basic example of this is the contacts app, which enables the
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * green "dial" key for quick access during searching.  Not all action keys are available on
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * every device, and not all are allowed to be overriden in this way.  (For example, the "Home"
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key must always return to the home screen, with no exceptions.)
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In order to define action keys for your searchable application, you must do two things.
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>You'll add one or more <i>actionkey</i> elements to your searchable metadata configuration
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file.  Each element defines one of the keycodes you are interested in,
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defines the conditions under which they are sent, and provides details
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on how to communicate the action key event back to your searchable activity.</li>
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>In your broadcast receiver, if you wish, you can check for action keys by checking the
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extras field of the {@link android.content.Intent Intent}.</li>
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Updating metadata.</b>  For each keycode of interest, you must add an &lt;actionkey&gt;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element.  Within this element you must define two or three attributes.  The first attribute,
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;android:keycode&gt;, is required;  It is the key code of the action key event, as defined in
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.KeyEvent}.  The remaining two attributes define the value of the actionkey's
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <i>message</i>, which will be passed to your searchable activity in the
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} (see below for more details).  Although each of these
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes is optional, you must define one or both for the action key to have any effect.
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;android:queryActionMsg&gt; provides the message that will be sent if the action key is
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pressed while the user is simply entering query text.  &lt;android:suggestActionMsgColumn&gt;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is used when action keys are tied to specific suggestions.  This attribute provides the name
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of a <i>column</i> in your suggestion cursor;  The individual suggestion, in that column,
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provides the message.  (If the cell is empty or null, that suggestion will not work with that
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action key.)
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="#SearchabilityMetadata">Searchability Metadata</a> section for more details
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and examples.
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Receiving Action Keys</b>  Intents launched by action keys will be specially marked
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using a combination of values.  This enables your searchable application to examine the intent,
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if necessary, and perform special processing.  For example, clicking a suggested contact might
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display them;  Selecting a suggested contact and clicking the dial button might
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * immediately call them.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When a search {@link android.content.Intent Intent} is launched by an action key, two values
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be added to the extras field.
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To examine the key code, use {@link android.content.Intent#getIntExtra
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getIntExtra(SearchManager.ACTION_KEY)}.</li>
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>To examine the message string, use {@link android.content.Intent#getStringExtra
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getStringExtra(SearchManager.ACTION_MSG)}</li>
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SearchabilityMetadata"></a>
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Searchability Metadata</h3>
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Every activity that is searchable must provide a small amount of additional information
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to properly configure the search system.  This controls the way that your search
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is presented to the user, and controls for the various modalities described previously.
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If your application is not searchable,
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then you do not need to provide any search metadata, and you can skip the rest of this section.
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When this search metadata cannot be found, the search manager will assume that the activity
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not implement search.  (Note: to implement web-based search, you will need to add
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the android.app.default_searchable metadata to your manifest, as shown below.)
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Values you supply in metadata apply only to each local searchable activity.  Each
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity can define a completely unique search experience relevant to its own
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capabilities and user experience requirements, and a single application can even define multiple
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activities.
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Metadata for searchable activity.</b>  As with your search implementations described
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above, you must first identify which of your activities is searchable.  In the
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry for this activity, you must
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide two elements:
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>An intent-filter specifying that you can receive and process the
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} {@link android.content.Intent Intent}.
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li>
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>A reference to a small XML file (typically called "searchable.xml") which contains the
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remaining configuration information for how your application implements search.</li></ul>
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is a snippet showing the necessary elements in the
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> entry for your searchable activity.
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;!-- Search Activity - searchable --&gt;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;activity android:name="MySearchActivity"
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  android:label="Search"
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  android:launchMode="singleTop"&gt;
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            &lt;intent-filter&gt;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                &lt;action android:name="android.intent.action.SEARCH" /&gt;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                &lt;category android:name="android.intent.category.DEFAULT" /&gt;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            &lt;/intent-filter&gt;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            &lt;meta-data android:name="android.app.searchable"
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                       android:resource="@xml/searchable" /&gt;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;/activity&gt;</pre>
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Next, you must provide the rest of the searchability configuration in
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the small XML file, stored in the ../xml/ folder in your build.  The XML file is a
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple enumeration of the search configuration parameters for searching within this activity,
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, or package.  Here is a sample XML file (named searchable.xml, for use with
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the above manifest) for a query-search activity.
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;searchable xmlns:android="http://schemas.android.com/apk/res/android"
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:label="@string/search_label"
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:hint="@string/search_hint" &gt;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;/searchable&gt;</pre>
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note that all user-visible strings <i>must</i> be provided in the form of "@string"
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * references.  Hard-coded strings, which cannot be localized, will not work properly in search
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metadata.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Attributes you can set in search metadata:
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr>
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:label</th>
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>This is the name for your application that will be presented to the user in a
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             list of search targets, or in the search box as a label.</td>
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">Yes</td>
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:icon</th>
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, this icon will be used <i>in place</i> of the label string.  This
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is provided in order to present logos or other non-textual banners.</td>
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:hint</th>
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>This is the text to display in the search text field when no user text has been
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             entered.</td>
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:searchButtonText</th>
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, this text will replace the default text in the "Search" button.</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:searchMode</th>
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided and non-zero, sets additional modes for control of the search
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             presentation.  The following mode bits are defined:
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <table border="2" align="center" frame="hsides" rules="rows">
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <tbody>
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <tr><th>showSearchLabelAsBadge</th>
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                     <td>If set, this flag enables the display of the search target (label)
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         within the search bar.  If this flag and showSearchIconAsBadge
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         (see below) are both not set, no badge will be shown.</td>
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 </tr>
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <tr><th>showSearchIconAsBadge</th>
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                     <td>If set, this flag enables the display of the search target (icon) within
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         the search bar.  If this flag and showSearchLabelAsBadge
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         (see above) are both not set, no badge will be shown.  If both flags
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         are set, showSearchIconAsBadge has precedence and the icon will be
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         shown.</td>
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 </tr>
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <tr><th>queryRewriteFromData</th>
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                     <td>If set, this flag causes the suggestion column SUGGEST_COLUMN_INTENT_DATA
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         to be considered as the text for suggestion query rewriting.  This should
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         only be used when the values in SUGGEST_COLUMN_INTENT_DATA are suitable
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         for user inspection and editing - typically, HTTP/HTTPS Uri's.</td>
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 </tr>
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 <tr><th>queryRewriteFromText</th>
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                     <td>If set, this flag causes the suggestion column SUGGEST_COLUMN_TEXT_1 to
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         be considered as the text for suggestion query rewriting.  This should
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         be used for suggestions in which no query text is provided and the
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         SUGGEST_COLUMN_INTENT_DATA values are not suitable for user inspection
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                         and editing.</td>
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 </tr>
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                 </tbody>
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            </table></td>
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:inputType</th>
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, supplies a hint about the type of search text the user will be
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             entering.  For most searches, in which free form text is expected, this attribute
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             need not be provided.  Suitable values for this attribute are described in the
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <a href="../R.attr.html#inputType">inputType</a> attribute.</td>
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:imeOptions</th>
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, supplies additional options for the input method.
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             For most searches, in which free form text is expected, this attribute
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             need not be provided, and will default to "actionSearch".
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             Suitable values for this attribute are described in the
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <a href="../R.attr.html#imeOptions">imeOptions</a> attribute.</td>
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Styleable Resources in your Metadata.</b>  It's possible to provide alternate strings
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your searchable application, in order to provide localization and/or to better visual
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * presentation on different device configurations.  Each searchable activity has a single XML
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metadata file, but any resource references can be replaced at runtime based on device
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration, language setting, and other system inputs.
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A concrete example is the "hint" text you supply using the android:searchHint attribute.
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In portrait mode you'll have less screen space and may need to provide a shorter string, but
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in landscape mode you can provide a longer, more descriptive hint.  To do this, you'll need to
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define two or more strings.xml files, in the following directories:
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>.../res/values-land/strings.xml</li>
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>.../res/values-port/strings.xml</li>
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>.../res/values/strings.xml</li></ul>
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For more complete documentation on this capability, see
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">Resources and
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internationalization: Alternate Resources</a>.
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Metadata for non-searchable activities.</b>  Activities which are part of a searchable
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application, but don't implement search itself, require a bit of "glue" in order to cause
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * them to invoke search using your searchable activity as their primary context.  If this is not
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provided, then searches from these activities will use the system default search context.
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The simplest way to specify this is to add a <i>search reference</i> element to the
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application entry in the <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> file.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of this reference can be either of:
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul><li>The name of your searchable activity.
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is typically prefixed by '.' to indicate that it's in the same package.</li>
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>A "*" indicates that the system may select a default searchable activity, in which
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * case it will typically select web-based search.</li>
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here is a snippet showing the necessary addition to the manifest entry for your
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * non-searchable activities.
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;application&gt;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            &lt;meta-data android:name="android.app.default_searchable"
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                       android:value=".MySearchActivity" /&gt;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *            &lt;!-- followed by activities, providers, etc... --&gt;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;/application&gt;</pre>
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You can also specify android.app.default_searchable on a per-activity basis, by including
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the meta-data element (as shown above) in one or more activity sections.  If found, these will
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override the reference in the application section.  The only reason to configure your application
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this way would be if you wish to partition it into separate sections with different search
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * behaviors;  Otherwise this configuration is not recommended.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Additional Metadata for search suggestions.</b>  If you have defined a content provider
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to generate search suggestions, you'll need to publish it to the system, and you'll need to
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide a bit of additional XML metadata in order to configure communications with it.
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>First, in your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>, you'll add the
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * following lines.
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;!-- Content provider for search suggestions --&gt;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *        &lt;provider android:name="YourSuggestionProviderClass"
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                android:authorities="your.suggestion.authority" /&gt;</pre>
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Next, you'll add a few lines to your XML metadata file, as shown:
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;!-- Required attribute for any suggestions provider --&gt;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:searchSuggestAuthority="your.suggestion.authority"
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;!-- Optional attribute for configuring queries --&gt;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:searchSuggestSelection="field =?"
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;!-- Optional attributes for configuring intent construction --&gt;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:searchSuggestIntentAction="intent action string"
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:searchSuggestIntentData="intent data Uri" /&gt;</pre>
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Elements of search metadata that support suggestions:
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr>
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:searchSuggestAuthority</th>
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>This value must match the authority string provided in the <i>provider</i> section
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             of your <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>.</td>
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">Yes</td>
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:searchSuggestPath</th>
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, this will be inserted in the suggestions query Uri, after the authority
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             you have provide but before the standard suggestions path.  This is only required if
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             you have a single content provider issuing different types of suggestions (e.g. for
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             different data types) and you need a way to disambiguate the suggestions queries
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             when they are received.</td>
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:searchSuggestSelection</th>
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, this value will be passed into your query function as the
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <i>selection</i> parameter.  Typically this will be a WHERE clause for your database,
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             and will contain a single question mark, which represents the actual query string
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             that has been typed by the user.  However, you can also use any non-null value
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             to simply trigger the delivery of the query text (via selection arguments), and then
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             use the query text in any way appropriate for your provider (ignoring the actual
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             text of the selection parameter.)</td>
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:searchSuggestIntentAction</th>
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, and not overridden by the selected suggestion, this value will be
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             placed in the action field of the {@link android.content.Intent Intent} when the
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             user clicks a suggestion.</td>
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:searchSuggestIntentData</th>
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If provided, and not overridden by the selected suggestion, this value will be
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             placed in the data field of the {@link android.content.Intent Intent} when the user
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             clicks a suggestion.</td>
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Additional Metadata for search action keys.</b>  For each action key that you would like to
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define, you'll need to add an additional element defining that key, and using the attributes
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * discussed in <a href="#ActionKeys">Action Keys</a>.  A simple example is shown here:
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">&lt;actionkey
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:keycode="KEYCODE_CALL"
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:queryActionMsg="call"
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:suggestActionMsg="call"
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:suggestActionMsgColumn="call_column" /&gt;</pre>
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Elements of search metadata that support search action keys.  Note that although each of the
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action message elements are marked as <i>optional</i>, at least one must be present for the
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * action key to have any effect.
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr>
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:keycode</th>
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>This attribute denotes the action key you wish to respond to.  Note that not
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             all action keys are actually supported using this mechanism, as many of them are
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             used for typing, navigation, or system functions.  This will be added to the
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your searchable activity.  To examine the key code, use
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#getIntExtra getIntExtra(SearchManager.ACTION_KEY)}.
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             <p>Note, in addition to the keycode, you must also provide one or more of the action
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             specifier attributes.</td>
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">Yes</td>
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:queryActionMsg</th>
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If you wish to handle an action key during normal search query entry, you
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          must define an action string here.  This will be added to the
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to your
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          searchable activity.  To examine the string, use
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          {@link android.content.Intent#getStringExtra
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *          getStringExtra(SearchManager.ACTION_MSG)}.</td>
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:suggestActionMsg</th>
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If you wish to handle an action key while a suggestion is being displayed <i>and
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             selected</i>, there are two ways to handle this.  If <i>all</i> of your suggestions
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             can handle the action key, you can simply define the action message using this
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             attribute.  This will be added to the
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your searchable activity.  To examine the string, use
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#getStringExtra
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             getStringExtra(SearchManager.ACTION_MSG)}.</td>
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>android:suggestActionMsgColumn</th>
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If you wish to handle an action key while a suggestion is being displayed <i>and
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             selected</i>, but you do not wish to enable this action key for every suggestion,
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             then you can use this attribute to control it on a suggestion-by-suggestion basis.
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             First, you must define a column (and name it here) where your suggestions will
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             include the action string.  Then, in your content provider, you must provide this
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             column, and when desired, provide data in this column.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             The search manager will look at your suggestion cursor, using the string
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             provided here in order to select a column, and will use that to select a string from
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             the cursor.  That string will be added to the
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that is passed to
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             your searchable activity.  To examine the string, use
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             {@link android.content.Intent#getStringExtra
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             getStringExtra(SearchManager.ACTION_MSG)}.  <i>If the data does not exist for the
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             selection suggestion, the action key will be ignored.</i></td>
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td align="center">No</td>
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="PassingSearchContext"></a>
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Passing Search Context</h3>
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In order to improve search experience, an application may wish to specify
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * additional data along with the search, such as local history or context.  For
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, a maps search would be improved by including the current location.
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In order to simplify the structure of your activities, this can be done using
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the search manager.
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Any data can be provided at the time the search is launched, as long as it
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be stored in a {@link android.os.Bundle Bundle} object.
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To pass application data into the Search Manager, you'll need to override
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSearchRequested onSearchRequested} as follows:
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &#64;Override
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public boolean onSearchRequested() {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Bundle appData = new Bundle();
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     appData.put...();
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     appData.put...();
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     startSearch(null, false, appData);
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     return true;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre>
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To receive application data from the Search Manager, you'll extract it from
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent Intent} as follows:
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final Bundle appData = queryIntent.getBundleExtra(SearchManager.APP_DATA);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if (appData != null) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     appData.get...();
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     appData.get...();
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }</pre>
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProtectingUserPrivacy"></a>
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Protecting User Privacy</h3>
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Many users consider their activities on the phone, including searches, to be private
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information.  Applications that implement search should take steps to protect users' privacy
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wherever possible.  This section covers two areas of concern, but you should consider your search
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * design carefully and take any additional steps necessary.
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Don't send personal information to servers, and if you do, don't log it.</b>
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Personal information" is information that can personally identify your users, such as name,
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * email address or billing information, or other data which can be reasonably linked to such
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information.  If your application implements search with the assistance of a server, try to
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * avoid sending personal information with your searches.  For example, if you are searching for
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The 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
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the server.  If you do need to send personal information, you should take steps to avoid
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * logging it.  If you must log it, you should protect that data very carefully, and erase it as
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * soon as possible.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Provide the user with a way to clear their search history.</b>  The Search Manager helps
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your application provide context-specific suggestions.  Sometimes these suggestions are based
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on previous searches, or other actions taken by the user in an earlier session.  A user may not
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wish for previous searches to be revealed to other users, for instance if they share their phone
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a friend.  If your application provides suggestions that can reveal previous activities,
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you should implement a "Clear History" menu, preference, or button.  If you are using
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.provider.SearchRecentSuggestions}, you can simply call its
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.provider.SearchRecentSuggestions#clearHistory() clearHistory()} method from
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your "Clear History" UI.  If you are implementing your own form of recent suggestions, you'll
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to provide a similar a "clear history" API in your provider, and call it from your
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Clear History" UI.
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SearchManager
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a shortcut definition for the default menu key to use for invoking search.
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See Menu.Item.setAlphabeticShortcut() for more information.
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static char MENU_KEY = 's';
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a shortcut definition for the default menu key to use for invoking search.
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See Menu.Item.setAlphabeticShortcut() for more information.
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int MENU_KEYCODE = KeyEvent.KEYCODE_S;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getStringExtra
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  content.Intent.getStringExtra()}
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain the query string from Intent.ACTION_SEARCH.
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String QUERY = "query";
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with Intent.ACTION_SEARCH and
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getBundleExtra
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  content.Intent.getBundleExtra()}
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain any additional app-specific data that was inserted by the
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity that launched the search.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String APP_DATA = "app_data";
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent app_data bundle key: Use this key with the bundle from
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getBundleExtra
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content.Intent.getBundleExtra(APP_DATA)} to obtain the source identifier
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set by the activity that launched the search.
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SOURCE = "source";
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with Intent.ACTION_SEARCH and
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getIntExtra content.Intent.getIntExtra()}
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain the keycode that the user used to trigger this query.  It will be zero if the
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user simply pressed the "GO" button on the search UI.  This is primarily used in conjunction
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the keycode attribute in the actionkey element of your searchable.xml configuration
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * file.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_KEY = "action_key";
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intent extra data key: Use this key with Intent.ACTION_SEARCH and
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getStringExtra content.Intent.getStringExtra()}
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to obtain the action message that was defined for a particular search action key and/or
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * suggestion.  It will be null if the search was launched by typing "enter", touched the the
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * "GO" button, or other means not involving any action key.
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_MSG = "action_msg";
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Uri path for queried suggestions data.  This is the path that the search manager
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will use when querying your content provider for suggestions data based on user input
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (e.g. looking for partial matches).
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Typically you'll use this with a URI matcher.
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_URI_PATH_QUERY = "search_suggest_query";
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MIME type for suggestions data.  You'll use this in your suggestions content provider
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the getType() function.
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_MIME_TYPE =
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  "vnd.android.cursor.dir/vnd.android.search.suggest";
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Unused - can be null or column can be omitted.</i>
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_FORMAT = "suggest_format";
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Required.</i>  This is the primary line of text that
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be presented to the user as the suggestion.
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1";
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  then all suggestions will be provided in a two-line format.  The second line of text is in
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  a much smaller appearance.
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  then all suggestions will be provided in format that includes space for two small icons,
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  one at the left and one at the right of each suggestion.  The data in the column must
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  be a a resource ID for the icon you wish to have displayed.  If you include this column,
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  you must also include {@link #SUGGEST_COLUMN_ICON_2}.
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1";
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  then all suggestions will be provided in format that includes space for two small icons,
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  one at the left and one at the right of each suggestion.  The data in the column must
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  be a a resource ID for the icon you wish to have displayed.  If you include this column,
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  you must also include {@link #SUGGEST_COLUMN_ICON_1}.
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2";
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this element exists at the given row, this is the action that will be used when
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * forming the suggestion's intent.  If the element is not provided, the action will be taken
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the android:searchSuggestIntentAction field in your XML metadata.  <i>At least one of
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * these must be present for the suggestion to generate an intent.</i>  Note:  If your action is
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same for all suggestions, it is more efficient to specify it using XML metadata and omit
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it from the cursor.
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action";
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this element exists at the given row, this is the data that will be used when
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * forming the suggestion's intent.  If the element is not provided, the data will be taken
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the android:searchSuggestIntentData field in your XML metadata.  If neither source
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is provided, the Intent's data field will be null.  Note:  If your data is
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same for all suggestions, or can be described using a constant part and a specific ID,
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it is more efficient to specify it using XML metadata and omit it from the cursor.
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Optional.</i>  If this column exists <i>and</i>
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this element exists at the given row, then "/" and this value will be appended to the data
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field in the Intent.  This should only be used if the data field has already been set to an
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * appropriate base string.
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id";
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Column name for suggestions cursor.  <i>Required if action is
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</i>  If this
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * column exists <i>and</i> this element exists at the given row, this is the data that will be
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used when forming the suggestion's query.
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Handler mHandler;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SearchDialog mSearchDialog;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnDismissListener mDismissListener = null;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnCancelListener mCancelListener = null;
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ SearchManager(Context context, Handler handler)  {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler = handler;
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static ISearchManager mService;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = ISearchManager.Stub.asInterface(
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService(Context.SEARCH_SERVICE));
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Launch search UI.
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The search manager will open a search widget in an overlapping
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window, and the underlying activity may be obscured.  The search
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entry state will remain in effect until one of the following events:
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The user completes the search.  In most cases this will launch
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a search intent.</li>
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The user uses the back, home, or other keys to exit the search.</li>
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The application calls the {@link #stopSearch}
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method, which will hide the search window and return focus to the
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity from which it was launched.</li>
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Most applications will <i>not</i> use this interface to invoke search.
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The primary method for invoking search is to call
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.app.Activity#onSearchRequested Activity.onSearchRequested()} or
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.app.Activity#startSearch Activity.startSearch()}.
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialQuery A search string can be pre-entered here, but this
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is typically null or empty.
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectInitialQuery If true, the intial query will be preselected, which means that
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any further typing will replace it.  This is useful for cases where an entire pre-formed
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * query is being inserted.  If false, the selection point will be placed at the end of the
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inserted query.  This is useful when the inserted query is text that the user entered,
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the user would expect to be able to keep typing.  <i>This parameter is only meaningful
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if initialQuery is a non-empty string.</i>
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param launchActivity The ComponentName of the activity that has launched this search.
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appSearchData An application can insert application-specific
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context here, in order to improve quality or specificity of its own
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * searches.  This data will be returned with SEARCH intent(s).  Null if
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no extra data is required.
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * defined by the application (which is usually defined as a local search).  If no default
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search is defined in the current application or activity, no search will be launched.
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.Activity#onSearchRequested
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopSearch
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startSearch(String initialQuery,
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean selectInitialQuery,
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ComponentName launchActivity,
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Bundle appSearchData,
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean globalSearch) {
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSearchDialog == null) {
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSearchDialog = new SearchDialog(mContext);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // activate the search manager and start it up!
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData,
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                globalSearch);
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSearchDialog.setOnCancelListener(this);
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSearchDialog.setOnDismissListener(this);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Terminate search UI.
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Typically the user will terminate the search UI by launching a
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search or by canceling.  This function allows the underlying application
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or activity to cancel the search prematurely (for any reason).
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function can be safely called at any time (even if no search is active.)
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #startSearch
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopSearch()  {
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSearchDialog != null) {
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSearchDialog.cancel();
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determine if the Search UI is currently displayed.
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is provided primarily for application test purposes.
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the search UI is currently displayed.
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isVisible()  {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSearchDialog != null) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSearchDialog.isShowing();
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link #setOnDismissListener} for configuring your activity to monitor search UI state.
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnDismissListener {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This method will be called when the search UI is dismissed. To make use if it, you must
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * implement this method in your activity, and call {@link #setOnDismissListener} to
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * register it.
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onDismiss();
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link #setOnCancelListener} for configuring your activity to monitor search UI state.
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnCancelListener {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This method will be called when the search UI is canceled. To make use if it, you must
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * implement this method in your activity, and call {@link #setOnCancelListener} to
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * register it.
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onCancel();
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the callback that will be invoked whenever the search UI is dismissed.
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The {@link OnDismissListener} to use, or null.
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnDismissListener(final OnDismissListener listener) {
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDismissListener = listener;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The callback from the search dialog when dismissed
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDismiss(DialogInterface dialog) {
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialog == mSearchDialog) {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDismissListener != null) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDismissListener.onDismiss();
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the callback that will be invoked whenever the search UI is canceled.
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The {@link OnCancelListener} to use, or null.
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnCancelListener(final OnCancelListener listener) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCancelListener = listener;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The callback from the search dialog when canceled
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCancel(DialogInterface dialog) {
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialog == mSearchDialog) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCancelListener != null) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCancelListener.onCancel();
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Save instance state so we can recreate after a rotation.
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void saveSearchDialog(Bundle outState, String key) {
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSearchDialog != null && mSearchDialog.isShowing()) {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle searchDialogState = mSearchDialog.onSaveInstanceState();
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outState.putBundle(key, searchDialogState);
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore instance state after a rotation.
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void restoreSearchDialog(Bundle inState, String key) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle searchDialogState = inState.getBundle(key);
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (searchDialogState != null) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSearchDialog == null) {
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSearchDialog = new SearchDialog(mContext);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSearchDialog.onRestoreInstanceState(searchDialogState);
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hook for updating layout on a rotation
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void onConfigurationChanged(Configuration newConfig) {
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSearchDialog != null && mSearchDialog.isShowing()) {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSearchDialog.onConfigurationChanged(newConfig);
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1386