diff options
5 files changed, 28 insertions, 13 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 9543acfba51b..804830101ffb 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -167,7 +167,7 @@ interface IWindowManager in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, int logo, int windowFlags, IBinder transferFrom, boolean createIfNeeded); void setAppVisibility(IBinder token, boolean visible); - void notifyAppStopped(IBinder token); + void notifyAppStopped(IBinder token, boolean stopped); void startAppFreezingScreen(IBinder token, int configChanges); void stopAppFreezingScreen(IBinder token, boolean force); void removeAppToken(IBinder token); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 74c836390a0b..d1e1d27af1f6 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1115,7 +1115,7 @@ final class ActivityStack { r.stopped = true; r.state = ActivityState.STOPPED; - mWindowManager.notifyAppStopped(r.appToken); + mWindowManager.notifyAppStopped(r.appToken, true); if (getVisibleBehindActivity() == r) { mStackSupervisor.requestVisibleBehindLocked(r, false); @@ -2247,6 +2247,10 @@ final class ActivityStack { next.app.thread.scheduleNewIntent(next.newIntents, next.appToken); } + // Well the app will no longer be stopped. + // Clear app token stopped state in window manager if needed. + mWindowManager.notifyAppStopped(next.appToken, false); + EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.userId, System.identityHashCode(next), next.task.taskId, next.shortComponentName); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index ecfbc0a30256..2731f42991a5 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -354,6 +354,11 @@ class AppWindowToken extends WindowToken { continue; } + if (DEBUG_ADD_REMOVE) Slog.e(TAG_WM, "win=" + win + + " destroySurfaces: mAppStopped=" + mAppStopped + + " win.mWindowRemovalAllowed=" + win.mWindowRemovalAllowed + + " win.mRemoveOnExit=" + win.mRemoveOnExit); + win.destroyOrSaveSurface(); if (win.mRemoveOnExit) { win.mAnimatingExit = false; @@ -372,15 +377,19 @@ class AppWindowToken extends WindowToken { } } - // The application has stopped, so destroy any surfaces which were keeping alive - // in case they were still being used. - void notifyAppStopped() { - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppStopped: " + this); - mAppStopped = true; - destroySurfaces(); + /** + * If the application has stopped it is okay to destroy any surfaces which were keeping alive + * in case they were still being used. + */ + void notifyAppStopped(boolean stopped) { + if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppStopped: stopped=" + stopped + " " + this); + mAppStopped = stopped; - // Remove any starting window that was added for this app if they are still around. - mTask.mService.scheduleRemoveStartingWindowLocked(this); + if (stopped) { + destroySurfaces(); + // Remove any starting window that was added for this app if they are still around. + mTask.mService.scheduleRemoveStartingWindowLocked(this); + } } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 7c2a8e338557..b64aaa89475a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4197,7 +4197,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void notifyAppStopped(IBinder token) { + public void notifyAppStopped(IBinder token, boolean stopped) { if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, "notifyAppStopped()")) { throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); @@ -4210,7 +4210,7 @@ public class WindowManagerService extends IWindowManager.Stub Slog.w(TAG_WM, "Attempted to set visibility of non-existing app token: " + token); return; } - wtoken.notifyAppStopped(); + wtoken.notifyAppStopped(stopped); } } @@ -4247,6 +4247,8 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.appDied = false; wtoken.removeAllWindows(); } else if (visible) { + if (DEBUG_ADD_REMOVE) Slog.v( + TAG_WM, "No longer Stopped: " + wtoken); wtoken.mAppStopped = false; wtoken.setWindowsExiting(false); } diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index d2103c811d3e..97195e4b32da 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -349,7 +349,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void notifyAppStopped(IBinder token) throws RemoteException { + public void notifyAppStopped(IBinder token, boolean stopped) throws RemoteException { // TODO Auto-generated method stub } |