diff options
| author | 2012-04-02 12:54:54 -0700 | |
|---|---|---|
| committer | 2012-04-02 12:54:54 -0700 | |
| commit | c8bc97e53044cd62c0e023fdc441fd13127d0283 (patch) | |
| tree | 9cf90df6164fbcad6c6644c4ce385fae9865db63 | |
| parent | b76a5608ecd05360daf484fae33ef88df285e038 (diff) | |
Further isolate the Surface from WindowState.
Replace references to mWinAnimator.mSurface with new member
mHasSurface.
Clean up odd looping structures.
Simplify logging.
Change-Id: I9cc52a657044220d7b92528928b11bb18a724aef
4 files changed, 59 insertions, 48 deletions
diff --git a/services/java/com/android/server/wm/AppWindowToken.java b/services/java/com/android/server/wm/AppWindowToken.java index d1f1b44c69fd..09e99a5cc1ae 100644 --- a/services/java/com/android/server/wm/AppWindowToken.java +++ b/services/java/com/android/server/wm/AppWindowToken.java @@ -376,7 +376,8 @@ class AppWindowToken extends WindowToken { int numDrawn = 0; boolean nowGone = true; - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "Update reported visibility: " + this); + if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, + "Update reported visibility: " + this); final int N = allAppWindows.size(); for (int i=0; i<N; i++) { WindowState win = allAppWindows.get(i); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index a2dfd916054f..28f453460a54 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -2314,7 +2314,7 @@ public class WindowManagerService extends IWindowManager.Stub // to hold off on removing the window until the animation is done. // If the display is frozen, just remove immediately, since the // animation wouldn't be seen. - if (win.mWinAnimator.mSurface != null && okToDisplay()) { + if (win.mHasSurface && okToDisplay()) { // If we are not currently running the exit animation, we // need to see about starting one. wasVisible = win.isWinVisibleLw(); @@ -2458,8 +2458,7 @@ public class WindowManagerService extends IWindowManager.Stub } static void logSurface(WindowState w, String msg, RuntimeException where) { - String str = " SURFACE " + Integer.toHexString(w.hashCode()) - + ": " + msg + " / " + w.mAttrs.getTitle(); + String str = " SURFACE " + msg + ": " + w; if (where != null) { Slog.i(TAG, str, where); } else { @@ -2481,15 +2480,14 @@ public class WindowManagerService extends IWindowManager.Stub try { synchronized (mWindowMap) { WindowState w = windowForClientLocked(session, client, false); - WindowStateAnimator winAnimator = w.mWinAnimator; - if ((w != null) && (winAnimator.mSurface != null)) { + if ((w != null) && w.mHasSurface) { if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setTransparentRegion"); Surface.openTransaction(); try { if (SHOW_TRANSACTIONS) logSurface(w, "transparentRegionHint=" + region, null); - winAnimator.mSurface.setTransparentRegionHint(region); + w.mWinAnimator.mSurface.setTransparentRegionHint(region); } finally { Surface.closeTransaction(); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, @@ -2618,10 +2616,10 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { WindowState win = windowForClientLocked(session, client, false); - WindowStateAnimator winAnimator = win.mWinAnimator; if (win == null) { return 0; } + WindowStateAnimator winAnimator = win.mWinAnimator; if (win.mRequestedWidth != requestedWidth || win.mRequestedHeight != requestedHeight) { win.mLayoutNeeded = true; @@ -2702,6 +2700,7 @@ public class WindowManagerService extends IWindowManager.Stub displayed = !win.isVisibleLw(); if (win.mExiting) { winAnimator.cancelExitAnimationForNextAnimationLocked(); + win.mExiting = false; } if (win.mDestroying) { win.mDestroying = false; @@ -2740,7 +2739,7 @@ public class WindowManagerService extends IWindowManager.Stub surfaceChanged = true; } try { - if (winAnimator.mSurface == null) { + if (!win.mHasSurface) { surfaceChanged = true; } Surface surface = winAnimator.createSurfaceLocked(); @@ -3416,15 +3415,13 @@ public class WindowManagerService extends IWindowManager.Stub } public int getOrientationFromAppTokensLocked() { - int pos = mAppTokens.size() - 1; int curGroup = 0; int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; boolean findingBehind = false; boolean haveGroup = false; boolean lastFullscreen = false; - while (pos >= 0) { + for (int pos = mAppTokens.size() - 1; pos >= 0; pos--) { AppWindowToken wtoken = mAppTokens.get(pos); - pos--; if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken); @@ -4138,7 +4135,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState w = wtoken.allAppWindows.get(i); if (w.mAppFreezing) { w.mAppFreezing = false; - if (w.mWinAnimator.mSurface != null && !w.mOrientationChanging) { + if (w.mHasSurface && !w.mOrientationChanging) { if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w); w.mOrientationChanging = true; } @@ -4726,7 +4723,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { for (int i=mWindows.size()-1; i>=0; i--) { WindowState w = mWindows.get(i); - if (w.mWinAnimator.mSurface != null) { + if (w.mHasSurface) { try { w.mClient.closeSystemDialogs(reason); } catch (RemoteException e) { @@ -5198,7 +5195,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean including = false; for (int i=mWindows.size()-1; i>=0; i--) { WindowState ws = mWindows.get(i); - if (ws.mWinAnimator.mSurface == null) { + if (!ws.mHasSurface) { continue; } if (ws.mLayer >= aboveAppLayer) { @@ -5512,7 +5509,7 @@ public class WindowManagerService extends IWindowManager.Stub for (int i=mWindows.size()-1; i>=0; i--) { WindowState w = mWindows.get(i); - if (w.mWinAnimator.mSurface != null) { + if (w.mHasSurface) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w); w.mOrientationChanging = true; } @@ -8027,7 +8024,7 @@ public class WindowManagerService extends IWindowManager.Stub mAnimator.mForceHiding = false; for (int i=mWindows.size()-1; i>=0; i--) { WindowState w = mWindows.get(i); - if (w.mWinAnimator.mSurface != null) { + if (w.mHasSurface) { final WindowManager.LayoutParams attrs = w.mAttrs; if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) { if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows"); @@ -8127,7 +8124,7 @@ public class WindowManagerService extends IWindowManager.Stub final int attrFlags = attrs.flags; final boolean canBeSeen = w.isDisplayedLw(); - if (w.mWinAnimator.mSurface != null) { + if (w.mHasSurface) { if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { mInnerFields.mHoldScreen = w.mSession; } @@ -8279,7 +8276,7 @@ public class WindowManagerService extends IWindowManager.Stub mPolicy.beginAnimationLw(dw, dh); for (i = mWindows.size() - 1; i >= 0; i--) { WindowState w = mWindows.get(i); - if (w.mWinAnimator.mSurface != null) { + if (w.mHasSurface) { mPolicy.animatingWindowLw(w, w.mAttrs); } } @@ -8397,7 +8394,7 @@ public class WindowManagerService extends IWindowManager.Stub updateResizingWindows(w); // Moved from updateWindowsAndWallpaperLocked(). - if (winAnimator.mSurface != null) { + if (w.mHasSurface) { // Take care of the window being ready to display. if (winAnimator.commitFinishDrawingLocked(currentTime)) { if ((w.mAttrs.flags @@ -8456,10 +8453,8 @@ public class WindowManagerService extends IWindowManager.Stub stopFreezingDisplayLocked(); } - i = mResizingWindows.size(); - if (i > 0) { - do { - i--; + if (!mResizingWindows.isEmpty()) { + for (i = mResizingWindows.size() - 1; i >= 0; i--) { WindowState win = mResizingWindows.get(i); final WindowStateAnimator winAnimator = win.mWinAnimator; try { @@ -8490,7 +8485,7 @@ public class WindowManagerService extends IWindowManager.Stub } catch (RemoteException e) { win.mOrientationChanging = false; } - } while (i > 0); + } mResizingWindows.clear(); } @@ -8725,6 +8720,7 @@ public class WindowManagerService extends IWindowManager.Stub wsa.mSurface.destroy(); wsa.mSurfaceShown = false; wsa.mSurface = null; + ws.mHasSurface = false; mForceRemoves.add(ws); i--; N--; @@ -8737,6 +8733,7 @@ public class WindowManagerService extends IWindowManager.Stub wsa.mSurface.destroy(); wsa.mSurfaceShown = false; wsa.mSurface = null; + ws.mHasSurface = false; leakedSurface = true; } } @@ -8775,6 +8772,7 @@ public class WindowManagerService extends IWindowManager.Stub surface.destroy(); winAnimator.mSurfaceShown = false; winAnimator.mSurface = null; + winAnimator.mWin.mHasSurface = false; } try { diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 7f6342962678..f8795e35187c 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -246,6 +246,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { final WindowStateAnimator mWinAnimator; + boolean mHasSurface = false; + WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token, WindowState attachedWindow, int seq, WindowManager.LayoutParams a, int viewVisibility) { @@ -609,7 +611,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ public boolean isVisibleLw() { final AppWindowToken atoken = mAppToken; - return mWinAnimator.mSurface != null && mPolicyVisibility && !mAttachedHidden + return mHasSurface && mPolicyVisibility && !mAttachedHidden && (atoken == null || !atoken.hiddenRequested) && !mExiting && !mDestroying; } @@ -630,7 +632,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { final AppWindowToken atoken = mAppToken; final boolean animating = atoken != null ? (atoken.animation != null) : false; - return mWinAnimator.mSurface != null && !mDestroying && !mExiting + return mHasSurface && !mDestroying && !mExiting && (atoken == null ? mPolicyVisibility : !atoken.hiddenRequested) && ((!mAttachedHidden && mViewVisibility == View.VISIBLE && !mRootToken.hidden) @@ -644,7 +646,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ public boolean isWinVisibleLw() { final AppWindowToken atoken = mAppToken; - return mWinAnimator.mSurface != null && mPolicyVisibility && !mAttachedHidden + return mHasSurface && mPolicyVisibility && !mAttachedHidden && (atoken == null || !atoken.hiddenRequested || atoken.animating) && !mExiting && !mDestroying; } @@ -654,7 +656,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { * the associated app token, not the pending requested hidden state. */ boolean isVisibleNow() { - return mWinAnimator.mSurface != null && mPolicyVisibility && !mAttachedHidden + return mHasSurface && mPolicyVisibility && !mAttachedHidden && !mRootToken.hidden && !mExiting && !mDestroying; } @@ -674,7 +676,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ boolean isVisibleOrAdding() { final AppWindowToken atoken = mAppToken; - return ((mWinAnimator.mSurface != null && !mWinAnimator.mReportDestroySurface) + return ((mHasSurface && !mWinAnimator.mReportDestroySurface) || (!mRelayoutCalled && mViewVisibility == View.VISIBLE)) && mPolicyVisibility && !mAttachedHidden && (atoken == null || !atoken.hiddenRequested) @@ -687,15 +689,15 @@ final class WindowState implements WindowManagerPolicy.WindowState { * being visible. */ boolean isOnScreen() { + if (!mHasSurface || !mPolicyVisibility || mDestroying) { + return false; + } final AppWindowToken atoken = mAppToken; if (atoken != null) { - return mWinAnimator.mSurface != null && mPolicyVisibility && !mDestroying - && ((!mAttachedHidden && !atoken.hiddenRequested) + return ((!mAttachedHidden && !atoken.hiddenRequested) || mWinAnimator.mAnimation != null || atoken.animation != null); - } else { - return mWinAnimator.mSurface != null && mPolicyVisibility && !mDestroying - && (!mAttachedHidden || mWinAnimator.mAnimation != null); } + return !mAttachedHidden || mWinAnimator.mAnimation != null; } /** @@ -707,7 +709,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { return false; } - return mWinAnimator.mSurface != null && mPolicyVisibility && !mDestroying + return mHasSurface && mPolicyVisibility && !mDestroying && ((!mAttachedHidden && mViewVisibility == View.VISIBLE && !mRootToken.hidden) || mWinAnimator.mAnimation != null @@ -741,8 +743,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { * complete UI in to. */ public boolean isDrawnLw() { - return mWinAnimator.mSurface != null && !mDestroying - && !mWinAnimator.mDrawPending && !mWinAnimator.mCommitDrawPending; + return mHasSurface && !mDestroying && + !mWinAnimator.mDrawPending && !mWinAnimator.mCommitDrawPending; } /** @@ -1017,8 +1019,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { } pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration); } - pw.print(prefix); pw.print("mShownFrame="); - mShownFrame.printShortString(pw); pw.println(); + pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface); + pw.print(" mShownFrame="); mShownFrame.printShortString(pw); pw.println(); if (dumpAll) { pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw); pw.print(" last="); mLastFrame.printShortString(pw); diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index e99340c998cb..e6a248185fa2 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -35,6 +35,7 @@ class WindowStateAnimator { static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS; static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC; static final boolean localLOGV = WindowManagerService.localLOGV; + static final boolean DEBUG_ORIENTATION = WindowManagerService.DEBUG_ORIENTATION; static final String TAG = "WindowStateAnimator"; @@ -158,13 +159,11 @@ class WindowStateAnimator { } void cancelExitAnimationForNextAnimationLocked() { - if (!mWin.mExiting) return; if (mAnimation != null) { mAnimation.cancel(); mAnimation = null; destroySurfaceLocked(); } - mWin.mExiting = false; } private boolean stepAnimation(long currentTime) { @@ -443,6 +442,7 @@ class WindowStateAnimator { mSession.mSurfaceSession, mSession.mPid, attrs.getTitle().toString(), 0, w, h, format, flags); + mWin.mHasSurface = true; if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, " CREATE SURFACE " + mSurface + " IN SESSION " @@ -452,10 +452,12 @@ class WindowStateAnimator { + Integer.toHexString(flags) + " / " + this); } catch (Surface.OutOfResourcesException e) { + mWin.mHasSurface = false; Slog.w(TAG, "OutOfResourcesException creating surface"); mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); return null; } catch (Exception e) { + mWin.mHasSurface = false; Slog.e(TAG, "Exception creating surface", e); return null; } @@ -573,6 +575,7 @@ class WindowStateAnimator { mSurfaceShown = false; mSurface = null; + mWin.mHasSurface =false; } } @@ -746,7 +749,7 @@ class WindowStateAnimator { final WindowState w = mWin; if (mSurface == null) { if (w.mOrientationChanging) { - if (WindowManagerService.DEBUG_ORIENTATION) { + if (DEBUG_ORIENTATION) { Slog.v(TAG, "Orientation change skips hidden " + w); } w.mOrientationChanging = false; @@ -841,7 +844,7 @@ class WindowStateAnimator { // new orientation. if (w.mOrientationChanging) { w.mOrientationChanging = false; - if (WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change skips hidden " + w); } } else if (mLastLayer != mAnimLayer @@ -909,12 +912,11 @@ class WindowStateAnimator { if (w.mOrientationChanging) { if (!w.isDrawnLw()) { mService.mInnerFields.mOrientationChangeComplete = false; - if (WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation continue waiting for draw in " + w); } else { w.mOrientationChanging = false; - if (WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG, - "Orientation change complete in " + w); + if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); } } w.mToken.hasVisible = true; @@ -935,7 +937,7 @@ class WindowStateAnimator { + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING), e); } if (mWin.mReadyToShow && mWin.isReadyForDisplay()) { - if (SHOW_TRANSACTIONS || WindowManagerService.DEBUG_ORIENTATION) + if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this + " during animation: policyVis=" + mWin.mPolicyVisibility @@ -1169,4 +1171,12 @@ class WindowStateAnimator { } } + @Override + public String toString() { + StringBuffer sb = new StringBuffer("WindowStateAnimator ("); + sb.append(mWin.mLastTitle + "): "); + sb.append("mSurface " + mSurface); + sb.append(", mAnimation " + mAnimation); + return sb.toString(); + } } |