From a782799b15323c9c8475e62a8dfd8f6fedb66b75 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Sat, 20 Feb 2021 12:49:03 +0800 Subject: [PATCH] Reset top focused root task when task hidden The focused app was not updated when bubble minimized and causing ANR. Bug: 179676966 Test: expand and minimize bubbles Change-Id: If04de21b954d074b045e76d7d23e02dade60cdbe --- services/core/java/com/android/server/wm/Task.java | 4 ++-- .../core/java/com/android/server/wm/TaskDisplayArea.java | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index d360916232077..d60b6e0ef81db 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -5373,11 +5373,11 @@ class Task extends WindowContainer { } final boolean wasHidden = isForceHidden(); mForceHiddenFlags = newFlags; - if (wasHidden && isFocusableAndVisible()) { + if (wasHidden != isForceHidden() && isTopActivityFocusable()) { // The change in force-hidden state will change visibility without triggering a root // task order change, so we should reset the preferred top focusable root task to ensure // it's not used if a new activity is started from this task. - getDisplayArea().resetPreferredTopFocusableRootTaskIfBelow(this); + getDisplayArea().resetPreferredTopFocusableRootTaskIfNeeded(this); } return true; } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 40248c43fe5df..badd7fda28974 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -974,9 +974,10 @@ final class TaskDisplayArea extends DisplayArea { onRootTaskOrderChanged(rootTask); } - void resetPreferredTopFocusableRootTaskIfBelow(Task task) { + /** Reset the mPreferredTopFocusableRootTask if it is or below the given task. */ + void resetPreferredTopFocusableRootTaskIfNeeded(Task task) { if (mPreferredTopFocusableRootTask != null - && mPreferredTopFocusableRootTask.compareTo(task) < 0) { + && mPreferredTopFocusableRootTask.compareTo(task) <= 0) { mPreferredTopFocusableRootTask = null; } }