Clean up global search and web search activity finding

This removes the '*' value for android.app.searchable and
android.app.default_searchable that was previously used by apps to say
that they want global search as their search. I think the only
activity that this will affect is the wallpaper chooser in the
launcher, which doesn't seem like it matters.  It could mean that some
third party code will stop invoking global search, but all they would
need to do is call startSearch() with globalSearch=true instead.

Fixes http://b/issue?id=2377433 and http://b/issue?id=2377429

Change-Id: I0252952b44ae85dab31221b598ed79cc24e2b580
diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index 9ba7863..cb03d2c 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -24,9 +24,8 @@
 
 /** @hide */
 interface ISearchManager {
-   SearchableInfo getSearchableInfo(in ComponentName launchActivity, boolean globalSearch);
+   SearchableInfo getSearchableInfo(in ComponentName launchActivity);
    List<SearchableInfo> getSearchablesInGlobalSearch();
-   List<SearchableInfo> getSearchablesForWebSearch();
-   SearchableInfo getDefaultSearchableForWebSearch();
-   void setDefaultWebSearch(in ComponentName component);
+   ComponentName getGlobalSearchActivity();
+   ComponentName getWebSearchActivity();
 }
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 581b436..6a02a58 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -274,7 +274,7 @@
         SearchManager searchManager = (SearchManager)
                 mContext.getSystemService(Context.SEARCH_SERVICE);
         // Try to get the searchable info for the provided component.
-        mSearchable = searchManager.getSearchableInfo(componentName, false);
+        mSearchable = searchManager.getSearchableInfo(componentName);
 
         if (mSearchable == null) {
             return false;
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 99edfaca..b54e53d 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -137,21 +137,11 @@
  * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);   // search within your activity
  * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL);  // search using platform global search</pre>
  * 
- * <p><b>How to enable global search with Quick Search Box.</b>  In addition to searching within
+ * <p><b>How to start global search.</b>  In addition to searching within
  * your activity or application, you can also use the Search Manager to invoke a platform-global
