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") {
"//chrome/browser/ui/android/default_browser_promo:java",
"//chrome/browser/ui/android/favicon: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/native_page:java",
"//chrome/browser/ui/android/theme:java",
......
......@@ -12,7 +12,7 @@ include_rules = [
"+chrome/browser/flags/android",
"+chrome/browser/fullscreen/android",
"+chrome/browser/image_descriptions",
"+chrome/browser/ui/android/layouts/java",
"+chrome/browser/ui/android/layouts",
"+chrome/browser/notifications",
"+chrome/browser/password_manager/android",
"+chrome/browser/policy/android",
......
......@@ -112,6 +112,7 @@ import org.chromium.chrome.browser.init.ProcessInitializationHandler;
import org.chromium.chrome.browser.init.StartupTabPreloader;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent;
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.media.PictureInPictureController;
import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker;
......@@ -1281,6 +1282,12 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
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.getLayoutManager() != null) {
mCompositorViewHolder.getLayoutManager().removeSceneChangeObserver(this);
......@@ -1789,6 +1796,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
@Override
public void initializeCompositorContent(LayoutManagerImpl layoutManager, View urlBar,
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);
layoutManager.addSceneChangeObserver(this);
......
......@@ -36,9 +36,9 @@ import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
import org.chromium.chrome.browser.gesturenav.HistoryNavigationCoordinator;
import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor;
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.LayoutType;
import org.chromium.chrome.browser.layouts.ManagedLayoutManager;
import org.chromium.chrome.browser.layouts.SceneOverlay;
import org.chromium.chrome.browser.layouts.animation.CompositorAnimationHandler;
import org.chromium.chrome.browser.layouts.components.VirtualView;
......@@ -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
* 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 {
/** Sampling at 60 fps. */
private static final long FRAME_DELTA_TIME_MS = 16;
......@@ -555,9 +555,7 @@ public class LayoutManagerImpl implements LayoutManager, LayoutUpdateHost, Layou
mTabModelFilterObserver);
}
/**
* Cleans up and destroys this object. It should not be used after this.
*/
@Override
public void destroy() {
mAnimationHandler.destroy();
mSceneChangeObservers.clear();
......
......@@ -9,6 +9,7 @@ android_library("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/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/LayoutType.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