diff options
3 files changed, 84 insertions, 142 deletions
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 0c5d06a..abf8412 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -146,35 +146,6 @@ public class WindowAnimator { mDisplayContentsAnimators.delete(displayId); } - void hideWallpapersLocked(final WindowState w) { - final WindowState wallpaperTarget = mService.mWallpaperTarget; - final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget; - final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens; - - if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) { - final int numTokens = wallpaperTokens.size(); - for (int i = numTokens - 1; i >= 0; i--) { - final WindowToken token = wallpaperTokens.get(i); - final int numWindows = token.windows.size(); - for (int j = numWindows - 1; j >= 0; j--) { - final WindowState wallpaper = token.windows.get(j); - final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; - if (!winAnimator.mLastHidden) { - winAnimator.hide(); - mService.dispatchWallpaperVisibility(wallpaper, false); - setPendingLayoutChanges(Display.DEFAULT_DISPLAY, - WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); - } - } - if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG, - "Hiding wallpaper " + token + " from " + w - + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget - + "\n" + Debug.getCallers(5, " ")); - token.hidden = true; - } - } - } - private void updateAppWindowsLocked(int displayId) { ArrayList<TaskStack> stacks = mService.getDisplayContentLocked(displayId).getStacks(); for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 71fddfb..02a4f4d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -582,7 +582,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>(); + private final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>(); // If non-null, this is the currently visible window that is associated // with the wallpaper. @@ -1694,7 +1694,7 @@ public class WindowManagerService extends IWindowManager.Stub return true; } - final boolean isWallpaperVisible(WindowState wallpaperTarget) { + private boolean isWallpaperVisible(WindowState wallpaperTarget) { if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target " + wallpaperTarget + ", obscured=" + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??") + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null) @@ -1708,6 +1708,34 @@ public class WindowManagerService extends IWindowManager.Stub || mLowerWallpaperTarget != null; } + void hideWallpapersLocked(final WindowState winGoingAway) { + if (mWallpaperTarget != null && + (mWallpaperTarget != winGoingAway || mLowerWallpaperTarget != null)) { + return; + } + + for (int i = mWallpaperTokens.size() - 1; i >= 0; i--) { + final WindowToken token = mWallpaperTokens.get(i); + for (int j = token.windows.size() - 1; j >= 0; j--) { + final WindowState wallpaper = token.windows.get(j); + final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; + if (!winAnimator.mLastHidden) { + winAnimator.hide(); + dispatchWallpaperVisibility(wallpaper, false); + final DisplayContent displayContent = wallpaper.getDisplayContent(); + if (displayContent != null) { + displayContent.pendingLayoutChanges |= + WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; + } + } + } + if (DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG, "Hiding wallpaper " + token + + " from " + winGoingAway + " target=" + mWallpaperTarget + " lower=" + + mLowerWallpaperTarget + "\n" + Debug.getCallers(5, " ")); + token.hidden = true; + } + } + static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1; static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2; @@ -1890,7 +1918,7 @@ public class WindowManagerService extends IWindowManager.Stub // AND any starting window associated with it, AND below the // maximum layer the policy allows for wallpapers. while (foundI > 0) { - WindowState wb = windows.get(foundI-1); + WindowState wb = windows.get(foundI - 1); if (wb.mBaseLayer < maxLayer && wb.mAttachedWindow != foundW && (foundW.mAttachedWindow == null || @@ -1916,7 +1944,7 @@ public class WindowManagerService extends IWindowManager.Stub } else { // Okay i is the position immediately above the wallpaper. Look at // what is below it for later. - foundW = foundI > 0 ? windows.get(foundI-1) : null; + foundW = foundI > 0 ? windows.get(foundI - 1) : null; } if (visible) { @@ -1939,43 +1967,37 @@ public class WindowManagerService extends IWindowManager.Stub // Start stepping backwards from here, ensuring that our wallpaper windows // are correctly placed. int changed = 0; - int curTokenIndex = mWallpaperTokens.size(); - while (curTokenIndex > 0) { - curTokenIndex--; - WindowToken token = mWallpaperTokens.get(curTokenIndex); + for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { + WindowToken token = mWallpaperTokens.get(curTokenNdx); if (token.hidden == visible) { if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, "Wallpaper token " + token + " hidden=" + !visible); changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED; token.hidden = !visible; - // Need to do a layout to ensure the wallpaper now has the - // correct size. + // Need to do a layout to ensure the wallpaper now has the correct size. getDefaultDisplayContentLocked().layoutNeeded = true; } - int curWallpaperIndex = token.windows.size(); - while (curWallpaperIndex > 0) { - curWallpaperIndex--; - WindowState wallpaper = token.windows.get(curWallpaperIndex); + final WindowList tokenWindows = token.windows; + for (int wallpaperNdx = tokenWindows.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + WindowState wallpaper = tokenWindows.get(wallpaperNdx); if (visible) { updateWallpaperOffsetLocked(wallpaper, dw, dh, false); } - // First, make sure the client has the current visibility - // state. + // First, make sure the client has the current visibility state. dispatchWallpaperVisibility(wallpaper, visible); - wallpaper.mWinAnimator.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment; + wallpaper.mWinAnimator.mAnimLayer = + wallpaper.mLayer + mWallpaperAnimLayerAdjustment; if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win " + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); - // First, if this window is at the current index, then all - // is well. + // First, if this window is at the current index, then all is well. if (wallpaper == foundW) { foundI--; - foundW = foundI > 0 - ? windows.get(foundI-1) : null; + foundW = foundI > 0 ? windows.get(foundI - 1) : null; continue; } @@ -2015,48 +2037,20 @@ public class WindowManagerService extends IWindowManager.Stub } } - /* - final TaskStack targetStack = - mWallpaperTarget == null ? null : mWallpaperTarget.getStack(); - if ((changed & ADJUST_WALLPAPER_LAYERS_CHANGED) != 0 && - targetStack != null && !targetStack.isHomeStack()) { - // If the wallpaper target is not on the home stack then make sure that all windows - // from other non-home stacks are above the wallpaper. - for (i = foundI - 1; i >= 0; --i) { - WindowState win = windows.get(i); - if (!win.isVisibleLw()) { - continue; - } - final TaskStack winStack = win.getStack(); - if (winStack != null && !winStack.isHomeStack() && winStack != targetStack) { - windows.remove(i); - windows.add(foundI + 1, win); - } - } - } - */ - - if (targetChanged && DEBUG_WALLPAPER_LIGHT) { - Slog.d(TAG, "New wallpaper: target=" + mWallpaperTarget - + " lower=" + mLowerWallpaperTarget + " upper=" - + mUpperWallpaperTarget); - } + if (targetChanged && DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, "New wallpaper: target=" + + mWallpaperTarget + " lower=" + mLowerWallpaperTarget + " upper=" + + mUpperWallpaperTarget); return changed; } void setWallpaperAnimLayerAdjustmentLocked(int adj) { - if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, - "Setting wallpaper layer adj to " + adj); + if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Setting wallpaper layer adj to " + adj); mWallpaperAnimLayerAdjustment = adj; - int curTokenIndex = mWallpaperTokens.size(); - while (curTokenIndex > 0) { - curTokenIndex--; - WindowToken token = mWallpaperTokens.get(curTokenIndex); - int curWallpaperIndex = token.windows.size(); - while (curWallpaperIndex > 0) { - curWallpaperIndex--; - WindowState wallpaper = token.windows.get(curWallpaperIndex); + for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { + WindowList windows = mWallpaperTokens.get(curTokenNdx).windows; + for (int wallpaperNdx = windows.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + WindowState wallpaper = windows.get(wallpaperNdx); wallpaper.mWinAnimator.mAnimLayer = wallpaper.mLayer + adj; if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "setWallpaper win " + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); @@ -2190,14 +2184,10 @@ public class WindowManagerService extends IWindowManager.Stub } } - int curTokenIndex = mWallpaperTokens.size(); - while (curTokenIndex > 0) { - curTokenIndex--; - WindowToken token = mWallpaperTokens.get(curTokenIndex); - int curWallpaperIndex = token.windows.size(); - while (curWallpaperIndex > 0) { - curWallpaperIndex--; - WindowState wallpaper = token.windows.get(curWallpaperIndex); + for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { + WindowList windows = mWallpaperTokens.get(curTokenNdx).windows; + for (int wallpaperNdx = windows.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + WindowState wallpaper = windows.get(wallpaperNdx); if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) { WindowStateAnimator winAnimator = wallpaper.mWinAnimator; winAnimator.computeShownFrameLocked(); @@ -2229,7 +2219,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - void updateWallpaperVisibilityLocked() { + private void updateWallpaperVisibilityLocked() { final boolean visible = isWallpaperVisible(mWallpaperTarget); final DisplayContent displayContent = mWallpaperTarget.getDisplayContent(); if (displayContent == null) { @@ -2239,21 +2229,18 @@ public class WindowManagerService extends IWindowManager.Stub final int dw = displayInfo.logicalWidth; final int dh = displayInfo.logicalHeight; - int curTokenIndex = mWallpaperTokens.size(); - while (curTokenIndex > 0) { - curTokenIndex--; - WindowToken token = mWallpaperTokens.get(curTokenIndex); + for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { + WindowToken token = mWallpaperTokens.get(curTokenNdx); if (token.hidden == visible) { token.hidden = !visible; // Need to do a layout to ensure the wallpaper now has the // correct size. - getDefaultDisplayContentLocked().layoutNeeded = true; + displayContent.layoutNeeded = true; } - int curWallpaperIndex = token.windows.size(); - while (curWallpaperIndex > 0) { - curWallpaperIndex--; - WindowState wallpaper = token.windows.get(curWallpaperIndex); + final WindowList windows = token.windows; + for (int wallpaperNdx = windows.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + WindowState wallpaper = windows.get(wallpaperNdx); if (visible) { updateWallpaperOffsetLocked(wallpaper, dw, dh, false); } @@ -2911,14 +2898,10 @@ public class WindowManagerService extends IWindowManager.Stub if (window == mWallpaperTarget || window == mLowerWallpaperTarget || window == mUpperWallpaperTarget) { boolean doWait = sync; - int curTokenIndex = mWallpaperTokens.size(); - while (curTokenIndex > 0) { - curTokenIndex--; - WindowToken token = mWallpaperTokens.get(curTokenIndex); - int curWallpaperIndex = token.windows.size(); - while (curWallpaperIndex > 0) { - curWallpaperIndex--; - WindowState wallpaper = token.windows.get(curWallpaperIndex); + for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { + final WindowList windows = mWallpaperTokens.get(curTokenNdx).windows; + for (int wallpaperNdx = windows.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + WindowState wallpaper = windows.get(wallpaperNdx); try { wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync); @@ -3556,13 +3539,13 @@ public class WindowManagerService extends IWindowManager.Stub false /*updateInputWindows*/); } - if (delayed) { - if (displayContent != null) { - displayContent.mExitingTokens.add(wtoken); - } + if (delayed && displayContent != null) { + displayContent.mExitingTokens.add(wtoken); } else if (wtoken.windowType == TYPE_WALLPAPER) { mWallpaperTokens.remove(wtoken); } + } else if (wtoken.windowType == TYPE_WALLPAPER) { + mWallpaperTokens.remove(wtoken); } mInputMonitor.updateInputWindowsLw(true /*force*/); @@ -9583,9 +9566,6 @@ public class WindowManagerService extends IWindowManager.Stub // it is animating. displayContent.pendingLayoutChanges = 0; - if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("loop number " - + mLayoutRepeatCount, displayContent.pendingLayoutChanges); - if (isDefaultDisplay) { mPolicy.beginPostLayoutPolicyLw(dw, dh); for (i = windows.size() - 1; i >= 0; i--) { @@ -9669,7 +9649,7 @@ public class WindowManagerService extends IWindowManager.Stub if (w.mHasSurface && !w.isHiddenFromUserLocked()) { // Take care of the window being ready to display. final boolean committed = - winAnimator.commitFinishDrawingLocked(currentTime); + winAnimator.commitFinishDrawingLocked(); if (isDefaultDisplay && committed) { if (w.mAttrs.type == TYPE_DREAM) { // HACK: When a dream is shown, it may at that @@ -10799,7 +10779,7 @@ public class WindowManagerService extends IWindowManager.Stub void dumpTokensLocked(PrintWriter pw, boolean dumpAll) { pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)"); - if (mTokenMap.size() > 0) { + if (!mTokenMap.isEmpty()) { pw.println(" All tokens:"); Iterator<WindowToken> it = mTokenMap.values().iterator(); while (it.hasNext()) { @@ -10813,7 +10793,7 @@ public class WindowManagerService extends IWindowManager.Stub } } } - if (mWallpaperTokens.size() > 0) { + if (!mWallpaperTokens.isEmpty()) { pw.println(); pw.println(" Wallpaper tokens:"); for (int i=mWallpaperTokens.size()-1; i>=0; i--) { @@ -10828,7 +10808,7 @@ public class WindowManagerService extends IWindowManager.Stub } } } - if (mFinishedStarting.size() > 0) { + if (!mFinishedStarting.isEmpty()) { pw.println(); pw.println(" Finishing start of application tokens:"); for (int i=mFinishedStarting.size()-1; i>=0; i--) { @@ -10843,7 +10823,7 @@ public class WindowManagerService extends IWindowManager.Stub } } } - if (mOpeningApps.size() > 0 || mClosingApps.size() > 0) { + if (!mOpeningApps.isEmpty() || !mClosingApps.isEmpty()) { pw.println(); if (mOpeningApps.size() > 0) { pw.print(" mOpeningApps="); pw.println(mOpeningApps); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 8202880..1ae8f25 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -53,21 +53,16 @@ import android.view.View; import android.view.WindowManager; import android.view.WindowManagerPolicy; import android.view.WindowManager.LayoutParams; -import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.AnimationUtils; import android.view.animation.Transformation; -import com.android.internal.R; import com.android.server.wm.WindowManagerService.H; import java.io.PrintWriter; import java.util.ArrayList; -class WinAnimatorList extends ArrayList<WindowStateAnimator> { -} - /** * Keep track of animations and surface operations for a single WindowState. **/ @@ -185,7 +180,7 @@ class WindowStateAnimator { int mAttrType; - public WindowStateAnimator(final WindowState win) { + WindowStateAnimator(final WindowState win) { final WindowManagerService service = win.mService; mService = service; @@ -482,7 +477,7 @@ class WindowStateAnimator { mService.mPendingRemove.add(mWin); mWin.mRemoveOnExit = false; } - mAnimator.hideWallpapersLocked(mWin); + mService.hideWallpapersLocked(mWin); } void hide() { @@ -523,7 +518,7 @@ class WindowStateAnimator { } // This must be called while inside a transaction. - boolean commitFinishDrawingLocked(long currentTime) { + boolean commitFinishDrawingLocked() { if (DEBUG_STARTING_WINDOW && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState=" @@ -980,7 +975,7 @@ class WindowStateAnimator { } mSurfaceControl.destroy(); } - mAnimator.hideWallpapersLocked(mWin); + mService.hideWallpapersLocked(mWin); } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " + this + " surface " + mSurfaceControl + " session " + mSession @@ -1006,7 +1001,7 @@ class WindowStateAnimator { WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); } mPendingDestroySurface.destroy(); - mAnimator.hideWallpapersLocked(mWin); + mService.hideWallpapersLocked(mWin); } } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " @@ -1454,7 +1449,7 @@ class WindowStateAnimator { hide(); } else if (w.mAttachedHidden || !w.isOnScreen()) { hide(); - mAnimator.hideWallpapersLocked(w); + mService.hideWallpapersLocked(w); // If we are waiting for this window to handle an // orientation change, well, it is hidden, so @@ -1626,13 +1621,8 @@ class WindowStateAnimator { } if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { - RuntimeException e = null; - if (!WindowManagerService.HIDE_STACK_CRAWLS) { - e = new RuntimeException(); - e.fillInStackTrace(); - } Slog.v(TAG, "performShow on " + this - + ": mDrawState=" + mDrawState + " readyForDisplay=" + + ": mDrawState=" + drawStateToString() + " readyForDisplay=" + mWin.isReadyForDisplayIgnoringKeyguard() + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING) + " during animation: policyVis=" + mWin.mPolicyVisibility @@ -1643,7 +1633,8 @@ class WindowStateAnimator { + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) + " animating=" + mAnimating + " tok animating=" - + (mAppAnimator != null ? mAppAnimator.animating : false), e); + + (mAppAnimator != null ? mAppAnimator.animating : false) + " Callers=" + + Debug.getCallers(3)); } if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplayIgnoringKeyguard()) { if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) |