diff options
4 files changed, 15 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 1353ff09b292..e16d869fdcd9 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3751,9 +3751,11 @@ class Task extends TaskFragment { // Boost the adjacent TaskFragment for dimmer if needed. final TaskFragment taskFragment = wc.asTaskFragment(); if (taskFragment != null && taskFragment.isEmbedded()) { + taskFragment.mDimmerSurfaceBoosted = false; final TaskFragment adjacentTf = taskFragment.getAdjacentTaskFragment(); if (adjacentTf != null && adjacentTf.shouldBoostDimmer()) { adjacentTf.assignLayer(t, layer++); + adjacentTf.mDimmerSurfaceBoosted = true; } } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 78ababc6473f..a818a721f964 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -216,6 +216,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { Dimmer mDimmer = Dimmer.DIMMER_REFACTOR ? new SmoothDimmer(this) : new LegacyDimmer(this); + /** {@code true} if the dimmer surface is boosted. {@code false} otherwise. */ + boolean mDimmerSurfaceBoosted; + /** Apply the dim layer on the embedded TaskFragment. */ static final int EMBEDDED_DIM_AREA_TASK_FRAGMENT = 0; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ae5a5cb7316c..e011c07b3434 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9214,6 +9214,11 @@ public class WindowManagerService extends IWindowManager.Stub return false; } + if (taskFragment.mDimmerSurfaceBoosted) { + // Skip if the TaskFragment currently has dimmer surface boosted. + return false; + } + final ActivityRecord topActivity = taskFragment.getTask().topRunningActivity(true /* focusableOnly */); if (topActivity == null || topActivity == focusedWindow.mActivityRecord) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 01bd96b8a772..5360a1033eb4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -896,6 +896,11 @@ public class TaskFragmentTest extends WindowTestsBase { assertFalse(mWm.moveFocusToTopEmbeddedWindow(winRightTop)); // The focus should NOT change. assertEquals(winRightTop, mDisplayContent.mCurrentFocus); + + // Do not move focus if the dim is boosted. + taskFragmentLeft.mDimmerSurfaceBoosted = true; + assertFalse(mWm.moveFocusToTopEmbeddedWindow(winLeftTop)); + assertEquals(winRightTop, mDisplayContent.mCurrentFocus); } } |