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 = [
"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/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/CustomTabIntentDataProvider.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabStatusBarColorProvider.java",
......
......@@ -435,7 +435,6 @@ public class CustomTabActivity extends ChromeActivity<CustomTabActivityComponent
public void initializeCompositor() {
super.initializeCompositor();
getTabModelSelector().onNativeLibraryReady(getTabContentManager());
mBottomBarDelegate.addOverlayPanelManagerObserver();
}
@Override
......@@ -784,6 +783,7 @@ public class CustomTabActivity extends ChromeActivity<CustomTabActivityComponent
});
mCustomTabIntentHandler = component.resolveIntentHandler();
mSessionDataHolder = component.getParent().resolveSessionDataHolder();
component.resolveCompositorContentInitializer();
if (mIntentDataProvider.isTrustedWebActivity()) {
component.resolveTrustedWebActivityCoordinator();
......
......@@ -22,8 +22,8 @@ import org.chromium.base.Log;
import org.chromium.base.metrics.CachedMetrics;
import org.chromium.chrome.R;
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.layouts.LayoutManager;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener;
......@@ -80,15 +80,19 @@ public class CustomTabBottomBarDelegate implements FullscreenListener {
@Inject
public CustomTabBottomBarDelegate(ChromeActivity activity,
CustomTabIntentDataProvider dataProvider, ChromeFullscreenManager fullscreenManager,
CustomTabIntentDataProvider dataProvider,
ChromeFullscreenManager fullscreenManager,
CustomTabNightModeStateController nightModeStateController,
SystemNightModeMonitor systemNightModeMonitor) {
SystemNightModeMonitor systemNightModeMonitor,
CustomTabCompositorContentInitializer compositorContentInitializer) {
mActivity = activity;
mDataProvider = dataProvider;
mFullscreenManager = fullscreenManager;
mNightModeStateController = nightModeStateController;
mSystemNightModeMonitor = systemNightModeMonitor;
fullscreenManager.addListener(this);
compositorContentInitializer.addCallback(this::addOverlayPanelManagerObserver);
}
/**
......@@ -226,12 +230,8 @@ public class CustomTabBottomBarDelegate implements FullscreenListener {
return mBottomBarView;
}
public void addOverlayPanelManagerObserver() {
if (mActivity.getCompositorViewHolder().getLayoutManager() == null) return;
OverlayPanelManager manager =
mActivity.getCompositorViewHolder().getLayoutManager().getOverlayPanelManager();
manager.addObserver(new OverlayPanelManagerObserver() {
public void addOverlayPanelManagerObserver(LayoutManager layoutDriver) {
layoutDriver.getOverlayPanelManager().addObserver(new OverlayPanelManagerObserver() {
@Override
public void onOverlayPanelShown() {
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;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TrustedWebActivityCoordinator;
import org.chromium.chrome.browser.customtabs.CustomTabActivityLifecycleUmaTracker;
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.CustomTabTabPersistencePolicy;
import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler;
......@@ -43,6 +44,7 @@ public interface CustomTabActivityComponent extends ChromeActivityComponent {
CustomTabActivityTabProvider resolveTabProvider();
CustomTabStatusBarColorProvider resolveCustomTabStatusBarColorProvider();
CustomTabToolbarCoordinator resolveToolbarCoordinator();
CustomTabCompositorContentInitializer resolveCompositorContentInitializer();
CustomTabTabPersistencePolicy resolveTabPersistencePolicy(); // For testing
}
......@@ -13,9 +13,9 @@ import android.view.View;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
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.customtabs.CustomButtonParams;
import org.chromium.chrome.browser.customtabs.CustomTabCompositorContentInitializer;
import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
......@@ -27,7 +27,6 @@ import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
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.Tab;
import org.chromium.chrome.browser.tab.TabObserverRegistrar;
......@@ -55,13 +54,12 @@ import dagger.Lazy;
* 3. Refactor to MVC.
*/
@ActivityScope
public class CustomTabToolbarCoordinator implements InflationObserver, NativeInitObserver {
public class CustomTabToolbarCoordinator implements InflationObserver {
private final Lazy<ToolbarManager> mToolbarManager;
private final CustomTabIntentDataProvider mIntentDataProvider;
private final CustomTabActivityTabProvider mTabProvider;
private final CustomTabsConnection mConnection;
private final Lazy<CompositorViewHolder> mCompositorViewHolder;
private final ChromeActivity mActivity;
private final Context mAppContext;
private final CustomTabActivityTabController mTabController;
......@@ -80,7 +78,6 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
CustomTabIntentDataProvider intentDataProvider,
CustomTabActivityTabProvider tabProvider,
CustomTabsConnection connection,
Lazy<CompositorViewHolder> compositorViewHolder,
ChromeActivity activity,
@Named(APP_CONTEXT) Context appContext,
CustomTabActivityTabController tabController,
......@@ -88,12 +85,12 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
CustomTabActivityNavigationController navigationController,
TabObserverRegistrar tabObserverRegistrar,
CustomTabStatusBarColorProvider statusBarColorProvider,
CustomTabBrowserControlsVisibilityDelegate visibilityDelegate) {
CustomTabBrowserControlsVisibilityDelegate visibilityDelegate,
CustomTabCompositorContentInitializer compositorContentInitializer) {
mToolbarManager = toolbarManager;
mIntentDataProvider = intentDataProvider;
mTabProvider = tabProvider;
mConnection = connection;
mCompositorViewHolder = compositorViewHolder;
mActivity = activity;
mAppContext = appContext;
mTabController = tabController;
......@@ -103,6 +100,8 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
mStatusBarColorProvider = statusBarColorProvider;
mVisibilityDelegate = visibilityDelegate;
lifecycleDispatcher.register(this);
compositorContentInitializer.addCallback(this::onCompositorContentInitialized);
}
@Override
......@@ -218,14 +217,7 @@ public class CustomTabToolbarCoordinator implements InflationObserver, NativeIni
});
}
@Override
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));
private void onCompositorContentInitialized(LayoutManager layoutDriver) {
mToolbarManager.get().initializeWithNative(mTabController.getTabModelSelector(),
mFullscreenManager.get().getBrowserVisibilityDelegate(), null, layoutDriver, null,
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