[go: up one dir, main page]

[Touchless]: Return backup icon if no icon is available for context menu

(cherry picked from commit 0063e7a725af029c3009b13b25895119a9d27b44)

Bug: 970373
Change-Id: I6316993dfa21e73ea5b6e6b46186d4f4c576aab2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1652082
Commit-Queue: Cathy Li <chili@chromium.org>
Reviewed-by: Justin DeWitt <dewittj@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#667743}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1653417
Reviewed-by: Cathy Li <chili@chromium.org>
Cr-Commit-Position: refs/branch-heads/3809@{#225}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionModel.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionModel.java
index d8ffa75..969b06b 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionModel.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionModel.java
@@ -25,19 +25,23 @@
             new PropertyModel.ReadableObjectPropertyKey<>();
     static final PropertyModel.WritableObjectPropertyKey<Bitmap> ICON_KEY =
             new PropertyModel.WritableObjectPropertyKey<>();
+    static final PropertyModel.ReadableObjectPropertyKey<Bitmap> DEFAULT_ICON_KEY =
+            new PropertyModel.ReadableObjectPropertyKey<>();
 
-    static PropertyModel getSiteSuggestionModel(SiteSuggestion suggestion) {
+    static PropertyModel getSiteSuggestionModel(SiteSuggestion suggestion, Bitmap defaultIcon) {
         String title = UrlUtilities.getDomainAndRegistry(suggestion.url, false);
         if (TextUtils.isEmpty(title)) {
             // Fallback to title.
             title = suggestion.title;
         }
         return new PropertyModel
-                .Builder(TITLE_KEY, URL_KEY, ICON_KEY, SOURCE_KEY, WHITELIST_ICON_PATH_KEY)
+                .Builder(TITLE_KEY, URL_KEY, ICON_KEY, SOURCE_KEY, WHITELIST_ICON_PATH_KEY,
+                        DEFAULT_ICON_KEY)
                 .with(TITLE_KEY, title)
                 .with(URL_KEY, suggestion.url)
                 .with(SOURCE_KEY, suggestion.source)
                 .with(WHITELIST_ICON_PATH_KEY, suggestion.whitelistIconPath)
+                .with(DEFAULT_ICON_KEY, defaultIcon)
                 .build();
     }
 }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
index b2533f4..9197ab0a 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
@@ -17,7 +17,6 @@
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.graphics.drawable.VectorDrawableCompat;
-import android.support.v7.widget.RecyclerView;
 import android.view.ContextMenu;
 import android.view.View;
 import android.widget.TextView;
@@ -25,7 +24,6 @@
 import org.chromium.chrome.browser.UrlConstants;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
 import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
-import org.chromium.chrome.browser.widget.RoundedIconGenerator;
 import org.chromium.chrome.touchless.R;
 import org.chromium.ui.modelutil.ForwardingListObservable;
 import org.chromium.ui.modelutil.PropertyKey;
@@ -110,38 +108,34 @@
 
         @Override
         public Bitmap getIconBitmap() {
+            if (mSuggestion.get(SiteSuggestionModel.ICON_KEY) == null) {
+                return mSuggestion.get(SiteSuggestionModel.DEFAULT_ICON_KEY);
+            }
             return mSuggestion.get(SiteSuggestionModel.ICON_KEY);
         }
     }
 
     private PropertyModel mModel;
-    private RoundedIconGenerator mIconGenerator;
     private SuggestionsNavigationDelegate mNavDelegate;
     private ContextMenuManager mContextMenuManager;
     private SiteSuggestionsLayoutManager mLayoutManager;
     private TextView mTitleView;
 
-    private final RecyclerView mRecyclerView;
-
     /**
      * @param model the main property model coming from {@link SiteSuggestionsCoordinator}.
-     * @param iconGenerator an icon generator for creating icons.
      * @param navigationDelegate delegate for navigation controls
      * @param contextMenuManager handles context menu creation
      * @param layoutManager the layout manager controlling this recyclerview and adapter
      * @param titleView the view to update site title when focus changes.
      */
