From b9836b9185132974f6cfa9296bb3c28d1c9b668a Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Mon, 11 Jun 2012 11:40:09 -0700 Subject: [PATCH] Fix exposing wallpaper on rotations and other. 1. Rotations do not go through standard closing of animations so the wallpaper was not being hidden when the wallpaper target surface was destroyed. This fix adds hiding the wallpaper when the wallpaper target is destroyed. 2. The wallpaper target is nulled when switching from launcher home screen to launcher all apps. In this case the wallpaper remains visible but below visible layers. It should be hidden so that when those layers adjust it is not exposed. (Separate fix for adjusting wallpaper in this case will come). Fixes bug 6629464. Change-Id: I522f97dafc0cdcc0f933a825ec9a29d8f63590b5 --- .../com/android/server/wm/WindowAnimator.java | 21 ++++++++++++++----- .../server/wm/WindowStateAnimator.java | 15 +++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index d25a96078031b..b5cf20135bc38 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -85,12 +85,19 @@ public class WindowAnimator { mPolicy = policy; } - void hideWallpapersLocked() { - for (final WindowToken token : mService.mWallpaperTokens) { - for (final WindowState wallpaper : token.windows) { - wallpaper.mWinAnimator.hide(); + void hideWallpapersLocked(final WindowState w) { + if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null) + || mService.mWallpaperTarget == null) { + for (final WindowToken token : mService.mWallpaperTokens) { + for (final WindowState wallpaper : token.windows) { + final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; + if (!winAnimator.mLastHidden) { + winAnimator.hide(); + mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; + } + } + token.hidden = true; } - token.hidden = true; } } @@ -491,6 +498,10 @@ public class WindowAnimator { for (int i = 0; i < N; i++) { final WindowStateAnimator winAnimator = mWinAnimators.get(i); if (winAnimator.mWin.mIsWallpaper && mService.mWallpaperTarget == null) { + if (!winAnimator.mWin.mWallpaperVisible && !winAnimator.mLastHidden) { + // Wallpaper is no longer visible and there is no wp target => hide it. + winAnimator.hide(); + } continue; } winAnimator.prepareSurfaceLocked(true); diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 5908958d6c004..d140aca9204a0 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -16,7 +16,6 @@ import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region; import android.os.Debug; -import android.os.RemoteException; import android.util.Slog; import android.view.Surface; import android.view.SurfaceSession; @@ -379,10 +378,7 @@ class WindowStateAnimator { mService.mPendingRemove.add(mWin); mWin.mRemoveOnExit = false; } - if (mService.mWallpaperTarget == mWin && mService.mLowerWallpaperTarget == null) { - mAnimator.hideWallpapersLocked(); - mAnimator.mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; - } + mAnimator.hideWallpapersLocked(mWin); } void hide() { @@ -738,6 +734,7 @@ class WindowStateAnimator { } mSurface.destroy(); } + mAnimator.hideWallpapersLocked(mWin); } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " + this + " surface " + mSurface + " session " + mSession @@ -763,6 +760,7 @@ class WindowStateAnimator { WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); } mPendingDestroySurface.destroy(); + mAnimator.hideWallpapersLocked(mWin); } } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " @@ -1067,11 +1065,8 @@ class WindowStateAnimator { if (w.mAttachedHidden || !w.isReadyForDisplay()) { hide(); - // TODO: Consider moving the following into hide() and out of finishExit() as well. - if (mService.mWallpaperTarget == mWin && mService.mLowerWallpaperTarget == null) { - mAnimator.hideWallpapersLocked(); - mAnimator.mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; - } + mAnimator.hideWallpapersLocked(w); + // If we are waiting for this window to handle an // orientation change, well, it is hidden, so // doesn't really matter. Note that this does