Commit 21922004 authored by Ryan Landay's avatar Ryan Landay Committed by Commit Bot

Refactor IncognitoToggleButtonTablet

IncognitoToggleButtonTablet implements a button we have in the Android tablet
toolbar that lets a user switch between normal and incognito modes. The button
only shows if there's at least one incognito tab currently open.

I want to add a similar button to the toolbar on Android phones as part of the
horizontal tab switcher experiment. The button won't need as much functionality
on phones (we want to always show it, not only when an incognito tab is open,
and the click handler will get passed from StackLayout through ToolbarPhone to
the incognito button, so we can have StackLayout disable it during animations).
This CL refactors the basic functionality into a new base class
IncognitoToggleButton, which we can use on phones. IncognitoToggleButtonTablet
will now extend this class so as to maintain the current functionality.

Bug: 828224
Change-Id: I453be95f42d7baef0d5e237c61bc14f7af7faba2
Reviewed-on: https://chromium-review.googlesource.com/1058433Reviewed-by: default avatarTheresa <twellington@chromium.org>
Commit-Queue: Ryan Landay <rlanday@chromium.org>
Cr-Commit-Position: refs/heads/master@{#558533}
parent 6c883a58
// 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.widget.incognitotoggle;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
/**
* A {@link View} that allows a user to toggle between incognito and normal {@link TabModel}s. This
* class provides the basic functionality of drawing the button and toggling its state when the
* TabModelSelector switches between normal and incognito modes. It can be subclassed (e.g. as is
* done in IncognitoToggleButtonTablet) to add additional behaviors.
*/
public class IncognitoToggleButton extends ImageButton {
protected TabModelSelector mTabModelSelector;
protected TabModelSelectorObserver mTabModelSelectorObserver;
/**
* Creates an instance of {@link IncognitoToggleButton}.
* @param context The {@link Context} to create this {@link View} under.
* @param attrs An {@link AttributeSet} that contains information on how to build this
* {@link View}.
*/
public IncognitoToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
setScaleType(ScaleType.CENTER);
}
/**
* Sets the {@link TabModelSelector} that will be queried for information about the state of
* the system.
* @param selector A {@link TabModelSelector} that represents the state of the system.
*/
public void setTabModelSelector(TabModelSelector selector) {
mTabModelSelector = selector;
if (selector != null) {
updateButtonResource();
mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
@Override
public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
updateButtonResource();
}
};
mTabModelSelector.addObserver(mTabModelSelectorObserver);
}
}
private void updateButtonResource() {
if (mTabModelSelector == null || mTabModelSelector.getCurrentModel() == null) return;
setContentDescription(getContext().getString(mTabModelSelector.isIncognitoSelected()
? R.string.accessibility_tabstrip_btn_incognito_toggle_incognito
: R.string.accessibility_tabstrip_btn_incognito_toggle_standard));
setImageResource(mTabModelSelector.isIncognitoSelected()
? R.drawable.btn_tabstrip_switch_incognito
: R.drawable.btn_tabstrip_switch_normal);
}
}
......@@ -7,24 +7,21 @@ package org.chromium.chrome.browser.widget.incognitotoggle;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
/**
* A {@link View} that allows a user to toggle between incognito and normal {@link TabModel}s.
* A subclass of IncognitoToggleButton that adds some functionality to hide the button when no
* incognito tabs are open. This subclass also implements the "toggle incognito mode on click"
* behavior directly (the base class allows the code instantiating the button to set custom
* behavior).
*/
public class IncognitoToggleButtonTablet extends ImageButton {
private TabModelSelector mTabModelSelector;
private TabModelSelectorObserver mTabModelSelectorObserver;
public class IncognitoToggleButtonTablet extends IncognitoToggleButton {
private TabModelObserver mTabModelObserver;
/**
......@@ -41,7 +38,6 @@ public class IncognitoToggleButtonTablet extends ImageButton {
public void onFinishInflate() {
super.onFinishInflate();
setScaleType(ScaleType.CENTER);
setVisibility(View.GONE);
setOnClickListener(new OnClickListener() {
......@@ -59,20 +55,12 @@ public class IncognitoToggleButtonTablet extends ImageButton {
* the system.
* @param selector A {@link TabModelSelector} that represents the state of the system.
*/
@Override
public void setTabModelSelector(TabModelSelector selector) {
mTabModelSelector = selector;
super.setTabModelSelector(selector);
if (selector != null) {
updateButtonResource();
updateButtonVisibility();
mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
@Override
public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
updateButtonResource();
}
};
mTabModelSelector.addObserver(mTabModelSelectorObserver);
mTabModelObserver = new EmptyTabModelObserver() {
@Override
public void didAddTab(Tab tab, TabLaunchType type) {
......@@ -95,16 +83,6 @@ public class IncognitoToggleButtonTablet extends ImageButton {
}
}
private void updateButtonResource() {
if (mTabModelSelector == null || mTabModelSelector.getCurrentModel() == null) return;
setContentDescription(getContext().getString(mTabModelSelector.isIncognitoSelected()
? R.string.accessibility_tabstrip_btn_incognito_toggle_incognito
: R.string.accessibility_tabstrip_btn_incognito_toggle_standard));
setImageResource(mTabModelSelector.isIncognitoSelected()
? R.drawable.btn_tabstrip_switch_incognito : R.drawable.btn_tabstrip_switch_normal);
}
private void updateButtonVisibility() {
if (mTabModelSelector == null || mTabModelSelector.getCurrentModel() == null) {
setVisibility(View.GONE);
......@@ -141,4 +119,4 @@ public class IncognitoToggleButtonTablet extends ImageButton {
}
super.onDetachedFromWindow();
}
}
\ No newline at end of file
}
......@@ -1481,6 +1481,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarObserver.java",
"java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java",
"java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java",
"java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java",
"java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButtonTablet.java",
"java/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java",
"java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java",
......
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