Merge "Destroy saved surfaces if one of the last visible windows gets removed" into nyc-dev am: 15818e1156
am: 51cc0f48d7
* commit '51cc0f48d7730efacaee77b8479aeec81cff2d17':
Destroy saved surfaces if one of the last visible windows gets removed
Change-Id: I14fad31b6a9a4947e29d6fbe10c15e5122b95f1c
This commit is contained in:
@@ -451,6 +451,16 @@ class AppWindowToken extends WindowToken {
|
|||||||
destroySurfaces();
|
destroySurfaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void markSavedSurfaceExiting() {
|
||||||
|
for (int i = allAppWindows.size() - 1; i >= 0; i--) {
|
||||||
|
final WindowState w = allAppWindows.get(i);
|
||||||
|
if (w.isAnimatingInvisibleWithSavedSurface()) {
|
||||||
|
w.mAnimatingExit = true;
|
||||||
|
w.mWinAnimator.mAnimating = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void restoreSavedSurfaces() {
|
void restoreSavedSurfaces() {
|
||||||
if (!canRestoreSurfaces()) {
|
if (!canRestoreSurfaces()) {
|
||||||
clearVisibleBeforeClientHidden();
|
clearVisibleBeforeClientHidden();
|
||||||
|
|||||||
@@ -2277,6 +2277,19 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupWindowForRemoveOnExit(WindowState win) {
|
||||||
|
win.mRemoveOnExit = true;
|
||||||
|
win.setDisplayLayoutNeeded();
|
||||||
|
// Request a focus update as this window's input channel is already gone. Otherwise
|
||||||
|
// we could have no focused window in input manager.
|
||||||
|
final boolean focusChanged = updateFocusedWindowLocked(
|
||||||
|
UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
|
||||||
|
mWindowPlacerLocked.performSurfacePlacement();
|
||||||
|
if (focusChanged) {
|
||||||
|
mInputMonitor.updateInputWindowsLw(false /*force*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void removeWindow(Session session, IWindow client) {
|
public void removeWindow(Session session, IWindow client) {
|
||||||
synchronized(mWindowMap) {
|
synchronized(mWindowMap) {
|
||||||
WindowState win = windowForClientLocked(session, client, false);
|
WindowState win = windowForClientLocked(session, client, false);
|
||||||
@@ -2358,14 +2371,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
// Do not set mAnimatingExit to true here, it will cause the surface to be hidden
|
// Do not set mAnimatingExit to true here, it will cause the surface to be hidden
|
||||||
// immediately after the enter animation is done. If the app is not yet drawn then
|
// immediately after the enter animation is done. If the app is not yet drawn then
|
||||||
// it will show up as a flicker.
|
// it will show up as a flicker.
|
||||||
win.mRemoveOnExit = true;
|
setupWindowForRemoveOnExit(win);
|
||||||
// Request a focus update as this window's input channel is already gone. Otherwise
|
|
||||||
// we could have no focused window in input manager.
|
|
||||||
final boolean focusChanged = updateFocusedWindowLocked(
|
|
||||||
UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
|
|
||||||
if (focusChanged) {
|
|
||||||
mInputMonitor.updateInputWindowsLw(false /*force*/);
|
|
||||||
}
|
|
||||||
Binder.restoreCallingIdentity(origId);
|
Binder.restoreCallingIdentity(origId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2417,17 +2423,10 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
// The exit animation is running or should run... wait for it!
|
// The exit animation is running or should run... wait for it!
|
||||||
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM,
|
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM,
|
||||||
"Not removing " + win + " due to exit animation ");
|
"Not removing " + win + " due to exit animation ");
|
||||||
win.mRemoveOnExit = true;
|
setupWindowForRemoveOnExit(win);
|
||||||
win.setDisplayLayoutNeeded();
|
|
||||||
final boolean focusChanged = updateFocusedWindowLocked(
|
|
||||||
UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
|
|
||||||
mWindowPlacerLocked.performSurfacePlacement();
|
|
||||||
if (appToken != null) {
|
if (appToken != null) {
|
||||||
appToken.updateReportedVisibilityLocked();
|
appToken.updateReportedVisibilityLocked();
|
||||||
}
|
}
|
||||||
if (focusChanged) {
|
|
||||||
mInputMonitor.updateInputWindowsLw(false /*force*/);
|
|
||||||
}
|
|
||||||
Binder.restoreCallingIdentity(origId);
|
Binder.restoreCallingIdentity(origId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2111,7 +2111,9 @@ final class WindowState implements WindowManagerPolicy.WindowState {
|
|||||||
void clearHasSavedSurface() {
|
void clearHasSavedSurface() {
|
||||||
mSurfaceSaved = false;
|
mSurfaceSaved = false;
|
||||||
mAnimatingWithSavedSurface = false;
|
mAnimatingWithSavedSurface = false;
|
||||||
mWasVisibleBeforeClientHidden = false;
|
if (mWasVisibleBeforeClientHidden) {
|
||||||
|
mAppToken.destroySavedSurfaces();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean clearAnimatingWithSavedSurface() {
|
boolean clearAnimatingWithSavedSurface() {
|
||||||
|
|||||||
@@ -1301,6 +1301,14 @@ class WindowSurfacePlacer {
|
|||||||
appsCount = mService.mClosingApps.size();
|
appsCount = mService.mClosingApps.size();
|
||||||
for (int i = 0; i < appsCount; i++) {
|
for (int i = 0; i < appsCount; i++) {
|
||||||
AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
|
AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
|
||||||
|
|
||||||
|
// If we still have some windows animating with saved surfaces that's
|
||||||
|
// either invisible or already removed, mark them exiting so that they
|
||||||
|
// are disposed of after the exit animation. These are not supposed to
|
||||||
|
// be shown, or are delayed removal until app is actually drawn (in which
|
||||||
|
// case the window will be removed after the animation).
|
||||||
|
wtoken.markSavedSurfaceExiting();
|
||||||
|
|
||||||
final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
|
final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
|
||||||
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
|
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
|
||||||
appAnimator.clearThumbnail();
|
appAnimator.clearThumbnail();
|
||||||
|
|||||||
Reference in New Issue
Block a user