- * search, which uses Quick Search Box to search across the device and the web. There are two ways
- * to do this:
- * <ul><li>You can simply define "search" within your application or activity to mean global search.
- * This is described in more detail in the 
- * <a href="#SearchabilityMetadata">Searchability Metadata</a> section.  Briefly, you will
- * add a single meta-data entry to your manifest, declaring that the default search
- * for your application is "*".  This indicates to the system that no application-specific
- * search activity is provided, and that it should launch web-based search instead.</li>
- * <li>Simply do nothing and the default implementation of
- * {@link android.app.Activity#onSearchRequested} will cause global search to be triggered.
- * (You can also always trigger search via a direct call to {@link android.app.Activity#startSearch}.
- * This is most useful if you wish to provide local searchability <i>and</i> access to global
- * search.)</li></ul> 
+ * search, which uses Quick Search Box to search across the device and the web.
+ * Override {@link android.app.Activity#onSearchRequested} and call
+ * {@link android.app.Activity#startSearch} with {@code globalSearch} set to {@code true}.
  * 
  * <p><b>How to disable search from your activity.</b> Search is a system-wide feature and users
  * will expect it to be available in all contexts.  If your UI design absolutely precludes
@@ -871,12 +861,8 @@
  * 
  * <p>The simplest way to specify this is to add a <i>search reference</i> element to the
  * application entry in the <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> file.  
- * The value of this reference can be either of:
- * <ul><li>The name of your searchable activity.  
- * It is typically prefixed by '.' to indicate that it's in the same package.</li>
- * <li>A "*" indicates that the system may select a default searchable activity, in which
- * case it will typically select web-based search.</li>
- * </ul>
+ * The value of this reference should be the name of your searchable activity.
+ * It is typically prefixed by '.' to indicate that it's in the same package.
  *
  * <p>Here is a snippet showing the necessary addition to the manifest entry for your 
  * non-searchable activities.
@@ -1662,32 +1648,15 @@
     /**
      * Gets the name of the global search activity.
      *
-     * This is currently implemented by returning the first activity that handles
-     * the GLOBAL_SEARCH intent and has the GLOBAL_SEARCH permission. If we allow
-     * more than one global search acitivity to be installed, this code must be changed.
-     *
-     * TODO: Doing this every time we start global search is inefficient. Will fix that once
-     * we have settled on the right mechanism for finding the global search activity.
-     *
      * @hide
      */
     public ComponentName getGlobalSearchActivity() {
-        Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH);
-        PackageManager pm = mContext.getPackageManager();
-        List<ResolveInfo> activities =
-                pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
-        int count = activities.size();
-        for (int i = 0; i < count; i++) {
-            ActivityInfo ai = activities.get(i).activityInfo;
-            if (pm.checkPermission(Manifest.permission.GLOBAL_SEARCH,
-                    ai.packageName) == PackageManager.PERMISSION_GRANTED) {
-                return new ComponentName(ai.packageName, ai.name);
-            } else {
-                Log.w(TAG, "Package " + ai.packageName + " wants to handle GLOBAL_SEARCH, "
-                        + "but does not have the GLOBAL_SEARCH permission.");
-            }
+        try {
+            return mService.getGlobalSearchActivity();
+        } catch (RemoteException ex) {
+            Log.e(TAG, "getGlobalSearchActivity() failed: " + ex);
+            return null;
         }
-        return null;
     }
 
     /**
@@ -1700,13 +1669,12 @@
      * @hide
      */
     public ComponentName getWebSearchActivity() {
-        ComponentName globalSearch = getGlobalSearchActivity();
-        if (globalSearch == null) {
+        try {
+            return mService.getWebSearchActivity();
+        } catch (RemoteException ex) {
+            Log.e(TAG, "getWebSearchActivity() failed: " + ex);
             return null;
         }
-        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
-        intent.setPackage(globalSearch.getPackageName());
-        return intent.resolveActivity(mContext.getPackageManager());
     }
 
     /**
@@ -1840,27 +1808,7 @@
      */
     public SearchableInfo getSearchableInfo(ComponentName componentName) {
         try {
-            return mService.getSearchableInfo(componentName, false);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "getSearchableInfo() failed: " + ex);
-            return null;
-        }
-    }
-
-    /**
-     * Gets information about a searchable activity.
-     *
-     * @param componentName The activity to get searchable information for.
-     * @param globalSearch If <code>false</code>, return information about the given activity.
-     *        If <code>true</code>, return information about the global search activity. 
-     * @return Searchable information, or <code>null</code> if the activity is not searchable.
-     * 
-     * @hide because SearchableInfo is not part of the API.
-     */
-    public SearchableInfo getSearchableInfo(ComponentName componentName,
-            boolean globalSearch) {
-        try {
-            return mService.getSearchableInfo(componentName, globalSearch);
+            return mService.getSearchableInfo(componentName);
         } catch (RemoteException ex) {
             Log.e(TAG, "getSearchableInfo() failed: " + ex);
             return null;
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index fbc4a81..2eebe77 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -123,24 +123,15 @@
      * Returns the SearchableInfo for a given activity.
      *
      * @param launchActivity The activity from which we're launching this search.
-     * @param globalSearch If false, this will only launch the search that has been specifically
-     * defined by the application (which is usually defined as a local search).  If no default
-     * search is defined in the current application or activity, no search will be launched.
-     * If true, this will always launch a platform-global (e.g. web-based) search instead.
      * @return Returns a SearchableInfo record describing the parameters of the search,
      * or null if no searchable metadata was available.
      */
-    public SearchableInfo getSearchableInfo(final ComponentName launchActivity,
-            final boolean globalSearch) {
-        if (globalSearch) {
-            return getSearchables().getDefaultSearchable();
-        } else {
-            if (launchActivity == null) {
-                Log.e(TAG, "getSearchableInfo(), activity == null");
-                return null;
-            }
-            return getSearchables().getSearchableInfo(launchActivity);
+    public SearchableInfo getSearchableInfo(final ComponentName launchActivity) {
+        if (launchActivity == null) {
+            Log.e(TAG, "getSearchableInfo(), activity == null");
+            return null;
         }
+        return getSearchables().getSearchableInfo(launchActivity);
     }
 
     /**
@@ -151,27 +142,17 @@
     }
 
     /**
-     * Returns a list of the searchable activities that handle web searches.
-     * Can be called from any thread.
+     * Gets the name of the global search activity.
      */
-    public List<SearchableInfo> getSearchablesForWebSearch() {
-        return getSearchables().getSearchablesForWebSearchList();
+    public ComponentName getGlobalSearchActivity() {
+        return getSearchables().getGlobalSearchActivity();
     }
 
     /**
-     * Returns the default searchable activity for web searches.
-     * Can be called from any thread.
+     * Gets the name of the web search activity.
      */
-    public SearchableInfo getDefaultSearchableForWebSearch() {
-        return getSearchables().getDefaultSearchableForWebSearch();
+    public ComponentName getWebSearchActivity() {
+        return getSearchables().getWebSearchActivity();
     }
 
-    /**
-     * Sets the default searchable activity for web searches.
-     * Can be called from any thread.
-     */
-    public void setDefaultWebSearch(final ComponentName component) {
-        getSearchables().setDefaultWebSearch(component);
-        broadcastSearchablesChanged();
-    }
 }
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
index cbb63a5..279c17d 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -16,14 +16,12 @@
 
 package android.server.search;
 
-import com.android.internal.app.ResolverActivity;
-
+import android.Manifest;
 import android.app.SearchManager;
 import android.app.SearchableInfo;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -52,9 +50,8 @@
     private HashMap<ComponentName, SearchableInfo> mSearchablesMap = null;
     private ArrayList<SearchableInfo> mSearchablesList = null;
     private ArrayList<SearchableInfo> mSearchablesInGlobalSearchList = null;
-    private ArrayList<SearchableInfo> mSearchablesForWebSearchList = null;
-    private SearchableInfo mDefaultSearchable = null;
-    private SearchableInfo mDefaultSearchableForWebSearch = null;
+    private ComponentName mGlobalSearchActivity = null;
+    private ComponentName mWebSearchActivity = null;
 
     public static String GOOGLE_SEARCH_COMPONENT_NAME =
             "com.android.googlesearch/.GoogleSearch";
@@ -131,10 +128,9 @@
             // Irrespective of source, if a reference was found, follow it.
             if (refActivityName != null)
             {
-                // An app or activity can declare that we should simply launch
-                // "system default search" if search is invoked.
+                // This value is deprecated, return null
                 if (refActivityName.equals(MD_SEARCHABLE_SYSTEM_SEARCH)) {
-                    return getDefaultSearchable();
+                    return null;
                 }
                 String pkg = activity.getPackageName();
                 ComponentName referredActivity;
@@ -164,20 +160,6 @@
     }
 
     /**
-     * Provides the system-default search activity, which you can use
-     * whenever getSearchableInfo() returns null;
-     *
-     * @return Returns the system-default search activity, null if never defined
-     */
-    public synchronized SearchableInfo getDefaultSearchable() {
-        return mDefaultSearchable;
-    }
-
-    public synchronized boolean isDefaultSearchable(SearchableInfo searchable) {
-        return searchable == mDefaultSearchable;
-    }
-
-    /**
      * Builds an entire list (suitable for display) of
      * activities that are searchable, by iterating the entire set of
      * ACTION_SEARCH & ACTION_WEB_SEARCH intents.
@@ -205,8 +187,6 @@
                                 = new ArrayList<SearchableInfo>();
         ArrayList<SearchableInfo> newSearchablesInGlobalSearchList
                                 = new ArrayList<SearchableInfo>();
-        ArrayList<SearchableInfo> newSearchablesForWebSearchList
-                                = new ArrayList<SearchableInfo>();
 
         final PackageManager pm = mContext.getPackageManager();
 
@@ -244,127 +224,71 @@
             }
         }
 
-        if (webSearchInfoList != null) {
-            for (int i = 0; i < webSearchInfoList.size(); ++i) {
-                ActivityInfo ai = webSearchInfoList.get(i).activityInfo;
-                ComponentName component = new ComponentName(ai.packageName, ai.name);
-                SearchableInfo searchable = newSearchablesMap.get(component);
-                if (searchable == null) {
-                    Log.w(LOG_TAG, "did not find component in searchables: " + component);
-                } else {
-                    newSearchablesForWebSearchList.add(searchable);
-                }
-            }
-        }
+        // Find the global search activity
+        ComponentName newGlobalSearchActivity = findGlobalSearchActivity();
 
-        // Find the global search provider
-        Intent globalSearchIntent = new Intent(SearchManager.INTENT_ACTION_GLOBAL_SEARCH);
-        ComponentName globalSearchActivity = globalSearchIntent.resolveActivity(pm);
-        SearchableInfo newDefaultSearchable = newSearchablesMap.get(globalSearchActivity);
-
-        if (newDefaultSearchable == null) {
-            Log.w(LOG_TAG, "No searchable info found for new default searchable activity "
-                    + globalSearchActivity);
-        }
-
-        // Find the default web search provider.
-        ComponentName webSearchActivity = getPreferredWebSearchActivity(mContext);
-        SearchableInfo newDefaultSearchableForWebSearch = null;
-        if (webSearchActivity != null) {
-            newDefaultSearchableForWebSearch = newSearchablesMap.get(webSearchActivity);
-        }
-        if (newDefaultSearchableForWebSearch == null) {
-            Log.w(LOG_TAG, "No searchable info found for new default web search activity "
-                    + webSearchActivity);
-        }
+        // Find the web search activity
+        ComponentName newWebSearchActivity = findWebSearchActivity(newGlobalSearchActivity);
 
         // Store a consistent set of new values
         synchronized (this) {
             mSearchablesMap = newSearchablesMap;
             mSearchablesList = newSearchablesList;
             mSearchablesInGlobalSearchList = newSearchablesInGlobalSearchList;
-            mSearchablesForWebSearchList = newSearchablesForWebSearchList;
-            mDefaultSearchable = newDefaultSearchable;
-            mDefaultSearchableForWebSearch = newDefaultSearchableForWebSearch;
+            mGlobalSearchActivity = newGlobalSearchActivity;
+            mWebSearchActivity = newWebSearchActivity;
         }
     }
 
     /**
-     * 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.
-     * @param action Intent action for which this activity is to be set as preferred.
-     * @return true if component was detected and set as preferred activity, false if not.
+     * Finds the global search activity.
+     *
+     * This is currently implemented by returning the first activity that handles
+     * the GLOBAL_SEARCH intent and has the GLOBAL_SEARCH permission. If we allow
+     * more than one global search activity to be installed, this code must be changed.
      */
-    private static boolean setPreferredActivity(Context context,
-            ComponentName component, String action) {
-        Log.d(LOG_TAG, "Checking component " + component);
-        PackageManager pm = context.getPackageManager();
-        ActivityInfo ai;
-        try {
-            ai = pm.getActivityInfo(component, 0);
-        } catch (PackageManager.NameNotFoundException e) {
-            return false;
+    private ComponentName findGlobalSearchActivity() {
+        Intent intent = new Intent(SearchManager.INTENT_ACTION_GLOBAL_SEARCH);
+        PackageManager pm = mContext.getPackageManager();
+        List<ResolveInfo> activities =
+                pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+        int count = activities == null ? 0 : activities.size();
+        for (int i = 0; i < count; i++) {
+            ActivityInfo ai = activities.get(i).activityInfo;
+            if (pm.checkPermission(Manifest.permission.GLOBAL_SEARCH,
+                    ai.packageName) == PackageManager.PERMISSION_GRANTED) {
+                return new ComponentName(ai.packageName, ai.name);
+            } else {
+                Log.w(LOG_TAG, "Package " + ai.packageName + " wants to handle GLOBAL_SEARCH, "
+                        + "but does not have the GLOBAL_SEARCH permission.");
+            }
         }
-
-        // The code here to find the value for bestMatch is heavily inspired by the code
-        // in ResolverActivity where the preferred activity is set.
-        Intent intent = new Intent(action);
-        intent.addCategory(Intent.CATEGORY_DEFAULT);
-        List<ResolveInfo> webSearchActivities = pm.queryIntentActivities(intent, 0);
-        ComponentName set[] = new ComponentName[webSearchActivities.size()];
-        int bestMatch = 0;
-        for (int i = 0; i < webSearchActivities.size(); ++i) {
-            ResolveInfo ri = webSearchActivities.get(i);
-            set[i] = new ComponentName(ri.activityInfo.packageName,
-                                       ri.activityInfo.name);
-            if (ri.match > bestMatch) bestMatch = ri.match;
-        }
-
-        Log.d(LOG_TAG, "Setting preferred web search activity to " + component);
-        IntentFilter filter = new IntentFilter(action);
-        filter.addCategory(Intent.CATEGORY_DEFAULT);
-        pm.replacePreferredActivity(filter, bestMatch, set, component);
-        return true;
+        Log.w(LOG_TAG, "No global search activity found");
+        return null;
     }
 
-    private static ComponentName getPreferredWebSearchActivity(Context context) {
-        // Check if we have a preferred web search activity.
-        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
-        PackageManager pm = context.getPackageManager();
-        ResolveInfo ri = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
-
-        if (ri == null || ri.activityInfo.name.equals(ResolverActivity.class.getName())) {
-            Log.d(LOG_TAG, "No preferred activity set for action web search.");
-
-            // The components in the providers array are checked in the order of declaration so the
-            // first one has the highest priority. If the component exists in the system it is set
-            // as the preferred activity to handle intent action web search.
-            String[] preferredActivities = context.getResources().getStringArray(
-                    com.android.internal.R.array.default_web_search_providers);
-            for (String componentName : preferredActivities) {
-                ComponentName component = ComponentName.unflattenFromString(componentName);
-                if (setPreferredActivity(context, component, Intent.ACTION_WEB_SEARCH)) {
-                    return component;
-                }
-            }
-        } else {
-            // If the current preferred activity is GoogleSearch, and we detect
-            // EnhancedGoogleSearch installed as well, set the latter as preferred since that
-            // is a superset and provides more functionality.
-            ComponentName cn = new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
-            if (cn.flattenToShortString().equals(GOOGLE_SEARCH_COMPONENT_NAME)) {
-                ComponentName enhancedGoogleSearch = ComponentName.unflattenFromString(
-                        ENHANCED_GOOGLE_SEARCH_COMPONENT_NAME);
-                if (setPreferredActivity(context, enhancedGoogleSearch,
-                        Intent.ACTION_WEB_SEARCH)) {
-                    return enhancedGoogleSearch;
-                }
-            }
+    /**
+     * Finds the web search activity.
+     *
+     * Only looks in the package of the global search activity.
+     */
+    private ComponentName findWebSearchActivity(ComponentName globalSearchActivity) {
+        if (globalSearchActivity == null) {
+            return null;
         }
-
-        if (ri == null) return null;
-        return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
+        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
+        intent.setPackage(globalSearchActivity.getPackageName());
+        PackageManager pm = mContext.getPackageManager();
+        List<ResolveInfo> activities =
+                pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+        int count = activities == null ? 0 : activities.size();
+        for (int i = 0; i < count; i++) {
+            ActivityInfo ai = activities.get(i).activityInfo;
+            // TODO: do some sanity checks here?
+            return new ComponentName(ai.packageName, ai.name);
+        }
+        Log.w(LOG_TAG, "No web search activity found");
+        return null;
     }
 
     /**
@@ -383,24 +307,16 @@
     }
 
     /**
-     * Returns a list of the searchable activities that handle web searches.
+     * Gets the name of the global search activity.
      */
-    public synchronized ArrayList<SearchableInfo> getSearchablesForWebSearchList() {
-        return new ArrayList<SearchableInfo>(mSearchablesForWebSearchList);
+    public synchronized ComponentName getGlobalSearchActivity() {
+        return mGlobalSearchActivity;
     }
 
     /**
-     * Returns the default searchable activity for web searches.
+     * Gets the name of the web search activity.
      */
-    public synchronized SearchableInfo getDefaultSearchableForWebSearch() {
-        return mDefaultSearchableForWebSearch;
-    }
-
-    /**
-     * Sets the default searchable activity for web searches.
-     */
-    public synchronized void setDefaultWebSearch(ComponentName component) {
-        setPreferredActivity(mContext, component, Intent.ACTION_WEB_SEARCH);
-        buildSearchableList();
+    public synchronized ComponentName getWebSearchActivity() {
+        return mWebSearchActivity;
     }
 }
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index cdc15c2..0c065ef 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -127,15 +127,4 @@
         <item><xliff:g id="id">ime</xliff:g></item>
     </string-array>
 
-    <!-- Do not translate. Each string points to the component name of an ACTION_WEB_SEARCH
-         handling activity. On startup if there were no preferred ACTION_WEB_SEARCH handlers,
-         the first component from this list which is found to be installed is set as the
-         preferred activity. -->
-    <string-array name="default_web_search_providers">
-        <item>com.google.android.googlequicksearchbox/.google.GoogleSearch</item>
-        <item>com.android.quicksearchbox/.google.GoogleSearch</item>
-        <item>com.google.android.providers.enhancedgooglesearch/.Launcher</item>
-        <item>com.android.googlesearch/.GoogleSearch</item>
-        <item>com.android.websearch/.Search.1</item>
-    </string-array>
 </resources>
diff --git a/core/tests/coretests/src/android/app/SearchablesTest.java b/core/tests/coretests/src/android/app/SearchablesTest.java
index 9b4520e..6cb31d4 100644
--- a/core/tests/coretests/src/android/app/SearchablesTest.java
+++ b/core/tests/coretests/src/android/app/SearchablesTest.java
@@ -64,39 +64,7 @@
      *  findActionKey works
      *  getIcon works
      */
-    
-    /**
-     * The goal of this test is to confirm proper operation of the 
-     * SearchableInfo helper class.
-     * 
-     * TODO:  The metadata source needs to be mocked out because adding
-     * searchability metadata via this test is causing it to leak into the
-     * real system.  So for now I'm just going to test for existence of the
-     * GlobalSearch app (which is searchable).
-     */
-    public void testSearchableGlobalSearch() {
-        // test basic array & hashmap
-        Searchables searchables = new Searchables(mContext);
-        searchables.buildSearchableList();
 
-        // test linkage from another activity
-        // TODO inject this via mocking into the package manager.
-        // TODO for now, just check for searchable GlobalSearch app (this isn't really a unit test)
-        ComponentName thisActivity = new ComponentName(
-                "com.android.globalsearch",
-                "com.android.globalsearch.GlobalSearch");
-
-        SearchableInfo si = searchables.getSearchableInfo(thisActivity);
-        assertNotNull(si);
-        assertEquals(thisActivity, si.getSearchActivity());
-        
-        Context appContext = si.getActivityContext(mContext);
-        assertNotNull(appContext);
-        MoreAsserts.assertNotEqual(appContext, mContext);
-        assertEquals("Quick Search Box", appContext.getString(si.getHintId()));
-        assertEquals("Quick Search Box", appContext.getString(si.getLabelId()));
-    }
-    
     /**
      * Test that non-searchable activities return no searchable info (this would typically
      * trigger the use of the default searchable e.g. contacts)
@@ -113,18 +81,7 @@
         SearchableInfo si = searchables.getSearchableInfo(nonActivity);
         assertNull(si);
     }
-    
-    /**
-     * Test that there is a default searchable (aka global search provider).
-     */
-    public void testDefaultSearchable() {
-        Searchables searchables = new Searchables(mContext);
-        searchables.buildSearchableList();
-        SearchableInfo si = searchables.getDefaultSearchable();
-        checkSearchable(si);
-        assertTrue(searchables.isDefaultSearchable(si));
-    }
-    
+
     /**
      * This is an attempt to run the searchable info list with a mocked context.  Here are some
      * things I'd like to test.
@@ -371,7 +328,8 @@
         public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
             assertNotNull(intent);
             assertTrue(intent.getAction().equals(Intent.ACTION_SEARCH)
-                    || intent.getAction().equals(Intent.ACTION_WEB_SEARCH));
+                    || intent.getAction().equals(Intent.ACTION_WEB_SEARCH)
+                    || intent.getAction().equals(SearchManager.INTENT_ACTION_GLOBAL_SEARCH));
             switch (mSearchablesMode) {
             case SEARCHABLES_PASSTHROUGH:
                 return mRealPackageManager.queryIntentActivities(intent, flags);
@@ -472,6 +430,20 @@
                 throw new UnsupportedOperationException();
             }
         }
+
+        @Override
+        public int checkPermission(String permName, String pkgName) {
+            assertNotNull(permName);
+            assertNotNull(pkgName);
+            switch (mSearchablesMode) {
+                case SEARCHABLES_PASSTHROUGH:
+                    return mRealPackageManager.checkPermission(permName, pkgName);
+                case SEARCHABLES_MOCK_ZERO:
+                    return PackageManager.PERMISSION_DENIED;
+                default:
+                    throw new UnsupportedOperationException();
+                }
+        }
     }
 }