From 16064f9f183e4a07cd361042dad660aadf84dc9c Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 25 Mar 2010 00:47:24 -0700 Subject: [PATCH] Fix issue #2543231: chat invitation dialog does show all the time We were forgetting to re-assign layers after re-ordering windows after an app token transaction. Change-Id: I448c0b9da644e027c3edff3ae8a4afa79da292d1 --- .../android/server/WindowManagerService.java | 96 ++++++++++++++----- 1 file changed, 71 insertions(+), 25 deletions(-) diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index fdb67f8fe567b..a1cf86878f951 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -7062,6 +7062,12 @@ public class WindowManagerService extends IWindowManager.Stub // Is this window now (or just being) removed? boolean mRemoved; + // For debugging, this is the last information given to the surface flinger. + boolean mSurfaceShown; + int mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH; + int mSurfaceLayer; + float mSurfaceAlpha; + WindowState(Session s, IWindow c, WindowToken token, WindowState attachedWindow, WindowManager.LayoutParams a, int viewVisibility) { @@ -7352,6 +7358,13 @@ public class WindowManagerService extends IWindowManager.Stub if (w <= 0) w = 1; if (h <= 0) h = 1; + mSurfaceShown = false; + mSurfaceLayer = 0; + mSurfaceAlpha = 1; + mSurfaceX = 0; + mSurfaceY = 0; + mSurfaceW = w; + mSurfaceH = h; try { mSurface = new Surface( mSession.mSurfaceSession, mSession.mPid, @@ -7387,9 +7400,12 @@ public class WindowManagerService extends IWindowManager.Stub Surface.openTransaction(); try { try { - mSurface.setPosition(mFrame.left + mXOffset, - mFrame.top + mYOffset); + mSurfaceX = mFrame.left + mXOffset; + mSurfaceY = mFrame.top = mYOffset; + mSurface.setPosition(mSurfaceX, mSurfaceY); + mSurfaceLayer = mAnimLayer; mSurface.setLayer(mAnimLayer); + mSurfaceShown = false; mSurface.hide(); if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_DITHER) != 0) { if (SHOW_TRANSACTIONS) logSurface(this, "DITHER", null); @@ -7472,6 +7488,7 @@ public class WindowManagerService extends IWindowManager.Stub + ": " + e.toString()); } + mSurfaceShown = false; mSurface = null; } } @@ -7731,6 +7748,7 @@ public class WindowManagerService extends IWindowManager.Stub mDestroySurface.add(this); mDestroying = true; if (SHOW_TRANSACTIONS) logSurface(this, "HIDE (finishExit)", null); + mSurfaceShown = false; try { mSurface.hide(); } catch (RuntimeException e) { @@ -8196,6 +8214,13 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mLastLayer="); pw.println(mLastLayer); if (mSurface != null) { pw.print(prefix); pw.print("mSurface="); pw.println(mSurface); + pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); + pw.print(" layer="); pw.print(mSurfaceLayer); + pw.print(" alpha="); pw.print(mSurfaceAlpha); + pw.print(" rect=("); pw.print(mSurfaceX); + pw.print(","); pw.print(mSurfaceY); + pw.print(") "); pw.print(mSurfaceW); + pw.print(" x "); pw.println(mSurfaceH); } pw.print(prefix); pw.print("mToken="); pw.println(mToken); pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken); @@ -9960,6 +9985,8 @@ public class WindowManagerService extends IWindowManager.Stub } } + int adjResult = 0; + if (!animating && mAppTransitionRunning) { // We have finished the animation of an app transition. To do // this, we have delayed a lot of operations like showing and @@ -9973,6 +10000,7 @@ public class WindowManagerService extends IWindowManager.Stub rebuildAppWindowListLocked(); changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; + adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED; moveInputMethodWindowsIfNeededLocked(false); wallpaperMayChange = true; // Since the window list has been rebuilt, focus might @@ -9981,8 +10009,6 @@ public class WindowManagerService extends IWindowManager.Stub mFocusMayChange = true; } - int adjResult = 0; - if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) { // At this point, there was a window with a wallpaper that // was force hiding other windows behind it, but now it @@ -10007,7 +10033,7 @@ public class WindowManagerService extends IWindowManager.Stub changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; } } - adjResult = adjustWallpaperWindowsLocked(); + adjResult |= adjustWallpaperWindowsLocked(); wallpaperMayChange = false; wallpaperForceHidingChanged = false; if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper @@ -10039,7 +10065,7 @@ public class WindowManagerService extends IWindowManager.Stub if (wallpaperMayChange) { if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper may change! Adjusting"); - adjResult = adjustWallpaperWindowsLocked(); + adjResult |= adjustWallpaperWindowsLocked(); } if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { @@ -10127,6 +10153,8 @@ public class WindowManagerService extends IWindowManager.Stub if (SHOW_TRANSACTIONS) logSurface(w, "POS " + w.mShownFrame.left + ", " + w.mShownFrame.top, null); + w.mSurfaceX = w.mShownFrame.left; + w.mSurfaceY = w.mShownFrame.top; w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top); } catch (RuntimeException e) { Slog.w(TAG, "Error positioning surface in " + w, e); @@ -10152,7 +10180,11 @@ public class WindowManagerService extends IWindowManager.Stub + w.mShownFrame.width() + "x" + w.mShownFrame.height(), null); w.mSurfaceResized = true; + w.mSurfaceW = width; + w.mSurfaceH = height; w.mSurface.setSize(width, height); + w.mSurfaceX = w.mShownFrame.left; + w.mSurfaceY = w.mShownFrame.top; w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top); } catch (RuntimeException e) { @@ -10245,6 +10277,7 @@ public class WindowManagerService extends IWindowManager.Stub if (SHOW_TRANSACTIONS) logSurface(w, "HIDE (performLayout)", null); if (w.mSurface != null) { + w.mSurfaceShown = false; try { w.mSurface.hide(); } catch (RuntimeException e) { @@ -10290,7 +10323,9 @@ public class WindowManagerService extends IWindowManager.Stub + "," + (w.mDtDy*w.mVScale) + "]", null); if (w.mSurface != null) { try { + w.mSurfaceAlpha = w.mShownAlpha; w.mSurface.setAlpha(w.mShownAlpha); + w.mSurfaceLayer = w.mAnimLayer; w.mSurface.setLayer(w.mAnimLayer); w.mSurface.setMatrix( w.mDsDx*w.mHScale, w.mDtDx*w.mVScale, @@ -10427,14 +10462,13 @@ public class WindowManagerService extends IWindowManager.Stub mDimAnimator = new DimAnimator(mFxSession); } mDimAnimator.show(dw, dh); + mDimAnimator.updateParameters(w, currentTime); } - mDimAnimator.updateParameters(w, currentTime); } if ((attrFlags&FLAG_BLUR_BEHIND) != 0) { if (!blurring) { //Slog.i(TAG, "BLUR BEHIND: " + w); blurring = true; - mBlurShown = true; if (mBlurSurface == null) { if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface + ": CREATE"); @@ -10448,20 +10482,25 @@ public class WindowManagerService extends IWindowManager.Stub Slog.e(TAG, "Exception creating Blur surface", e); } } - if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " - + mBlurSurface + ": SHOW pos=(0,0) (" + - dw + "x" + dh + "), layer=" + (w.mAnimLayer-1)); if (mBlurSurface != null) { + if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + + mBlurSurface + ": pos=(0,0) (" + + dw + "x" + dh + "), layer=" + (w.mAnimLayer-1)); mBlurSurface.setPosition(0, 0); mBlurSurface.setSize(dw, dh); - try { - mBlurSurface.show(); - } catch (RuntimeException e) { - Slog.w(TAG, "Failure showing blur surface", e); + mBlurSurface.setLayer(w.mAnimLayer-2); + if (!mBlurShown) { + try { + if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + + mBlurSurface + ": SHOW"); + mBlurSurface.show(); + } catch (RuntimeException e) { + Slog.w(TAG, "Failure showing blur surface", e); + } + mBlurShown = true; } } } - mBlurSurface.setLayer(w.mAnimLayer-2); } } } @@ -10613,6 +10652,7 @@ public class WindowManagerService extends IWindowManager.Stub mAppTransitionRunning = false; needRelayout = true; rebuildAppWindowListLocked(); + assignLayersLocked(); // Clear information about apps that were moving. mToBottomApps.clear(); } @@ -10677,6 +10717,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean showSurfaceRobustlyLocked(WindowState win) { try { if (win.mSurface != null) { + win.mSurfaceShown = true; win.mSurface.show(); if (win.mTurnOnScreen) { if (DEBUG_VISIBILITY) Slog.v(TAG, @@ -10723,6 +10764,7 @@ public class WindowManagerService extends IWindowManager.Stub + " pid=" + ws.mSession.mPid + " uid=" + ws.mSession.mUid); ws.mSurface.destroy(); + ws.mSurfaceShown = false; ws.mSurface = null; mForceRemoves.add(ws); i--; @@ -10733,6 +10775,7 @@ public class WindowManagerService extends IWindowManager.Stub + ws + " surface=" + ws.mSurface + " token=" + win.mAppToken); ws.mSurface.destroy(); + ws.mSurfaceShown = false; ws.mSurface = null; leakedSurface = true; } @@ -10769,6 +10812,7 @@ public class WindowManagerService extends IWindowManager.Stub Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry."); if (surface != null) { surface.destroy(); + win.mSurfaceShown = false; win.mSurface = null; } @@ -11245,15 +11289,17 @@ public class WindowManagerService extends IWindowManager.Stub * Show the dim surface. */ void show(int dw, int dh) { - if (SHOW_TRANSACTIONS) Slog.i(TAG, " DIM " + mDimSurface + ": SHOW pos=(0,0) (" + - dw + "x" + dh + ")"); - mDimShown = true; - try { - mDimSurface.setPosition(0, 0); - mDimSurface.setSize(dw, dh); - mDimSurface.show(); - } catch (RuntimeException e) { - Slog.w(TAG, "Failure showing dim surface", e); + if (!mDimShown) { + if (SHOW_TRANSACTIONS) Slog.i(TAG, " DIM " + mDimSurface + ": SHOW pos=(0,0) (" + + dw + "x" + dh + ")"); + mDimShown = true; + try { + mDimSurface.setPosition(0, 0); + mDimSurface.setSize(dw, dh); + mDimSurface.show(); + } catch (RuntimeException e) { + Slog.w(TAG, "Failure showing dim surface", e); + } } }