Loading Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -352,6 +352,8 @@ web_docs_sample_code_flags := \ guide/samples/LunarLander "Lunar Lander" \ -samplecode $(sample_dir)/NotePad \ guide/samples/NotePad "Note Pad" \ -samplecode $(sample_dir)/SearchableDictionary \ guide/samples/SearchableDictionary "Searchable Dictionary" \ -samplecode $(sample_dir)/Snake \ guide/samples/Snake "Snake" \ -samplecode $(sample_dir)/SoftKeyboard \ Loading api/4.xml +110 −0 Original line number Diff line number Diff line Loading @@ -4123,6 +4123,17 @@ visibility="public" > </field> <field name="includeInGlobalSearch" type="int" transient="false" volatile="false" value="16843374" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="indeterminate" type="int" transient="false" Loading Loading @@ -6191,6 +6202,17 @@ visibility="public" > </field> <field name="queryAfterZeroResults" type="int" transient="false" volatile="false" value="16843394" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="radioButtonStyle" type="int" transient="false" Loading Loading @@ -6686,6 +6708,17 @@ visibility="public" > </field> <field name="searchSettingsDescription" type="int" transient="false" volatile="false" value="16843402" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="searchSuggestAuthority" type="int" transient="false" Loading Loading @@ -6741,6 +6774,17 @@ visibility="public" > </field> <field name="searchSuggestThreshold" type="int" transient="false" volatile="false" value="16843373" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="secondaryProgress" type="int" transient="false" Loading Loading @@ -21158,6 +21202,17 @@ visibility="public" > </field> <field name="INTENT_ACTION_WEB_SEARCH_SETTINGS" type="java.lang.String" transient="false" volatile="false" value=""android.search.action.WEB_SEARCH_SETTINGS"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="MENU_KEY" type="char" transient="false" Loading Loading @@ -21191,6 +21246,17 @@ visibility="public" > </field> <field name="SHORTCUT_MIME_TYPE" type="java.lang.String" transient="false" volatile="false" value=""vnd.android.cursor.item/vnd.android.search.suggest"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_FORMAT" type="java.lang.String" transient="false" Loading Loading @@ -21279,6 +21345,28 @@ visibility="public" > </field> <field name="SUGGEST_COLUMN_SHORTCUT_ID" type="java.lang.String" transient="false" volatile="false" value=""suggest_shortcut_id"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING" type="java.lang.String" transient="false" volatile="false" value=""suggest_spinner_while_refreshing"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_TEXT_1" type="java.lang.String" transient="false" Loading Loading @@ -21312,6 +21400,17 @@ visibility="public" > </field> <field name="SUGGEST_NEVER_MAKE_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""_-1"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_URI_PATH_QUERY" type="java.lang.String" transient="false" Loading @@ -21323,6 +21422,17 @@ visibility="public" > </field> <field name="SUGGEST_URI_PATH_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""search_suggest_shortcut"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="USER_QUERY" type="java.lang.String" transient="false" api/current.xml +110 −0 Original line number Diff line number Diff line Loading @@ -4123,6 +4123,17 @@ visibility="public" > </field> <field name="includeInGlobalSearch" type="int" transient="false" volatile="false" value="16843374" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="indeterminate" type="int" transient="false" Loading Loading @@ -6191,6 +6202,17 @@ visibility="public" > </field> <field name="queryAfterZeroResults" type="int" transient="false" volatile="false" value="16843394" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="radioButtonStyle" type="int" transient="false" Loading Loading @@ -6686,6 +6708,17 @@ visibility="public" > </field> <field name="searchSettingsDescription" type="int" transient="false" volatile="false" value="16843402" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="searchSuggestAuthority" type="int" transient="false" Loading Loading @@ -6741,6 +6774,17 @@ visibility="public" > </field> <field name="searchSuggestThreshold" type="int" transient="false" volatile="false" value="16843373" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="secondaryProgress" type="int" transient="false" Loading Loading @@ -21158,6 +21202,17 @@ visibility="public" > </field> <field name="INTENT_ACTION_WEB_SEARCH_SETTINGS" type="java.lang.String" transient="false" volatile="false" value=""android.search.action.WEB_SEARCH_SETTINGS"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="MENU_KEY" type="char" transient="false" Loading Loading @@ -21191,6 +21246,17 @@ visibility="public" > </field> <field name="SHORTCUT_MIME_TYPE" type="java.lang.String" transient="false" volatile="false" value=""vnd.android.cursor.item/vnd.android.search.suggest"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_FORMAT" type="java.lang.String" transient="false" Loading Loading @@ -21279,6 +21345,28 @@ visibility="public" > </field> <field name="SUGGEST_COLUMN_SHORTCUT_ID" type="java.lang.String" transient="false" volatile="false" value=""suggest_shortcut_id"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING" type="java.lang.String" transient="false" volatile="false" value=""suggest_spinner_while_refreshing"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_TEXT_1" type="java.lang.String" transient="false" Loading Loading @@ -21312,6 +21400,17 @@ visibility="public" > </field> <field name="SUGGEST_NEVER_MAKE_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""_-1"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_URI_PATH_QUERY" type="java.lang.String" transient="false" Loading @@ -21323,6 +21422,17 @@ visibility="public" > </field> <field name="SUGGEST_URI_PATH_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""search_suggest_shortcut"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="USER_QUERY" type="java.lang.String" transient="false" core/java/android/app/SearchManager.java +146 −21 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import java.util.List; * <li><a href="#HowSearchIsInvoked">How Search Is Invoked</a> * <li><a href="#ImplementingSearchForYourApp">Implementing Search for Your App</a> * <li><a href="#Suggestions">Search Suggestions</a> * <li><a href="#ExposingSearchSuggestionsToQuickSearchBox">Exposing Search Suggestions to * Quick Search Box</a></li> * <li><a href="#ActionKeys">Action Keys</a> * <li><a href="#SearchabilityMetadata">Searchability Metadata</a> * <li><a href="#PassingSearchContext">Passing Search Context</a> Loading Loading @@ -246,6 +248,12 @@ import java.util.List; * <li>Summaries of possible results</li> * </ul> * * <p>Once an application is configured to provide search suggestions, those same suggestions can * easily be made available to the system-wide Quick Search Box, providing faster access to its * content from one central prominent place. See * <a href="#ExposingSearchSuggestionsToQuickSearchBox">Exposing Search Suggestions to Quick Search * Box</a> for more details. * * <p>The primary form of suggestions is known as <i>queried suggestions</i> and is based on query * text that the user has already typed. This would generally be based on partial matches in * the available data. In certain situations - for example, when no query text has been typed yet - Loading Loading @@ -480,6 +488,26 @@ import java.util.List; * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</td> * </tr> * * <tr><th>{@link #SUGGEST_COLUMN_SHORTCUT_ID}</th> * <td>This column is used to indicate whether a search suggestion should be stored as a * shortcut, and whether it should be validated. Shortcuts are usually formed when the * user clicks a suggestion from Quick Search Box. If missing, the result will be * stored as a shortcut and never refreshed. If set to * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. * Otherwise, the shortcut id will be used to check back for for an up to date * suggestion using {@link #SUGGEST_URI_PATH_SHORTCUT}. Read more about shortcut * refreshing in the section about * <a href="#ExposingSearchSuggestionsToQuickSearchBox">exposing search suggestions to * Quick Search Box</a>.</td> * <td align="center">No. Only applicable to sources included in Quick Search Box.</td> * </tr> * * <tr><th>{@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING}</th> * <td>This column is used to specify that a spinner should be shown in lieu of an icon2 * while the shortcut of this suggestion is being refreshed in Quick Search Box.</td> * <td align="center">No. Only applicable to sources included in Quick Search Box.</td> * </tr> * * <tr><th><i>Other Columns</i></th> * <td>Finally, if you have defined any <a href="#ActionKeys">Action Keys</a> and you wish * for them to have suggestion-specific definitions, you'll need to define one Loading Loading @@ -553,6 +581,68 @@ import java.util.List; * query text is provided and the SUGGEST_COLUMN_INTENT_DATA values are not suitable for user * inspection and editing.</li></ul> * * <a name="ExposingSearchSuggestionsToQuickSearchBox"></a> * <h3>Exposing Search Suggestions to Quick Search Box</h3> * * <p>Once your application is set up to provide search suggestions, making them available to the * globally accessable Quick Search Box is as easy as setting android:includeInGlobalSearch to * "true" in your searchable metadata file. Beyond that, here are some more details of how * suggestions interact with Quick Search Box, and optional ways that you may customize suggestions * for your application. * * <p><b>Important Note:</b> By default, your application will not be enabled as a suggestion * provider (or "searchable item") in Quick Search Box. Once your app is installed, the user must * enable it as a "searchable item" in the Search settings in order to receive your app's * suggestions in Quick Search Box. You should consider how to message this to users of your app - * perhaps with a note to the user the first time they launch the app about how to enable search * suggestions. This gives your app a chance to be queried for suggestions as the user types into * Quick Search Box, though exactly how or if your suggestions will be surfaced is decided by Quick * Search Box. * * <p><b>Source Ranking:</b> Once your application's search results are made available to Quick * Search Box, how they surface to the user for a particular query will be determined as appropriate * by Quick Search Box ranking. This may depend on how many other apps have results for that query, * and how often the user has clicked on your results compared to the other apps - but there is no * guarantee about how ranking will occur, or whether your app's suggestions will show at all for * a given query. In general, you can expect that providing quality results will increase the * likelihood that your app's suggestions are provided in a prominent position, and apps that * provide lower quality suggestions will be more likely to be ranked lower and/or not displayed. * * <p><b>Search Settings:</b> Each app that is available to Quick Search Box has an entry in the * system settings where the user can enable or disable the inclusion of its results. Below the * name of the application, each application may provide a brief description of what kind of * information will be made available via a search settings description string pointed to by the * android:searchSettingsDescription attribute in the searchable metadata. Note that the * user will need to visit this settings menu to enable search suggestions for your app before your * app will have a chance to provide search suggestions to Quick Search Box - see the section * called "Important Note" above. * * <p><b>Shortcuts:</b> Suggestions that are clicked on by the user may be automatically made into * shortcuts, which are suggestions that have been copied from your provider in order to be quickly * displayed without the need to re-query the original sources. Shortcutted suggestions may be * displayed for the query that yielded the suggestion and for any prefixes of that query. You can * request how to have your app's suggestions made into shortcuts, and whether they should be * refreshed, using the {@link #SUGGEST_COLUMN_SHORTCUT_ID} column: * <ul><li>Suggestions that do not include a shortcut id column will be made into shortcuts and * never refreshed. This makes sense for suggestions that refer to data that will never be changed * or removed.</li> * <li>Suggestions that include a shortcut id will be re-queried for a fresh version of the * suggestion each time the shortcut is displayed. The shortcut will be quickly displayed with * whatever data was most recently available until the refresh query returns, after which the * suggestion will be dynamically refreshed with the up to date information. The shortcut refresh * query will be sent to your suggestion provider with a uri of {@link #SUGGEST_URI_PATH_SHORTCUT}. * The result should contain one suggestion using the same columns as the suggestion query, or be * empty, indicating that the shortcut is no longer valid. Shortcut ids make sense when referring * to data that may change over time, such as a contact's presence status. If a suggestion refers * to data that could take longer to refresh, such as a network based refresh of a stock quote, you * may include {@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING} to show a progress spinner for the * right hand icon until the refresh is complete.</li> * <li>Finally, to prevent a suggestion from being copied into a shortcut, you may provide a * shortcut id with a value of {@link #SUGGEST_NEVER_MAKE_SHORTCUT}.</li></ul> * * Note that Quick Search Box will ultimately decide whether to shortcut your app's suggestions, * considering these values as a strong request from your application. * * <a name="ActionKeys"></a> * <h3>Action Keys</h3> * Loading Loading @@ -725,7 +815,12 @@ import java.util.List; * and editing.</td> * </tr> * </tbody> * </table></td> * </table> * Note that the icon of your app will likely be shown alongside any badge you specify, * to differentiate search in your app from Quick Search Box. The display of this icon * is not under the app's control. * </td> * * <td align="center">No</td> * </tr> * Loading Loading @@ -869,6 +964,47 @@ import java.util.List; * </tbody> * </table> * * <p>Elements of search metadata that configure search suggestions being available to Quick Search * Box: * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> * * <thead> * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> * </thead> * * <tr><th>android:includeInGlobalSearch</th> * <td>If true, indicates the search suggestions provided by your application should be * included in the globally accessible Quick Search Box. The attributes below are only * applicable if this is set to true.</td> * <td align="center">Yes</td> * </tr> * * <tr><th>android:searchSettingsDescription</th> * <td>If provided, provides a brief description of the search suggestions that are provided * by your application to Quick Search Box, and will be displayed in the search settings * entry for your application.</td> * <td align="center">No</td> * </tr> * * <tr><th>android:queryAfterZeroResults</th> * <td>Indicates whether a source should be invoked for supersets of queries it has * returned zero results for in the past. For example, if a source returned zero * results for "bo", it would be ignored for "bob". If set to false, this source * will only be ignored for a single session; the next time the search dialog is * invoked, all sources will be queried. The default value is false.</td> * <td align="center">No</td> * </tr> * * <tr><th>android:searchSuggestThreshold</th> * <td>Indicates the minimum number of characters needed to trigger a source from Quick * Search Box. Only guarantees that a source will not be queried for anything shorter * than the threshold. The default value is 0.</td> * <td align="center">No</td> * </tr> * * </tbody> * </table> * * <p><b>Additional metadata for search action keys.</b> For each action key that you would like to * define, you'll need to add an additional element defining that key, and using the attributes * discussed in <a href="#ActionKeys">Action Keys</a>. A simple example is shown here: Loading Loading @@ -1246,16 +1382,12 @@ public class SearchManager * result indicates the shortcut refers to a no longer valid sugggestion. * * @see #SUGGEST_COLUMN_SHORTCUT_ID * * @hide pending enabling of global search for third parties */ public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut"; /** * MIME type for shortcut validation. You'll use this in your suggestions content provider * in the getType() function. * * @hide pending enabling of global search for third parties */ public final static String SHORTCUT_MIME_TYPE = "vnd.android.cursor.item/vnd.android.search.suggest"; Loading @@ -1268,7 +1400,7 @@ public class SearchManager * In addition to the columns below, the suggestion columns are used to pass along the full * suggestion so it can be shortcutted. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_AUTHORITY = "com.android.globalsearch.stats"; Loading @@ -1276,21 +1408,21 @@ public class SearchManager /** * The path the write goes to. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_URI_PATH = "click"; /** * The column storing the query for the click. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_COLUMN_QUERY = "query"; /** * The column storing the component name of the application that was pivoted into. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_COLUMN_COMPONENT = "component"; Loading Loading @@ -1375,7 +1507,7 @@ public class SearchManager * {@link #COMPONENT_NAME_KEY}. For use by the global search system only - if other providers * attempt to use this column, the value will be overwritten by global search. * * @hide an implementation detail not part of the public api * @hide */ public final static String SUGGEST_COLUMN_INTENT_COMPONENT_NAME = "suggest_intent_component"; /** Loading @@ -1400,8 +1532,6 @@ public class SearchManager * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. * Otherwise, the shortcut id will be used to check back for an up to date suggestion using * {@link #SUGGEST_URI_PATH_SHORTCUT}. * * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id"; Loading @@ -1410,7 +1540,7 @@ public class SearchManager * cursor item's background color if it needs a non-default background color. A non-zero value * indicates a valid background color to override the default. * * @hide an implementation detail not part of the public api * @hide For internal use, not part of the public API. */ public final static String SUGGEST_COLUMN_BACKGROUND_COLOR = "suggest_background_color"; Loading @@ -1418,8 +1548,6 @@ public class SearchManager * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion * is being refreshed. * * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = "suggest_spinner_while_refreshing"; Loading @@ -1427,8 +1555,6 @@ public class SearchManager /** * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion * should not be stored as a shortcut in global search. * * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1"; Loading Loading @@ -1475,8 +1601,6 @@ public class SearchManager * Intent action for starting a web search provider's settings activity. * Web search providers should handle this intent if they have provider-specific * settings to implement. * * @hide implementation detail only relevent to web search providers */ public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS = "android.search.action.WEB_SEARCH_SETTINGS"; Loading @@ -1491,7 +1615,8 @@ public class SearchManager /** * Intent action broadcasted to inform that the search settings have changed in some way. * Either searchables have been enabled or disabled. * Either searchables have been enabled or disabled, or a different web search provider * has been chosen. */ public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED = "android.search.action.SETTINGS_CHANGED"; Loading @@ -1500,7 +1625,7 @@ public class SearchManager * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION}, * the search dialog will take no action. * * @hide an implentation detail not part of the public api * @hide */ public final static String INTENT_ACTION_NONE = "android.search.action.ZILCH"; Loading core/java/android/server/search/Searchables.java +8 −30 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.util.Log; Loading Loading @@ -231,20 +230,18 @@ public class Searchables { : webSearchInfoList.get(ii - search_count); ActivityInfo ai = info.activityInfo; // Check first to avoid duplicate entries. if (newSearchablesMap.containsKey(new ComponentName(ai.packageName, ai.name))) { continue; } if (newSearchablesMap.get(new ComponentName(ai.packageName, ai.name)) == null) { SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai); if (searchable != null) { newSearchablesList.add(searchable); newSearchablesMap.put(searchable.getSearchActivity(), searchable); if (searchable.shouldIncludeInGlobalSearch() && isWhitelistedForGlobalSearch(pm, searchable.getSearchActivity())) { if (searchable.shouldIncludeInGlobalSearch()) { newSearchablesInGlobalSearchList.add(searchable); } } } } } if (webSearchInfoList != null) { for (int i = 0; i < webSearchInfoList.size(); ++i) { Loading Loading @@ -291,25 +288,6 @@ public class Searchables { } } /** * Determines whether an activity may be included in quick search box. For now this is * restricted to system installed apps. * * TODO: remove when we are ready to enable global search for third party applications. * * @param pm The package manager. * @param searchActivity The component of the search activity. * @return True if the search activity may include its search suggestions in quick search box. */ private boolean isWhitelistedForGlobalSearch(PackageManager pm, ComponentName searchActivity) { try { ActivityInfo ai = pm.getActivityInfo(searchActivity, 0); return ((ai.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); } catch (PackageManager.NameNotFoundException e) { return false; } } /** * Checks if the given activity component is present in the system and if so makes it the * preferred activity for handling ACTION_WEB_SEARCH. Loading Loading
Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -352,6 +352,8 @@ web_docs_sample_code_flags := \ guide/samples/LunarLander "Lunar Lander" \ -samplecode $(sample_dir)/NotePad \ guide/samples/NotePad "Note Pad" \ -samplecode $(sample_dir)/SearchableDictionary \ guide/samples/SearchableDictionary "Searchable Dictionary" \ -samplecode $(sample_dir)/Snake \ guide/samples/Snake "Snake" \ -samplecode $(sample_dir)/SoftKeyboard \ Loading
api/4.xml +110 −0 Original line number Diff line number Diff line Loading @@ -4123,6 +4123,17 @@ visibility="public" > </field> <field name="includeInGlobalSearch" type="int" transient="false" volatile="false" value="16843374" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="indeterminate" type="int" transient="false" Loading Loading @@ -6191,6 +6202,17 @@ visibility="public" > </field> <field name="queryAfterZeroResults" type="int" transient="false" volatile="false" value="16843394" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="radioButtonStyle" type="int" transient="false" Loading Loading @@ -6686,6 +6708,17 @@ visibility="public" > </field> <field name="searchSettingsDescription" type="int" transient="false" volatile="false" value="16843402" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="searchSuggestAuthority" type="int" transient="false" Loading Loading @@ -6741,6 +6774,17 @@ visibility="public" > </field> <field name="searchSuggestThreshold" type="int" transient="false" volatile="false" value="16843373" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="secondaryProgress" type="int" transient="false" Loading Loading @@ -21158,6 +21202,17 @@ visibility="public" > </field> <field name="INTENT_ACTION_WEB_SEARCH_SETTINGS" type="java.lang.String" transient="false" volatile="false" value=""android.search.action.WEB_SEARCH_SETTINGS"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="MENU_KEY" type="char" transient="false" Loading Loading @@ -21191,6 +21246,17 @@ visibility="public" > </field> <field name="SHORTCUT_MIME_TYPE" type="java.lang.String" transient="false" volatile="false" value=""vnd.android.cursor.item/vnd.android.search.suggest"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_FORMAT" type="java.lang.String" transient="false" Loading Loading @@ -21279,6 +21345,28 @@ visibility="public" > </field> <field name="SUGGEST_COLUMN_SHORTCUT_ID" type="java.lang.String" transient="false" volatile="false" value=""suggest_shortcut_id"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING" type="java.lang.String" transient="false" volatile="false" value=""suggest_spinner_while_refreshing"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_TEXT_1" type="java.lang.String" transient="false" Loading Loading @@ -21312,6 +21400,17 @@ visibility="public" > </field> <field name="SUGGEST_NEVER_MAKE_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""_-1"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_URI_PATH_QUERY" type="java.lang.String" transient="false" Loading @@ -21323,6 +21422,17 @@ visibility="public" > </field> <field name="SUGGEST_URI_PATH_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""search_suggest_shortcut"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="USER_QUERY" type="java.lang.String" transient="false"
api/current.xml +110 −0 Original line number Diff line number Diff line Loading @@ -4123,6 +4123,17 @@ visibility="public" > </field> <field name="includeInGlobalSearch" type="int" transient="false" volatile="false" value="16843374" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="indeterminate" type="int" transient="false" Loading Loading @@ -6191,6 +6202,17 @@ visibility="public" > </field> <field name="queryAfterZeroResults" type="int" transient="false" volatile="false" value="16843394" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="radioButtonStyle" type="int" transient="false" Loading Loading @@ -6686,6 +6708,17 @@ visibility="public" > </field> <field name="searchSettingsDescription" type="int" transient="false" volatile="false" value="16843402" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="searchSuggestAuthority" type="int" transient="false" Loading Loading @@ -6741,6 +6774,17 @@ visibility="public" > </field> <field name="searchSuggestThreshold" type="int" transient="false" volatile="false" value="16843373" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="secondaryProgress" type="int" transient="false" Loading Loading @@ -21158,6 +21202,17 @@ visibility="public" > </field> <field name="INTENT_ACTION_WEB_SEARCH_SETTINGS" type="java.lang.String" transient="false" volatile="false" value=""android.search.action.WEB_SEARCH_SETTINGS"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="MENU_KEY" type="char" transient="false" Loading Loading @@ -21191,6 +21246,17 @@ visibility="public" > </field> <field name="SHORTCUT_MIME_TYPE" type="java.lang.String" transient="false" volatile="false" value=""vnd.android.cursor.item/vnd.android.search.suggest"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_FORMAT" type="java.lang.String" transient="false" Loading Loading @@ -21279,6 +21345,28 @@ visibility="public" > </field> <field name="SUGGEST_COLUMN_SHORTCUT_ID" type="java.lang.String" transient="false" volatile="false" value=""suggest_shortcut_id"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING" type="java.lang.String" transient="false" volatile="false" value=""suggest_spinner_while_refreshing"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_COLUMN_TEXT_1" type="java.lang.String" transient="false" Loading Loading @@ -21312,6 +21400,17 @@ visibility="public" > </field> <field name="SUGGEST_NEVER_MAKE_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""_-1"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="SUGGEST_URI_PATH_QUERY" type="java.lang.String" transient="false" Loading @@ -21323,6 +21422,17 @@ visibility="public" > </field> <field name="SUGGEST_URI_PATH_SHORTCUT" type="java.lang.String" transient="false" volatile="false" value=""search_suggest_shortcut"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="USER_QUERY" type="java.lang.String" transient="false"
core/java/android/app/SearchManager.java +146 −21 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import java.util.List; * <li><a href="#HowSearchIsInvoked">How Search Is Invoked</a> * <li><a href="#ImplementingSearchForYourApp">Implementing Search for Your App</a> * <li><a href="#Suggestions">Search Suggestions</a> * <li><a href="#ExposingSearchSuggestionsToQuickSearchBox">Exposing Search Suggestions to * Quick Search Box</a></li> * <li><a href="#ActionKeys">Action Keys</a> * <li><a href="#SearchabilityMetadata">Searchability Metadata</a> * <li><a href="#PassingSearchContext">Passing Search Context</a> Loading Loading @@ -246,6 +248,12 @@ import java.util.List; * <li>Summaries of possible results</li> * </ul> * * <p>Once an application is configured to provide search suggestions, those same suggestions can * easily be made available to the system-wide Quick Search Box, providing faster access to its * content from one central prominent place. See * <a href="#ExposingSearchSuggestionsToQuickSearchBox">Exposing Search Suggestions to Quick Search * Box</a> for more details. * * <p>The primary form of suggestions is known as <i>queried suggestions</i> and is based on query * text that the user has already typed. This would generally be based on partial matches in * the available data. In certain situations - for example, when no query text has been typed yet - Loading Loading @@ -480,6 +488,26 @@ import java.util.List; * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.</td> * </tr> * * <tr><th>{@link #SUGGEST_COLUMN_SHORTCUT_ID}</th> * <td>This column is used to indicate whether a search suggestion should be stored as a * shortcut, and whether it should be validated. Shortcuts are usually formed when the * user clicks a suggestion from Quick Search Box. If missing, the result will be * stored as a shortcut and never refreshed. If set to * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. * Otherwise, the shortcut id will be used to check back for for an up to date * suggestion using {@link #SUGGEST_URI_PATH_SHORTCUT}. Read more about shortcut * refreshing in the section about * <a href="#ExposingSearchSuggestionsToQuickSearchBox">exposing search suggestions to * Quick Search Box</a>.</td> * <td align="center">No. Only applicable to sources included in Quick Search Box.</td> * </tr> * * <tr><th>{@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING}</th> * <td>This column is used to specify that a spinner should be shown in lieu of an icon2 * while the shortcut of this suggestion is being refreshed in Quick Search Box.</td> * <td align="center">No. Only applicable to sources included in Quick Search Box.</td> * </tr> * * <tr><th><i>Other Columns</i></th> * <td>Finally, if you have defined any <a href="#ActionKeys">Action Keys</a> and you wish * for them to have suggestion-specific definitions, you'll need to define one Loading Loading @@ -553,6 +581,68 @@ import java.util.List; * query text is provided and the SUGGEST_COLUMN_INTENT_DATA values are not suitable for user * inspection and editing.</li></ul> * * <a name="ExposingSearchSuggestionsToQuickSearchBox"></a> * <h3>Exposing Search Suggestions to Quick Search Box</h3> * * <p>Once your application is set up to provide search suggestions, making them available to the * globally accessable Quick Search Box is as easy as setting android:includeInGlobalSearch to * "true" in your searchable metadata file. Beyond that, here are some more details of how * suggestions interact with Quick Search Box, and optional ways that you may customize suggestions * for your application. * * <p><b>Important Note:</b> By default, your application will not be enabled as a suggestion * provider (or "searchable item") in Quick Search Box. Once your app is installed, the user must * enable it as a "searchable item" in the Search settings in order to receive your app's * suggestions in Quick Search Box. You should consider how to message this to users of your app - * perhaps with a note to the user the first time they launch the app about how to enable search * suggestions. This gives your app a chance to be queried for suggestions as the user types into * Quick Search Box, though exactly how or if your suggestions will be surfaced is decided by Quick * Search Box. * * <p><b>Source Ranking:</b> Once your application's search results are made available to Quick * Search Box, how they surface to the user for a particular query will be determined as appropriate * by Quick Search Box ranking. This may depend on how many other apps have results for that query, * and how often the user has clicked on your results compared to the other apps - but there is no * guarantee about how ranking will occur, or whether your app's suggestions will show at all for * a given query. In general, you can expect that providing quality results will increase the * likelihood that your app's suggestions are provided in a prominent position, and apps that * provide lower quality suggestions will be more likely to be ranked lower and/or not displayed. * * <p><b>Search Settings:</b> Each app that is available to Quick Search Box has an entry in the * system settings where the user can enable or disable the inclusion of its results. Below the * name of the application, each application may provide a brief description of what kind of * information will be made available via a search settings description string pointed to by the * android:searchSettingsDescription attribute in the searchable metadata. Note that the * user will need to visit this settings menu to enable search suggestions for your app before your * app will have a chance to provide search suggestions to Quick Search Box - see the section * called "Important Note" above. * * <p><b>Shortcuts:</b> Suggestions that are clicked on by the user may be automatically made into * shortcuts, which are suggestions that have been copied from your provider in order to be quickly * displayed without the need to re-query the original sources. Shortcutted suggestions may be * displayed for the query that yielded the suggestion and for any prefixes of that query. You can * request how to have your app's suggestions made into shortcuts, and whether they should be * refreshed, using the {@link #SUGGEST_COLUMN_SHORTCUT_ID} column: * <ul><li>Suggestions that do not include a shortcut id column will be made into shortcuts and * never refreshed. This makes sense for suggestions that refer to data that will never be changed * or removed.</li> * <li>Suggestions that include a shortcut id will be re-queried for a fresh version of the * suggestion each time the shortcut is displayed. The shortcut will be quickly displayed with * whatever data was most recently available until the refresh query returns, after which the * suggestion will be dynamically refreshed with the up to date information. The shortcut refresh * query will be sent to your suggestion provider with a uri of {@link #SUGGEST_URI_PATH_SHORTCUT}. * The result should contain one suggestion using the same columns as the suggestion query, or be * empty, indicating that the shortcut is no longer valid. Shortcut ids make sense when referring * to data that may change over time, such as a contact's presence status. If a suggestion refers * to data that could take longer to refresh, such as a network based refresh of a stock quote, you * may include {@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING} to show a progress spinner for the * right hand icon until the refresh is complete.</li> * <li>Finally, to prevent a suggestion from being copied into a shortcut, you may provide a * shortcut id with a value of {@link #SUGGEST_NEVER_MAKE_SHORTCUT}.</li></ul> * * Note that Quick Search Box will ultimately decide whether to shortcut your app's suggestions, * considering these values as a strong request from your application. * * <a name="ActionKeys"></a> * <h3>Action Keys</h3> * Loading Loading @@ -725,7 +815,12 @@ import java.util.List; * and editing.</td> * </tr> * </tbody> * </table></td> * </table> * Note that the icon of your app will likely be shown alongside any badge you specify, * to differentiate search in your app from Quick Search Box. The display of this icon * is not under the app's control. * </td> * * <td align="center">No</td> * </tr> * Loading Loading @@ -869,6 +964,47 @@ import java.util.List; * </tbody> * </table> * * <p>Elements of search metadata that configure search suggestions being available to Quick Search * Box: * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> * * <thead> * <tr><th>Attribute</th> <th>Description</th> <th>Required?</th></tr> * </thead> * * <tr><th>android:includeInGlobalSearch</th> * <td>If true, indicates the search suggestions provided by your application should be * included in the globally accessible Quick Search Box. The attributes below are only * applicable if this is set to true.</td> * <td align="center">Yes</td> * </tr> * * <tr><th>android:searchSettingsDescription</th> * <td>If provided, provides a brief description of the search suggestions that are provided * by your application to Quick Search Box, and will be displayed in the search settings * entry for your application.</td> * <td align="center">No</td> * </tr> * * <tr><th>android:queryAfterZeroResults</th> * <td>Indicates whether a source should be invoked for supersets of queries it has * returned zero results for in the past. For example, if a source returned zero * results for "bo", it would be ignored for "bob". If set to false, this source * will only be ignored for a single session; the next time the search dialog is * invoked, all sources will be queried. The default value is false.</td> * <td align="center">No</td> * </tr> * * <tr><th>android:searchSuggestThreshold</th> * <td>Indicates the minimum number of characters needed to trigger a source from Quick * Search Box. Only guarantees that a source will not be queried for anything shorter * than the threshold. The default value is 0.</td> * <td align="center">No</td> * </tr> * * </tbody> * </table> * * <p><b>Additional metadata for search action keys.</b> For each action key that you would like to * define, you'll need to add an additional element defining that key, and using the attributes * discussed in <a href="#ActionKeys">Action Keys</a>. A simple example is shown here: Loading Loading @@ -1246,16 +1382,12 @@ public class SearchManager * result indicates the shortcut refers to a no longer valid sugggestion. * * @see #SUGGEST_COLUMN_SHORTCUT_ID * * @hide pending enabling of global search for third parties */ public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut"; /** * MIME type for shortcut validation. You'll use this in your suggestions content provider * in the getType() function. * * @hide pending enabling of global search for third parties */ public final static String SHORTCUT_MIME_TYPE = "vnd.android.cursor.item/vnd.android.search.suggest"; Loading @@ -1268,7 +1400,7 @@ public class SearchManager * In addition to the columns below, the suggestion columns are used to pass along the full * suggestion so it can be shortcutted. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_AUTHORITY = "com.android.globalsearch.stats"; Loading @@ -1276,21 +1408,21 @@ public class SearchManager /** * The path the write goes to. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_URI_PATH = "click"; /** * The column storing the query for the click. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_COLUMN_QUERY = "query"; /** * The column storing the component name of the application that was pivoted into. * * @hide an implementation detail not part of the public api * @hide */ public final static String SEARCH_CLICK_REPORT_COLUMN_COMPONENT = "component"; Loading Loading @@ -1375,7 +1507,7 @@ public class SearchManager * {@link #COMPONENT_NAME_KEY}. For use by the global search system only - if other providers * attempt to use this column, the value will be overwritten by global search. * * @hide an implementation detail not part of the public api * @hide */ public final static String SUGGEST_COLUMN_INTENT_COMPONENT_NAME = "suggest_intent_component"; /** Loading @@ -1400,8 +1532,6 @@ public class SearchManager * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. * Otherwise, the shortcut id will be used to check back for an up to date suggestion using * {@link #SUGGEST_URI_PATH_SHORTCUT}. * * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id"; Loading @@ -1410,7 +1540,7 @@ public class SearchManager * cursor item's background color if it needs a non-default background color. A non-zero value * indicates a valid background color to override the default. * * @hide an implementation detail not part of the public api * @hide For internal use, not part of the public API. */ public final static String SUGGEST_COLUMN_BACKGROUND_COLOR = "suggest_background_color"; Loading @@ -1418,8 +1548,6 @@ public class SearchManager * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion * is being refreshed. * * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = "suggest_spinner_while_refreshing"; Loading @@ -1427,8 +1555,6 @@ public class SearchManager /** * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion * should not be stored as a shortcut in global search. * * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1"; Loading Loading @@ -1475,8 +1601,6 @@ public class SearchManager * Intent action for starting a web search provider's settings activity. * Web search providers should handle this intent if they have provider-specific * settings to implement. * * @hide implementation detail only relevent to web search providers */ public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS = "android.search.action.WEB_SEARCH_SETTINGS"; Loading @@ -1491,7 +1615,8 @@ public class SearchManager /** * Intent action broadcasted to inform that the search settings have changed in some way. * Either searchables have been enabled or disabled. * Either searchables have been enabled or disabled, or a different web search provider * has been chosen. */ public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED = "android.search.action.SETTINGS_CHANGED"; Loading @@ -1500,7 +1625,7 @@ public class SearchManager * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION}, * the search dialog will take no action. * * @hide an implentation detail not part of the public api * @hide */ public final static String INTENT_ACTION_NONE = "android.search.action.ZILCH"; Loading
core/java/android/server/search/Searchables.java +8 −30 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.util.Log; Loading Loading @@ -231,20 +230,18 @@ public class Searchables { : webSearchInfoList.get(ii - search_count); ActivityInfo ai = info.activityInfo; // Check first to avoid duplicate entries. if (newSearchablesMap.containsKey(new ComponentName(ai.packageName, ai.name))) { continue; } if (newSearchablesMap.get(new ComponentName(ai.packageName, ai.name)) == null) { SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai); if (searchable != null) { newSearchablesList.add(searchable); newSearchablesMap.put(searchable.getSearchActivity(), searchable); if (searchable.shouldIncludeInGlobalSearch() && isWhitelistedForGlobalSearch(pm, searchable.getSearchActivity())) { if (searchable.shouldIncludeInGlobalSearch()) { newSearchablesInGlobalSearchList.add(searchable); } } } } } if (webSearchInfoList != null) { for (int i = 0; i < webSearchInfoList.size(); ++i) { Loading Loading @@ -291,25 +288,6 @@ public class Searchables { } } /** * Determines whether an activity may be included in quick search box. For now this is * restricted to system installed apps. * * TODO: remove when we are ready to enable global search for third party applications. * * @param pm The package manager. * @param searchActivity The component of the search activity. * @return True if the search activity may include its search suggestions in quick search box. */ private boolean isWhitelistedForGlobalSearch(PackageManager pm, ComponentName searchActivity) { try { ActivityInfo ai = pm.getActivityInfo(searchActivity, 0); return ((ai.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); } catch (PackageManager.NameNotFoundException e) { return false; } } /** * Checks if the given activity component is present in the system and if so makes it the * preferred activity for handling ACTION_WEB_SEARCH. Loading