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;