Commit 9e7f9692 authored by Peter E Conn's avatar Peter E Conn Committed by Commit Bot

🛃 Register overlay observer after compositor content is initialized.

Previously CustomTabBottomBarDelegate#addOverlayPanelManagerObserver
was called before CompositorViewHolder had a LayoutManager. This meant
that no observer was added and subsequently the bottom bar was not
hidden when an overlay panel was present.

Bug: 990367
Change-Id: I911e1d19347c59e6165b6d6649e709fcff418295
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1735163Reviewed-by: default avatarPavel Shmakov <pshmakov@chromium.org>
Commit-Queue: Peter Conn <peconn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#685174}
parent 3ce9f4d8
...@@ -371,6 +371,7 @@ chrome_java_sources = [ ...@@ -371,6 +371,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/customtabs/CustomTabActivityLifecycleUmaTracker.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabActivityLifecycleUmaTracker.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabCompositorContentInitializer.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabStatusBarColorProvider.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabStatusBarColorProvider.java",
......
...@@ -435,7 +435,6 @@ public class CustomTabActivity extends ChromeActivity<CustomTabActivityComponent ...@@ -435,7 +435,6 @@ public class CustomTabActivity extends ChromeActivity<CustomTabActivityComponent
public void initializeCompositor() { public void initializeCompositor() {
super.initializeCompositor(); super.initializeCompositor();
getTabModelSelector().onNativeLibraryReady(getTabContentManager()); getTabModelSelector().onNativeLibraryReady(getTabContentManager());
mBottomBarDelegate.addOverlayPanelManagerObserver();
} }
@Override @Override
...@@ -784,6 +783,7 @@ public class CustomTabActivity extends ChromeActivity<CustomTabActivityComponent ...@@ -784,6 +783,7 @@ public class CustomTabActivity extends ChromeActivity<CustomTabActivityComponent
}); });
mCustomTabIntentHandler = component.resolveIntentHandler(); mCustomTabIntentHandler = component.resolveIntentHandler();
mSessionDataHolder = component.getParent().resolveSessionDataHolder(); mSessionDataHolder = component.getParent().resolveSessionDataHolder();
component.resolveCompositorContentInitializer();
if (mIntentDataProvider.isTrustedWebActivity()) { if (mIntentDataProvider.isTrustedWebActivity()) {
component.resolveTrustedWebActivityCoordinator(); component.resolveTrustedWebActivityCoordinator();
......
...@@ -22,8 +22,8 @@ import org.chromium.base.Log; ...@@ -22,8 +22,8 @@ import org.chromium.base.Log;
import org.chromium.base.metrics.CachedMetrics; import org.chromium.base.metrics.CachedMetrics;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.OverlayPanelManagerObserver; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.OverlayPanelManagerObserver;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.dependency_injection.ActivityScope; import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener;
...@@ -80,15 +80,19 @@ public class CustomTabBottomBarDelegate implements FullscreenListener { ...@@ -80,15 +80,19 @@ public class CustomTabBottomBarDelegate implements FullscreenListener {
@Inject @Inject
public CustomTabBottomBarDelegate(ChromeActivity activity, public CustomTabBottomBarDelegate(ChromeActivity activity,
CustomTabIntentDataProvider dataProvider, ChromeFullscreenManager fullscreenManager, CustomTabIntentDataProvider dataProvider,
ChromeFullscreenManager fullscreenManager,
CustomTabNightModeStateController nightModeStateController, CustomTabNightModeStateController nightModeStateController,
SystemNightModeMonitor systemNightModeMonitor) { SystemNightModeMonitor systemNightModeMonitor,
CustomTabCompositorContentInitializer compositorContentInitializer) {
mActivity = activity; mActivity = activity;
mDataProvider = dataProvider; mDataProvider = dataProvider;
mFullscreenManager = fullscreenManager; mFullscreenManager = fullscreenManager;
mNightModeStateController = nightModeStateController; mNightModeStateController = nightModeStateController;
mSystemNightModeMonitor = systemNightModeMonitor; mSystemNightModeMonitor = systemNightModeMonitor;
fullscreenManager.addListener(this); fullscreenManager.addListener(this);
compositorContentInitializer.addCallback(this::addOverlayPanelManagerObserver);
} }
/** /**
...@@ -226,12 +230,8 @@ public class CustomTabBottomBarDelegate implements FullscreenListener { ...@@ -226,12 +230,8 @@ public class CustomTabBottomBarDelegate implements FullscreenListener {
return mBottomBarView; return mBottomBarView;
} }
public void addOverlayPanelManagerObserver() { public void addOverlayPanelManagerObserver(LayoutManager layoutDriver) {
if (mActivity.getCompositorViewHolder().getLayoutManager() == null) return; layoutDriver.getOverlayPanelManager().addObserver(new OverlayPanelManagerObserver() {
OverlayPanelManager manager =
mActivity.getCompositorViewHolder().getLayoutManager().getOverlayPanelManager();
manager.addObserver(new OverlayPanelManagerObserver() {
@Override @Override
public void onOverlayPanelShown() { public void onOverlayPanelShown() {
if (mBottomBarView == null) return; if (mBottomBarView == null) return;
......
// 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.customtabs;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import dagger.Lazy;
/**
* Initializes the compositor content (calls {@link ChromeActivity#initializeCompositorContent}).
*/
@ActivityScope
public class CustomTabCompositorContentInitializer implements NativeInitObserver {
private final ActivityLifecycleDispatcher mLifecycleDispatcher;
private final ChromeActivity mActivity;
private final Lazy<CompositorViewHolder> mCompositorViewHolder;
private final List<Callback<LayoutManager>> mListeners = new ArrayList<>();
private boolean mInitialized;
@Inject
public CustomTabCompositorContentInitializer(
ActivityLifecycleDispatcher lifecycleDispatcher,
ChromeActivity activity,
Lazy<CompositorViewHolder> compositorViewHolder) {
mLifecycleDispatcher = lifecycleDispatcher;
mActivity = activity;
mCompositorViewHolder = compositorViewHolder;
lifecycleDispatcher.register(this);
}
/**
* Adds a callback that will be called once the Compositor View Holder has its content
* initialized, or immediately (synchronously) if it is already initialized.
*/
public void addCallback(Callback<LayoutManager> callback) {
if (mInitialized) {
callback.onResult(mCompositorViewHolder.get().getLayoutManager());
} else {
mListeners.add(callback);
}
}
@Override
public void onFinishNativeInitialization() {
LayoutManager layoutDriver = new LayoutManager(mCompositorViewHolder.get());
mActivity.initializeCompositorContent(layoutDriver,
mActivity.findViewById(org.chromium.chrome.R.id.url_bar),
mActivity.findViewById(android.R.id.content),
mActivity.findViewById(org.chromium.chrome.R.id.control_container));
for (Callback<LayoutManager> listener : mListeners) {
listener.onResult(layoutDriver);
}
mInitialized = true;
mListeners.clear();
mLifecycleDispatcher.unregister(this);
}
}
...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.customtabs.dependency_injection; ...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.customtabs.dependency_injection;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TrustedWebActivityCoordinator; import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TrustedWebActivityCoordinator;
import org.chromium.chrome.browser.customtabs.CustomTabActivityLifecycleUmaTracker; import org.chromium.chrome.browser.customtabs.CustomTabActivityLifecycleUmaTracker;
import org.chromium.chrome.browser.customtabs.CustomTabBottomBarDelegate; import org.chromium.chrome.browser.customtabs.CustomTabBottomBarDelegate;
import org.chromium.chrome.browser.customtabs.CustomTabCompositorContentInitializer;
import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider; import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
import org.chromium.chrome.browser.customtabs.CustomTabTabPersistencePolicy; import org.chromium.chrome.browser.customtabs.CustomTabTabPersistencePolicy;
import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler; import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler;
...@@ -43,6 +44,7 @@ public interface CustomTabActivityComponent extends ChromeActivityComponent { ...@@ -43,6 +44,7 @@ public interface CustomTabActivityComponent extends ChromeActivityComponent {
CustomTabActivityTabProvider resolveTabProvider(); CustomTabActivityTabProvider resolveTabProvider();
CustomTabStatusBarColorProvider resolveCustomTabStatusBarColorProvider(); CustomTabStatusBarColorProvider resolveCustomTabStatusBarColorProvider();
CustomTabToolbarCoordinator resolveToolbarCoordinator(); CustomTabToolbarCoordinator resolveToolbarCoordinator();
CustomTabCompositorContentInitializer resolveCompositorContentInitializer();
CustomTabTabPersistencePolicy resolveTabPersistencePolicy(); // For testing CustomTabTabPersistencePolicy resolveTabPersistencePolicy(); // For testing
} }
...@@ -13,9 +13,9 @@ import android.view.View; ...@@ -13,9 +13,9 @@ import android.view.View;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
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.customtabs.CustomButtonParams; import org.chromium.chrome.browser.customtabs.CustomButtonParams;
import org.chromium.chrome.browser.customtabs.CustomTabCompositorContentInitializer;
import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider; import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider; import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
import org.chromium.chrome.browser.customtabs.CustomTabsConnection; import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
...@@ -27,7 +27,6 @@ import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; ...@@ -27,7 +27,6 @@ import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.InflationObserver; import org.chromium.chrome.browser.lifecycle.InflationObserver;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabObserverRegistrar; import org.chromium.chrome.browser.tab.TabObserverRegistrar;
...@@ -55,13 +54,12 @@ import dagger.Lazy; ...@@ -55,13 +54,12 @@ import dagger.Lazy;
* 3. Refactor to MVC. * 3. Refactor to MVC.
*/ */
@ActivityScope @ActivityScope
public class CustomTabToolbarCoordinator implements InflationObserver, NativeInitObserver { public class CustomTabToolbarCoordinator implements InflationObserver {
private final Lazy<ToolbarManager> mToolbarManager; private final Lazy<ToolbarManager> mToolbarManager;
private final CustomTabIntentDataProvider mIntentDataProvider; private final CustomTabIntentDataProvider mIntentDataProvider;
private final CustomTabActivityTabProvider mTabProvider; private final CustomTabActivityTabProvider mTabProvider;
private final CustomTabsConnection mConnection; private final CustomTabsConnection mConnection;
private final Lazy<CompositorViewHolder> mCompositorViewHolder;
private final ChromeActivity mActivity; private final ChromeActivity mActivity;
private final Context mAppContext; private final Context mAppContext;
private final CustomTabActivityTabController mTabController; private final CustomTabActivityTabController mTabController;
...@@ -80,7 +78,6 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni ...@@ -80,7 +78,6 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
CustomTabIntentDataProvider intentDataProvider, CustomTabIntentDataProvider intentDataProvider,
CustomTabActivityTabProvider tabProvider, CustomTabActivityTabProvider tabProvider,
CustomTabsConnection connection, CustomTabsConnection connection,
Lazy<CompositorViewHolder> compositorViewHolder,
ChromeActivity activity, ChromeActivity activity,
@Named(APP_CONTEXT) Context appContext, @Named(APP_CONTEXT) Context appContext,
CustomTabActivityTabController tabController, CustomTabActivityTabController tabController,
...@@ -88,12 +85,12 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni ...@@ -88,12 +85,12 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
CustomTabActivityNavigationController navigationController, CustomTabActivityNavigationController navigationController,
TabObserverRegistrar tabObserverRegistrar, TabObserverRegistrar tabObserverRegistrar,
CustomTabStatusBarColorProvider statusBarColorProvider, CustomTabStatusBarColorProvider statusBarColorProvider,
CustomTabBrowserControlsVisibilityDelegate visibilityDelegate) { CustomTabBrowserControlsVisibilityDelegate visibilityDelegate,
CustomTabCompositorContentInitializer compositorContentInitializer) {
mToolbarManager = toolbarManager; mToolbarManager = toolbarManager;
mIntentDataProvider = intentDataProvider; mIntentDataProvider = intentDataProvider;
mTabProvider = tabProvider; mTabProvider = tabProvider;
mConnection = connection; mConnection = connection;
mCompositorViewHolder = compositorViewHolder;
mActivity = activity; mActivity = activity;
mAppContext = appContext; mAppContext = appContext;
mTabController = tabController; mTabController = tabController;
...@@ -103,6 +100,8 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni ...@@ -103,6 +100,8 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
mStatusBarColorProvider = statusBarColorProvider; mStatusBarColorProvider = statusBarColorProvider;
mVisibilityDelegate = visibilityDelegate; mVisibilityDelegate = visibilityDelegate;
lifecycleDispatcher.register(this); lifecycleDispatcher.register(this);
compositorContentInitializer.addCallback(this::onCompositorContentInitialized);
} }
@Override @Override
...@@ -218,14 +217,7 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni ...@@ -218,14 +217,7 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
}); });
} }
@Override private void onCompositorContentInitialized(LayoutManager layoutDriver) {
public void onFinishNativeInitialization() {
LayoutManager layoutDriver = new LayoutManager(mCompositorViewHolder.get());
mActivity.initializeCompositorContent(layoutDriver,
mActivity.findViewById(R.id.url_bar),
mActivity.findViewById(android.R.id.content),
mActivity.findViewById(R.id.control_container));
mToolbarManager.get().initializeWithNative(mTabController.getTabModelSelector(), mToolbarManager.get().initializeWithNative(mTabController.getTabModelSelector(),
mFullscreenManager.get().getBrowserVisibilityDelegate(), null, layoutDriver, null, mFullscreenManager.get().getBrowserVisibilityDelegate(), null, layoutDriver, null,
null, null, v -> onCloseButtonClick()); null, null, v -> onCloseButtonClick());
......
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