diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2009-09-02 13:39:46 -0700 |
---|---|---|
committer | Jean-Baptiste Queru <jbq@google.com> | 2009-09-02 13:39:46 -0700 |
commit | 8f4b5a561813ee8c22d2b8e73c33299471d4a3f3 (patch) | |
tree | b19d6696816a2892cea093dab422becd50e9a21f | |
parent | 72b1f379d5c97c8ff31d2201e78215af777d6bda (diff) | |
download | base-android-sdk-1.6_r1.tar.gz |
donut snapshotandroid-sdk-1.6_r1android-1.6_r1
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | api/4.xml | 110 | ||||
-rw-r--r-- | api/current.xml | 110 | ||||
-rw-r--r-- | core/java/android/app/SearchManager.java | 167 | ||||
-rw-r--r-- | core/java/android/server/search/Searchables.java | 38 | ||||
-rw-r--r-- | core/java/android/text/Layout.java | 2 | ||||
-rw-r--r-- | core/res/res/values/attrs.xml | 10 | ||||
-rw-r--r-- | core/res/res/values/public.xml | 4 | ||||
-rw-r--r-- | docs/html/guide/guide_toc.cs | 5 | ||||
-rw-r--r-- | docs/html/guide/samples/images/SearchableDictionary1.png | bin | 0 -> 15800 bytes | |||
-rw-r--r-- | docs/html/guide/samples/images/SearchableDictionary2.png | bin | 0 -> 18114 bytes | |||
-rw-r--r-- | docs/html/guide/samples/index.jd | 4 | ||||
-rw-r--r-- | docs/html/guide/topics/manifest/uses-feature-element.jd | 98 | ||||
-rw-r--r-- | docs/html/guide/topics/manifest/uses-sdk-element.jd | 17 | ||||
-rw-r--r-- | tests/AndroidTests/src/com/android/unit_tests/activity/LifecycleTest.java | 3 |
15 files changed, 495 insertions, 75 deletions
diff --git a/Android.mk b/Android.mk index fd03c6d897dc..1b5c70b6ae1d 100644 --- a/Android.mk +++ b/Android.mk @@ -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 \ diff --git a/api/4.xml b/api/4.xml index 55d910508cca..fc54859f7369 100644 --- a/api/4.xml +++ b/api/4.xml @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" diff --git a/api/current.xml b/api/current.xml index 55d910508cca..fc54859f7369 100644 --- a/api/current.xml +++ b/api/current.xml @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index 62faadc83de1..2245562763cf 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -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> @@ -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 - @@ -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 @@ -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> * @@ -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> * @@ -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: @@ -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"; @@ -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"; @@ -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"; @@ -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"; /** @@ -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"; @@ -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"; @@ -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"; @@ -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"; @@ -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"; @@ -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"; @@ -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"; diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java index a2add73dc3b0..c61595736723 100644 --- a/core/java/android/server/search/Searchables.java +++ b/core/java/android/server/search/Searchables.java @@ -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; @@ -231,16 +230,14 @@ 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; - } - SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai); - if (searchable != null) { - newSearchablesList.add(searchable); - newSearchablesMap.put(searchable.getSearchActivity(), searchable); - if (searchable.shouldIncludeInGlobalSearch() - && isWhitelistedForGlobalSearch(pm, searchable.getSearchActivity())) { - newSearchablesInGlobalSearchList.add(searchable); + 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()) { + newSearchablesInGlobalSearchList.add(searchable); + } } } } @@ -292,25 +289,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. * @param component Name of the component to check and set as preferred. diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index 29dc2ea5246e..a92800d011ee 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -1527,7 +1527,7 @@ public abstract class Layout { if (bm != null) { workPaint.set(paint); Styled.measureText(paint, workPaint, text, - offset, offset + 1, null); + j, j + 2, null); float wid = (float) bm.getWidth() * -workPaint.ascent() / bm.getHeight(); diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index d5f8dcb76bcb..fd78f83698aa 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2866,16 +2866,16 @@ when the user clicks a suggestion. <i>Optional attribute.</i> --> <attr name="searchSuggestIntentData" format="string" /> - <!-- @hide If provided, this is the minimum number of characters needed to trigger + <!-- If provided, this is the minimum number of characters needed to trigger search suggestions. The default value is 0. <i>Optional attribute.</i> --> <attr name="searchSuggestThreshold" format="integer" /> - <!-- @hide If provided and <code>true</code>, this searchable activity will be + <!-- If provided and <code>true</code>, this searchable activity will be included in any global lists of search targets. - The default value is <code>false</code>. <i>Optional attribute.</i>.--> + The default value is <code>false</code>. <i>Optional attribute.</i>. --> <attr name="includeInGlobalSearch" format="boolean" /> - <!-- @hide If provided and <code>true</code>, this searchable activity will be invoked for all + <!-- If provided and <code>true</code>, this searchable activity will be invoked for all queries in a particular session. If set to <code>false</code> and the activity returned zero results for a query, it will not be invoked again in that session for supersets of that zero-results query. For example, if the activity returned zero @@ -2883,7 +2883,7 @@ The default value is <code>false</code>. <i>Optional attribute.</i>. --> <attr name="queryAfterZeroResults" format="boolean" /> - <!-- @hide If provided, this string will be used to describe the searchable item in the + <!-- If provided, this string will be used to describe the searchable item in the searchable items settings within system search settings. <i>Optional attribute.</i> --> <attr name="searchSettingsDescription" format="string" /> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index d7224131f6a1..c92cf5185279 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1094,9 +1094,7 @@ <public type="attr" name="tension" id="0x0101026a" /> <public type="attr" name="extraTension" id="0x0101026b" /> <public type="attr" name="anyDensity" id="0x0101026c" /> - <!-- {@hide} --> <public type="attr" name="searchSuggestThreshold" id="0x0101026d" /> - <!-- {@hide} --> <public type="attr" name="includeInGlobalSearch" id="0x0101026e" /> <public type="attr" name="onClick" id="0x0101026f" /> <public type="attr" name="targetSdkVersion" id="0x01010270" /> @@ -1117,7 +1115,6 @@ <public type="attr" name="backupAgent" id="0x0101027f" /> <public type="attr" name="allowBackup" id="0x01010280" /> <public type="attr" name="glEsVersion" id="0x01010281" /> - <!-- {@hide} --> <public type="attr" name="queryAfterZeroResults" id="0x01010282" /> <public type="attr" name="dropDownHeight" id="0x01010283" /> <public type="attr" name="smallScreens" id="0x01010284" /> @@ -1126,7 +1123,6 @@ <public type="attr" name="progressBarStyleInverse" id="0x01010287" /> <public type="attr" name="progressBarStyleSmallInverse" id="0x01010288" /> <public type="attr" name="progressBarStyleLargeInverse" id="0x01010289" /> - <!-- {@hide} --> <public type="attr" name="searchSettingsDescription" id="0x0101028a" /> <public type="attr" name="textColorPrimaryInverseDisableOnly" id="0x0101028b" /> <public type="attr" name="autoUrlDetect" id="0x0101028c" /> diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 459ad37f79b6..a5dadbc25acd 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -375,7 +375,7 @@ </ul> <ul> <?cs if:android.whichdoc != "online" ?> - <li><a href="<?cs var:toroot ?>../samples"> + <li><a href="<?cs var:toroot ?>../platforms/android-<?cs var:sdk.version ?>/samples"> <span class="en">Sample Code</span> »</a></li> <?cs else ?> @@ -399,6 +399,9 @@ <li><a href="<?cs var:toroot ?>guide/samples/NotePad/index.html"> <span class="en">Note Pad</span> </a></li> + <li><a href="<?cs var:toroot ?>guide/samples/SearchableDictionary/index.html"> + <span class="en">Searchable Dictionary</span> + </a></li> <li><a href="<?cs var:toroot ?>guide/samples/Snake/index.html"> <span class="en">Snake</span> </a></li> diff --git a/docs/html/guide/samples/images/SearchableDictionary1.png b/docs/html/guide/samples/images/SearchableDictionary1.png Binary files differnew file mode 100644 index 000000000000..ebb4604f8607 --- /dev/null +++ b/docs/html/guide/samples/images/SearchableDictionary1.png diff --git a/docs/html/guide/samples/images/SearchableDictionary2.png b/docs/html/guide/samples/images/SearchableDictionary2.png Binary files differnew file mode 100644 index 000000000000..34746cd15563 --- /dev/null +++ b/docs/html/guide/samples/images/SearchableDictionary2.png diff --git a/docs/html/guide/samples/index.jd b/docs/html/guide/samples/index.jd index d8bbc4128c54..6e79d5020b01 100644 --- a/docs/html/guide/samples/index.jd +++ b/docs/html/guide/samples/index.jd @@ -33,6 +33,10 @@ can modify them and watch them execute. </p> <dd>An application for saving notes. Similar (but not identical) to the <a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad tutorial</a>.</dd> + <dt><a href="SearchableDictionary/index.html">Searchable Dictionary</a></dt> + <dd>A sample application that demonstrates Android's search framework, + including how to provide search suggestions for Quick Search Box.</dd> + <dt><a href="Snake/index.html">Snake</a></dt> <dd>An implementation of the classic game "Snake."</dd> diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd index 2626735cae11..e5083923370f 100644 --- a/docs/html/guide/topics/manifest/uses-feature-element.jd +++ b/docs/html/guide/topics/manifest/uses-feature-element.jd @@ -6,7 +6,8 @@ page.title=<uses-feature> <dt>syntax:</dt> <dd> <pre class="stx"> -<uses-feature android:<a href="#glEsVersion">glEsVersion</a>=["true" | "false"] /> +<uses-feature android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>" + android:<a href="#name">name</a>="<em>string</em>" /> </pre> </dd> @@ -14,15 +15,60 @@ page.title=<uses-feature> <dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd> <dt>description:</dt> -<dd>This element specifies specific features used by the application. +<dd>This element declares a specific feature used by the application. Android provides some features that may not be equally supported by all Android devices. In a manner similar to the <code><a href="uses-sdk-element.html"><uses-sdk></a></code> -element, this element allows an application to specify which potentially variable -features it requires. In this way, the application -will not be installed on devices that do not offer the required feature.</p> +element, this element allows an application to specify which device-variable +features it uses. In this way, the application +will not be installed on devices that do not offer the feature.</p> + +<p>For example, an application might specify that it requires a camera with auto-focus capabilities. +If a device does not provide a camera with auto-focus, then it will not allow +installation of the application.</p> + +<p>In order to maintain strict device compatibility, it's very important that you use +this element to declare all features that your application uses. Failure to declare +a feature may result your application being installed on a device +that does not support the feature and your application failing.</p> + +<p>For some features, there may exist a specfic attribute that allows you to define +a version of the feature, such as the version of Open GL used (declared with +<a href="#glEsVersion">{@code glEsVersion}</a>). Other features that either do or do not +exist for a device, such as camera auto-focus, are declared using the +<a href="#name">{@code name}</a> attribute.</p> + +<p>Any software or hardware features that may vary among Android-powered +devices will be listed on this page among the attributes below. If you see any features +here that you use in your application, you should include a {@code +<uses-feature>} element for each one. For example, if your application uses the device +camera, then you should include the following in your {@code AndroidManifest.xml}:</p> + +<pre> +<uses-feature android:name="android.hardware.camera" /> +</pre> + +<p>If you declare "android.hardware.camera", then your application is considered +compatible with all devices that include a camera, regardless of whether auto-focus is +available or not. If you also use the auto-focus features (available through the {@link +android.hardware.Camera Camera API}), then you need to include an additional +{@code <uses-feature>} element that declares the "android.hardware.camera.autofocus" +feature. Also note that you must still request the {@link android.Manifest.permission#CAMERA +CAMERA permission}. Requesting permission grants your application access to the +appropriate hardware and software, while declaring the features used by +your application ensures proper device compatibility.</p> + +<p>Although the {@code <uses-feature>} element is only activated for devices running +API Level 4 or higher, it is safe to include this for applications that declare +a <a href="uses-sdk-element.html#min">{@code minSdkVersion}</a> +of "3" or lower. Devices running older versions of the platform +will simply ignore this element, but newer devices will recognize it and enforce +installation restrictions based on whether the device supports the feature.</p> + +<p class="note"><strong>Note:</strong> +For each feature required by your application, you must include a new {@code +<uses-feature>} element. Multiple features cannot be declared in one +instance of this element.</p> -<p>For example, an application might specify that it requires a certain version of Open GL. -If a device does not support that version of Open GL, then it will not allow installation of the application.</p> </dd> @@ -38,6 +84,44 @@ If a device does not support that version of Open GL, then it will not allow ins </dl> </dd> +<dd> +<dl class="attr"><dt><a name="name"></a>{@code android:name}</dt> + <dd>The name of a feature required by the application. + The value must be one of the following accepted strings: + + <table> + <tr> + <th>Feature</th> + <th>Value</th> + <th>Description</th> + </tr><tr> + <td rowspan="3">Camera</td> + <td>"{@code android.hardware.camera}"</td> + <td>The application requires a camera.</td> + </tr><tr> + <td>"{@code android.hardware.camera.autofocus}"</td> + <td>The application requires a camera with auto-focus capability. + As a prerequisite, "{@code android.hardware.camera}" must also be declared + with a separate {@code <uses-feature>} element. + </td> + <tr> + <td colspan="2"> + <strong>Note:</strong> Any application that requests the + {@link android.Manifest.permission#CAMERA CAMERA permission} but does <em>not</em> + declare any camera features with the {@code <uses-feature>} element will be assumed + to use all camera features (such as auto-focus). Thus, the application will not + be compatible with devices that do not support all features. Please use + {@code <uses-feature>} to declare only the camera features that your + application needs. + </td> + </tr> + </tr> + </table> + + </dd> +</dl> +</dd> + <!-- ##api level indication## --> <dt>introduced in:</dt> <dd>API Level 4</dd> diff --git a/docs/html/guide/topics/manifest/uses-sdk-element.jd b/docs/html/guide/topics/manifest/uses-sdk-element.jd index adcdc286cbed..ee8d03dc06d1 100644 --- a/docs/html/guide/topics/manifest/uses-sdk-element.jd +++ b/docs/html/guide/topics/manifest/uses-sdk-element.jd @@ -3,7 +3,10 @@ page.title=<uses-sdk> <dl class="xml"> <dt>syntax:</dt> -<dd><pre class="stx"><uses-sdk android:<a href="#min">minSdkVersion</a>="<i>integer</i>" /></pre></dd> +<dd><pre> +<uses-sdk android:<a href="#min">minSdkVersion</a>="<i>integer</i>" + android:<a href="#max">maxSdkVersion</a>="<i>integer</i>" + android:<a href="#target">targetSdkVersion</a>="<i>integer</i>" /></pre></dd> <dt>contained in:</dt> <dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd> @@ -64,12 +67,16 @@ and minor versions).</p> <dt><a name="target"></a>{@code android:targetSdkVersion}</dt> <dd>An integer designating the API Level that the application is targetting. - <p>With this attribute set, the application says that is is be able to run on + <p>With this attribute set, the application says that it is able to run on older versions (down to {@code minSdkVersion}), but was explicitly tested to work with the version specified here. - Specifying this version allows the platform to disable compatibility - code that is not required or enable newer features that are not - available to older applications.</p> + Specifying this target version allows the platform to disable compatibility + settings that are not required for the target version (which may otherwise be turned on + in order to maintain forward-compatibility) or enable newer features that are not + available to older applications. This does not mean that you can program different + features for different versions of the platform—it simply informs the platform that you + have tested against the target version and the platform should not perform any extra + work to maintain forward-compatibility with the target version.</p> <p>Introduced in: API Level 4</p> </dd> diff --git a/tests/AndroidTests/src/com/android/unit_tests/activity/LifecycleTest.java b/tests/AndroidTests/src/com/android/unit_tests/activity/LifecycleTest.java index fdc12ce727b0..80904da5f0d7 100644 --- a/tests/AndroidTests/src/com/android/unit_tests/activity/LifecycleTest.java +++ b/tests/AndroidTests/src/com/android/unit_tests/activity/LifecycleTest.java @@ -67,7 +67,8 @@ public class LifecycleTest extends ActivityTestsBase { runLaunchpad(LaunchpadActivity.LIFECYCLE_SCREEN); } - @LargeTest + //flaky test, removing from large suite until 1866891 is fixed + //@LargeTest public void testDialog() throws Exception { mIntent = mTopIntent; runLaunchpad(LaunchpadActivity.LIFECYCLE_DIALOG); |