summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2024-05-17 21:28:33 -0600
committer Riddle Hsu <riddlehsu@google.com> 2024-05-17 21:28:33 +0800
commit089c8193a31c9e28fcc4ed76ef3da7492e4b5dcc (patch)
tree8238905c58d4282b3423731e5249751ea77c196a
parentb972663f6daf3cb60874e1169c3e080e735bc8b6 (diff)
Make WindowContainer#mPendingTransaction optional
This can reduce 70+ unused Transaction objects. So far the only used pending transaction is the instance in DisplayContent. The centralized transaction was to avoid applying unexpected order or incomplete surface operations. In general, it is not expected to care about the surface operations before a window container is attached. Because when a container is attached, the surface attributes will still be updated according to its current configuration. After this change, the mPendingTransaction of non-display container will only be used when creating display area of a new display. And then it will be null out immediately when attaching to display. Bug: 163976519 Bug: 132320879 Test: atest WindowContainerTests Change-Id: I7c2155bee55d260dbb72cf1f5f58c143f9dd03c6
-rw-r--r--services/core/java/com/android/server/wm/Task.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java20
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java9
3 files changed, 24 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 8bd7b5f78cf4..2c52eee00b99 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -1986,6 +1986,12 @@ class Task extends TaskFragment {
final boolean wasInMultiWindowMode = inMultiWindowMode();
final boolean wasInPictureInPicture = inPinnedWindowingMode();
super.onConfigurationChanged(newParentConfig);
+ if (mDisplayContent == null) {
+ // This should be initializing from Task.Builder. The onConfigurationChanged will be
+ // called again when this task is attached to hierarchy. Early return here because the
+ // following operations are no-op for a non-attached task.
+ return;
+ }
// Only need to update surface size here since the super method will handle updating
// surface position.
updateSurfaceSize(getSyncTransaction());
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index d70ca02cc23d..fadd77b3532b 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -201,8 +201,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
private int mLastLayer = 0;
private SurfaceControl mLastRelativeToLayer = null;
- // TODO(b/132320879): Remove this from WindowContainers except DisplayContent.
- private final Transaction mPendingTransaction;
+ private Transaction mPendingTransaction;
/**
* Windows that clients are waiting to have drawn.
@@ -357,7 +356,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
WindowContainer(WindowManagerService wms) {
mWmService = wms;
mTransitionController = mWmService.mAtmService.getTransitionController();
- mPendingTransaction = wms.mTransactionFactory.get();
mSyncTransaction = wms.mTransactionFactory.get();
mSurfaceAnimator = new SurfaceAnimator(this, this::onAnimationFinished, wms);
mSurfaceFreezer = new SurfaceFreezer(this, wms);
@@ -579,6 +577,10 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
@Override
public void onConfigurationChanged(Configuration newParentConfig) {
super.onConfigurationChanged(newParentConfig);
+ if (mParent == null) {
+ // Avoid unnecessary surface operation before attaching to a parent.
+ return;
+ }
updateSurfacePositionNonOrganized();
scheduleAnimation();
if (mOverlayHost != null) {
@@ -1073,8 +1075,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
}
mDisplayContent = dc;
- if (dc != null && dc != this) {
+ if (dc != null && dc != this && mPendingTransaction != null) {
dc.getPendingTransaction().merge(mPendingTransaction);
+ mPendingTransaction = null;
}
if (dc != this && mLocalInsetsSources != null) {
mLocalInsetsSources.clear();
@@ -2923,14 +2926,17 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
@Override
public Transaction getPendingTransaction() {
- final DisplayContent displayContent = getDisplayContent();
- if (displayContent != null && displayContent != this) {
- return displayContent.getPendingTransaction();
+ final WindowContainer<?> dc = mDisplayContent;
+ if (dc != null && dc.mPendingTransaction != null) {
+ return dc.mPendingTransaction;
}
// This WindowContainer has not attached to a display yet or this is a DisplayContent, so we
// let the caller to save the surface operations within the local mPendingTransaction.
// If this is not a DisplayContent, we will merge it to the pending transaction of its
// display once it attaches to it.
+ if (mPendingTransaction == null) {
+ mPendingTransaction = mWmService.mTransactionFactory.get();
+ }
return mPendingTransaction;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 9f85acb98817..72e9eb394544 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -163,7 +163,7 @@ public class WindowContainerTests extends WindowTestsBase {
@Test
public void testAddChildSetsSurfacePosition() {
reset(mTransaction);
- try (MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer(mWm)) {
+ try (MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer(mDisplayContent)) {
WindowContainer child = new WindowContainer(mWm);
child.setBounds(1, 1, 10, 10);
@@ -266,7 +266,7 @@ public class WindowContainerTests extends WindowTestsBase {
@Test
public void testRemoveImmediatelyClearsLastSurfacePosition() {
reset(mTransaction);
- try (MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer(mWm)) {
+ try (MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer(mDisplayContent)) {
final WindowContainer<WindowContainer> child1 = new WindowContainer(mWm);
child1.setBounds(1, 1, 10, 10);
@@ -1814,8 +1814,9 @@ public class WindowContainerTests extends WindowTestsBase {
implements AutoCloseable {
private final SurfaceSession mSession = new SurfaceSession();
- MockSurfaceBuildingContainer(WindowManagerService wm) {
- super(wm);
+ MockSurfaceBuildingContainer(DisplayContent dc) {
+ super(dc.mWmService);
+ onDisplayChanged(dc);
}
static class MockSurfaceBuilder extends SurfaceControl.Builder {