Combining the two bottom toolbar ThemeColorProviders

The bottom toolbar has two theme color providers (one for tab switcher
and one for browsing mode). This CL merges them into one provider.

Change-Id: I3632a14bedcf24ce692e35a8b47fb42dbe08f603
Reviewed-on: https://chromium-review.googlesource.com/c/1404427
Reviewed-by: Matthew Jones <mdjones@chromium.org>
Commit-Queue: Pedro Amaral <amaralp@chromium.org>
Cr-Commit-Position: refs/heads/master@{#622244}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoStateProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoStateProvider.java
index 0d25229..3bdefb8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoStateProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoStateProvider.java
@@ -5,19 +5,15 @@
 package org.chromium.chrome.browser.toolbar;
 
 import android.content.Context;
-import android.content.res.ColorStateList;
-import android.support.v7.content.res.AppCompatResources;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ObserverList;
-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 provider that notifies its observers when incognito mode is entered or exited. */
-public class IncognitoStateProvider implements ThemeColorProvider {
+public class IncognitoStateProvider {
     /** An interface to be notified about changes to the incognito state. */
     public interface IncognitoStateObserver {
         /** Called when incognito state changes. */
@@ -25,23 +21,8 @@
     }
 
     /** List of {@link IncognitoStateObserver}s. These are used to broadcast events to listeners. */
-    private final ObserverList<ThemeColorObserver> mThemeColorObservers;
-
-    /** List of {@link IncognitoStateObserver}s. These are used to broadcast events to listeners. */
     private final ObserverList<IncognitoStateObserver> mIncognitoStateObservers;
 
-    /** Tint to be used in incognito mode. */
-    private final ColorStateList mIncognitoTint;
-
-    /** Tint to be used in normal mode. */
-    private final ColorStateList mNormalTint;
-
-    /** Primary color for normal mode. */
-    private final int mNormalPrimaryColor;
-
-    /** Primary color for incognito mode. */
-    private final int mIncognitoPrimaryColor;
-
     /** A {@link TabModelSelectorObserver} used to know when incognito mode is entered or exited. */
     private final TabModelSelectorObserver mTabModelSelectorObserver;
 
@@ -49,16 +30,8 @@
     private TabModelSelector mTabModelSelector;
 
     public IncognitoStateProvider(Context context) {
-        mThemeColorObservers = new ObserverList<ThemeColorObserver>();
         mIncognitoStateObservers = new ObserverList<IncognitoStateObserver>();
 
-        mIncognitoTint = AppCompatResources.getColorStateList(context, R.color.light_mode_tint);
-        mNormalTint = AppCompatResources.getColorStateList(context, R.color.dark_mode_tint);
-        mNormalPrimaryColor = ApiCompatibilityUtils.getColor(
-                context.getResources(), R.color.modern_primary_color);
-        mIncognitoPrimaryColor = ApiCompatibilityUtils.getColor(
-                context.getResources(), R.color.incognito_modern_primary_color);
-
         mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
             @Override
             public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
@@ -90,16 +63,6 @@
         mIncognitoStateObservers.removeObserver(observer);
     }
 
-    @Override
-    public void addObserver(ThemeColorObserver observer) {
-        mThemeColorObservers.addObserver(observer);
-    }
-
-    @Override
-    public void removeObserver(ThemeColorObserver observer) {
-        mThemeColorObservers.removeObserver(observer);
-    }
-
     void setTabModelSelector(TabModelSelector tabModelSelector) {
         mTabModelSelector = tabModelSelector;
         mTabModelSelector.addObserver(mTabModelSelectorObserver);
@@ -111,7 +74,6 @@
             mTabModelSelector.removeObserver(mTabModelSelectorObserver);
             mTabModelSelector = null;
         }
-        mThemeColorObservers.clear();
         mIncognitoStateObservers.clear();
     }
 
@@ -119,10 +81,5 @@
         for (IncognitoStateObserver observer : mIncognitoStateObservers) {
             observer.onIncognitoStateChanged(isIncognito);
         }
-        final ColorStateList tint = isIncognito ? mIncognitoTint : mNormalTint;
-        final int primaryColor = isIncognito ? mIncognitoPrimaryColor : mNormalPrimaryColor;
-        for (ThemeColorObserver observer : mThemeColorObservers) {
-            observer.onThemeColorChanged(tint, primaryColor);
-        }
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index 54015b3..e7468ea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -1189,9 +1189,6 @@
      */
     public void onAccessibilityStatusChanged(boolean enabled) {
         mToolbar.onAccessibilityStatusChanged(enabled);
-        if (mBottomToolbarCoordinator != null) {
-            mBottomToolbarCoordinator.onAccessibilityStatusChanged(enabled);
-        }
     }
 
     private void registerTemplateUrlObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarCoordinator.java
index 815ae7a..f5f31ae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarCoordinator.java
@@ -36,6 +36,9 @@
     /** The tab switcher mode bottom toolbar stub that will be inflated when native is ready. */
     private final ViewStub mTabSwitcherModeStub;
 
+    /** A provider that notifies components when the theme color changes.*/
+    private final BottomToolbarThemeColorProvider mBottomToolbarThemeColorProvider;
+
     /**
      * Build the coordinator that manages the bottom toolbar.
      * @param fullscreenManager A {@link ChromeFullscreenManager} to update the bottom controls
@@ -55,6 +58,8 @@
                 tabProvider, homeButtonListener, searchAcceleratorListener, shareButtonListener);
 
         mTabSwitcherModeStub = root.findViewById(R.id.bottom_toolbar_tab_switcher_mode_stub);
+
+        mBottomToolbarThemeColorProvider = new BottomToolbarThemeColorProvider();
     }
 
     /**
@@ -84,12 +89,16 @@
             TabModelSelector tabModelSelector, OverviewModeBehavior overviewModeBehavior,
             WindowAndroid windowAndroid, TabCountProvider tabCountProvider,
             IncognitoStateProvider incognitoStateProvider) {
+        mBottomToolbarThemeColorProvider.setIncognitoStateProvider(incognitoStateProvider);
+        mBottomToolbarThemeColorProvider.setOverviewModeBehavior(overviewModeBehavior);
+
         mBrowsingModeCoordinator.initializeWithNative(resourceManager, layoutManager,
                 tabSwitcherListener, menuButtonHelper, overviewModeBehavior, windowAndroid,
-                tabCountProvider, incognitoStateProvider, tabModelSelector);
+                tabCountProvider, mBottomToolbarThemeColorProvider, tabModelSelector);
         mTabSwitcherModeCoordinator = new TabSwitcherBottomToolbarCoordinator(mTabSwitcherModeStub,
-                incognitoStateProvider, newTabClickListener, closeTabsClickListener,
-                menuButtonHelper, tabModelSelector, overviewModeBehavior, tabCountProvider);
+                incognitoStateProvider, mBottomToolbarThemeColorProvider, newTabClickListener,
+                closeTabsClickListener, menuButtonHelper, tabModelSelector, overviewModeBehavior,
+                tabCountProvider);
     }
 
     /**
@@ -136,16 +145,6 @@
     }
 
     /**
-     * Called when the accessibility enabled state changes.
-     * @param enabled Whether accessibility is enabled.
-     */
-    public void onAccessibilityStatusChanged(boolean enabled) {
-        if (mTabSwitcherModeCoordinator != null) {
-            mTabSwitcherModeCoordinator.onAccessibilityStatusChanged(enabled);
-        }
-    }
-
-    /**
      * Clean up any state when the bottom toolbar is destroyed.
      */
     public void destroy() {
@@ -154,5 +153,6 @@
             mTabSwitcherModeCoordinator.destroy();
             mTabSwitcherModeCoordinator = null;
         }
+        mBottomToolbarThemeColorProvider.destroy();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherThemeColorProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarThemeColorProvider.java
similarity index 66%
rename from chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherThemeColorProvider.java
rename to chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarThemeColorProvider.java
index 904f2e2..f0b39ca 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherThemeColorProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarThemeColorProvider.java
@@ -9,17 +9,21 @@
 import android.support.v7.content.res.AppCompatResources;
 
 import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.ObserverList;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
 import org.chromium.chrome.browser.device.DeviceClassManager;
 import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
 import org.chromium.chrome.browser.toolbar.IncognitoStateProvider.IncognitoStateObserver;
 import org.chromium.chrome.browser.toolbar.ThemeColorProvider;
 import org.chromium.chrome.browser.toolbar.ThemeColorProvider.ThemeColorObserver;
 
-/** A ThemeColorProvider for the tab switcher UI elements. */
-public class TabSwitcherThemeColorProvider implements ThemeColorProvider, IncognitoStateObserver {
+/** A ThemeColorProvider for the bottom toolbar. */
+public class BottomToolbarThemeColorProvider implements ThemeColorProvider, IncognitoStateObserver {
     /** List of {@link ThemeColorObserver}s. These are used to broadcast events to listeners. */
     private final ObserverList<ThemeColorObserver> mThemeColorObservers;
 
@@ -38,21 +42,45 @@
     /** Used to know when incognito mode is entered or exited. */
     private IncognitoStateProvider mIncognitoStateProvider;
 
+    /** The overview mode manager. */
+    private OverviewModeBehavior mOverviewModeBehavior;
+
+    /** Observer to know when overview mode is entered/exited. */
+    private OverviewModeObserver mOverviewModeObserver;
+
     /** Whether theme is dark mode. */
     private boolean mIsUsingDarkBackground;
 
     /** Whether app is in incognito mode. */
     private boolean mIsIncognito;
 
-    public TabSwitcherThemeColorProvider(Context context) {
+    /** Whether app is in overview mode. */
+    private boolean mIsOverviewVisible;
+
+    public BottomToolbarThemeColorProvider() {
         mThemeColorObservers = new ObserverList<ThemeColorObserver>();
 
+        final Context context = ContextUtils.getApplicationContext();
         mDarkModeTint = AppCompatResources.getColorStateList(context, R.color.light_mode_tint);
         mLightModeTint = AppCompatResources.getColorStateList(context, R.color.dark_mode_tint);
         mLightPrimaryColor = ApiCompatibilityUtils.getColor(
                 context.getResources(), R.color.modern_primary_color);
         mDarkPrimaryColor = ApiCompatibilityUtils.getColor(
                 context.getResources(), R.color.incognito_modern_primary_color);
+
+        mOverviewModeObserver = new EmptyOverviewModeObserver() {
+            @Override
+            public void onOverviewModeStartedShowing(boolean showToolbar) {
+                mIsOverviewVisible = true;
+                updateTheme();
+            }
+
+            @Override
+            public void onOverviewModeStartedHiding(boolean showToolbar, boolean delayAnimation) {
+                mIsOverviewVisible = false;
+                updateTheme();
+            }
+        };
     }
 
     @Override
@@ -76,20 +104,18 @@
         updateTheme();
     }
 
-    /**
-     * Called when the accessibility enabled state changes.
-     * @param enabled Whether accessibility is enabled.
-     */
-    public void onAccessibilityStatusChanged(boolean enabled) {
-        updateTheme();
+    void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {
+        mOverviewModeBehavior = overviewModeBehavior;
+        mOverviewModeBehavior.addOverviewModeObserver(mOverviewModeObserver);
     }
 
     private void updateTheme() {
         final boolean isAccessibilityEnabled = DeviceClassManager.enableAccessibilityLayout();
         final boolean isHorizontalTabSwitcherEnabled =
                 ChromeFeatureList.isEnabled(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID);
-        final boolean shouldUseDarkBackground =
-                mIsIncognito && (isAccessibilityEnabled || isHorizontalTabSwitcherEnabled);
+        final boolean shouldUseDarkBackground = mIsIncognito
+                && (isAccessibilityEnabled || isHorizontalTabSwitcherEnabled
+                        || !mIsOverviewVisible);
 
         if (shouldUseDarkBackground == mIsUsingDarkBackground) return;
         mIsUsingDarkBackground = shouldUseDarkBackground;
@@ -105,6 +131,10 @@
             mIncognitoStateProvider.removeObserver(this);
             mIncognitoStateProvider = null;
         }
+        if (mOverviewModeBehavior != null) {
+            mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver);
+            mOverviewModeBehavior = null;
+        }
         mThemeColorObservers.clear();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarCoordinator.java
index 5354c7a..96248aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarCoordinator.java
@@ -8,7 +8,6 @@
 import android.view.View.OnClickListener;
 import android.view.ViewStub;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
@@ -17,6 +16,7 @@
 import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
 import org.chromium.chrome.browser.toolbar.MenuButton;
 import org.chromium.chrome.browser.toolbar.TabCountProvider;
+import org.chromium.chrome.browser.toolbar.ThemeColorProvider;
 
 /**
  * The coordinator for the tab switcher mode bottom toolbar. This class handles all interactions
@@ -26,9 +26,6 @@
     /** The mediator that handles events from outside the tab switcher bottom toolbar. */
     private final TabSwitcherBottomToolbarMediator mMediator;
 
-    /** The color provider for tab switching mode. */
-    private final TabSwitcherThemeColorProvider mTabSwitcherThemeColorProvider;
-
     /** The close all tabs button that lives in the tab switcher bottom bar. */
     private final CloseAllTabsButton mCloseAllTabsButton;
 
@@ -42,6 +39,7 @@
      * Build the coordinator that manages the tab switcher bottom toolbar.
      * @param stub The tab switcher bottom toolbar {@link ViewStub} to inflate.
      * @param incognitoStateProvider Notifies components when incognito mode is entered or exited.
+     * @param themeColorProvider Notifies components when the theme color changes.
      * @param newTabClickListener An {@link OnClickListener} that is triggered when the
      *                            new tab button is clicked.
      * @param closeTabsClickListener An {@link OnClickListener} that is triggered when the
@@ -55,37 +53,32 @@
      *                         incognito toggle tab layout.
      */
     public TabSwitcherBottomToolbarCoordinator(ViewStub stub,
-            IncognitoStateProvider incognitoStateProvider, OnClickListener newTabClickListener,
-            OnClickListener closeTabsClickListener, AppMenuButtonHelper menuButtonHelper,
-            TabModelSelector tabModelSelector, OverviewModeBehavior overviewModeBehavior,
-            TabCountProvider tabCountProvider) {
+            IncognitoStateProvider incognitoStateProvider, ThemeColorProvider themeColorProvider,
+            OnClickListener newTabClickListener, OnClickListener closeTabsClickListener,
+            AppMenuButtonHelper menuButtonHelper, TabModelSelector tabModelSelector,
+            OverviewModeBehavior overviewModeBehavior, TabCountProvider tabCountProvider) {
         final View root = stub.inflate();
 
         TabSwitcherBottomToolbarModel model = new TabSwitcherBottomToolbarModel();
 
         PropertyModelChangeProcessor.create(model, root, new TabSwitcherBottomToolbarViewBinder());
 
-        mTabSwitcherThemeColorProvider =
-                new TabSwitcherThemeColorProvider(ContextUtils.getApplicationContext());
-
-        mTabSwitcherThemeColorProvider.setIncognitoStateProvider(incognitoStateProvider);
-
         mMediator = new TabSwitcherBottomToolbarMediator(
-                model, mTabSwitcherThemeColorProvider, overviewModeBehavior);
+                model, themeColorProvider, overviewModeBehavior);
 
         mCloseAllTabsButton = root.findViewById(R.id.close_all_tabs_button);
         mCloseAllTabsButton.setOnClickListener(closeTabsClickListener);
         mCloseAllTabsButton.setIncognitoStateProvider(incognitoStateProvider);
-        mCloseAllTabsButton.setThemeColorProvider(mTabSwitcherThemeColorProvider);
+        mCloseAllTabsButton.setThemeColorProvider(themeColorProvider);
         mCloseAllTabsButton.setTabCountProvider(tabCountProvider);
 
         mNewTabButton = root.findViewById(R.id.tab_switcher_new_tab_button);
         mNewTabButton.setOnClickListener(newTabClickListener);
         mNewTabButton.setIncognitoStateProvider(incognitoStateProvider);
-        mNewTabButton.setThemeColorProvider(mTabSwitcherThemeColorProvider);
+        mNewTabButton.setThemeColorProvider(themeColorProvider);
 
         mMenuButton = root.findViewById(R.id.menu_button_wrapper);
-        mMenuButton.setThemeColorProvider(mTabSwitcherThemeColorProvider);
+        mMenuButton.setThemeColorProvider(themeColorProvider);
         mMenuButton.setTouchListener(menuButtonHelper);
         mMenuButton.setAccessibilityDelegate(menuButtonHelper);
     }
@@ -98,19 +91,10 @@
     }
 
     /**
-     * Called when the accessibility enabled state changes.
-     * @param enabled Whether accessibility is enabled.
-     */
-    public void onAccessibilityStatusChanged(boolean enabled) {
-        mTabSwitcherThemeColorProvider.onAccessibilityStatusChanged(enabled);
-    }
-
-    /**
      * Clean up any state when the bottom toolbar is destroyed.
      */
     public void destroy() {
         mMediator.destroy();
-        mTabSwitcherThemeColorProvider.destroy();
         mCloseAllTabsButton.destroy();
         mNewTabButton.destroy();
         mMenuButton.destroy();
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 81ce9abb..08059b4 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1623,7 +1623,7 @@
   "java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarMediator.java",
   "java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarModel.java",
   "java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherBottomToolbarViewBinder.java",
-  "java/src/org/chromium/chrome/browser/toolbar/bottom/TabSwitcherThemeColorProvider.java",
+  "java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarThemeColorProvider.java",
   "java/src/org/chromium/chrome/browser/toolbar/top/ActionModeController.java",
   "java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java",
   "java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbarAnimationDelegate.java",