Commit c4596c3d authored by Mia Glaese's avatar Mia Glaese Committed by Commit Bot

[Start Surface] Add identity disc to toolbar.

Screenshots here:
https://drive.google.com/drive/folders/1ya-W3P0fFftqwD8MVoc1FaGcOJucjawm?usp=sharing

Video record:
1, single start surface
https://drive.google.com/a/google.com/file/d/1TsAyE5lzz5OyaluVWFsjOnoY7RFMit7d/view?usp=sharing
2, tasks only start surface
https://drive.google.com/a/google.com/file/d/1Jij-EpFKZOFWhf5BV79yP97JSWgF4QxA/view?usp=sharing
3, start surface disabled
https://drive.google.com/a/google.com/file/d/15AlCELYCu_FgdifcO9NyGp5eCVQzNzBG/view?usp=sharing

Bug: 982018
Change-Id: I3b3bb7daa9eb58ab9cd804d58c376f0c9be9edfe
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1992272
Commit-Queue: Ganggui Tang <gogerald@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarPatrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarPavel Yatsuk <pavely@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Reviewed-by: default avatarGanggui Tang <gogerald@chromium.org>
Cr-Commit-Position: refs/heads/master@{#733785}
parent d798e544
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingEnd="16dp" android:paddingEnd="8dp"
android:thumb="@drawable/incognito_switch" android:thumb="@drawable/incognito_switch"
android:track="@drawable/incognito_switch_track" android:track="@drawable/incognito_switch_track"
android:visibility="gone"/> android:visibility="gone"/>
...@@ -43,10 +43,17 @@ ...@@ -43,10 +43,17 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_toStartOf="@+id/menu_anchor" android:layout_toStartOf="@+id/menu_anchor"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:paddingStart="16dp" android:paddingStart="8dp"
android:paddingEnd="16dp" android:paddingEnd="8dp"
android:contentDescription="@string/accessibility_toolbar_btn_new_tab" /> android:contentDescription="@string/accessibility_toolbar_btn_new_tab" />
<include
layout="@layout/experimental_toolbar_button"
android:id="@+id/experimental_toolbar_button_start"
android:layout_toStartOf="@+id/menu_anchor"
style="@style/ToolbarButton"
android:visibility="gone" />
<FrameLayout <FrameLayout
android:id="@+id/menu_anchor" android:id="@+id/menu_anchor"
android:layout_width="wrap_content" android:layout_width="wrap_content"
......
...@@ -320,6 +320,10 @@ ...@@ -320,6 +320,10 @@
24dp is needed to completely round the corners. --> 24dp is needed to completely round the corners. -->
<dimen name="modern_toolbar_background_corner_radius">24dp</dimen> <dimen name="modern_toolbar_background_corner_radius">24dp</dimen>
<!-- Start surface toolbar dimensions -->
<dimen name="start_surface_toolbar_button_padding_to_button">8dp</dimen>
<dimen name="start_surface_toolbar_button_padding_to_edge">16dp</dimen>
<!-- Omnibox suggestions --> <!-- Omnibox suggestions -->
<dimen name="omnibox_suggestion_height">60dp</dimen> <dimen name="omnibox_suggestion_height">60dp</dimen>
<dimen name="omnibox_suggestion_answer_height">72dp</dimen> <dimen name="omnibox_suggestion_answer_height">72dp</dimen>
......
...@@ -70,7 +70,7 @@ class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Obs ...@@ -70,7 +70,7 @@ class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Obs
@IdentityDiscState @IdentityDiscState
private int mState = IdentityDiscState.NONE; private int mState = IdentityDiscState.NONE;
private boolean mIsNTPVisible; private boolean mShouldShowButton;
/** /**
* Creates IdentityDiscController object. * Creates IdentityDiscController object.
...@@ -98,23 +98,23 @@ class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Obs ...@@ -98,23 +98,23 @@ class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Obs
} }
/** /**
* Shows/hides Identity Disc depending on whether NTP is visible. * Shows/hides Identity Disc.
*/ */
void updateButtonState() { void updateButtonState() {
updateButtonState(mIsNTPVisible); updateButtonState(mShouldShowButton);
} }
/** /**
* Shows/hides Identity Disc depending on whether NTP is visible. * @param shouldShowButton Whether to show the Identity Disc.
*/ */
void updateButtonState(boolean isNTPVisible) { void updateButtonState(boolean shouldShowButton) {
mIsNTPVisible = isNTPVisible; mShouldShowButton = shouldShowButton;
String accountName = ChromeSigninController.get().getSignedInAccountName(); String accountName = ChromeSigninController.get().getSignedInAccountName();
boolean shouldShowIdentityDisc = isNTPVisible && accountName != null; boolean canShowIdentityDisc = mShouldShowButton && accountName != null;
@IdentityDiscState @IdentityDiscState
int oldState = mState; int oldState = mState;
mState = !shouldShowIdentityDisc mState = !canShowIdentityDisc
? IdentityDiscState.NONE ? IdentityDiscState.NONE
: mToolbarManager.isBottomToolbarVisible() ? IdentityDiscState.LARGE : mToolbarManager.isBottomToolbarVisible() ? IdentityDiscState.LARGE
: IdentityDiscState.SMALL; : IdentityDiscState.SMALL;
......
...@@ -251,6 +251,9 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -251,6 +251,9 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
private int mCurrentOrientation; private int mCurrentOrientation;
@OverviewModeState
private int mOverviewModeState = OverviewModeState.NOT_SHOWN;
/** /**
* Runnable for the home and search accelerator button when Start Surface home page is enabled. * Runnable for the home and search accelerator button when Start Surface home page is enabled.
*/ */
...@@ -735,7 +738,11 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -735,7 +738,11 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
@Override @Override
public void onOverviewModeStateChanged( public void onOverviewModeStateChanged(
@OverviewModeState int overviewModeState, boolean showTabSwitcherToolbar) { @OverviewModeState int overviewModeState, boolean showTabSwitcherToolbar) {
assert FeatureUtilities.isStartSurfaceEnabled();
mToolbar.updateTabSwitcherToolbarState(showTabSwitcherToolbar); mToolbar.updateTabSwitcherToolbarState(showTabSwitcherToolbar);
mOverviewModeState = overviewModeState;
mIdentityDiscController.updateButtonState(
mOverviewModeState == OverviewModeState.SHOWN_HOMEPAGE);
} }
@Override @Override
...@@ -757,6 +764,7 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -757,6 +764,7 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
@Override @Override
public void onOverviewModeFinishedHiding() { public void onOverviewModeFinishedHiding() {
mToolbar.onTabSwitcherTransitionFinished(); mToolbar.onTabSwitcherTransitionFinished();
updateButtonStatus();
} }
}; };
...@@ -1880,8 +1888,12 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -1880,8 +1888,12 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
if (mToolbar.getMenuButtonWrapper() != null && !isBottomToolbarVisible()) { if (mToolbar.getMenuButtonWrapper() != null && !isBottomToolbarVisible()) {
mToolbar.getMenuButtonWrapper().setVisibility(View.VISIBLE); mToolbar.getMenuButtonWrapper().setVisibility(View.VISIBLE);
} }
// TODO(crbug.com/1041475): Separate enabling the IdentityDiscController from enabling the
// ExperimentalButton.
mIdentityDiscController.updateButtonState( mIdentityDiscController.updateButtonState(
mLocationBarModel.getNewTabPageForCurrentTab() != null); mLocationBarModel.getNewTabPageForCurrentTab() != null
|| mOverviewModeState == OverviewModeState.SHOWN_HOMEPAGE);
} }
private void updateBookmarkButtonStatus() { private void updateBookmarkButtonStatus() {
......
...@@ -4,9 +4,12 @@ ...@@ -4,9 +4,12 @@
package org.chromium.chrome.browser.toolbar.top; package org.chromium.chrome.browser.toolbar.top;
import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import android.view.ViewStub; import android.view.ViewStub;
import androidx.annotation.StringRes;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.incognito.IncognitoUtils; import org.chromium.chrome.browser.incognito.IncognitoUtils;
...@@ -113,6 +116,43 @@ class StartSurfaceToolbarCoordinator { ...@@ -113,6 +116,43 @@ class StartSurfaceToolbarCoordinator {
mToolbarMediator.setOverviewModeBehavior(overviewModeBehavior); mToolbarMediator.setOverviewModeBehavior(overviewModeBehavior);
} }
/**
* Enable the experimental toolbar button.
* @param onClickListener The {@link OnClickListener} to be called when the button is clicked.
* @param image The drawable to display for the button.
* @param contentDescriptionResId The resource id of the content description for the button.
*/
void enableExperimentalButton(View.OnClickListener onClickListener, Drawable image,
@StringRes int contentDescriptionResId) {
mToolbarMediator.enableIdentityDisc(onClickListener, image, contentDescriptionResId);
}
/**
* Updates image displayed on experimental button.
* @param image The new image for the button.
*/
void updateExperimentalButtonImage(Drawable image) {
mToolbarMediator.updateIdentityDiscImage(image);
}
/**
* Disable the experimental toolbar button.
*/
void disableExperimentalButton() {
mToolbarMediator.disableIdentityDisc();
}
/**
* Displays in-product help for experimental button.
* @param stringId The id of the string resource for the text that should be shown.
* @param accessibilityStringId The id of the string resource of the accessibility text.
* @param dismissedCallback The callback that will be called when in-product help is dismissed.
*/
void showIPHOnExperimentalButton(@StringRes int stringId, @StringRes int accessibilityStringId,
Runnable dismissedCallback) {
mToolbarMediator.showIPHOnIdentityDisc(stringId, accessibilityStringId, dismissedCallback);
}
void onNativeLibraryReady() { void onNativeLibraryReady() {
mToolbarMediator.onNativeLibraryReady(); mToolbarMediator.onNativeLibraryReady();
} }
......
...@@ -7,6 +7,11 @@ package org.chromium.chrome.browser.toolbar.top; ...@@ -7,6 +7,11 @@ package org.chromium.chrome.browser.toolbar.top;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.APP_MENU_BUTTON_HELPER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.APP_MENU_BUTTON_HELPER;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IMAGE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IPH;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IS_VISIBLE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.INCOGNITO_STATE_PROVIDER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.INCOGNITO_STATE_PROVIDER;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_INCOGNITO; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_INCOGNITO;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE;
...@@ -15,8 +20,11 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarPropert ...@@ -15,8 +20,11 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarPropert
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_CLICK_HANDLER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_CLICK_HANDLER;
import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import androidx.annotation.StringRes;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
...@@ -27,6 +35,7 @@ import org.chromium.chrome.browser.tabmodel.TabModel; ...@@ -27,6 +35,7 @@ import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
import org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IPHContainer;
import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper;
import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.chrome.browser.util.AccessibilityUtil;
import org.chromium.components.search_engines.TemplateUrlService.TemplateUrlServiceObserver; import org.chromium.components.search_engines.TemplateUrlService.TemplateUrlServiceObserver;
...@@ -43,6 +52,7 @@ class StartSurfaceToolbarMediator { ...@@ -43,6 +52,7 @@ class StartSurfaceToolbarMediator {
@OverviewModeState @OverviewModeState
private int mOverviewModeState; private int mOverviewModeState;
private boolean mIsGoogleSearchEngine; private boolean mIsGoogleSearchEngine;
private boolean mEnableIdentityDisc;
StartSurfaceToolbarMediator(PropertyModel model) { StartSurfaceToolbarMediator(PropertyModel model) {
mPropertyModel = model; mPropertyModel = model;
...@@ -93,10 +103,12 @@ class StartSurfaceToolbarMediator { ...@@ -93,10 +103,12 @@ class StartSurfaceToolbarMediator {
@Override @Override
public void onTabModelSelected(TabModel newModel, TabModel oldModel) { public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected()); mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected());
updateIdentityDiscVisibility();
} }
}; };
} }
mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected()); mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected());
updateIdentityDiscVisibility();
mTabModelSelector.addObserver(mTabModelSelectorObserver); mTabModelSelector.addObserver(mTabModelSelectorObserver);
} }
...@@ -131,6 +143,7 @@ class StartSurfaceToolbarMediator { ...@@ -131,6 +143,7 @@ class StartSurfaceToolbarMediator {
mOverviewModeState = overviewModeState; mOverviewModeState = overviewModeState;
updateNewTabButtonVisibility(); updateNewTabButtonVisibility();
updateLogoVisibility(mIsGoogleSearchEngine); updateLogoVisibility(mIsGoogleSearchEngine);
updateIdentityDiscVisibility();
} }
@Override @Override
public void onOverviewModeFinishedShowing() { public void onOverviewModeFinishedShowing() {
...@@ -156,6 +169,35 @@ class StartSurfaceToolbarMediator { ...@@ -156,6 +169,35 @@ class StartSurfaceToolbarMediator {
mPropertyModel.set(LOGO_IS_VISIBLE, shouldShowLogo); mPropertyModel.set(LOGO_IS_VISIBLE, shouldShowLogo);
} }
void enableIdentityDisc(View.OnClickListener onClickListener, Drawable image,
@StringRes int contentDescriptionResId) {
mEnableIdentityDisc = true;
mPropertyModel.set(IDENTITY_DISC_CLICK_HANDLER, onClickListener);
mPropertyModel.set(IDENTITY_DISC_IMAGE, image);
mPropertyModel.set(IDENTITY_DISC_DESCRIPTION, contentDescriptionResId);
updateIdentityDiscVisibility();
}
void updateIdentityDiscImage(Drawable image) {
mPropertyModel.set(IDENTITY_DISC_IMAGE, image);
}
void disableIdentityDisc() {
mEnableIdentityDisc = false;
mPropertyModel.set(IDENTITY_DISC_IS_VISIBLE, false);
}
void showIPHOnIdentityDisc(@StringRes int stringId, @StringRes int accessibilityStringId,
Runnable dismissedCallback) {
// Only show IPH if IdentityDisc is actually visible, otherwise dismiss.
if (mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)) {
mPropertyModel.set(IDENTITY_DISC_IPH,
new IPHContainer(stringId, accessibilityStringId, dismissedCallback));
} else if (dismissedCallback != null) {
dismissedCallback.run();
}
}
private void updateNewTabButtonVisibility() { private void updateNewTabButtonVisibility() {
// This toolbar is only shown for tab switcher when accessibility is enabled. Note that // This toolbar is only shown for tab switcher when accessibility is enabled. Note that
// OverviewListLayout will be shown as the tab switcher instead of the star surface. // OverviewListLayout will be shown as the tab switcher instead of the star surface.
...@@ -164,4 +206,10 @@ class StartSurfaceToolbarMediator { ...@@ -164,4 +206,10 @@ class StartSurfaceToolbarMediator {
|| AccessibilityUtil.isAccessibilityEnabled(); || AccessibilityUtil.isAccessibilityEnabled();
mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState); mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState);
} }
private void updateIdentityDiscVisibility() {
mPropertyModel.set(IDENTITY_DISC_IS_VISIBLE,
mOverviewModeState == OverviewModeState.SHOWN_HOMEPAGE && mEnableIdentityDisc
&& !mTabModelSelector.isIncognitoSelected());
}
} }
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
package org.chromium.chrome.browser.toolbar.top; package org.chromium.chrome.browser.toolbar.top;
import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import androidx.annotation.StringRes;
import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper;
import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyKey;
...@@ -13,6 +16,21 @@ import org.chromium.ui.modelutil.PropertyModel; ...@@ -13,6 +16,21 @@ import org.chromium.ui.modelutil.PropertyModel;
/** List of the start surface toolbar properties. */ /** List of the start surface toolbar properties. */
class StartSurfaceToolbarProperties { class StartSurfaceToolbarProperties {
public static class IPHContainer {
@StringRes
public final int stringId;
@StringRes
public final int accessibilityStringId;
public Runnable dismissedCallback;
IPHContainer(@StringRes int stringId, @StringRes int accessibilityStringId,
Runnable dismissedCallback) {
this.stringId = stringId;
this.accessibilityStringId = accessibilityStringId;
this.dismissedCallback = dismissedCallback;
}
}
private StartSurfaceToolbarProperties() {} private StartSurfaceToolbarProperties() {}
public static final PropertyModel public static final PropertyModel
...@@ -24,6 +42,17 @@ class StartSurfaceToolbarProperties { ...@@ -24,6 +42,17 @@ class StartSurfaceToolbarProperties {
public static final PropertyModel public static final PropertyModel
.WritableObjectPropertyKey<View.OnClickListener> NEW_TAB_CLICK_HANDLER = .WritableObjectPropertyKey<View.OnClickListener> NEW_TAB_CLICK_HANDLER =
new PropertyModel.WritableObjectPropertyKey<View.OnClickListener>(); new PropertyModel.WritableObjectPropertyKey<View.OnClickListener>();
public static final PropertyModel
.WritableObjectPropertyKey<View.OnClickListener> IDENTITY_DISC_CLICK_HANDLER =
new PropertyModel.WritableObjectPropertyKey<View.OnClickListener>();
public static final PropertyModel.WritableObjectPropertyKey<Drawable> IDENTITY_DISC_IMAGE =
new PropertyModel.WritableObjectPropertyKey<Drawable>();
public static final PropertyModel.WritableIntPropertyKey IDENTITY_DISC_DESCRIPTION =
new PropertyModel.WritableIntPropertyKey();
public static final PropertyModel.WritableObjectPropertyKey<IPHContainer> IDENTITY_DISC_IPH =
new PropertyModel.WritableObjectPropertyKey<IPHContainer>();
public static final PropertyModel.WritableBooleanPropertyKey IDENTITY_DISC_IS_VISIBLE =
new PropertyModel.WritableBooleanPropertyKey();
public static final PropertyModel.WritableBooleanPropertyKey IS_VISIBLE = public static final PropertyModel.WritableBooleanPropertyKey IS_VISIBLE =
new PropertyModel.WritableBooleanPropertyKey(); new PropertyModel.WritableBooleanPropertyKey();
public static final PropertyModel.WritableBooleanPropertyKey LOGO_IS_VISIBLE = public static final PropertyModel.WritableBooleanPropertyKey LOGO_IS_VISIBLE =
...@@ -42,5 +71,7 @@ class StartSurfaceToolbarProperties { ...@@ -42,5 +71,7 @@ class StartSurfaceToolbarProperties {
public static final PropertyKey[] ALL_KEYS = public static final PropertyKey[] ALL_KEYS =
new PropertyKey[] {APP_MENU_BUTTON_HELPER, NEW_TAB_CLICK_HANDLER, IS_VISIBLE, new PropertyKey[] {APP_MENU_BUTTON_HELPER, NEW_TAB_CLICK_HANDLER, IS_VISIBLE,
LOGO_IS_VISIBLE, IS_INCOGNITO, INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED, LOGO_IS_VISIBLE, IS_INCOGNITO, INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED,
MENU_IS_VISIBLE, NEW_TAB_BUTTON_IS_VISIBLE, BUTTONS_CLICKABLE}; MENU_IS_VISIBLE, NEW_TAB_BUTTON_IS_VISIBLE, BUTTONS_CLICKABLE,
IDENTITY_DISC_IS_VISIBLE, IDENTITY_DISC_CLICK_HANDLER, IDENTITY_DISC_IMAGE,
IDENTITY_DISC_DESCRIPTION, IDENTITY_DISC_IPH};
} }
...@@ -7,17 +7,24 @@ package org.chromium.chrome.browser.toolbar.top; ...@@ -7,17 +7,24 @@ package org.chromium.chrome.browser.toolbar.top;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.content.res.AppCompatResources; import android.support.v7.content.res.AppCompatResources;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.ImageButton;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
import org.chromium.chrome.browser.toolbar.MenuButton; import org.chromium.chrome.browser.toolbar.MenuButton;
import org.chromium.chrome.browser.toolbar.NewTabButton; import org.chromium.chrome.browser.toolbar.NewTabButton;
import org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IPHContainer;
import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper;
import org.chromium.chrome.browser.ui.widget.textbubble.TextBubble;
import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.ColorUtils;
import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.styles.ChromeColors;
...@@ -27,6 +34,8 @@ class StartSurfaceToolbarView extends RelativeLayout { ...@@ -27,6 +34,8 @@ class StartSurfaceToolbarView extends RelativeLayout {
private View mIncognitoSwitch; private View mIncognitoSwitch;
private MenuButton mMenuButton; private MenuButton mMenuButton;
private View mLogo; private View mLogo;
@Nullable
private ImageButton mIdentityDiscButton;
private int mPrimaryColor; private int mPrimaryColor;
private ColorStateList mLightIconTint; private ColorStateList mLightIconTint;
private ColorStateList mDarkIconTint; private ColorStateList mDarkIconTint;
...@@ -46,6 +55,13 @@ class StartSurfaceToolbarView extends RelativeLayout { ...@@ -46,6 +55,13 @@ class StartSurfaceToolbarView extends RelativeLayout {
mIncognitoSwitch = findViewById(R.id.incognito_switch); mIncognitoSwitch = findViewById(R.id.incognito_switch);
mMenuButton = findViewById(R.id.menu_button_wrapper); mMenuButton = findViewById(R.id.menu_button_wrapper);
mLogo = findViewById(R.id.logo); mLogo = findViewById(R.id.logo);
mIdentityDiscButton = findViewById(R.id.experimental_toolbar_button_start);
// Change padding in layout file programmatically, since padding in layout file can not be
// changed in ViewStub.
final int buttonPadding = getContext().getResources().getDimensionPixelOffset(
R.dimen.start_surface_toolbar_button_padding_to_button);
mIdentityDiscButton.setPadding(buttonPadding, 0, buttonPadding, 0);
updatePrimaryColorAndTint(false); updatePrimaryColorAndTint(false);
} }
...@@ -100,6 +116,14 @@ class StartSurfaceToolbarView extends RelativeLayout { ...@@ -100,6 +116,14 @@ class StartSurfaceToolbarView extends RelativeLayout {
*/ */
void setMenuButtonVisibility(boolean isVisible) { void setMenuButtonVisibility(boolean isVisible) {
mMenuButton.setVisibility(isVisible ? View.VISIBLE : View.GONE); mMenuButton.setVisibility(isVisible ? View.VISIBLE : View.GONE);
final int buttonPaddingLeft = getContext().getResources().getDimensionPixelOffset(
R.dimen.start_surface_toolbar_button_padding_to_button);
final int buttonPaddingRight =
(isVisible ? buttonPaddingLeft
: getContext().getResources().getDimensionPixelOffset(
R.dimen.start_surface_toolbar_button_padding_to_edge));
mIdentityDiscButton.setPadding(buttonPaddingLeft, 0, buttonPaddingRight, 0);
mNewTabButton.setPadding(buttonPaddingLeft, 0, buttonPaddingRight, 0);
} }
/** /**
...@@ -135,6 +159,52 @@ class StartSurfaceToolbarView extends RelativeLayout { ...@@ -135,6 +159,52 @@ class StartSurfaceToolbarView extends RelativeLayout {
mNewTabButton.onAccessibilityStatusChanged(); mNewTabButton.onAccessibilityStatusChanged();
} }
/**
* @param isVisible Whether the identity disc is visible.
*/
void setIdentityDiscVisibility(boolean isVisible) {
mIdentityDiscButton.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
/**
* Sets the {@link OnClickListener} that will be notified when the identity disc button is
* pressed.
* @param listener The callback that will be notified when the identity disc is pressed.
*/
void setIdentityDiscClickHandler(View.OnClickListener listener) {
mIdentityDiscButton.setOnClickListener(listener);
}
/**
* Updates the image displayed on the identity disc button.
* @param image The new image for the button.
*/
void setIdentityDiscImage(Drawable image) {
mIdentityDiscButton.setImageDrawable(image);
}
/**
* Updates idnetity disc content description.
* @param contentDescriptionResId The new description for the button.
*/
void setIdentityDiscContentDescription(@StringRes int contentDescriptionResId) {
mIdentityDiscButton.setContentDescription(
getContext().getResources().getString(contentDescriptionResId));
}
/**
* Show the IPH for the identity disc button.
*/
void showIPHOnIdentityDisc(IPHContainer iphContainer) {
TextBubble textBubble = new TextBubble(getContext(), mIdentityDiscButton,
iphContainer.stringId, iphContainer.accessibilityStringId, mIdentityDiscButton);
textBubble.setDismissOnTouchInteraction(true);
if (iphContainer.dismissedCallback != null) {
textBubble.addOnDismissListener(() -> { iphContainer.dismissedCallback.run(); });
}
textBubble.show();
}
private void updatePrimaryColorAndTint(boolean isIncognito) { private void updatePrimaryColorAndTint(boolean isIncognito) {
int primaryColor = ChromeColors.getPrimaryBackgroundColor(getResources(), isIncognito); int primaryColor = ChromeColors.getPrimaryBackgroundColor(getResources(), isIncognito);
setBackgroundColor(primaryColor); setBackgroundColor(primaryColor);
......
...@@ -7,6 +7,11 @@ package org.chromium.chrome.browser.toolbar.top; ...@@ -7,6 +7,11 @@ package org.chromium.chrome.browser.toolbar.top;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.APP_MENU_BUTTON_HELPER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.APP_MENU_BUTTON_HELPER;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IMAGE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IPH;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IS_VISIBLE;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.INCOGNITO_STATE_PROVIDER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.INCOGNITO_STATE_PROVIDER;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_INCOGNITO; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_INCOGNITO;
import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE;
...@@ -24,24 +29,34 @@ import org.chromium.ui.modelutil.PropertyModel; ...@@ -24,24 +29,34 @@ import org.chromium.ui.modelutil.PropertyModel;
class StartSurfaceToolbarViewBinder { class StartSurfaceToolbarViewBinder {
public static void bind( public static void bind(
PropertyModel model, StartSurfaceToolbarView view, PropertyKey propertyKey) { PropertyModel model, StartSurfaceToolbarView view, PropertyKey propertyKey) {
if (propertyKey == APP_MENU_BUTTON_HELPER) { if (propertyKey == ACCESSIBILITY_ENABLED) {
view.onAccessibilityStatusChanged(model.get(ACCESSIBILITY_ENABLED));
} else if (propertyKey == APP_MENU_BUTTON_HELPER) {
view.setAppMenuButtonHelper(model.get(APP_MENU_BUTTON_HELPER)); view.setAppMenuButtonHelper(model.get(APP_MENU_BUTTON_HELPER));
} else if (propertyKey == BUTTONS_CLICKABLE) { } else if (propertyKey == BUTTONS_CLICKABLE) {
view.setButtonClickableState(model.get(BUTTONS_CLICKABLE)); view.setButtonClickableState(model.get(BUTTONS_CLICKABLE));
} else if (propertyKey == NEW_TAB_CLICK_HANDLER) { } else if (propertyKey == IDENTITY_DISC_CLICK_HANDLER) {
view.setOnNewTabClickHandler(model.get(NEW_TAB_CLICK_HANDLER)); view.setIdentityDiscClickHandler(model.get(IDENTITY_DISC_CLICK_HANDLER));
} else if (propertyKey == IDENTITY_DISC_DESCRIPTION) {
view.setIdentityDiscContentDescription(model.get(IDENTITY_DISC_DESCRIPTION));
} else if (propertyKey == IDENTITY_DISC_IMAGE) {
view.setIdentityDiscImage(model.get(IDENTITY_DISC_IMAGE));
} else if (propertyKey == IDENTITY_DISC_IPH) {
view.showIPHOnIdentityDisc(model.get(IDENTITY_DISC_IPH));
} else if (propertyKey == IDENTITY_DISC_IS_VISIBLE) {
view.setIdentityDiscVisibility(model.get(IDENTITY_DISC_IS_VISIBLE));
} else if (propertyKey == INCOGNITO_STATE_PROVIDER) {
view.setIncognitoStateProvider(model.get(INCOGNITO_STATE_PROVIDER));
} else if (propertyKey == IS_INCOGNITO) {
view.updateIncognito(model.get(IS_INCOGNITO));
} else if (propertyKey == IS_VISIBLE) { } else if (propertyKey == IS_VISIBLE) {
view.setVisibility(model.get(IS_VISIBLE) ? View.VISIBLE : View.GONE); view.setVisibility(model.get(IS_VISIBLE) ? View.VISIBLE : View.GONE);
} else if (propertyKey == LOGO_IS_VISIBLE) { } else if (propertyKey == LOGO_IS_VISIBLE) {
view.setLogoVisibility(model.get(LOGO_IS_VISIBLE)); view.setLogoVisibility(model.get(LOGO_IS_VISIBLE));
} else if (propertyKey == IS_INCOGNITO) {
view.updateIncognito(model.get(IS_INCOGNITO));
} else if (propertyKey == INCOGNITO_STATE_PROVIDER) {
view.setIncognitoStateProvider(model.get(INCOGNITO_STATE_PROVIDER));
} else if (propertyKey == ACCESSIBILITY_ENABLED) {
view.onAccessibilityStatusChanged(model.get(ACCESSIBILITY_ENABLED));
} else if (propertyKey == MENU_IS_VISIBLE) { } else if (propertyKey == MENU_IS_VISIBLE) {
view.setMenuButtonVisibility(model.get(MENU_IS_VISIBLE)); view.setMenuButtonVisibility(model.get(MENU_IS_VISIBLE));
} else if (propertyKey == NEW_TAB_CLICK_HANDLER) {
view.setOnNewTabClickHandler(model.get(NEW_TAB_CLICK_HANDLER));
} else if (propertyKey == NEW_TAB_BUTTON_IS_VISIBLE) { } else if (propertyKey == NEW_TAB_BUTTON_IS_VISIBLE) {
view.setNewTabButtonVisibility(model.get(NEW_TAB_BUTTON_IS_VISIBLE)); view.setNewTabButtonVisibility(model.get(NEW_TAB_BUTTON_IS_VISIBLE));
} }
......
...@@ -625,6 +625,10 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -625,6 +625,10 @@ public class TopToolbarCoordinator implements Toolbar {
*/ */
public void enableExperimentalButton(View.OnClickListener onClickListener, Drawable image, public void enableExperimentalButton(View.OnClickListener onClickListener, Drawable image,
@StringRes int contentDescriptionResId) { @StringRes int contentDescriptionResId) {
if (FeatureUtilities.isStartSurfaceSinglePaneEnabled()) {
mStartSurfaceToolbarCoordinator.enableExperimentalButton(
onClickListener, image, contentDescriptionResId);
}
mToolbarLayout.enableExperimentalButton(onClickListener, image, contentDescriptionResId); mToolbarLayout.enableExperimentalButton(onClickListener, image, contentDescriptionResId);
} }
...@@ -644,6 +648,9 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -644,6 +648,9 @@ public class TopToolbarCoordinator implements Toolbar {
* @return The experimental toolbar button if it exists. * @return The experimental toolbar button if it exists.
*/ */
public void updateExperimentalButtonImage(Drawable image) { public void updateExperimentalButtonImage(Drawable image) {
if (FeatureUtilities.isStartSurfaceSinglePaneEnabled()) {
mStartSurfaceToolbarCoordinator.updateExperimentalButtonImage(image);
}
mToolbarLayout.updateExperimentalButtonImage(image); mToolbarLayout.updateExperimentalButtonImage(image);
} }
...@@ -651,6 +658,9 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -651,6 +658,9 @@ public class TopToolbarCoordinator implements Toolbar {
* Disable the experimental toolbar button. * Disable the experimental toolbar button.
*/ */
public void disableExperimentalButton() { public void disableExperimentalButton() {
if (FeatureUtilities.isStartSurfaceSinglePaneEnabled()) {
mStartSurfaceToolbarCoordinator.disableExperimentalButton();
}
mToolbarLayout.disableExperimentalButton(); mToolbarLayout.disableExperimentalButton();
} }
...@@ -662,6 +672,12 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -662,6 +672,12 @@ public class TopToolbarCoordinator implements Toolbar {
*/ */
public void showIPHOnExperimentalButton(@StringRes int stringId, public void showIPHOnExperimentalButton(@StringRes int stringId,
@StringRes int accessibilityStringId, Runnable dismissedCallback) { @StringRes int accessibilityStringId, Runnable dismissedCallback) {
if (mStartSurfaceToolbarCoordinator != null
&& mToolbarLayout.getToolbarDataProvider().isInOverviewAndShowingOmnibox()) {
mStartSurfaceToolbarCoordinator.showIPHOnExperimentalButton(
stringId, accessibilityStringId, dismissedCallback);
return;
}
mToolbarLayout.showIPHOnExperimentalButton( mToolbarLayout.showIPHOnExperimentalButton(
stringId, accessibilityStringId, dismissedCallback); stringId, accessibilityStringId, dismissedCallback);
} }
......
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