blob: d1acafc9d9f46728b8d9b36d81eaf6468c36a761 [file] [log] [blame]
// Copyright 2018 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.toolbar;
import android.content.Context;
import android.content.res.ColorStateList;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.ThemeColorProvider.TintObserver;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.ui.widget.ChromeImageButton;
/**
* The home button.
*/
public class HomeButton extends ChromeImageButton
implements TintObserver, OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener,
HomepageManager.HomepageStateListener {
private static final int ID_REMOVE = 0;
/** A provider that notifies components when the theme color changes.*/
private ThemeColorProvider mThemeColorProvider;
/** The {@link ActivityTabTabObserver} used to know when the active page changed. */
private ActivityTabTabObserver mActivityTabTabObserver;
/** The {@link ActivityTabProvider} used to know if the active tab is on the NTP. */
private ActivityTabProvider mActivityTabProvider;
public HomeButton(Context context, AttributeSet attrs) {
super(context, attrs);
final int homeButtonIcon = FeatureUtilities.isNewTabPageButtonEnabled()
? R.drawable.ic_home
: R.drawable.btn_toolbar_home;
setImageDrawable(ContextCompat.getDrawable(context, homeButtonIcon));
if (!FeatureUtilities.isNewTabPageButtonEnabled()
&& !FeatureUtilities.isBottomToolbarEnabled()) {
setOnCreateContextMenuListener(this);
}
HomepageManager.getInstance().addListener(this);
}
public void destroy() {
if (mThemeColorProvider != null) {
mThemeColorProvider.removeTintObserver(this);
mThemeColorProvider = null;
}
if (mActivityTabTabObserver != null) {
mActivityTabTabObserver.destroy();
mActivityTabTabObserver = null;
}
HomepageManager.getInstance().removeListener(this);
}
public void setThemeColorProvider(ThemeColorProvider themeColorProvider) {
mThemeColorProvider = themeColorProvider;
mThemeColorProvider.addTintObserver(this);
}
@Override
public void onTintChanged(ColorStateList tint, boolean useLight) {
ApiCompatibilityUtils.setImageTintList(this, tint);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove).setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
assert item.getItemId() == ID_REMOVE;
HomepageManager.getInstance().setPrefHomepageEnabled(false);
return true;
}
@Override
public void onHomepageStateUpdated() {
updateButtonEnabledState();
}
public void setActivityTabProvider(ActivityTabProvider activityTabProvider) {
mActivityTabProvider = activityTabProvider;
mActivityTabTabObserver = new ActivityTabTabObserver(activityTabProvider) {
@Override
public void onObservingDifferentTab(Tab tab) {
if (tab == null) return;
updateButtonEnabledState();
}
@Override
public void onUpdateUrl(Tab tab, String url) {
updateButtonEnabledState();
}
};
}
private void updateButtonEnabledState() {
if (FeatureUtilities.isNewTabPageButtonEnabled() || !HomepageManager.isHomepageEnabled()) {
setEnabled(!isActiveTabNTP());
} else {
setEnabled(true);
}
}
private boolean isActiveTabNTP() {
if (mActivityTabProvider == null) return false;
return NewTabPage.isNTPUrl(mActivityTabProvider.getActivityTab().getUrl());
}
}