Bug 1170346 - Use top sites default favicon style for search preferences. r=sebastian
MozReview-Commit-ID: 1gUROCT8NPQ
--- 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);
+ }
+ });
+ }
}