From 8fd75428b409ad926e54178ec0dcd47012255d2c Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Fri, 24 Jun 2016 14:20:37 -0700 Subject: [PATCH] Reset relaunching count is app dies during re-launch WindowManager keeps a count of how many relaunches an app is told to do so that it can defer app transtions until the relaunches are done. If the app porcess is killed during one of the relaunches the app will never report back that it is done relaunching, so app transtions into the app will not happen until will timeout from waiting for the app. We now notify WM of this situation so it can clear the relaunching count for the app. Bug: 29551109 Change-Id: Ibadba9f73e6e1bde141385aa8a0e066fbc0c5764 --- .../core/java/com/android/server/am/ActivityStack.java | 4 ++++ .../core/java/com/android/server/wm/AppWindowToken.java | 7 +++++++ .../java/com/android/server/wm/WindowManagerService.java | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 4059a675c4fdc..8fb10fdc1ea55 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3759,6 +3759,10 @@ final class ActivityStack { if (getVisibleBehindActivity() == r) { mStackSupervisor.requestVisibleBehindLocked(r, false); } + + // Clean-up activities are no longer relaunching (e.g. app process died). Notify window + // manager so it can update its bookkeeping. + mWindowManager.notifyAppRelaunchesCleared(r.appToken); } private void removeTimeoutsForActivityLocked(ActivityRecord r) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index b907da666fea0..531146eb48631 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -625,6 +625,13 @@ class AppWindowToken extends WindowToken { } } + void clearRelaunching() { + if (canFreezeBounds()) { + unfreezeBounds(); + } + mPendingRelaunchCount = 0; + } + void addWindow(WindowState w) { for (int i = allAppWindows.size() - 1; i >= 0; i--) { WindowState candidate = allAppWindows.get(i); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 54960a4ee46ca..fc0e530cedfe6 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -10206,6 +10206,15 @@ public class WindowManagerService extends IWindowManager.Stub } } + public void notifyAppRelaunchesCleared(IBinder token) { + synchronized (mWindowMap) { + final AppWindowToken appWindow = findAppWindowToken(token); + if (appWindow != null) { + appWindow.clearRelaunching(); + } + } + } + @Override public int getDockedDividerInsetsLw() { return getDefaultDisplayContentLocked().getDockedDividerController().getContentInsets();