diff options
5 files changed, 37 insertions, 21 deletions
diff --git a/graphics/java/android/graphics/Point.java b/graphics/java/android/graphics/Point.java index 3bd17fa6b8f3..abcccbdbc9fb 100644 --- a/graphics/java/android/graphics/Point.java +++ b/graphics/java/android/graphics/Point.java @@ -99,7 +99,7 @@ public class Point implements Parcelable { /** @hide */ public void printShortString(PrintWriter pw) { - pw.println("["); pw.print(x); pw.print(","); pw.print(y); pw.print("]"); + pw.print("["); pw.print(x); pw.print(","); pw.print(y); pw.print("]"); } /** diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 5a1ed582358c..d18c85414683 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -114,11 +114,14 @@ class AppWindowToken extends WindowToken { // This application will have its window replaced due to relaunch. This allows window manager // to differentiate between simple removal of a window and replacement. In the latter case it // will preserve the old window until the new one is drawn. - boolean mReplacingWindow; + boolean mWillReplaceWindow; // If true, the replaced window was already requested to be removed. boolean mReplacingRemoveRequested; // Whether the replacement of the window should trigger app transition animation. boolean mAnimateReplacingWindow; + // If not null, the window that will be used to replace the old one. This is being set when + // the window is added and unset when this window reports its first draw. + WindowState mReplacingWindow; AppWindowToken(WindowManagerService _service, IApplicationToken _token, boolean _voiceInteraction) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 643c471086d5..76a8e255d179 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1327,8 +1327,14 @@ public class WindowManagerService extends IWindowManager.Stub addAttachedWindowToListLocked(win, addToToken); } - if (win.mAppToken != null && addToToken) { - win.mAppToken.allAppWindows.add(win); + final AppWindowToken appToken = win.mAppToken; + if (appToken != null) { + if (addToToken) { + appToken.allAppWindows.add(win); + } + if (appToken.mWillReplaceWindow) { + appToken.mReplacingWindow = win; + } } } @@ -2053,7 +2059,7 @@ public class WindowManagerService extends IWindowManager.Stub } private void prepareWindowReplacementTransition(AppWindowToken atoken) { - if (atoken == null || !atoken.mReplacingWindow || !atoken.mAnimateReplacingWindow) { + if (atoken == null || !atoken.mWillReplaceWindow || !atoken.mAnimateReplacingWindow) { return; } atoken.allDrawn = false; @@ -2157,6 +2163,8 @@ public class WindowManagerService extends IWindowManager.Stub + " isAnimating=" + win.mWinAnimator.isAnimating() + " app-animation=" + (win.mAppToken != null ? win.mAppToken.mAppAnimator.animation : null) + + " mWillReplaceWindow=" + + (win.mAppToken != null ? win.mAppToken.mWillReplaceWindow : false) + " inPendingTransaction=" + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false) + " mDisplayFrozen=" + mDisplayFrozen); @@ -2168,8 +2176,8 @@ public class WindowManagerService extends IWindowManager.Stub // animation wouldn't be seen. if (win.mHasSurface && okToDisplay()) { final AppWindowToken appToken = win.mAppToken; - if (appToken != null && appToken.mReplacingWindow) { - // This window is going to be replaced. We need to kepp it around until the new one + if (appToken != null && appToken.mWillReplaceWindow) { + // This window is going to be replaced. We need to keep it around until the new one // gets added, then we will get rid of this one. if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Preserving " + win + " until the new one is " + "added"); @@ -2833,7 +2841,8 @@ public class WindowManagerService extends IWindowManager.Stub try { synchronized (mWindowMap) { WindowState win = windowForClientLocked(session, client, false); - if (DEBUG_ADD_REMOVE) Slog.d(TAG, "finishDrawingWindow: " + win); + if (DEBUG_ADD_REMOVE) Slog.d(TAG, "finishDrawingWindow: " + win + " mDrawState=" + + (win != null ? win.mWinAnimator.drawStateToString() : "null")); if (win != null && win.mWinAnimator.finishDrawingLocked()) { if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { getDefaultDisplayContentLocked().pendingLayoutChanges |= @@ -3920,7 +3929,7 @@ public class WindowManagerService extends IWindowManager.Stub // transition animation // * or this is an opening app and windows are being replaced. if (wtoken.hidden == visible || (wtoken.hidden && wtoken.mIsExiting) || - (visible && wtoken.mReplacingWindow)) { + (visible && wtoken.mWillReplaceWindow)) { boolean changed = false; if (DEBUG_APP_TRANSITIONS) Slog.v( TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden @@ -8358,7 +8367,7 @@ public class WindowManagerService extends IWindowManager.Stub final int numTokens = tokens.size(); for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) { final AppWindowToken wtoken = tokens.get(tokenNdx); - if (wtoken.mIsExiting && !wtoken.mReplacingWindow) { + if (wtoken.mIsExiting && !wtoken.mWillReplaceWindow) { continue; } i = reAddAppWindowsLocked(displayContent, i, wtoken); @@ -8428,7 +8437,8 @@ public class WindowManagerService extends IWindowManager.Stub } else if (wtoken != null) { winAnimator.mAnimLayer = w.mLayer + wtoken.mAppAnimator.animLayerAdjustment; - if (wtoken.mReplacingWindow && wtoken.mAnimateReplacingWindow) { + if (wtoken.mWillReplaceWindow && wtoken.mAnimateReplacingWindow && + wtoken.mReplacingWindow != w) { // We know that we will be animating a relaunching window in the near future, // which will receive a z-order increase. We want the replaced window to // immediately receive the same treatment, e.g. to be above the dock divider. @@ -9974,7 +9984,9 @@ public class WindowManagerService extends IWindowManager.Stub Slog.w(TAG, "Attempted to set replacing window on non-existing app token " + token); return; } - appWindowToken.mReplacingWindow = true; + if (DEBUG_ADD_REMOVE) Slog.d(TAG, "Marking app token " + appWindowToken + + " as replacing window."); + appWindowToken.mWillReplaceWindow = true; appWindowToken.mAnimateReplacingWindow = animate; } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 7ea64f153061..42a0e9da49b8 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -28,6 +28,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static com.android.server.wm.WindowManagerService.DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowManagerService.DEBUG_CONFIGURATION; import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT; import static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; @@ -55,7 +56,6 @@ import android.content.res.Configuration; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.Rect; -import android.graphics.RectF; import android.graphics.Region; import android.os.IBinder; import android.os.RemoteException; @@ -446,7 +446,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { + WindowManagerService.TYPE_LAYER_OFFSET; mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type); mAttachedWindow = attachedWindow; - if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow); + if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + + mAttachedWindow); final WindowList childWindows = mAttachedWindow.mChildWindows; final int numChildWindows = childWindows.size(); @@ -552,7 +553,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { @Override public void computeFrameLw(Rect pf, Rect df, Rect of, Rect cf, Rect vf, Rect dcf, Rect sf, Rect osf) { - if (mAppToken != null && mAppToken.mReplacingWindow + if (mAppToken != null && mAppToken.mWillReplaceWindow && (mExiting || !mAppToken.mReplacingRemoveRequested)) { // This window is being replaced and either already got information that it's being // removed or we are still waiting for some information. Because of this we don't @@ -1307,10 +1308,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { void maybeRemoveReplacedWindow() { AppWindowToken token = mAppToken; - if (token != null && token.mReplacingWindow) { - token.mReplacingWindow = false; + if (token != null && token.mWillReplaceWindow && token.mReplacingWindow == this) { + if (DEBUG_ADD_REMOVE) Slog.d(TAG, "Removing replacing window: " + this); + token.mWillReplaceWindow = false; token.mAnimateReplacingWindow = false; token.mReplacingRemoveRequested = false; + token.mReplacingWindow = null; for (int i = token.allAppWindows.size() - 1; i >= 0; i--) { WindowState win = token.allAppWindows.get(i); if (win.mExiting) { diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 1754123d0546..9344b8d51f4f 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -38,7 +38,6 @@ import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; -import android.graphics.RectF; import android.graphics.Region; import android.os.Debug; import android.os.RemoteException; @@ -1428,7 +1427,7 @@ class WindowStateAnimator { // living in a different stack. If we suddenly crop it to the new stack bounds, it might // get cut off. We don't want it to happen, so we let it ignore the stack bounds until it // gets removed. The window that will replace it will abide them. - if (appToken != null && appToken.mCropWindowsToStack && !appToken.mReplacingWindow) { + if (appToken != null && appToken.mCropWindowsToStack && !appToken.mWillReplaceWindow) { TaskStack stack = w.getTask().mStack; stack.getBounds(mTmpStackBounds); // When we resize we use the big surface approach, which means we can't trust the @@ -1854,8 +1853,7 @@ class WindowStateAnimator { } } - if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING - && mWin.mAppToken != null) { + if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING && mWin.mAppToken != null) { mWin.mAppToken.firstWindowDrawn = true; if (mWin.mAppToken.startingData != null) { |