summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-04-06 06:10:04 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-04-06 06:10:04 +0000
commit6f773fa6482d14da96e237bc8622691d14b97aba (patch)
treecd2217b1483bd5eda8e89b729f946b49e39716b6
parentebba175110415567ac3cc51c013291c1f27278b8 (diff)
parent3284bb4beb8d180bf1f459e6569f0eda3a2d5079 (diff)
Merge "Reduce unnecessary operations in perpareSurface" into udc-dev
-rw-r--r--services/core/java/com/android/server/wm/Dimmer.java19
-rw-r--r--services/core/java/com/android/server/wm/DisplayArea.java17
-rw-r--r--services/core/java/com/android/server/wm/Task.java24
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java13
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DimmerTests.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java1
7 files changed, 61 insertions, 46 deletions
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index 13a1cb6daf38..c6db8a7acb6f 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -126,6 +126,9 @@ class Dimmer {
boolean isVisible;
SurfaceAnimator mSurfaceAnimator;
+ // TODO(b/64816140): Remove after confirming dimmer layer always matches its container.
+ final Rect mDimBounds = new Rect();
+
/**
* Determines whether the dim layer should animate before destroying.
*/
@@ -260,11 +263,16 @@ class Dimmer {
* {@link WindowContainer#prepareSurfaces}. After calling this, the container should
* chain {@link WindowContainer#prepareSurfaces} down to it's children to give them
* a chance to request dims to continue.
+ * @return Non-null dim bounds if the dimmer is showing.
*/
- void resetDimStates() {
- if (mDimState != null && !mDimState.mDontReset) {
+ Rect resetDimStates() {
+ if (mDimState == null) {
+ return null;
+ }
+ if (!mDimState.mDontReset) {
mDimState.mDimming = false;
}
+ return mDimState.mDimBounds;
}
void dontAnimateExit() {
@@ -275,13 +283,13 @@ class Dimmer {
/**
* Call after invoking {@link WindowContainer#prepareSurfaces} on children as
- * described in {@link #resetDimStates}.
+ * described in {@link #resetDimStates}. The dim bounds returned by {@link #resetDimStates}
+ * should be set before calling this method.
*
* @param t A transaction in which to update the dims.
- * @param bounds The bounds at which to dim.
* @return true if any Dims were updated.
*/
- boolean updateDims(SurfaceControl.Transaction t, Rect bounds) {
+ boolean updateDims(SurfaceControl.Transaction t) {
if (mDimState == null) {
return false;
}
@@ -297,6 +305,7 @@ class Dimmer {
mDimState = null;
return false;
} else {
+ final Rect bounds = mDimState.mDimBounds;
// TODO: Once we use geometry from hierarchy this falls away.
t.setPosition(mDimState.mDimLayer, bounds.left, bounds.top);
t.setWindowCrop(mDimState.mDimLayer, bounds.width(), bounds.height());
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index 00299c286b08..26f56a2e5c0b 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -767,7 +767,6 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
*/
static class Dimmable extends DisplayArea<DisplayArea> {
private final Dimmer mDimmer = new Dimmer(this);
- private final Rect mTmpDimBoundsRect = new Rect();
Dimmable(WindowManagerService wms, Type type, String name, int featureId) {
super(wms, type, name, featureId);
@@ -780,11 +779,13 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
@Override
void prepareSurfaces() {
- mDimmer.resetDimStates();
+ final Rect dimBounds = mDimmer.resetDimStates();
super.prepareSurfaces();
- // Bounds need to be relative, as the dim layer is a child.
- getBounds(mTmpDimBoundsRect);
- mTmpDimBoundsRect.offsetTo(0 /* newLeft */, 0 /* newTop */);
+ if (dimBounds != null) {
+ // Bounds need to be relative, as the dim layer is a child.
+ getBounds(dimBounds);
+ dimBounds.offsetTo(0 /* newLeft */, 0 /* newTop */);
+ }
// If SystemUI is dragging for recents, we want to reset the dim state so any dim layer
// on the display level fades out.
@@ -792,8 +793,10 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
mDimmer.resetDimStates();
}
- if (mDimmer.updateDims(getSyncTransaction(), mTmpDimBoundsRect)) {
- scheduleAnimation();
+ if (dimBounds != null) {
+ if (mDimmer.updateDims(getSyncTransaction())) {
+ scheduleAnimation();
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index db4453297001..0857898ca1d2 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -481,8 +481,6 @@ class Task extends TaskFragment {
// to layout without loading all the task snapshots
final PersistedTaskSnapshotData mLastTaskSnapshotData;
- private final Rect mTmpDimBoundsRect = new Rect();
-
/** @see #setCanAffectSystemUiFlags */
private boolean mCanAffectSystemUiFlags = true;
@@ -3254,22 +3252,24 @@ class Task extends TaskFragment {
@Override
void prepareSurfaces() {
- mDimmer.resetDimStates();
+ final Rect dimBounds = mDimmer.resetDimStates();
super.prepareSurfaces();
- getDimBounds(mTmpDimBoundsRect);
- // Bounds need to be relative, as the dim layer is a child.
- if (inFreeformWindowingMode()) {
- getBounds(mTmpRect);
- mTmpDimBoundsRect.offsetTo(mTmpDimBoundsRect.left - mTmpRect.left,
- mTmpDimBoundsRect.top - mTmpRect.top);
- } else {
- mTmpDimBoundsRect.offsetTo(0, 0);
+ if (dimBounds != null) {
+ getDimBounds(dimBounds);
+
+ // Bounds need to be relative, as the dim layer is a child.
+ if (inFreeformWindowingMode()) {
+ getBounds(mTmpRect);
+ dimBounds.offsetTo(dimBounds.left - mTmpRect.left, dimBounds.top - mTmpRect.top);
+ } else {
+ dimBounds.offsetTo(0, 0);
+ }
}
final SurfaceControl.Transaction t = getSyncTransaction();
- if (mDimmer.updateDims(t, mTmpDimBoundsRect)) {
+ if (dimBounds != null && mDimmer.updateDims(t)) {
scheduleAnimation();
}
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 612fc4be70db..1d232fe99e3c 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -2923,14 +2923,15 @@ class TaskFragment extends WindowContainer<WindowContainer> {
return;
}
- mDimmer.resetDimStates();
+ final Rect dimBounds = mDimmer.resetDimStates();
super.prepareSurfaces();
- // Bounds need to be relative, as the dim layer is a child.
- final Rect dimBounds = getBounds();
- dimBounds.offsetTo(0 /* newLeft */, 0 /* newTop */);
- if (mDimmer.updateDims(getSyncTransaction(), dimBounds)) {
- scheduleAnimation();
+ if (dimBounds != null) {
+ // Bounds need to be relative, as the dim layer is a child.
+ dimBounds.offsetTo(0 /* newLeft */, 0 /* newTop */);
+ if (mDimmer.updateDims(getSyncTransaction())) {
+ scheduleAnimation();
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 736f489cf99d..6e3924baadf3 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -5177,13 +5177,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
void prepareSurfaces() {
mIsDimming = false;
- applyDims();
- updateSurfacePositionNonOrganized();
- // Send information to SurfaceFlinger about the priority of the current window.
- updateFrameRateSelectionPriorityIfNeeded();
- updateScaleIfNeeded();
-
- mWinAnimator.prepareSurfaceLocked(getSyncTransaction());
+ if (mHasSurface) {
+ applyDims();
+ updateSurfacePositionNonOrganized();
+ // Send information to SurfaceFlinger about the priority of the current window.
+ updateFrameRateSelectionPriorityIfNeeded();
+ updateScaleIfNeeded();
+ mWinAnimator.prepareSurfaceLocked(getSyncTransaction());
+ }
super.prepareSurfaces();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
index e85b574baa22..5282585e9757 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
@@ -147,8 +147,8 @@ public class DimmerTests extends WindowTestsBase {
int width = 100;
int height = 300;
- Rect bounds = new Rect(0, 0, width, height);
- mDimmer.updateDims(mTransaction, bounds);
+ mDimmer.mDimState.mDimBounds.set(0, 0, width, height);
+ mDimmer.updateDims(mTransaction);
verify(mTransaction).setWindowCrop(getDimLayer(), width, height);
verify(mTransaction).show(getDimLayer());
@@ -194,7 +194,7 @@ public class DimmerTests extends WindowTestsBase {
SurfaceControl dimLayer = getDimLayer();
mDimmer.resetDimStates();
- mDimmer.updateDims(mTransaction, new Rect());
+ mDimmer.updateDims(mTransaction);
verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any(
SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean(),
eq(ANIMATION_TYPE_DIMMER));
@@ -212,29 +212,29 @@ public class DimmerTests extends WindowTestsBase {
mDimmer.resetDimStates();
mDimmer.dimAbove(mTransaction, child, alpha);
- mDimmer.updateDims(mTransaction, new Rect());
+ mDimmer.updateDims(mTransaction);
verify(mTransaction).show(dimLayer);
verify(mTransaction, never()).remove(dimLayer);
}
@Test
public void testDimUpdateWhileDimming() {
- Rect bounds = new Rect();
TestWindowContainer child = new TestWindowContainer(mWm);
mHost.addChild(child, 0);
final float alpha = 0.8f;
mDimmer.dimAbove(mTransaction, child, alpha);
+ final Rect bounds = mDimmer.mDimState.mDimBounds;
SurfaceControl dimLayer = getDimLayer();
bounds.set(0, 0, 10, 10);
- mDimmer.updateDims(mTransaction, bounds);
+ mDimmer.updateDims(mTransaction);
verify(mTransaction).setWindowCrop(dimLayer, bounds.width(), bounds.height());
verify(mTransaction, times(1)).show(dimLayer);
verify(mTransaction).setPosition(dimLayer, 0, 0);
bounds.set(10, 10, 30, 30);
- mDimmer.updateDims(mTransaction, bounds);
+ mDimmer.updateDims(mTransaction);
verify(mTransaction).setWindowCrop(dimLayer, bounds.width(), bounds.height());
verify(mTransaction).setPosition(dimLayer, 10, 10);
}
@@ -246,13 +246,13 @@ public class DimmerTests extends WindowTestsBase {
mDimmer.dimAbove(mTransaction, child, 1);
SurfaceControl dimLayer = getDimLayer();
- mDimmer.updateDims(mTransaction, new Rect());
+ mDimmer.updateDims(mTransaction);
verify(mTransaction, times(1)).show(dimLayer);
reset(mSurfaceAnimatorStarter);
mDimmer.dontAnimateExit();
mDimmer.resetDimStates();
- mDimmer.updateDims(mTransaction, new Rect());
+ mDimmer.updateDims(mTransaction);
verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any(
SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean(),
eq(ANIMATION_TYPE_DIMMER));
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index b48fd7d60f06..fdb3502f2ce7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -691,6 +691,7 @@ public class WindowStateTests extends WindowTestsBase {
// Child window without scale (e.g. different app) should apply inverse scale of parent.
doReturn(1f).when(cmp).getCompatScale(anyString(), anyInt());
final WindowState child2 = createWindow(w, TYPE_APPLICATION_SUB_PANEL, "child2");
+ makeWindowVisible(w, child2);
clearInvocations(t);
child2.prepareSurfaces();
verify(t).setMatrix(child2.mSurfaceControl, w.mInvGlobalScale, 0, 0, w.mInvGlobalScale);