Caching external icons in LauncherModel

- Global search icon and voice search icon are loaded instantly on device rotations

Change-Id: I91380849d470b181e8eb5569410ab25067b4efaf
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 2a2d364..1a486d7 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -259,6 +259,11 @@
     private HashMap<View, AppWidgetProviderInfo> mWidgetsToAdvance =
         new HashMap<View, AppWidgetProviderInfo>();
 
+    // External icons saved in case of resource changes, orientation, etc.
+    private static Drawable sGlobalSearchIcon;
+    private static Drawable sVoiceSearchIcon;
+    private static Drawable sAppMarketIcon;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -374,6 +379,19 @@
 
         IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
         registerReceiver(mCloseSystemDialogsReceiver, filter);
+
+        // If we have a saved version of these external icons, we load them up immediately
+        if (LauncherApplication.isScreenXLarge()) {
+            if (sGlobalSearchIcon != null) {
+                updateGlobalSearchIcon(sGlobalSearchIcon);
+            }
+            if (sVoiceSearchIcon != null) {
+                updateVoiceSearchIcon(sVoiceSearchIcon);
+            }
+            if (sAppMarketIcon != null) {
+                updateAppMarketIcon(sAppMarketIcon);
+            }
+        }
     }
 
     private void checkForLocaleChange() {
@@ -2880,7 +2898,8 @@
         showWorkspace(true, layout);
     }
 
-    private void updateButtonWithIconFromExternalActivity(
+    // if successful in getting icon, return it; otherwise, set button to use default drawable
+    private Drawable updateButtonWithIconFromExternalActivity(
             int buttonId, ComponentName activityName, int fallbackDrawableId) {
         ImageView button = (ImageView) findViewById(buttonId);
         Drawable toolbarIcon = null;
@@ -2902,18 +2921,25 @@
         // If we were unable to find the icon via the meta-data, use a generic one
         if (toolbarIcon == null) {
             button.setImageResource(fallbackDrawableId);
+            return null;
         } else {
             button.setImageDrawable(toolbarIcon);
+            return toolbarIcon;
         }
     }
 
+    private void updateButtonWithDrawable(int buttonId, Drawable d) {
+        ImageView button = (ImageView) findViewById(buttonId);
+        button.setImageDrawable(d);
+    }
+
     private void updateGlobalSearchIcon() {
         if (LauncherApplication.isScreenXLarge()) {
             final SearchManager searchManager =
                     (SearchManager) getSystemService(Context.SEARCH_SERVICE);
             ComponentName activityName = searchManager.getGlobalSearchActivity();
             if (activityName != null) {
-                updateButtonWithIconFromExternalActivity(
+                sGlobalSearchIcon = updateButtonWithIconFromExternalActivity(
                         R.id.search_button, activityName, R.drawable.search_button_generic);
             } else {
                 findViewById(R.id.search_button).setVisibility(View.GONE);
@@ -2921,12 +2947,16 @@
         }
     }
 
+    private void updateGlobalSearchIcon(Drawable d) {
+        updateButtonWithDrawable(R.id.search_button, d);
+    }
+
     private void updateVoiceSearchIcon() {
         if (LauncherApplication.isScreenXLarge()) {
             Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
             ComponentName activityName = intent.resolveActivity(getPackageManager());
             if (activityName != null) {
-                updateButtonWithIconFromExternalActivity(
+                sVoiceSearchIcon = updateButtonWithIconFromExternalActivity(
                         R.id.voice_button, activityName, R.drawable.ic_voice_search);
             } else {
                 findViewById(R.id.voice_button).setVisibility(View.GONE);
@@ -2934,6 +2964,10 @@
         }
     }
 
+    private void updateVoiceSearchIcon(Drawable d) {
+        updateButtonWithDrawable(R.id.voice_button, d);
+    }
+
     /**
      * Sets the app market icon (shown when all apps is visible on x-large screens)
      */
@@ -2945,12 +2979,16 @@
             ComponentName activityName = intent.resolveActivity(getPackageManager());
             if (activityName != null) {
                 mAppMarketIntent = intent;
-                updateButtonWithIconFromExternalActivity(
+                sAppMarketIcon = updateButtonWithIconFromExternalActivity(
                         R.id.market_button, activityName, R.drawable.app_market_generic);
             }
         }
     }
 
+    private void updateAppMarketIcon(Drawable d) {
+        updateButtonWithDrawable(R.id.market_button, d);
+    }
+
     /**
      * Displays the shortcut creation dialog and launches, if necessary, the
      * appropriate activity.