From 9b5881335df9095d91b6760f3f459e6e6a3bdda8 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 20 Dec 2021 09:48:00 +0800 Subject: [PATCH] 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 --- .../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 3e558114abdcc..39f30e4aefe48 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -473,7 +473,6 @@ class Task extends TaskFragment { // to layout without loading all the task snapshots final PersistedTaskSnapshotData mLastTaskSnapshotData; - 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 97cb512455f66..956df7cba24c7 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -161,6 +161,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; @@ -2337,6 +2339,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;