Commit 55ebd355 authored by Brandon Wylie's avatar Brandon Wylie Committed by Commit Bot

Remove ChromeActivity ref from CustomTabCompositorContentInitializer

CustomTabCompositorContentInitializer relies on ChromeActivity to
initialize compositor content. This method is part of ChromeActivity's
interface, so removing the dependency is difficult.

Moving the #initializeCompositorContent behind an interface and
injecting that into CustomTabCompositorContentInitializer to decouple
the two.

This change is meant to be an example on how to handle this case.

Bug: 1123209
Change-Id: I8ba93cd80074c8935bd07428327f74ca2973eb19
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2429870Reviewed-by: default avatarPeter Conn <peconn@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Commit-Queue: Brandon Wylie <wylieb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#812820}
parent 9e81d0e9
...@@ -128,9 +128,6 @@ specific_include_rules = { ...@@ -128,9 +128,6 @@ specific_include_rules = {
"CustomTabBottomBarDelegate\.java": [ "CustomTabBottomBarDelegate\.java": [
"+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java", "+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java",
], ],
"CustomTabCompositorContentInitializer\.java": [
"+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java",
],
"CustomTabDelegateFactory\.java": [ "CustomTabDelegateFactory\.java": [
"+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java", "+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java",
], ],
......
...@@ -220,7 +220,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -220,7 +220,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
implements TabCreatorManager, PolicyChangeListener, ContextualSearchTabPromotionDelegate, implements TabCreatorManager, PolicyChangeListener, ContextualSearchTabPromotionDelegate,
SnackbarManageable, SceneChangeObserver, SnackbarManageable, SceneChangeObserver,
StatusBarColorController.StatusBarColorProvider, AppMenuDelegate, AppMenuBlocker, StatusBarColorController.StatusBarColorProvider, AppMenuDelegate, AppMenuBlocker,
MenuOrKeyboardActionController { MenuOrKeyboardActionController, CompositorViewHolder.Initializer {
/** /**
* No control container to inflate during initialization. * No control container to inflate during initialization.
*/ */
...@@ -411,7 +411,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -411,7 +411,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
getWindowAndroid(), this::getCompositorViewHolder, this, getWindowAndroid(), this::getCompositorViewHolder, this,
this::getCurrentTabCreator, this::isCustomTab, this::getCurrentTabCreator, this::isCustomTab,
getStatusBarColorController(), ScreenOrientationProvider.getInstance(), getStatusBarColorController(), ScreenOrientationProvider.getInstance(),
this::getNotificationManagerProxy) this::getNotificationManagerProxy, getTabContentManagerSupplier(),
/* CompositorViewHolder.Initializer */ this)
: overridenCommonsFactory.create(this, mRootUiCoordinator::getBottomSheetController, : overridenCommonsFactory.create(this, mRootUiCoordinator::getBottomSheetController,
mTabModelSelectorSupplier, getBrowserControlsManager(), mTabModelSelectorSupplier, getBrowserControlsManager(),
getBrowserControlsManager(), getBrowserControlsManager(), getBrowserControlsManager(), getBrowserControlsManager(),
...@@ -420,7 +421,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -420,7 +421,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
getTabContentManager(), getWindowAndroid(), this::getCompositorViewHolder, getTabContentManager(), getWindowAndroid(), this::getCompositorViewHolder,
this, this::getCurrentTabCreator, this::isCustomTab, this, this::getCurrentTabCreator, this::isCustomTab,
getStatusBarColorController(), ScreenOrientationProvider.getInstance(), getStatusBarColorController(), ScreenOrientationProvider.getInstance(),
this::getNotificationManagerProxy); this::getNotificationManagerProxy, getTabContentManagerSupplier(),
/* CompositorViewHolder.Initializer */ this);
return createComponent(commonsModule); return createComponent(commonsModule);
} }
...@@ -1718,18 +1720,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1718,18 +1720,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
return false; return false;
} }
/** @Override
* Initializes the {@link CompositorViewHolder} with the relevant content it needs to properly
* show content on the screen.
* @param layoutManager A {@link LayoutManager} instance. This class is
* responsible for driving all high level screen content and
* determines which {@link Layout} is shown when.
* @param urlBar The {@link View} representing the URL bar (must be
* focusable) or {@code null} if none exists.
* @param contentContainer A {@link ViewGroup} that can have content attached by
* {@link Layout}s.
* @param controlContainer A {@link ControlContainer} instance to draw.
*/
public void initializeCompositorContent(LayoutManager layoutManager, View urlBar, public void initializeCompositorContent(LayoutManager layoutManager, View urlBar,
ViewGroup contentContainer, ControlContainer controlContainer) { ViewGroup contentContainer, ControlContainer controlContainer) {
if (mContextualSearchManager != null) { if (mContextualSearchManager != null) {
......
...@@ -102,6 +102,27 @@ public class CompositorViewHolder extends FrameLayout ...@@ -102,6 +102,27 @@ public class CompositorViewHolder extends FrameLayout
ViewGroup.OnHierarchyChangeListener { ViewGroup.OnHierarchyChangeListener {
private static final long SYSTEM_UI_VIEWPORT_UPDATE_DELAY_MS = 500; private static final long SYSTEM_UI_VIEWPORT_UPDATE_DELAY_MS = 500;
/**
* Initializer interface used to decouple initialization from the class that owns
* the CompositorViewHolder.
*/
public interface Initializer {
/**
* Initializes the {@link CompositorViewHolder} with the relevant content it needs to
* properly show content on the screen.
* @param layoutManager A {@link LayoutManager} instance. This class is
* responsible for driving all high level screen content
* and determines which {@link Layout} is shown when.
* @param urlBar The {@link View} representing the URL bar (must be
* focusable) or {@code null} if none exists.
* @param contentContainer A {@link ViewGroup} that can have content attached by
* {@link Layout}s.
* @param controlContainer A {@link ControlContainer} instance to draw.
*/
void initializeCompositorContent(LayoutManager layoutManager, View urlBar,
ViewGroup contentContainer, ControlContainer controlContainer);
}
/** /**
* Observer interface for any object that needs to process touch events. * Observer interface for any object that needs to process touch events.
*/ */
......
...@@ -4,12 +4,14 @@ ...@@ -4,12 +4,14 @@
package org.chromium.chrome.browser.customtabs; package org.chromium.chrome.browser.customtabs;
import android.app.Activity;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.dependency_injection.ActivityScope; import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver; import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
...@@ -26,20 +28,26 @@ import dagger.Lazy; ...@@ -26,20 +28,26 @@ import dagger.Lazy;
*/ */
@ActivityScope @ActivityScope
public class CustomTabCompositorContentInitializer implements NativeInitObserver { public class CustomTabCompositorContentInitializer implements NativeInitObserver {
private final ActivityLifecycleDispatcher mLifecycleDispatcher; private final List<Callback<LayoutManager>> mListeners = new ArrayList<>();
private final ChromeActivity<?> mActivity; private final ActivityLifecycleDispatcher mLifecycleDispatcher;
private final Activity mActivity;
private final Lazy<CompositorViewHolder> mCompositorViewHolder; private final Lazy<CompositorViewHolder> mCompositorViewHolder;
private final ObservableSupplier<TabContentManager> mTabContentManagerSupplier;
private final CompositorViewHolder.Initializer mCompositorViewHolderInitializer;
private final List<Callback<LayoutManager>> mListeners = new ArrayList<>();
private boolean mInitialized; private boolean mInitialized;
@Inject @Inject
public CustomTabCompositorContentInitializer(ActivityLifecycleDispatcher lifecycleDispatcher, public CustomTabCompositorContentInitializer(ActivityLifecycleDispatcher lifecycleDispatcher,
ChromeActivity<?> activity, Lazy<CompositorViewHolder> compositorViewHolder) { Activity activity, Lazy<CompositorViewHolder> compositorViewHolder,
ObservableSupplier<TabContentManager> tabContentManagerSupplier,
CompositorViewHolder.Initializer compositorViewHolderInitializer) {
mLifecycleDispatcher = lifecycleDispatcher; mLifecycleDispatcher = lifecycleDispatcher;
mActivity = activity; mActivity = activity;
mCompositorViewHolder = compositorViewHolder; mCompositorViewHolder = compositorViewHolder;
mTabContentManagerSupplier = tabContentManagerSupplier;
mCompositorViewHolderInitializer = compositorViewHolderInitializer;
lifecycleDispatcher.register(this); lifecycleDispatcher.register(this);
} }
...@@ -49,7 +57,6 @@ public class CustomTabCompositorContentInitializer implements NativeInitObserver ...@@ -49,7 +57,6 @@ public class CustomTabCompositorContentInitializer implements NativeInitObserver
* initialized, or immediately (synchronously) if it is already initialized. * initialized, or immediately (synchronously) if it is already initialized.
*/ */
public void addCallback(Callback<LayoutManager> callback) { public void addCallback(Callback<LayoutManager> callback) {
if (mInitialized) { if (mInitialized) {
callback.onResult(mCompositorViewHolder.get().getLayoutManager()); callback.onResult(mCompositorViewHolder.get().getLayoutManager());
} else { } else {
...@@ -60,10 +67,10 @@ public class CustomTabCompositorContentInitializer implements NativeInitObserver ...@@ -60,10 +67,10 @@ public class CustomTabCompositorContentInitializer implements NativeInitObserver
@Override @Override
public void onFinishNativeInitialization() { public void onFinishNativeInitialization() {
ViewGroup contentContainer = mActivity.findViewById(android.R.id.content); ViewGroup contentContainer = mActivity.findViewById(android.R.id.content);
LayoutManager layoutDriver = new LayoutManager(mCompositorViewHolder.get(), LayoutManager layoutDriver = new LayoutManager(
contentContainer, mActivity.getTabContentManagerSupplier()); mCompositorViewHolder.get(), contentContainer, mTabContentManagerSupplier);
mActivity.initializeCompositorContent(layoutDriver, mCompositorViewHolderInitializer.initializeCompositorContent(layoutDriver,
mActivity.findViewById(org.chromium.chrome.R.id.url_bar), contentContainer, mActivity.findViewById(org.chromium.chrome.R.id.url_bar), contentContainer,
mActivity.findViewById(org.chromium.chrome.R.id.control_container)); mActivity.findViewById(org.chromium.chrome.R.id.control_container));
......
...@@ -13,6 +13,7 @@ import android.content.Context; ...@@ -13,6 +13,7 @@ import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.view.View; import android.view.View;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.ChromeActivity;
...@@ -65,6 +66,8 @@ public class ChromeActivityCommonsModule { ...@@ -65,6 +66,8 @@ public class ChromeActivityCommonsModule {
private final StatusBarColorController mStatusBarColorController; private final StatusBarColorController mStatusBarColorController;
private final ScreenOrientationProvider mScreenOrientationProvider; private final ScreenOrientationProvider mScreenOrientationProvider;
private final Supplier<NotificationManagerProxy> mNotificationManagerProxySupplier; private final Supplier<NotificationManagerProxy> mNotificationManagerProxySupplier;
private final ObservableSupplier<TabContentManager> mTabContentManagerSupplier;
private final CompositorViewHolder.Initializer mCompositorViewHolderInitializer;
/** See {@link ModuleFactoryOverrides} */ /** See {@link ModuleFactoryOverrides} */
public interface Factory { public interface Factory {
...@@ -84,7 +87,9 @@ public class ChromeActivityCommonsModule { ...@@ -84,7 +87,9 @@ public class ChromeActivityCommonsModule {
Supplier<Boolean> isPromotableToTabSupplier, Supplier<Boolean> isPromotableToTabSupplier,
StatusBarColorController statusBarColorController, StatusBarColorController statusBarColorController,
ScreenOrientationProvider screenOrientationProvider, ScreenOrientationProvider screenOrientationProvider,
Supplier<NotificationManagerProxy> notificationManagerProxySupplier); Supplier<NotificationManagerProxy> notificationManagerProxySupplier,
ObservableSupplier<TabContentManager> tabContentManagerSupplier,
CompositorViewHolder.Initializer compositorViewHolderInitializer);
} }
public ChromeActivityCommonsModule(ChromeActivity activity, public ChromeActivityCommonsModule(ChromeActivity activity,
...@@ -103,7 +108,9 @@ public class ChromeActivityCommonsModule { ...@@ -103,7 +108,9 @@ public class ChromeActivityCommonsModule {
Supplier<Boolean> isPromotableToTabSupplier, Supplier<Boolean> isPromotableToTabSupplier,
StatusBarColorController statusBarColorController, StatusBarColorController statusBarColorController,
ScreenOrientationProvider screenOrientationProvider, ScreenOrientationProvider screenOrientationProvider,
Supplier<NotificationManagerProxy> notificationManagerProxySupplier) { Supplier<NotificationManagerProxy> notificationManagerProxySupplier,
ObservableSupplier<TabContentManager> tabContentManagerSupplier,
CompositorViewHolder.Initializer compositorViewHolderInitializer) {
mActivity = activity; mActivity = activity;
mBottomSheetControllerSupplier = bottomSheetControllerSupplier; mBottomSheetControllerSupplier = bottomSheetControllerSupplier;
mTabModelSelectorSupplier = tabModelSelectorSupplier; mTabModelSelectorSupplier = tabModelSelectorSupplier;
...@@ -124,6 +131,8 @@ public class ChromeActivityCommonsModule { ...@@ -124,6 +131,8 @@ public class ChromeActivityCommonsModule {
mStatusBarColorController = statusBarColorController; mStatusBarColorController = statusBarColorController;
mScreenOrientationProvider = screenOrientationProvider; mScreenOrientationProvider = screenOrientationProvider;
mNotificationManagerProxySupplier = notificationManagerProxySupplier; mNotificationManagerProxySupplier = notificationManagerProxySupplier;
mTabContentManagerSupplier = tabContentManagerSupplier;
mCompositorViewHolderInitializer = compositorViewHolderInitializer;
} }
@Provides @Provides
...@@ -255,4 +264,14 @@ public class ChromeActivityCommonsModule { ...@@ -255,4 +264,14 @@ public class ChromeActivityCommonsModule {
public NotificationManagerProxy provideNotificationManagerProxy() { public NotificationManagerProxy provideNotificationManagerProxy() {
return mNotificationManagerProxySupplier.get(); return mNotificationManagerProxySupplier.get();
} }
@Provides
public ObservableSupplier<TabContentManager> provideTabContentManagerSupplier() {
return mTabContentManagerSupplier;
}
@Provides
public CompositorViewHolder.Initializer provideCompositorViewHolderInitializer() {
return mCompositorViewHolderInitializer;
}
} }
...@@ -79,21 +79,25 @@ public class RunningInChromeTest { ...@@ -79,21 +79,25 @@ public class RunningInChromeTest {
private final TestRule mModuleOverridesRule = new ModuleOverridesRule().setOverride( private final TestRule mModuleOverridesRule = new ModuleOverridesRule().setOverride(
ChromeActivityCommonsModule.Factory.class, ChromeActivityCommonsModule.Factory.class,
(activity, bottomSheetControllerSupplier, tabModelSelectorSupplier, (activity, bottomSheetController, tabModelSelectorSupplier, browserControlsManager,
browserControlsManager, browserControlsVisibilityManager, browserControlsSizer, browserControlsVisibilityManager, browserControlsSizer, fullscreenManager,
fullscreenManager, layoutManagerSupplier, lifecycleDispatcher, layoutManagerSupplier, lifecycleDispatcher, snackbarManagerSupplier,
snackbarManagerSupplier, activityTabProvider, tabContentManager, activityTabProvider, tabContentManager, activityWindowAndroid,
activityWindowAndroid, compositorViewHolderSupplier, tabCreatorManager, compositorViewHolderSupplier, tabCreatorManager, tabCreatorSupplier,
tabCreatorSupplier, isPromotableToTabSupplier, statusBarColorController, isPromotableToTabSupplier, statusBarColorController, screenOrientationProvider,
screenOrientationProvider, notificationManagerProxySupplier) -> { notificationManagerProxySupplier, tabContentManagerSupplier,
return new ChromeActivityCommonsModule(activity, bottomSheetControllerSupplier, compositorViewHolderInitializer) -> {
return new ChromeActivityCommonsModule(activity, bottomSheetController,
tabModelSelectorSupplier, browserControlsManager, tabModelSelectorSupplier, browserControlsManager,
browserControlsVisibilityManager, browserControlsSizer, fullscreenManager, browserControlsVisibilityManager, browserControlsSizer, fullscreenManager,
layoutManagerSupplier, lifecycleDispatcher, snackbarManagerSupplier, layoutManagerSupplier, lifecycleDispatcher, snackbarManagerSupplier,
activityTabProvider, tabContentManager, activityWindowAndroid, activityTabProvider, tabContentManager, activityWindowAndroid,
compositorViewHolderSupplier, tabCreatorManager, tabCreatorSupplier, compositorViewHolderSupplier, tabCreatorManager, tabCreatorSupplier,
isPromotableToTabSupplier, statusBarColorController, isPromotableToTabSupplier, statusBarColorController,
screenOrientationProvider, () -> mMockNotificationManager); screenOrientationProvider,
()
-> mMockNotificationManager,
tabContentManagerSupplier, compositorViewHolderInitializer);
}); });
@Rule @Rule
......
...@@ -92,7 +92,8 @@ public class WebApkInitializationTest { ...@@ -92,7 +92,8 @@ public class WebApkInitializationTest {
snackbarManagerSupplier, activityTabProvider, tabContentManager, snackbarManagerSupplier, activityTabProvider, tabContentManager,
activityWindowAndroid, compositorViewHolderSupplier, tabCreatorManager, activityWindowAndroid, compositorViewHolderSupplier, tabCreatorManager,
tabCreatorSupplier, isPromotableToTabSupplier, statusBarColorController, tabCreatorSupplier, isPromotableToTabSupplier, statusBarColorController,
screenOrientationProvider, notificationManagerProxySupplier) -> { screenOrientationProvider, notificationManagerProxySupplier,
tabContentManagerSupplier, compositorViewHolderInitializer) -> {
mTrackingActivityLifecycleDispatcher.init(lifecycleDispatcher); mTrackingActivityLifecycleDispatcher.init(lifecycleDispatcher);
return new ChromeActivityCommonsModule(activity, bottomSheetControllerSupplier, return new ChromeActivityCommonsModule(activity, bottomSheetControllerSupplier,
tabModelSelectorSupplier, browserControlsManager, tabModelSelectorSupplier, browserControlsManager,
...@@ -101,7 +102,8 @@ public class WebApkInitializationTest { ...@@ -101,7 +102,8 @@ public class WebApkInitializationTest {
snackbarManagerSupplier, activityTabProvider, tabContentManager, snackbarManagerSupplier, activityTabProvider, tabContentManager,
activityWindowAndroid, compositorViewHolderSupplier, tabCreatorManager, activityWindowAndroid, compositorViewHolderSupplier, tabCreatorManager,
tabCreatorSupplier, isPromotableToTabSupplier, statusBarColorController, tabCreatorSupplier, isPromotableToTabSupplier, statusBarColorController,
screenOrientationProvider, notificationManagerProxySupplier); screenOrientationProvider, notificationManagerProxySupplier,
tabContentManagerSupplier, compositorViewHolderInitializer);
}); });
private final WebApkActivityTestRule mActivityRule = new WebApkActivityTestRule(); private final WebApkActivityTestRule mActivityRule = new WebApkActivityTestRule();
......
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