Commit 2930b325 authored by Reda Tawfik's avatar Reda Tawfik Committed by Commit Bot

[Android][Mfill] Add favicons to credential row

This CL adds favicons to each credential row int the bottom sheet
or a default icon if no icon is available for a site.

Screenshot: https://bugs.chromium.org/p/chromium/issues/detail?id=1104132#c14

Bug: 1104132
Change-Id: I44c6486a4534498107404c3ee3906ae7e6306ca9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2396238Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarFriedrich [CET] <fhorschig@chromium.org>
Commit-Queue: Reda Tawfik <redatawfik@google.com>
Cr-Commit-Position: refs/heads/master@{#807420}
parent 93ea0983
......@@ -8,4 +8,5 @@ include_rules = [
"+components/feature_engagement/public",
"-content/public/android",
"+content/public/android/java/src/org/chromium/content_public",
"+chrome/browser/profiles",
]
......@@ -67,6 +67,7 @@ android_library("internal_java") {
"java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryView.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/data/CachedProviderAdapter.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/helper/FaviconHelper.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java",
......
......@@ -11,13 +11,18 @@ import static org.chromium.chrome.browser.keyboard_accessory.all_passwords_botto
import static org.chromium.chrome.browser.keyboard_accessory.all_passwords_bottom_sheet.AllPasswordsBottomSheetProperties.SHEET_ITEMS;
import static org.chromium.chrome.browser.keyboard_accessory.all_passwords_bottom_sheet.AllPasswordsBottomSheetProperties.VISIBLE;
import android.graphics.drawable.Drawable;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.keyboard_accessory.all_passwords_bottom_sheet.AllPasswordsBottomSheetProperties.ItemType;
import org.chromium.chrome.browser.keyboard_accessory.helper.FaviconHelper;
import org.chromium.components.url_formatter.SchemeDisplay;
import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.ui.modelutil.MVCListAdapter;
......@@ -138,8 +143,22 @@ class AllPasswordsBottomSheetViewBinder {
passwordView.getPrimaryTextView().setTransformationMethod(
new PasswordTransformationMethod());
passwordView.getPrimaryTextView().setText(credential.getPassword());
// Set the default icon, then try to get a better one.
FaviconHelper faviconHelper = new FaviconHelper(view.getContext());
ImageView iconView = view.findViewById(R.id.favicon);
setIconForBitmap(iconView, faviconHelper.getDefaultIcon(credential.getOriginUrl()));
faviconHelper.fetchFavicon(
credential.getOriginUrl(), icon -> setIconForBitmap(iconView, icon));
} else {
assert false : "Unhandled update to property:" + propertyKey;
}
}
private static void setIconForBitmap(ImageView iconView, @Nullable Drawable icon) {
final int kIconSize = iconView.getContext().getResources().getDimensionPixelSize(
R.dimen.keyboard_accessory_suggestion_icon_size);
if (icon != null) icon.setBounds(0, 0, kIconSize, kIconSize);
iconView.setImageDrawable(icon);
}
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.keyboard_accessory.helper;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.ui.favicon.FaviconUtils;
import org.chromium.chrome.browser.ui.favicon.LargeIconBridge;
import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
import org.chromium.url.GURL;
/**
* Provides default favicons and helps to fetch and set favicons.
*/
public class FaviconHelper {
private final Resources mResources;
private final RoundedIconGenerator mIconGenerator;
private final int mDesiredSize;
/**
* Creates a new helper.
* @param context The {@link Context} used to fetch resources and create Drawables.
*/
public FaviconHelper(Context context) {
mResources = context.getResources();
mDesiredSize =
mResources.getDimensionPixelSize(R.dimen.keyboard_accessory_suggestion_icon_size);
mIconGenerator = FaviconUtils.createCircularIconGenerator(mResources);
}
public Drawable getDefaultIcon(String origin) {
return FaviconUtils.getIconDrawableWithoutFilter(null, origin,
R.color.default_favicon_background_color, mIconGenerator, mResources, mDesiredSize);
}
/**
* Resets favicon in case the container is recycled. Then queries a favicon for the origin.
* @param origin The origin URL of the favicon.
* @param setIconCallback Callback called with fetched icons. May be called with null.
*/
public void fetchFavicon(String origin, Callback<Drawable> setIconCallback) {
final LargeIconBridge mIconBridge =
new LargeIconBridge(Profile.getLastUsedRegularProfile());
final GURL gurlOrigin = new GURL(origin);
if (!gurlOrigin.isValid()) return;
mIconBridge.getLargeIconForUrl(gurlOrigin, mDesiredSize,
(icon, fallbackColor, isFallbackColorDefault, iconType) -> {
Drawable drawable = FaviconUtils.getIconDrawableWithoutFilter(
icon, origin, fallbackColor, mIconGenerator, mResources, mDesiredSize);
setIconCallback.onResult(drawable);
});
}
}
......@@ -16,9 +16,9 @@ import androidx.recyclerview.widget.RecyclerView;
import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
import org.chromium.chrome.browser.keyboard_accessory.data.UserInfoField;
import org.chromium.chrome.browser.keyboard_accessory.helper.FaviconHelper;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabViewBinder.ElementViewHolder;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessorySheetViewBinder.FaviconHelper;
import org.chromium.ui.modelutil.ListModel;
import org.chromium.ui.widget.ChipView;
......
......@@ -6,8 +6,6 @@ package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
import static org.chromium.ui.base.LocalizationUtils.isLayoutRtl;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
......@@ -23,17 +21,13 @@ import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
import org.chromium.chrome.browser.keyboard_accessory.data.UserInfoField;
import org.chromium.chrome.browser.keyboard_accessory.helper.FaviconHelper;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabViewBinder.ElementViewHolder;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.ui.favicon.FaviconUtils;
import org.chromium.chrome.browser.ui.favicon.LargeIconBridge;
import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
import org.chromium.ui.HorizontalListDividerDrawable;
import org.chromium.ui.modelutil.ListModel;
......@@ -194,49 +188,6 @@ class PasswordAccessorySheetViewBinder {
}
}
/**
* Provides default favicons and helps to fetch and set favicons. It automatically discards
* out-of-date responses which are common for recycled ViewHolder.
*/
static class FaviconHelper {
private final Resources mResources;
private final RoundedIconGenerator mIconGenerator;
private final int mDesiredSize;
/**
* Creates a new helper.
* @param context The {@link Context} used to fetch resources and create Drawables.
*/
FaviconHelper(Context context) {
mResources = context.getResources();
mDesiredSize = mResources.getDimensionPixelSize(
R.dimen.keyboard_accessory_suggestion_icon_size);
mIconGenerator = FaviconUtils.createCircularIconGenerator(mResources);
}
Drawable getDefaultIcon(String origin) {
return FaviconUtils.getIconDrawableWithoutFilter(null, origin,
R.color.default_favicon_background_color, mIconGenerator, mResources,
mDesiredSize);
}
/**
* Resets favicon in case the container is recycled. Then queries a favicon for the origin.
* @param origin The origin URL of the favicon.
* @param setIconCallback Callback called with fetched icons. May be called with null.
*/
void fetchFavicon(String origin, Callback<Drawable> setIconCallback) {
final LargeIconBridge mIconBridge =
new LargeIconBridge(Profile.getLastUsedRegularProfile());
mIconBridge.getLargeIconForStringUrl(origin, mDesiredSize,
(icon, fallbackColor, isFallbackColorDefault, iconType) -> {
Drawable drawable = FaviconUtils.getIconDrawableWithoutFilter(icon, origin,
fallbackColor, mIconGenerator, mResources, mDesiredSize);
setIconCallback.onResult(drawable);
});
}
}
static void initializeView(RecyclerView view, AccessorySheetTabModel model) {
view.setAdapter(PasswordAccessorySheetCoordinator.createAdapter(model));
view.addItemDecoration(new FooterCommandViewHolder.DynamicTopDivider());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment