From 66a576b409a75e2ce185f5251dbb182689d3455b Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 20 Dec 2021 09:48:00 +0800 Subject: [PATCH] [RESTRICT AUTOMERGE] Dimming on an embedded TaskFragment vs. parent Task Migrate the dimmer to TaskFragment and the dim surface needs to be offset relative to its parent task. Bug: 202379687 Test: verify dim in two pane Change-Id: I95fe47ebc66d419b42c1da8cc8216773c295f1d1 (cherry picked from commit 9b5881335df9095d91b6760f3f459e6e6a3bdda8) --- .../core/java/com/android/server/wm/Task.java | 1 - .../com/android/server/wm/TaskFragment.java | 30 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 33235d03439f8..1fa8f63f47fac 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -486,7 +486,6 @@ class Task extends TaskFragment { // root task moves and we in fact do so when moving from full screen to pinned. private boolean mPreserveNonFloatingState = false; - private Dimmer mDimmer = new Dimmer(this); private final Rect mTmpDimBoundsRect = new Rect(); /** @see #setCanAffectSystemUiFlags */ diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index efd51e99a26af..24b66ca3ac9c3 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -162,6 +162,8 @@ class TaskFragment extends WindowContainer { */ int mMinHeight; + Dimmer mDimmer = new Dimmer(this); + /** This task fragment will be removed when the cleanup of its children are done. */ private boolean mIsRemovalRequested; @@ -2352,6 +2354,34 @@ class TaskFragment extends WindowContainer { sendTaskFragmentVanished(); } + @Override + Dimmer getDimmer() { + // If the window is in an embedded TaskFragment, we want to dim at the TaskFragment. + if (asTask() == null) { + return mDimmer; + } + + return super.getDimmer(); + } + + @Override + void prepareSurfaces() { + if (asTask() != null) { + super.prepareSurfaces(); + return; + } + + 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(getPendingTransaction(), dimBounds)) { + scheduleAnimation(); + } + } + @Override boolean canBeAnimationTarget() { return true;