donut snapshot
diff --git a/Android.mk b/Android.mk
index fd03c6d..1b5c70b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -352,6 +352,8 @@
 		            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 55d9105..fc54859 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="&quot;android.search.action.WEB_SEARCH_SETTINGS&quot;"
+ 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="&quot;vnd.android.cursor.item/vnd.android.search.suggest&quot;"
+ 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="&quot;suggest_shortcut_id&quot;"
+ 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="&quot;suggest_spinner_while_refreshing&quot;"
+ 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="&quot;_-1&quot;"
+ 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="&quot;search_suggest_shortcut&quot;"
+ 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 55d9105..fc54859 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="&quot;android.search.action.WEB_SEARCH_SETTINGS&quot;"
+ 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="&quot;vnd.android.cursor.item/vnd.android.search.suggest&quot;"
+ 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="&quot;suggest_shortcut_id&quot;"
+ 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="&quot;suggest_spinner_while_refreshing&quot;"
+ 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="&quot;_-1&quot;"
+ 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="&quot;search_suggest_shortcut&quot;"
+ 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 62faadc..2245562 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -51,6 +51,8 @@
  * <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 @@
  * <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 @@
  *             {@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 @@
  * 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 @@
  *                         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 @@
  *     </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 @@
      * 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 @@
      * 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 @@
     /**
      * 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 @@
      *  {@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 @@
      * {@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 @@
      * 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 @@
      * 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 @@
     /**
      * 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 @@
      * 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 @@
     
     /**
      * 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 @@
      * 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 a2add73..c615957 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -26,7 +26,6 @@
 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 @@
                         : 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 @@
     }
 
     /**
-     * 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 29dc2ea52..a92800d 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -1527,7 +1527,7 @@
                     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 d5f8dcb..fd78f83 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 d722413..c92cf51 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 459ad37..a5dadbc 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>
           &raquo;</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
new file mode 100644
index 0000000..ebb4604
--- /dev/null
+++ b/docs/html/guide/samples/images/SearchableDictionary1.png
Binary files differ
diff --git a/docs/html/guide/samples/images/SearchableDictionary2.png b/docs/html/guide/samples/images/SearchableDictionary2.png
new file mode 100644
index 0000000..34746cd
--- /dev/null
+++ b/docs/html/guide/samples/images/SearchableDictionary2.png
Binary files differ
diff --git a/docs/html/guide/samples/index.jd b/docs/html/guide/samples/index.jd
index d8bbc41..6e79d50 100644
--- a/docs/html/guide/samples/index.jd
+++ b/docs/html/guide/samples/index.jd
@@ -33,6 +33,10 @@
   <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 2626735..e508392 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 @@
 <dt>syntax:</dt>
 <dd>
 <pre class="stx">
-&lt;uses-feature android:<a href="#glEsVersion">glEsVersion</a>=["true" | "false"] /&gt;
+&lt;uses-feature android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>"
+              android:<a href="#name">name</a>="<em>string</em>" /&gt;
 </pre>
 </dd>
 
@@ -14,15 +15,60 @@
 <dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</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">&lt;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 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>
+<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
+&lt;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>
+&lt;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 &lt;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 &lt;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
+&lt;uses-feature>} element. Multiple features cannot be declared in one 
+instance of this element.</p>
+
 </dd> 
 
 
@@ -38,6 +84,44 @@
 </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 &lt;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 &lt;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 &lt;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 adcdc28..ee8d03d 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 @@
 
 <dl class="xml">
 <dt>syntax:</dt>
-<dd><pre class="stx">&lt;uses-sdk android:<a href="#min">minSdkVersion</a>="<i>integer</i>" /&gt;</pre></dd>
+<dd><pre>
+&lt;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>" /&gt;</pre></dd>
 
 <dt>contained in:</dt>
 <dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a></code></dd>
@@ -64,12 +67,16 @@
   <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&mdash;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 fdc12ce..80904da 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 @@
         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);