Bug 1170346 - Use top sites default favicon style for search preferences. r=sebastian draft
authorMichael Comella <michael.l.comella@gmail.com>
Thu, 14 Jul 2016 11:27:33 -0700
changeset 387713 981e2571dc86e8b6e0369c620acf84942fdd40d9
parent 386404 5978434c7789519778ba9f46ec723f06363a7a65
child 525432 91adff1ac61a84dda6054fee3b97ed1f6ea05c3d
push id23052
push usermichael.l.comella@gmail.com
push dateThu, 14 Jul 2016 18:29:11 +0000
reviewerssebastian
bugs1170346
milestone50.0a1
Bug 1170346 - Use top sites default favicon style for search preferences. r=sebastian MozReview-Commit-ID: 1gUROCT8NPQ
mobile/android/base/java/org/mozilla/gecko/preferences/SearchEnginePreference.java
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/SearchEnginePreference.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/SearchEnginePreference.java
@@ -3,20 +3,19 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.preferences;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.SnackbarHelper;
+import org.mozilla.gecko.favicons.FaviconGenerator;
 import org.mozilla.gecko.favicons.Favicons;
 import org.mozilla.gecko.favicons.OnFaviconLoadedListener;
-import org.mozilla.gecko.favicons.decoders.FaviconDecoder;
-import org.mozilla.gecko.util.ThreadUtils;
 import org.mozilla.gecko.widget.FaviconView;
 
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.support.design.widget.Snackbar;
@@ -61,16 +60,25 @@ public class SearchEnginePreference exte
 
         // We synchronise to avoid a race condition between this and the favicon loading callback in
         // setSearchEngineFromJSON.
         synchronized (bitmapLock) {
             // Set the icon in the FaviconView.
             mFaviconView = ((FaviconView) view.findViewById(R.id.search_engine_icon));
 
             if (mIconBitmap != null) {
+                setBitmapAndUpdateFaviconView(mIconBitmap); // set is redundant but keeps the code simple.
+            }
+        }
+    }
+
+    private void setBitmapAndUpdateFaviconView(final Bitmap favicon) {
+        synchronized (bitmapLock) {
+            mIconBitmap = favicon;
+            if (mFaviconView != null) {
                 mFaviconView.updateAndScaleImage(mIconBitmap, getTitle().toString());
             }
         }
     }
 
     @Override
     protected int getPreferenceLayoutResource() {
         return R.layout.preference_search_engine;
@@ -173,25 +181,34 @@ public class SearchEnginePreference exte
             }
 
             Favicons.getSizedFavicon(getContext(), mIdentifier, iconURI,
                 Favicons.LoadType.PRIVILEGED, // We have an internal store of search engine icons, hence we're always loading PRIVILEGED icons here
                 desiredWidth, 0,
                 new OnFaviconLoadedListener() {
                     @Override
                     public void onFaviconLoaded(String url, String faviconURL, Bitmap favicon) {
-                        synchronized (bitmapLock) {
-                            mIconBitmap = favicon;
-
-                            if (mFaviconView != null) {
-                                mFaviconView.updateAndScaleImage(mIconBitmap, getTitle().toString());
-                            }
+                        if (favicon != null) {
+                            setBitmapAndUpdateFaviconView(favicon);
+                        } else {
+                            generateAndUseDefaultFavicon();
                         }
                     }
                 }
             );
         } catch (IllegalArgumentException e) {
             Log.e(LOGTAG, "IllegalArgumentException creating Bitmap. Most likely a zero-length bitmap.", e);
         } catch (NullPointerException e) {
             Log.e(LOGTAG, "NullPointerException creating Bitmap. Most likely a zero-length bitmap.", e);
         }
     }
+
+    private void generateAndUseDefaultFavicon() {
+        // HACK: favicon generator requests a url to identify its representative character but we give
+        // it the title string. I didn't try to modify the favicon generator due to time constraints.
+        FaviconGenerator.generate(getContext(), getTitle().toString(), new OnFaviconLoadedListener() {
+            @Override
+            public void onFaviconLoaded(final String url, final String faviconURL, final Bitmap favicon) {
+                setBitmapAndUpdateFaviconView(favicon);
+            }
+        });
+    }
 }