Commit 034a1dd8 authored by Theresa's avatar Theresa Committed by Commit Bot

Introduce TabbedRootUiCoordinator for tabbed-mode specific UI

BUG=931496

Change-Id: I0165508f00aede40e4cc072b27dcacb303624924
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1620696
Commit-Queue: Theresa <twellington@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#662001}
parent 04a58677
......@@ -1488,7 +1488,10 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java",
"java/src/org/chromium/chrome/browser/tab/TrustedCdn.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator.java",
"java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java",
"java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java",
"java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java",
......@@ -1615,9 +1618,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/usage_stats/WebsiteEvent.java",
"java/src/org/chromium/chrome/browser/ui/ImmersiveModeManager.java",
"java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java",
"java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java",
"java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java",
"java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java",
"java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java",
"java/src/org/chromium/chrome/browser/util/ChromeContextUtil.java",
"java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java",
......
......@@ -445,6 +445,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java",
"javatests/src/org/chromium/chrome/browser/tab/TabUmaTest.java",
"javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java",
"javatests/src/org/chromium/chrome/browser/tabmodel/AsyncTabCreationParamsManagerTest.java",
"javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java",
"javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java",
......@@ -471,7 +472,6 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java",
"javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java",
"javatests/src/org/chromium/chrome/browser/translate/TranslateOptionsTest.java",
"javatests/src/org/chromium/chrome/browser/ui/system/NavigationBarColorControllerTest.java",
"javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java",
"javatests/src/org/chromium/chrome/browser/util/ChromeFileProviderTest.java",
"javatests/src/org/chromium/chrome/browser/util/FeatureUtilitiesTest.java",
......
......@@ -369,12 +369,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
super.performPreInflationStartup();
// TODO(https://crbug.com/931496): Remove dependency on ChromeActivity in favor of passing
// in direct dependencies on needed classes. While migrating code from Chrome*Activity
// to the RootUiCoordinator, passing the activity is an easy way to get access to a
// number of objects that will ultimately be owned by the RootUiCoordinator. This is not
// a recommended pattern.
mRootUiCoordinator = new RootUiCoordinator(this);
mRootUiCoordinator = createRootUiCoordinator();
// See comments on #getTouchlessUiCoordinator for why we're doing this here.
getTouchlessUiCoordinator();
......@@ -400,6 +395,15 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
getWindow().setBackgroundDrawable(getBackgroundDrawable());
}
protected RootUiCoordinator createRootUiCoordinator() {
// TODO(https://crbug.com/931496): Remove dependency on ChromeActivity in favor of passing
// in direct dependencies on needed classes. While migrating code from Chrome*Activity
// to the RootUiCoordinator, passing the activity is an easy way to get access to a
// number of objects that will ultimately be owned by the RootUiCoordinator. This is not
// a recommended pattern.
return new RootUiCoordinator(this);
}
private C createComponent() {
ChromeActivityCommonsModule.Factory overridenCommonsFactory =
ModuleFactoryOverrides.getOverrideFor(ChromeActivityCommonsModule.Factory.class);
......
......@@ -124,6 +124,7 @@ import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabRedirectHandler;
import org.chromium.chrome.browser.tab.TabStateBrowserControlsVisibilityDelegate;
import org.chromium.chrome.browser.tabbed_mode.TabbedAppMenuPropertiesDelegate;
import org.chromium.chrome.browser.tabbed_mode.TabbedRootUiCoordinator;
import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
......@@ -145,6 +146,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvi
import org.chromium.chrome.browser.toolbar.ToolbarButtonInProductHelpController;
import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer;
import org.chromium.chrome.browser.touchless.TouchlessDelegate;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.usage_stats.UsageStatsService;
import org.chromium.chrome.browser.util.AccessibilityUtil;
import org.chromium.chrome.browser.util.FeatureUtilities;
......@@ -1560,6 +1562,11 @@ public class ChromeTabbedActivity
IncognitoTabHostRegistry.getInstance().register(mIncognitoTabHost);
}
@Override
protected RootUiCoordinator createRootUiCoordinator() {
return new TabbedRootUiCoordinator(this);
}
@Override
protected int getControlContainerLayoutId() {
return R.layout.control_container;
......
......@@ -2,7 +2,7 @@
// 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.ui.system;
package org.chromium.chrome.browser.tabbed_mode;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
......@@ -37,7 +37,7 @@ import org.chromium.ui.UiUtils;
* Controls the bottom system navigation bar color for the provided {@link Window}.
*/
@TargetApi(Build.VERSION_CODES.O_MR1)
class NavigationBarColorController implements VrModeObserver {
class TabbedNavigationBarColorController implements VrModeObserver {
private final Window mWindow;
private final ViewGroup mRootView;
private final Resources mResources;
......@@ -54,7 +54,7 @@ class NavigationBarColorController implements VrModeObserver {
private boolean mOverviewModeHiding;
/**
* Creates a new {@link NavigationBarColorController} instance.
* Creates a new {@link TabbedNavigationBarColorController} instance.
* @param window The {@link Window} this controller should operate on.
* @param tabModelSelector The {@link TabModelSelector} used to determine which tab model is
* selected.
......@@ -62,7 +62,7 @@ class NavigationBarColorController implements VrModeObserver {
* @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
* {@link OverviewModeBehavior} associated with the containing activity.
*/
NavigationBarColorController(Window window, TabModelSelector tabModelSelector,
TabbedNavigationBarColorController(Window window, TabModelSelector tabModelSelector,
@Nullable ImmersiveModeManager immersiveModeManager,
ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1;
......@@ -119,7 +119,7 @@ class NavigationBarColorController implements VrModeObserver {
}
/**
* Destroy this {@link NavigationBarColorController} instance.
* Destroy this {@link TabbedNavigationBarColorController} instance.
*/
public void destroy() {
if (mTabModelSelector != null) mTabModelSelector.removeObserver(mTabModelSelectorObserver);
......
// Copyright 2019 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.tabbed_mode;
import android.support.annotation.Nullable;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.appmenu.AppMenuHandler;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
import org.chromium.chrome.browser.ui.ImmersiveModeManager;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewWrapper;
import org.chromium.ui.base.DeviceFormFactor;
/**
* A {@link RootUiCoordinator} variant that controls tabbed-mode specific UI.
*/
public class TabbedRootUiCoordinator extends RootUiCoordinator implements NativeInitObserver {
private @Nullable ImmersiveModeManager mImmersiveModeManager;
private TabbedSystemUiCoordinator mSystemUiCoordinator;
private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
public TabbedRootUiCoordinator(ChromeActivity activity) {
super(activity);
}
@Override
public void destroy() {
if (mImmersiveModeManager != null) mImmersiveModeManager.destroy();
if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy();
if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy();
super.destroy();
}
@Override
public void onPostInflationStartup() {
super.onPostInflationStartup();
mImmersiveModeManager = AppHooks.get().createImmersiveModeManager(
mActivity.getWindow().getDecorView().findViewById(android.R.id.content));
mSystemUiCoordinator = new TabbedSystemUiCoordinator(mActivity.getWindow(),
mActivity.getTabModelSelector(), mImmersiveModeManager,
mActivity.getOverviewModeBehaviorSupplier());
if (mImmersiveModeManager != null) {
mActivity.getToolbarManager().setImmersiveModeManager(mImmersiveModeManager);
}
}
@Override
public void onFinishNativeInitialization() {
// TODO(twellington): Supply TabModelSelector as well and move initialization earlier.
if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) {
AppMenuHandler appMenuHandler =
mAppMenuCoordinator == null ? null : mAppMenuCoordinator.getAppMenuHandler();
mEmptyBackgroundViewWrapper = new EmptyBackgroundViewWrapper(
mActivity.getTabModelSelector(), mActivity.getTabCreator(false), mActivity,
appMenuHandler, mActivity.getSnackbarManager(),
mActivity.getOverviewModeBehaviorSupplier());
mEmptyBackgroundViewWrapper.initialize();
}
}
}
......@@ -2,47 +2,42 @@
// 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.ui.system;
package org.chromium.chrome.browser.tabbed_mode;
import android.os.Build;
import android.support.annotation.Nullable;
import android.view.Window;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.ui.ImmersiveModeManager;
import org.chromium.chrome.browser.util.ObservableSupplier;
/**
* A UI coordinator that manages the system status bar and bottom navigation bar.
* A UI coordinator that manages the system status bar and bottom navigation bar for
* ChromeTabbedActivity.
*
* TODO(https://crbug.com/943371): Move status bar code from Chrome*Activity into a new
* StatusBarCoordinator.
* TODO(https://crbug.com/943371): Create a base SystemUiCoordinator to own the
* StatusBarColorController, and have this class extend that one.
*/
public class SystemUiCoordinator {
private @Nullable NavigationBarColorController mNavigationBarColorController;
public class TabbedSystemUiCoordinator {
private @Nullable TabbedNavigationBarColorController mNavigationBarColorController;
/**
* Construct a new {@link SystemUiCoordinator}.
* Construct a new {@link TabbedSystemUiCoordinator}.
*
* @param window The {@link Window} associated with the containing activity.
* @param tabModelSelector The {@link TabModelSelector} for the containing activity.
* @param immersiveModeManager The {@link ImmersiveModeManager} for the containing activity.
* @param activityType The {@link org.chromium.chrome.browser.ChromeActivity.ActivityType} of
* the containing activity.
* @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
* {@link OverviewModeBehavior} associated with the containing activity.
*/
public SystemUiCoordinator(Window window, TabModelSelector tabModelSelector,
public TabbedSystemUiCoordinator(Window window, TabModelSelector tabModelSelector,
@Nullable ImmersiveModeManager immersiveModeManager,
@ChromeActivity.ActivityType int activityType,
@Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
// TODO(https://crbug.com/931496): Move to a TabbedSystemUiCoordinator or delegate?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
&& activityType == ChromeActivity.ActivityType.TABBED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
assert overviewModeBehaviorSupplier != null;
mNavigationBarColorController = new NavigationBarColorController(
mNavigationBarColorController = new TabbedNavigationBarColorController(
window, tabModelSelector, immersiveModeManager, overviewModeBehaviorSupplier);
}
}
......
......@@ -8,16 +8,10 @@ import android.support.annotation.Nullable;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.appmenu.AppMenuCoordinator;
import org.chromium.chrome.browser.appmenu.AppMenuHandler;
import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.lifecycle.InflationObserver;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
import org.chromium.chrome.browser.ui.system.SystemUiCoordinator;
import org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewWrapper;
import org.chromium.ui.base.DeviceFormFactor;
/**
* The root UI coordinator. This class will eventually be responsible for inflating and managing
......@@ -26,13 +20,10 @@ import org.chromium.ui.base.DeviceFormFactor;
* The specific things this component will manage and how it will hook into Chrome*Activity are
* still being discussed See https://crbug.com/931496.
*/
public class RootUiCoordinator implements Destroyable, NativeInitObserver, InflationObserver,
ChromeActivity.MenuOrKeyboardActionHandler {
private ChromeActivity mActivity;
private @Nullable AppMenuCoordinator mAppMenuCoordinator;
private @Nullable ImmersiveModeManager mImmersiveModeManager;
private SystemUiCoordinator mSystemUiCoordinator;
private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
public class RootUiCoordinator
implements Destroyable, InflationObserver, ChromeActivity.MenuOrKeyboardActionHandler {
protected ChromeActivity mActivity;
protected @Nullable AppMenuCoordinator mAppMenuCoordinator;
/**
* Create a new {@link RootUiCoordinator} for the given activity.
......@@ -49,10 +40,7 @@ public class RootUiCoordinator implements Destroyable, NativeInitObserver, Infla
public void destroy() {
mActivity.unregisterMenuOrKeyboardActionHandler(this);
mActivity = null;
if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy();
if (mImmersiveModeManager != null) mImmersiveModeManager.destroy();
if (mAppMenuCoordinator != null) mAppMenuCoordinator.destroy();
if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy();
}
@Override
......@@ -73,32 +61,6 @@ public class RootUiCoordinator implements Destroyable, NativeInitObserver, Infla
} else if (mActivity.getToolbarManager() != null) {
mActivity.getToolbarManager().getToolbar().disableMenuButton();
}
mImmersiveModeManager = AppHooks.get().createImmersiveModeManager(
mActivity.getWindow().getDecorView().findViewById(android.R.id.content));
mSystemUiCoordinator = new SystemUiCoordinator(mActivity.getWindow(),
mActivity.getTabModelSelector(), mImmersiveModeManager, mActivity.getActivityType(),
mActivity.getOverviewModeBehaviorSupplier());
if (mImmersiveModeManager != null && mActivity.getToolbarManager() != null) {
mActivity.getToolbarManager().setImmersiveModeManager(mImmersiveModeManager);
}
}
@Override
public void onFinishNativeInitialization() {
// TODO(https://crbug.com/931496): Move to a TabbedRootUiCoordinator or delegate?
// TODO(twellington): Supply TabModelSelector as well and move initialization earlier.
if (mActivity.getActivityType() == ChromeActivity.ActivityType.TABBED
&& DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) {
AppMenuHandler appMenuHandler =
mAppMenuCoordinator == null ? null : mAppMenuCoordinator.getAppMenuHandler();
mEmptyBackgroundViewWrapper = new EmptyBackgroundViewWrapper(
mActivity.getTabModelSelector(), mActivity.getTabCreator(false), mActivity,
appMenuHandler, mActivity.getSnackbarManager(),
mActivity.getOverviewModeBehaviorSupplier());
mEmptyBackgroundViewWrapper.initialize();
}
}
@Override
......
......@@ -2,7 +2,7 @@
// 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.ui.system;
package org.chromium.chrome.browser.tabbed_mode;
import static org.junit.Assert.assertEquals;
......@@ -29,13 +29,13 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
/** Tests for the NavigationBarColorController. */
/** Tests for the TabbedNavigationBarColorController. */
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@MinAndroidSdkLevel(Build.VERSION_CODES.O_MR1)
@TargetApi(Build.VERSION_CODES.O_MR1)
@SuppressLint("NewApi")
public class NavigationBarColorControllerTest {
public class TabbedNavigationBarColorControllerTest {
@Rule
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
......
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