Commit cb2e0579 authored by Pedro Amaral's avatar Pedro Amaral Committed by Commit Bot

Moving incognito toggle button down to bottom toolbar

Moved the incognito toggle button to the bottom toolbar and removed
the new tab button and incognito toggle button from the top toolbar.

Bug: 847639

Change-Id: I1a8c081251f2058f74ec7ad9b76865758fe136e4
Reviewed-on: https://chromium-review.googlesource.com/1152541
Commit-Queue: Pedro Amaral <amaralp@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578791}
parent 8c35e22c
......@@ -43,8 +43,7 @@
<org.chromium.chrome.browser.widget.TintedImageButton
android:id="@+id/first_button"
style="@style/ToolbarButton"
android:layout_gravity="center"
app:chrometint="@color/dark_mode_tint" />
android:layout_gravity="center" />
<Space
android:layout_width="0dp"
......@@ -54,8 +53,7 @@
<org.chromium.chrome.browser.widget.TintedImageButton
android:id="@+id/second_button"
style="@style/ToolbarButton"
android:layout_gravity="center"
app:chrometint="@color/dark_mode_tint" />
android:layout_gravity="center" />
<Space
android:layout_width="0dp"
......
......@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.modelutil.PropertyKey;
import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.toolbar.BottomToolbarViewBinder.ViewHolder;
import org.chromium.chrome.browser.toolbar.ToolbarButtonSlotData.ToolbarButtonData;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.resources.ResourceManager;
......@@ -88,17 +89,25 @@ public class BottomToolbarCoordinator {
* @param overviewModeBehavior The overview mode manager.
* @param contextualSearchManager The manager for Contextual Search to handle interactions when
* that feature is visible.
* @param firstSlotTabSwitcherButtonData The button to be shown in the first slot when in tab
* switcher mode.
* @param secondSlotTabSwitcherButtonData The button to be shown in the second slot when in tab
* switcher mode.
*/
public void initializeWithNative(ResourceManager resourceManager, LayoutManager layoutManager,
OnClickListener tabSwitcherListener, OnTouchListener menuButtonListener,
TabModelSelector tabModelSelector, OverviewModeBehavior overviewModeBehavior,
ContextualSearchManager contextualSearchManager, WindowAndroid windowAndroid) {
ContextualSearchManager contextualSearchManager, WindowAndroid windowAndroid,
ToolbarButtonData firstSlotTabSwitcherButtonData,
ToolbarButtonData secondSlotTabSwitcherButtonData) {
mMediator.setLayoutManager(layoutManager);
mMediator.setResourceManager(resourceManager);
mMediator.setOverviewModeBehavior(overviewModeBehavior);
mMediator.setToolbarSwipeHandler(layoutManager.getToolbarSwipeHandler());
mMediator.setContextualSearchManager(contextualSearchManager);
mMediator.setWindowAndroid(windowAndroid);
mMediator.setTabSwitcherButtonData(
firstSlotTabSwitcherButtonData, secondSlotTabSwitcherButtonData);
mTabSwitcherButtonCoordinator.setTabSwitcherListener(tabSwitcherListener);
mTabSwitcherButtonCoordinator.setTabModelSelector(tabModelSelector);
......
......@@ -19,6 +19,7 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchObserver;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener;
import org.chromium.chrome.browser.gsa.GSAContextDisplaySelection;
import org.chromium.chrome.browser.toolbar.ToolbarButtonSlotData.ToolbarButtonData;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.KeyboardVisibilityListener;
import org.chromium.ui.resources.ResourceManager;
......@@ -225,4 +226,17 @@ class BottomToolbarMediator implements ContextualSearchObserver, FullscreenListe
mWindowAndroid = windowAndroid;
mWindowAndroid.addKeyboardVisibilityListener(this);
}
void setTabSwitcherButtonData(
ToolbarButtonData firstSlotButtonData, ToolbarButtonData secondSlotButtonData) {
mFirstSlotData.tabSwitcherModeButtonData = firstSlotButtonData;
mSecondSlotData.tabSwitcherModeButtonData = secondSlotButtonData;
if (mOverviewModeBehavior.overviewVisible()) {
mModel.setValue(
BottomToolbarModel.FIRST_BUTTON_DATA, mFirstSlotData.tabSwitcherModeButtonData);
mModel.setValue(BottomToolbarModel.SECOND_BUTTON_DATA,
mSecondSlotData.tabSwitcherModeButtonData);
}
}
}
......@@ -5,9 +5,10 @@
package org.chromium.chrome.browser.toolbar;
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.view.View.OnClickListener;
import org.chromium.chrome.browser.widget.TintedDrawable;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.widget.TintedImageButton;
/**
......@@ -18,16 +19,14 @@ class ToolbarButtonSlotData {
public final ToolbarButtonData browsingModeButtonData;
/** The button to be shown when in tab switcher mode. */
public final ToolbarButtonData tabSwitcherModeButtonData;
public ToolbarButtonData tabSwitcherModeButtonData;
/**
* @param browsingModeButton The button to be shown when in browsing mode.
* @param tabSwitcherModeButton The button to be shown when in tab switcher mode.
*/
ToolbarButtonSlotData(
ToolbarButtonData browsingModeButton, ToolbarButtonData tabSwitcherModeButton) {
ToolbarButtonSlotData(ToolbarButtonData browsingModeButton) {
browsingModeButtonData = browsingModeButton;
tabSwitcherModeButtonData = tabSwitcherModeButton;
}
/**
......@@ -35,23 +34,27 @@ class ToolbarButtonSlotData {
* buttons when entering or leaving tab switching mode.
*/
static class ToolbarButtonData {
private final TintedDrawable mTintedDrawable;
private final int mDrawableResId;
// TODO(amaralp): Add incognito accessibility string.
private final CharSequence mAccessibilityStringResId;
private final OnClickListener mOnClickListener;
private final boolean mShouldTint;
/**
* @param tintedDrawableResId The drawable's resource id.
* @param drawableResId The drawable's resource id.
* @param accessibilityStringResId The accessibility's resource id.
* @param onClickListener An {@link OnClickListener} that is triggered when this button is
* clicked.
* @param shouldTint Whether the button should be tinted.
* @param context The {@link Context} used to get the drawable and accessibility string
* resources.
*/
ToolbarButtonData(int tintedDrawableResId, int accessibilityStringResId,
OnClickListener onClickListener, Context context) {
mTintedDrawable = TintedDrawable.constructTintedDrawable(context, tintedDrawableResId);
ToolbarButtonData(int drawableResId, int accessibilityStringResId,
OnClickListener onClickListener, boolean shouldTint, Context context) {
mAccessibilityStringResId = context.getString(accessibilityStringResId);
mOnClickListener = onClickListener;
mDrawableResId = drawableResId;
mShouldTint = shouldTint;
}
/**
......@@ -59,8 +62,14 @@ class ToolbarButtonSlotData {
*/
void updateButton(TintedImageButton imageButton) {
imageButton.setOnClickListener(mOnClickListener);
imageButton.setImageDrawable(mTintedDrawable);
imageButton.setImageResource(mDrawableResId);
imageButton.setContentDescription(mAccessibilityStringResId);
if (mShouldTint) {
imageButton.setImageTintList(ContextCompat.getColorStateList(
imageButton.getContext(), R.color.dark_mode_tint));
} else {
imageButton.setImageTintList(null);
}
}
}
}
......@@ -29,6 +29,7 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.NativePage;
import org.chromium.chrome.browser.TabLoadStatus;
......@@ -46,6 +47,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
import org.chromium.chrome.browser.device.DeviceClassManager;
import org.chromium.chrome.browser.download.DownloadUtils;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate;
......@@ -62,6 +64,7 @@ import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener;
import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
import org.chromium.chrome.browser.partnercustomizations.HomepageManager.HomepageStateListener;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrl;
import org.chromium.chrome.browser.search_engines.TemplateUrlService;
......@@ -78,6 +81,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegate;
import org.chromium.chrome.browser.toolbar.ToolbarButtonSlotData.ToolbarButtonData;
import org.chromium.chrome.browser.util.ColorUtils;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.chrome.browser.widget.ViewHighlighter;
......@@ -153,7 +157,6 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe
private final ToolbarControlContainer mControlContainer;
private BottomToolbarCoordinator mBottomToolbarCoordinator;
private OnClickListener mNewTabButtonOnClickListener;
private TabModelSelector mTabModelSelector;
private TabModelSelectorObserver mTabModelSelectorObserver;
private TabModelObserver mTabModelObserver;
......@@ -638,11 +641,10 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe
*/
public void enableBottomToolbar() {
if (FeatureUtilities.isBottomToolbarEnabled()) {
final Context context = mActivity.getBaseContext();
final ToolbarButtonSlotData firstButtonSlot = new ToolbarButtonSlotData(
createHomeButton(context), createNewTabButton(context));
final ToolbarButtonSlotData firstButtonSlot =
new ToolbarButtonSlotData(createHomeButton(mActivity));
final ToolbarButtonSlotData secondButtonSlot =
new ToolbarButtonSlotData(createSearchAccelerator(context), null);
new ToolbarButtonSlotData(createSearchAccelerator(mActivity));
mBottomToolbarCoordinator = new BottomToolbarCoordinator(
mActivity.getFullscreenManager(), mActivity.findViewById(R.id.coordinator),
firstButtonSlot, secondButtonSlot);
......@@ -650,29 +652,34 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe
}
}
private ToolbarButtonSlotData.ToolbarButtonData createHomeButton(Context context) {
private ToolbarButtonData createHomeButton(Context context) {
final OnClickListener homeButtonListener = v -> openHomepage();
return new ToolbarButtonSlotData.ToolbarButtonData(R.drawable.btn_toolbar_home,
R.string.accessibility_toolbar_btn_home, homeButtonListener, context);
return new ToolbarButtonData(R.drawable.btn_toolbar_home,
R.string.accessibility_toolbar_btn_home, homeButtonListener, true, context);
}
private ToolbarButtonSlotData.ToolbarButtonData createNewTabButton(Context context) {
final OnClickListener newTabButtonListener = v -> {
if (mNewTabButtonOnClickListener != null) mNewTabButtonOnClickListener.onClick(v);
};
return new ToolbarButtonSlotData.ToolbarButtonData(R.drawable.plus,
R.string.accessibility_toolbar_btn_new_tab, newTabButtonListener, context);
private ToolbarButtonData createNewTabButton(
OnClickListener newTabClickListener, Context context) {
return new ToolbarButtonData(R.drawable.btn_new_tab_white_normal,
R.string.accessibility_toolbar_btn_new_tab, newTabClickListener, false, context);
}
private ToolbarButtonSlotData.ToolbarButtonData createSearchAccelerator(Context context) {
private ToolbarButtonData createSearchAccelerator(Context context) {
final OnClickListener searchAcceleratorListener = v -> {
recordOmniboxFocusReason(OmniboxFocusReason.ACCELERATOR_TAP);
ACCELERATOR_BUTTON_TAP_ACTION.record();
setUrlBarFocus(true);
};
return new ToolbarButtonSlotData.ToolbarButtonData(R.drawable.ic_search,
return new ToolbarButtonData(R.drawable.ic_search,
R.string.accessibility_toolbar_btn_search_accelerator, searchAcceleratorListener,
context);
true, context);
}
private ToolbarButtonData createIncognitoToggleButton(
OnClickListener incognitoToggleClickHandler, Context context) {
return new ToolbarButtonData(R.drawable.btn_tabstrip_switch_normal,
R.string.accessibility_tabstrip_btn_incognito_toggle_standard,
incognitoToggleClickHandler, false, context);
}
/**
......@@ -747,7 +754,6 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe
OnClickListener customTabsBackClickHandler, OnClickListener incognitoClickHandler) {
assert !mInitializedWithNative;
mTabModelSelector = tabModelSelector;
mNewTabButtonOnClickListener = newTabClickHandler;
mToolbar.setTabModelSelector(mTabModelSelector);
mToolbar.getLocationBar().updateVisualsForState();
......@@ -794,11 +800,21 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe
}
if (mBottomToolbarCoordinator != null) {
final boolean showIncognitoToggleButton =
!DeviceClassManager.enableAccessibilityLayout()
&& ChromeFeatureList.isEnabled(
ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID)
&& PrefServiceBridge.getInstance().isIncognitoModeEnabled();
final ToolbarButtonData secondSlotTabSwitcherButtonData = showIncognitoToggleButton
? createIncognitoToggleButton(incognitoClickHandler, mActivity)
: null;
mBottomToolbarCoordinator.initializeWithNative(
mActivity.getCompositorViewHolder().getResourceManager(),
mActivity.getCompositorViewHolder().getLayoutManager(), tabSwitcherClickHandler,
mAppMenuButtonHelper, mTabModelSelector, mOverviewModeBehavior,
mActivity.getContextualSearchManager(), mActivity.getWindowAndroid());
mActivity.getContextualSearchManager(), mActivity.getWindowAndroid(),
createNewTabButton(newTabClickHandler, mActivity),
secondSlotTabSwitcherButtonData);
}
onNativeLibraryReady();
......
......@@ -480,9 +480,12 @@ public class ToolbarPhone extends ToolbarLayout
private void inflateTabSwitchingResources() {
mToggleTabStackButton = (ImageView) findViewById(R.id.tab_switcher_button);
mNewTabButton = (NewTabButton) findViewById(R.id.new_tab_button);
if (FeatureUtilities.isBottomToolbarEnabled()) {
UiUtils.removeViewFromParent(mToggleTabStackButton);
UiUtils.removeViewFromParent(mNewTabButton);
mToggleTabStackButton = null;
mNewTabButton = null;
} else {
mToggleTabStackButton.setClickable(false);
mTabSwitcherButtonDrawable =
......@@ -490,16 +493,13 @@ public class ToolbarPhone extends ToolbarLayout
mTabSwitcherButtonDrawableLight =
TabSwitcherDrawable.createTabSwitcherDrawable(getContext(), true);
mToggleTabStackButton.setImageDrawable(mTabSwitcherButtonDrawable);
}
mNewTabButton = (NewTabButton) findViewById(R.id.new_tab_button);
mTabSwitcherModeViews.add(mNewTabButton);
// Ensure that the new tab button will not draw over the toolbar buttons if the
// translated string is long. Set a margin to the size of the toolbar button container
// for the new tab button.
WindowManager wm = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
WindowManager wm =
(WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Point screenSize = new Point();
wm.getDefaultDisplay().getSize(screenSize);
......@@ -507,12 +507,12 @@ public class ToolbarPhone extends ToolbarLayout
MeasureSpec.makeMeasureSpec(screenSize.x, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(screenSize.y, MeasureSpec.AT_MOST));
MarginLayoutParamsCompat.setMarginEnd(
getFrameLayoutParams(mNewTabButton), mToolbarButtonsContainer.getMeasuredWidth());
MarginLayoutParamsCompat.setMarginEnd(getFrameLayoutParams(mNewTabButton),
mToolbarButtonsContainer.getMeasuredWidth());
}
}
private void enableTabSwitchingResources() {
if (mToggleTabStackButton != null) {
mToggleTabStackButton.setOnClickListener(this);
mToggleTabStackButton.setOnLongClickListener(this);
mToggleTabStackButton.setOnKeyListener(new KeyboardNavigationListener() {
......@@ -531,7 +531,6 @@ public class ToolbarPhone extends ToolbarLayout
return findViewById(R.id.url_bar);
}
});
}
mNewTabButton.setOnClickListener(this);
mNewTabButton.setOnLongClickListener(this);
}
......@@ -551,7 +550,7 @@ public class ToolbarPhone extends ToolbarLayout
getLocationBar().onNativeLibraryReady();
enableTabSwitchingResources();
if (!FeatureUtilities.isBottomToolbarEnabled()) enableTabSwitchingResources();
if (mHomeButton != null) {
changeIconToNTPIcon(mHomeButton);
......@@ -577,7 +576,7 @@ public class ToolbarPhone extends ToolbarLayout
});
onHomeButtonUpdate(HomepageManager.isHomepageEnabled());
if (mLocationBar.useModernDesign()) mNewTabButton.setIsModern();
if (mNewTabButton != null && mLocationBar.useModernDesign()) mNewTabButton.setIsModern();
setTabSwitcherAnimationMenuDrawable();
updateVisualsForToolbarState();
......@@ -1909,8 +1908,8 @@ public class ToolbarPhone extends ToolbarLayout
// Don't inflate the incognito toggle button unless the horizontal tab switcher experiment
// is enabled and the user actually enters the tab switcher.
if (mIncognitoToggleButton == null && mTabSwitcherState != STATIC_TAB
&& usingHorizontalTabSwitcher()
if (!FeatureUtilities.isBottomToolbarEnabled() && mIncognitoToggleButton == null
&& mTabSwitcherState != STATIC_TAB && usingHorizontalTabSwitcher()
&& PrefServiceBridge.getInstance().isIncognitoModeEnabled()) {
ViewStub incognitoToggleButtonStub = findViewById(R.id.incognito_button_stub);
mIncognitoToggleButton = (IncognitoToggleButton) incognitoToggleButtonStub.inflate();
......@@ -1990,7 +1989,7 @@ public class ToolbarPhone extends ToolbarLayout
layoutLocationBar(getMeasuredWidth());
updateUrlExpansionAnimation();
}
mNewTabButton.setEnabled(true);
if (mNewTabButton != null) mNewTabButton.setEnabled(true);
updateViewsForTabSwitcherMode();
mTabSwitcherModeAnimation = createEnterTabSwitcherModeAnimation();
} else {
......@@ -2081,7 +2080,7 @@ public class ToolbarPhone extends ToolbarLayout
@Override
protected void onAccessibilityStatusChanged(boolean enabled) {
super.onAccessibilityStatusChanged(enabled);
mNewTabButton.onAccessibilityStatusChanged();
if (mNewTabButton != null) mNewTabButton.onAccessibilityStatusChanged();
}
@Override
......@@ -2734,15 +2733,16 @@ public class ToolbarPhone extends ToolbarLayout
updateNtpTransitionAnimation();
}
if (mNewTabButton != null) {
mNewTabButton.setIsIncognito(isIncognito);
CharSequence newTabContentDescription = getResources().getText(isIncognito
? R.string.accessibility_toolbar_btn_new_incognito_tab
: R.string.accessibility_toolbar_btn_new_tab);
CharSequence newTabContentDescription = getResources().getText(
isIncognito ? R.string.accessibility_toolbar_btn_new_incognito_tab :
R.string.accessibility_toolbar_btn_new_tab);
if (mNewTabButton != null
&& !newTabContentDescription.equals(mNewTabButton.getContentDescription())) {
if (!newTabContentDescription.equals(mNewTabButton.getContentDescription())) {
mNewTabButton.setContentDescription(newTabContentDescription);
}
}
if (getMenuButtonWrapper() != null) {
getMenuButtonWrapper().setVisibility(View.VISIBLE);
......
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