From ec7b3c2c534e349eaf8baa09bcf3c877066f1fbe Mon Sep 17 00:00:00 2001 From: Chris Li Date: Sat, 14 Aug 2021 14:51:26 -0700 Subject: [PATCH] Not resume the invisible TaskFragment when resume top Task When a TaskFragment is covered by another resumed TaskFragment, this call would try to resume the activity in the invisible TaskFragment as well. However, because the activity would not be visible, so it would also be called to pause, which would then call to resume the top Task. It resulted a infinite recurring call of [resume, pause, ...] Bug: 189385903 Test: manually with splite demo app Change-Id: I561fec516f0585695e71508c00946355ab0764bb --- services/core/java/com/android/server/wm/Task.java | 9 ++++----- .../core/java/com/android/server/wm/TaskFragment.java | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 04b6d470467a6..e35579b90c0cc 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3114,10 +3114,6 @@ class Task extends TaskFragment { }); } - boolean isFocusableAndVisible() { - return isTopActivityFocusable() && shouldBeVisible(null /* starting */); - } - void positionChildAtTop(ActivityRecord child) { positionChildAt(child, POSITION_TOP); } @@ -5037,7 +5033,10 @@ class Task extends TaskFragment { if (topFragment == f) { return; } - + if (!f.isFocusableAndVisible()) { + // No need to resume activity in TaskFragment that is not visible. + return; + } resumed[0] |= f.resumeTopActivity(prev, options, deferPause); }, true); return resumed[0]; diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 6c31716f86347..70b0ccd764744 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1262,6 +1262,10 @@ class TaskFragment extends WindowContainer { return getVisibility(starting) != TASK_FRAGMENT_VISIBILITY_INVISIBLE; } + boolean isFocusableAndVisible() { + return isTopActivityFocusable() && shouldBeVisible(null /* starting */); + } + final boolean startPausing(boolean uiSleeping, ActivityRecord resuming, String reason) { return startPausing(mTaskSupervisor.mUserLeaving, uiSleeping, resuming, reason); }