Commit 22dc0ce8 authored by twellington's avatar twellington Committed by Commit bot

[Android History] Add favicons to history item views

BUG=654071

Review-Url: https://codereview.chromium.org/2571933002
Cr-Commit-Position: refs/heads/master@{#438939}
parent a26e5845
...@@ -132,7 +132,7 @@ public class HistoryAdapter extends DateDividedAdapter implements BrowsingHistor ...@@ -132,7 +132,7 @@ public class HistoryAdapter extends DateDividedAdapter implements BrowsingHistor
SelectableItemViewHolder<HistoryItem> holder = SelectableItemViewHolder<HistoryItem> holder =
(SelectableItemViewHolder<HistoryItem>) current; (SelectableItemViewHolder<HistoryItem>) current;
holder.displayItem(item); holder.displayItem(item);
item.setHistoryManager(mManager); ((HistoryItemView) holder.itemView).setHistoryManager(mManager);
} }
@Override @Override
......
...@@ -5,24 +5,49 @@ ...@@ -5,24 +5,49 @@
package org.chromium.chrome.browser.history; package org.chromium.chrome.browser.history;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
import org.chromium.chrome.browser.widget.RoundedIconGenerator;
import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.TintedImageButton;
import org.chromium.chrome.browser.widget.selection.SelectableItemView; import org.chromium.chrome.browser.widget.selection.SelectableItemView;
/** /**
* The SelectableItemView for items displayed in the browsing history UI. * The SelectableItemView for items displayed in the browsing history UI.
*/ */
public class HistoryItemView extends SelectableItemView<HistoryItem> { public class HistoryItemView extends SelectableItemView<HistoryItem> implements LargeIconCallback {
private TextView mTitle; private TextView mTitle;
private TextView mDomain; private TextView mDomain;
private TintedImageButton mRemoveButton; private TintedImageButton mRemoveButton;
private ImageView mIconImageView;
private HistoryManager mHistoryManager;
private final RoundedIconGenerator mIconGenerator;
private final int mMinIconSize;
private final int mDisplayedIconSize;
private final int mCornerRadius;
public HistoryItemView(Context context, AttributeSet attrs) { public HistoryItemView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mCornerRadius = getResources().getDimensionPixelSize(R.dimen.default_favicon_corner_radius);
mMinIconSize = getResources().getDimensionPixelSize(R.dimen.default_favicon_min_size);
mDisplayedIconSize = getResources().getDimensionPixelSize(R.dimen.default_favicon_size);
int textSize = getResources().getDimensionPixelSize(R.dimen.default_favicon_icon_text_size);
int iconColor = ApiCompatibilityUtils.getColor(
getResources(), R.color.default_favicon_background_color);
mIconGenerator = new RoundedIconGenerator(mDisplayedIconSize , mDisplayedIconSize,
mCornerRadius, iconColor, textSize);
} }
@Override @Override
...@@ -30,6 +55,7 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> { ...@@ -30,6 +55,7 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> {
super.onFinishInflate(); super.onFinishInflate();
mTitle = (TextView) findViewById(R.id.title); mTitle = (TextView) findViewById(R.id.title);
mDomain = (TextView) findViewById(R.id.domain); mDomain = (TextView) findViewById(R.id.domain);
mIconImageView = (ImageView) findViewById(R.id.icon_view);
mRemoveButton = (TintedImageButton) findViewById(R.id.remove); mRemoveButton = (TintedImageButton) findViewById(R.id.remove);
mRemoveButton.setOnClickListener(new OnClickListener() { mRemoveButton.setOnClickListener(new OnClickListener() {
@Override @Override
...@@ -41,9 +67,14 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> { ...@@ -41,9 +67,14 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> {
@Override @Override
public void setItem(HistoryItem item) { public void setItem(HistoryItem item) {
if (getItem() == item) return;
super.setItem(item); super.setItem(item);
mTitle.setText(item.getTitle()); mTitle.setText(item.getTitle());
mDomain.setText(item.getDomain()); mDomain.setText(item.getDomain());
mIconImageView.setImageResource(R.drawable.default_favicon);
if (mHistoryManager != null) requestIcon();
} }
/** /**
...@@ -51,6 +82,10 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> { ...@@ -51,6 +82,10 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> {
*/ */
public void setHistoryManager(HistoryManager manager) { public void setHistoryManager(HistoryManager manager) {
getItem().setHistoryManager(manager); getItem().setHistoryManager(manager);
if (mHistoryManager == manager) return;
mHistoryManager = manager;
requestIcon();
} }
/** /**
...@@ -64,4 +99,26 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> { ...@@ -64,4 +99,26 @@ public class HistoryItemView extends SelectableItemView<HistoryItem> {
protected void onClick() { protected void onClick() {
if (getItem() != null) getItem().open(); if (getItem() != null) getItem().open();
} }
@Override
public void onLargeIconAvailable(Bitmap icon, int fallbackColor,
boolean isFallbackColorDefault) {
// TODO(twellington): move this somewhere that can be shared with bookmarks.
if (icon == null) {
mIconGenerator.setBackgroundColor(fallbackColor);
icon = mIconGenerator.generateIconForUrl(getItem().getUrl());
mIconImageView.setImageDrawable(new BitmapDrawable(getResources(), icon));
} else {
RoundedBitmapDrawable roundedIcon = RoundedBitmapDrawableFactory.create(
getResources(),
Bitmap.createScaledBitmap(icon, mDisplayedIconSize, mDisplayedIconSize, false));
roundedIcon.setCornerRadius(mCornerRadius);
mIconImageView.setImageDrawable(roundedIcon);
}
}
private void requestIcon() {
mHistoryManager.getLargeIconBridge().getLargeIconForUrl(
getItem().getUrl(), mMinIconSize, this);
}
} }
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
package org.chromium.chrome.browser.history; package org.chromium.chrome.browser.history;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.provider.Browser; import android.provider.Browser;
...@@ -17,11 +19,14 @@ import android.view.LayoutInflater; ...@@ -17,11 +19,14 @@ import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.favicon.LargeIconBridge;
import org.chromium.chrome.browser.preferences.PreferencesLauncher; import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataPreferences; import org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataPreferences;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.chrome.browser.widget.TintedDrawable; import org.chromium.chrome.browser.widget.TintedDrawable;
import org.chromium.chrome.browser.widget.selection.SelectableListLayout; import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
...@@ -34,10 +39,14 @@ import java.util.List; ...@@ -34,10 +39,14 @@ import java.util.List;
* Displays and manages the UI for browsing history. * Displays and manages the UI for browsing history.
*/ */
public class HistoryManager implements OnMenuItemClickListener { public class HistoryManager implements OnMenuItemClickListener {
private static final int FAVICON_MAX_CACHE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB
private static final int MEGABYTES_TO_BYTES = 1024 * 1024;
private final Activity mActivity; private final Activity mActivity;
private final SelectableListLayout mSelectableListLayout; private final SelectableListLayout mSelectableListLayout;
private final HistoryAdapter mHistoryAdapter; private final HistoryAdapter mHistoryAdapter;
private final SelectionDelegate<HistoryItem> mSelectionDelegate; private final SelectionDelegate<HistoryItem> mSelectionDelegate;
private LargeIconBridge mLargeIconBridge;
/** /**
* Creates a new HistoryManager. * Creates a new HistoryManager.
...@@ -76,6 +85,13 @@ public class HistoryManager implements OnMenuItemClickListener { ...@@ -76,6 +85,13 @@ public class HistoryManager implements OnMenuItemClickListener {
mHistoryAdapter.loadMoreItems(); mHistoryAdapter.loadMoreItems();
} }
}}); }});
mLargeIconBridge = new LargeIconBridge(Profile.getLastUsedProfile().getOriginalProfile());
ActivityManager activityManager = ((ActivityManager) ContextUtils
.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE));
int maxSize = Math.min((activityManager.getMemoryClass() / 4) * MEGABYTES_TO_BYTES,
FAVICON_MAX_CACHE_SIZE_BYTES);
mLargeIconBridge.createCache(maxSize);
} }
@Override @Override
...@@ -115,6 +131,8 @@ public class HistoryManager implements OnMenuItemClickListener { ...@@ -115,6 +131,8 @@ public class HistoryManager implements OnMenuItemClickListener {
public void onDestroyed() { public void onDestroyed() {
mSelectableListLayout.onDestroyed(); mSelectableListLayout.onDestroyed();
mHistoryAdapter.onDestroyed(); mHistoryAdapter.onDestroyed();
mLargeIconBridge.destroy();
mLargeIconBridge = null;
} }
/** /**
...@@ -176,6 +194,13 @@ public class HistoryManager implements OnMenuItemClickListener { ...@@ -176,6 +194,13 @@ public class HistoryManager implements OnMenuItemClickListener {
IntentUtils.safeStartActivity(mActivity, intent); IntentUtils.safeStartActivity(mActivity, intent);
} }
/**
* @return The {@link LargeIconBridge} used to fetch large favicons.
*/
public LargeIconBridge getLargeIconBridge() {
return mLargeIconBridge;
}
private void openItemsInNewTabs(List<HistoryItem> items, boolean isIncognito) { private void openItemsInNewTabs(List<HistoryItem> items, boolean isIncognito) {
for (HistoryItem item : items) { for (HistoryItem item : items) {
openUrl(item.getUrl(), isIncognito, true); openUrl(item.getUrl(), isIncognito, true);
......
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