Commit 343aa665 authored by Matt Jones's avatar Matt Jones Committed by Chromium LUCI CQ

Expose LayoutManager as UnownedUserData

This patch adds a LayoutManagerProvider with a static method to access
the activity's LayoutManager. This patch has a fair amount of
indirection to keep certain apis internal and the public api clean.

LayoutManagerAppUtils: A utility class only exposed to app or glue
code to attach the LayoutManager to the window. This exists in its own
build target with ManagedLayoutManager.

ManagedLayoutManager: Another app/glue code api for lifecycle
management. This extends LayoutManager and includes other external
signals that would not otherwise be exposed through the LayoutManager
interface.

LayoutManagerProvider: This is the main access point for clients
wanting an instance of the LayoutManager.

LayoutManagerProvider.Unowned: A package-protected interface for
obscuring attach and detach method implementations in the public api.

Bug: 1161560, 1167255
Change-Id: Ie9561cd6d9dafcca8acac54a85c3c7bc27ca085e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2634003Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarMei Liang <meiliang@chromium.org>
Commit-Queue: Matthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#846268}
parent 3d23def5
...@@ -350,6 +350,7 @@ android_library("chrome_java") { ...@@ -350,6 +350,7 @@ android_library("chrome_java") {
"//chrome/browser/ui/android/default_browser_promo:java", "//chrome/browser/ui/android/default_browser_promo:java",
"//chrome/browser/ui/android/favicon:java", "//chrome/browser/ui/android/favicon:java",
"//chrome/browser/ui/android/layouts:java", "//chrome/browser/ui/android/layouts:java",
"//chrome/browser/ui/android/layouts/glue:java",
"//chrome/browser/ui/android/layouts/third_party/float_property:java", "//chrome/browser/ui/android/layouts/third_party/float_property:java",
"//chrome/browser/ui/android/native_page:java", "//chrome/browser/ui/android/native_page:java",
"//chrome/browser/ui/android/theme:java", "//chrome/browser/ui/android/theme:java",
......
...@@ -12,7 +12,7 @@ include_rules = [ ...@@ -12,7 +12,7 @@ include_rules = [
"+chrome/browser/flags/android", "+chrome/browser/flags/android",
"+chrome/browser/fullscreen/android", "+chrome/browser/fullscreen/android",
"+chrome/browser/image_descriptions", "+chrome/browser/image_descriptions",
"+chrome/browser/ui/android/layouts/java", "+chrome/browser/ui/android/layouts",
"+chrome/browser/notifications", "+chrome/browser/notifications",
"+chrome/browser/password_manager/android", "+chrome/browser/password_manager/android",
"+chrome/browser/policy/android", "+chrome/browser/policy/android",
......
...@@ -112,6 +112,7 @@ import org.chromium.chrome.browser.init.ProcessInitializationHandler; ...@@ -112,6 +112,7 @@ import org.chromium.chrome.browser.init.ProcessInitializationHandler;
import org.chromium.chrome.browser.init.StartupTabPreloader; import org.chromium.chrome.browser.init.StartupTabPreloader;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent; import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponentFactory; import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponentFactory;
import org.chromium.chrome.browser.layouts.LayoutManagerAppUtils;
import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.media.PictureInPictureController; import org.chromium.chrome.browser.media.PictureInPictureController;
import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker; import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker;
...@@ -1281,6 +1282,12 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1281,6 +1282,12 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
mTabModelSelectorTabObserver = null; mTabModelSelectorTabObserver = null;
} }
// TODO(1168131): Destruction and detaching of the LayoutManager should be moved to the
// RootUiCoordinator.
if (mLayoutManagerSupplier.get() != null) {
LayoutManagerAppUtils.detach(mLayoutManagerSupplier.get());
}
if (mCompositorViewHolder != null) { if (mCompositorViewHolder != null) {
if (mCompositorViewHolder.getLayoutManager() != null) { if (mCompositorViewHolder.getLayoutManager() != null) {
mCompositorViewHolder.getLayoutManager().removeSceneChangeObserver(this); mCompositorViewHolder.getLayoutManager().removeSceneChangeObserver(this);
...@@ -1789,6 +1796,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1789,6 +1796,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
@Override @Override
public void initializeCompositorContent(LayoutManagerImpl layoutManager, View urlBar, public void initializeCompositorContent(LayoutManagerImpl layoutManager, View urlBar,
ViewGroup contentContainer, ControlContainer controlContainer) { ViewGroup contentContainer, ControlContainer controlContainer) {
// TODO(1168131): The responsibility of managing the availability of the LayoutManager
// should be moved to the RootUiCoordinator.
LayoutManagerAppUtils.attach(getWindowAndroid(), layoutManager);
mLayoutManagerSupplier.set(layoutManager); mLayoutManagerSupplier.set(layoutManager);
layoutManager.addSceneChangeObserver(this); layoutManager.addSceneChangeObserver(this);
......
...@@ -36,9 +36,9 @@ import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; ...@@ -36,9 +36,9 @@ import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
import org.chromium.chrome.browser.gesturenav.HistoryNavigationCoordinator; import org.chromium.chrome.browser.gesturenav.HistoryNavigationCoordinator;
import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor; import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor;
import org.chromium.chrome.browser.layouts.EventFilter; import org.chromium.chrome.browser.layouts.EventFilter;
import org.chromium.chrome.browser.layouts.LayoutManager;
import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.layouts.LayoutType;
import org.chromium.chrome.browser.layouts.ManagedLayoutManager;
import org.chromium.chrome.browser.layouts.SceneOverlay; import org.chromium.chrome.browser.layouts.SceneOverlay;
import org.chromium.chrome.browser.layouts.animation.CompositorAnimationHandler; import org.chromium.chrome.browser.layouts.animation.CompositorAnimationHandler;
import org.chromium.chrome.browser.layouts.components.VirtualView; import org.chromium.chrome.browser.layouts.components.VirtualView;
...@@ -85,7 +85,7 @@ import java.util.Map; ...@@ -85,7 +85,7 @@ import java.util.Map;
* A class that is responsible for managing an active {@link Layout} to show to the screen. This * A class that is responsible for managing an active {@link Layout} to show to the screen. This
* includes lifecycle managment like showing/hiding this {@link Layout}. * includes lifecycle managment like showing/hiding this {@link Layout}.
*/ */
public class LayoutManagerImpl implements LayoutManager, LayoutUpdateHost, LayoutProvider, public class LayoutManagerImpl implements ManagedLayoutManager, LayoutUpdateHost, LayoutProvider,
TabModelSelector.CloseAllTabsDelegate { TabModelSelector.CloseAllTabsDelegate {
/** Sampling at 60 fps. */ /** Sampling at 60 fps. */
private static final long FRAME_DELTA_TIME_MS = 16; private static final long FRAME_DELTA_TIME_MS = 16;
...@@ -555,9 +555,7 @@ public class LayoutManagerImpl implements LayoutManager, LayoutUpdateHost, Layou ...@@ -555,9 +555,7 @@ public class LayoutManagerImpl implements LayoutManager, LayoutUpdateHost, Layou
mTabModelFilterObserver); mTabModelFilterObserver);
} }
/** @Override
* Cleans up and destroys this object. It should not be used after this.
*/
public void destroy() { public void destroy() {
mAnimationHandler.destroy(); mAnimationHandler.destroy();
mSceneChangeObservers.clear(); mSceneChangeObservers.clear();
......
...@@ -9,6 +9,7 @@ android_library("java") { ...@@ -9,6 +9,7 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessor.java", "java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessor.java",
"java/src/org/chromium/chrome/browser/layouts/EventFilter.java", "java/src/org/chromium/chrome/browser/layouts/EventFilter.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutManager.java", "java/src/org/chromium/chrome/browser/layouts/LayoutManager.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutManagerProvider.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java", "java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutType.java", "java/src/org/chromium/chrome/browser/layouts/LayoutType.java",
"java/src/org/chromium/chrome/browser/layouts/SceneOverlay.java", "java/src/org/chromium/chrome/browser/layouts/SceneOverlay.java",
......
# Copyright 2021 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.
import("//build/config/android/rules.gni")
android_library("java") {
visibility = [
":*",
"//chrome/android:chrome_java",
]
sources = [
"java/src/org/chromium/chrome/browser/layouts/LayoutManagerAppUtils.java",
"java/src/org/chromium/chrome/browser/layouts/ManagedLayoutManager.java",
]
deps = [
"..:java",
"//ui/android:ui_java",
]
}
// Copyright 2021 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.layouts;
import org.chromium.ui.base.WindowAndroid;
/** A class used by app code to manage an instance of the {@link LayoutManager}. */
public class LayoutManagerAppUtils {
/**
* Attach a shared {@link LayoutManager} to a {@link WindowAndroid}.
* @param windowAndroid The window to attach the manager to.
* @param controller The controller to attach.
*/
public static void attach(WindowAndroid windowAndroid, ManagedLayoutManager controller) {
LayoutManagerProvider.attach(windowAndroid, controller);
}
/**
* Detach the specified {@link LayoutManager} from any {@link WindowAndroid}s it is associated
* with.
* @param controller The manager to remove from any associated windows.
*/
public static void detach(ManagedLayoutManager controller) {
LayoutManagerProvider.detach(controller);
}
}
// Copyright 2021 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.layouts;
/**
* This interface is intended to be used by glue code to manage the lifecycle and external input to
* the {@link LayoutManager} implementations.
*/
public interface ManagedLayoutManager extends LayoutManagerProvider.Unowned {
/**
* Clean up any state held by the layout manager to prepare for browser shutdown. The object
* should not be used after this has been called.
*/
void destroy();
}
// Copyright 2021 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.layouts;
import org.chromium.base.UnownedUserData;
import org.chromium.base.UnownedUserDataKey;
import org.chromium.ui.base.WindowAndroid;
/**
* This class manages the details associated with binding a {@link LayoutManager} to user data on a
* {@link WindowAndroid}.
*/
public class LayoutManagerProvider {
/** An interface that allows a LayoutManager to be associated with an unowned data host. */
interface Unowned extends LayoutManager, UnownedUserData {}
/** The key used to bind the LayoutManager to the unowned data host. */
private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>(Unowned.class);
/**
* Get the shared {@link LayoutManager} from the provided {@link WindowAndroid}.
* @param windowAndroid The window to pull the LayoutManager from.
* @return A shared instance of a {@link LayoutManager}.
*/
public static LayoutManager from(WindowAndroid windowAndroid) {
return KEY.retrieveDataFromHost(windowAndroid.getUnownedUserDataHost());
}
static void attach(WindowAndroid windowAndroid, Unowned layoutManager) {
KEY.attachToHost(windowAndroid.getUnownedUserDataHost(), layoutManager);
}
static void detach(Unowned layoutManager) {
KEY.detachFromAllHosts(layoutManager);
}
}
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