-    SiteSuggestionsAdapter(PropertyModel model, RoundedIconGenerator iconGenerator,
-            SuggestionsNavigationDelegate navigationDelegate, ContextMenuManager contextMenuManager,
-            SiteSuggestionsLayoutManager layoutManager, TextView titleView,
-            RecyclerView recyclerView) {
+    SiteSuggestionsAdapter(PropertyModel model, SuggestionsNavigationDelegate navigationDelegate,
+            ContextMenuManager contextMenuManager, SiteSuggestionsLayoutManager layoutManager,
+            TextView titleView) {
         mModel = model;
-        mIconGenerator = iconGenerator;
         mNavDelegate = navigationDelegate;
         mContextMenuManager = contextMenuManager;
         mLayoutManager = layoutManager;
         mTitleView = titleView;
-        mRecyclerView = recyclerView;
 
         mModel.get(SUGGESTIONS_KEY).addObserver(this);
         mModel.addObserver(this);
@@ -195,11 +189,10 @@
             // Only update the icon for icon updates.
             if (payload == SiteSuggestionModel.ICON_KEY) {
                 tile.updateIcon(item.get(SiteSuggestionModel.ICON_KEY),
-                        item.get(SiteSuggestionModel.TITLE_KEY));
+                        item.get(SiteSuggestionModel.DEFAULT_ICON_KEY));
             } else {
-                tile.initialize(mIconGenerator);
                 tile.updateIcon(item.get(SiteSuggestionModel.ICON_KEY),
-                        item.get(SiteSuggestionModel.TITLE_KEY));
+                        item.get(SiteSuggestionModel.DEFAULT_ICON_KEY));
 
                 SiteSuggestionInteractionDelegate interactionDelegate =
                         new SiteSuggestionInteractionDelegate(item);
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java
index 57cb334f..f8d835cd 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java
@@ -73,9 +73,9 @@
 
         RecyclerView recyclerView =
                 suggestionsView.findViewById(R.id.most_likely_launcher_recycler);
-        SiteSuggestionsAdapter adapterDelegate = new SiteSuggestionsAdapter(model, iconGenerator,
+        SiteSuggestionsAdapter adapterDelegate = new SiteSuggestionsAdapter(model,
                 navigationDelegate, contextMenuManager, layoutManager,
-                suggestionsView.findViewById(R.id.most_likely_web_title_text), recyclerView);
+                suggestionsView.findViewById(R.id.most_likely_web_title_text));
 
         RecyclerViewAdapter<SiteSuggestionsViewHolderFactory.SiteSuggestionsViewHolder, PropertyKey>
                 adapter = new RecyclerViewAdapter<>(
@@ -98,7 +98,8 @@
         recyclerView.setLayoutManager(layoutManager);
         recyclerView.setAdapter(adapter);
 
-        mMediator = new SiteSuggestionsMediator(model, profile, imageFetcher, iconSize);
+        mMediator =
+                new SiteSuggestionsMediator(model, profile, imageFetcher, iconGenerator, iconSize);
     }
 
     public void destroy() {
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java
index 0c22dd26..acdf180 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java
@@ -19,6 +19,7 @@
 import org.chromium.chrome.browser.suggestions.MostVisitedSites;
 import org.chromium.chrome.browser.suggestions.SiteSuggestion;
 import org.chromium.chrome.browser.suggestions.SuggestionsDependencyFactory;
+import org.chromium.chrome.browser.widget.RoundedIconGenerator;
 import org.chromium.chrome.touchless.R;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -49,6 +50,7 @@
     private ImageFetcher mImageFetcher;
     private MostVisitedSites mMostVisitedSites;
     private Profile mProfile;
+    private RoundedIconGenerator mDefaultIconGenerator;
     private int mIconSize;
 
     // Whether we should set focus to the data. Used to delay focus-setting until after loading
@@ -57,12 +59,13 @@
     // Whether we have pending requests for suggestions.
     private boolean mHasPendingRequests;
 
-    SiteSuggestionsMediator(
-            PropertyModel model, Profile profile, ImageFetcher imageFetcher, int minIconSize) {
+    SiteSuggestionsMediator(PropertyModel model, Profile profile, ImageFetcher imageFetcher,
+            RoundedIconGenerator iconGenerator, int minIconSize) {
         mModel = model;
         mImageFetcher = imageFetcher;
         mIconSize = minIconSize;
         mProfile = profile;
+        mDefaultIconGenerator = iconGenerator;
 
         mHasPendingRequests = true;
         mMostVisitedSites =
@@ -89,7 +92,8 @@
             // Do not put duplicates.
             if (urls.contains(suggestion.url)) continue;
 
-            PropertyModel siteSuggestion = SiteSuggestionModel.getSiteSuggestionModel(suggestion);
+            PropertyModel siteSuggestion = SiteSuggestionModel.getSiteSuggestionModel(
+                    suggestion, mDefaultIconGenerator.generateIconForText(suggestion.title));
             modelList.add(siteSuggestion);
             if (suggestion.whitelistIconPath.isEmpty()) {
                 makeIconRequest(siteSuggestion);
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsTileView.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsTileView.java
index cdf1316..42519ff 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsTileView.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsTileView.java
@@ -11,7 +11,6 @@
 import android.util.AttributeSet;
 
 import org.chromium.chrome.browser.util.ViewUtils;
-import org.chromium.chrome.browser.widget.RoundedIconGenerator;
 import org.chromium.chrome.browser.widget.tile.TileView;
 import org.chromium.chrome.touchless.R;
 
@@ -21,8 +20,6 @@
 public class SiteSuggestionsTileView extends TileView {
     private final int mIconSizePx;
 
-    // Used to generate textual icons.
-    private RoundedIconGenerator mIconGenerator;
 
     public SiteSuggestionsTileView(Context ctx, AttributeSet attrs) {
         super(ctx, attrs);
@@ -30,33 +27,25 @@
     }
 
     /**
-     * Initializes the icon generator and clears the model processor attached to this view.
-     * @param generator The generator for icons.
-     */
-    public void initialize(RoundedIconGenerator generator) {
-        mIconGenerator = generator;
-    }
-
-    /**
      * Updates the icon in the tile.
      *
      * @param iconImage Bitmap icon to update.
-     * @param text Text to generate scrabble text from.
+     * @param defaultIcon Default icon for the tile.
      */
-    public void updateIcon(Bitmap iconImage, String text) {
-        setIconDrawable(getDrawableForBitmap(iconImage, text));
+    public void updateIcon(Bitmap iconImage, Bitmap defaultIcon) {
+        setIconDrawable(getDrawableForBitmap(iconImage, defaultIcon));
     }
 
     /**
      * Generates a Drawable from the Bitmap version of an icon.
      *
      * @param image The Bitmap image. Can be null.
-     * @param text The text to generate a scrabble text from if the bitmap is null.
+     * @param defaultIcon Default icon for the tile.
      * @return Drawable encapsulating either the scrabble tile or the bitmap.
      */
-    public Drawable getDrawableForBitmap(Bitmap image, String text) {
+    public Drawable getDrawableForBitmap(Bitmap image, Bitmap defaultIcon) {
         if (image == null) {
-            return new BitmapDrawable(getResources(), mIconGenerator.generateIconForText(text));
+            return new BitmapDrawable(getResources(), defaultIcon);
         }
         return ViewUtils.createRoundedBitmapDrawable(
                 Bitmap.createScaledBitmap(image, mIconSizePx, mIconSizePx, false),