diff options
Diffstat (limited to 'services/java/com/android/server/WindowManagerService.java')
-rw-r--r-- | services/java/com/android/server/WindowManagerService.java | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 1c92da9..fb87d69 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -23,8 +23,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; -import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN; -import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; @@ -100,7 +98,6 @@ import android.util.TypedValue; import android.view.Display; import android.view.DragEvent; import android.view.Gravity; -import android.view.HapticFeedbackConstants; import android.view.IApplicationToken; import android.view.IOnKeyguardExitResult; import android.view.IRotationWatcher; @@ -128,7 +125,6 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Transformation; -import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.File; @@ -464,6 +460,11 @@ public class WindowManagerService extends IWindowManager.Stub // If non-null, we are in the middle of animating from one wallpaper target // to another, and this is the higher one in Z-order. WindowState mUpperWallpaperTarget = null; + // Window currently running an animation that has requested it be detached + // from the wallpaper. This means we need to ensure the wallpaper is + // visible behind it in case it animates in a way that would allow it to be + // seen. + WindowState mWindowDetachedWallpaper = null; int mWallpaperAnimLayerAdjustment; float mLastWallpaperX = -1; float mLastWallpaperY = -1; @@ -1709,6 +1710,7 @@ public class WindowManagerService extends IWindowManager.Stub int foundI = 0; WindowState topCurW = null; int topCurI = 0; + int windowDetachedI = -1; int i = N; while (i > 0) { i--; @@ -1721,13 +1723,12 @@ public class WindowManagerService extends IWindowManager.Stub continue; } topCurW = null; - if (w.mAppToken != null) { + if (w != mWindowDetachedWallpaper && w.mAppToken != null) { // If this window's app token is hidden and not animating, // it is of no interest to us. if (w.mAppToken.hidden && w.mAppToken.animation == null) { if (DEBUG_WALLPAPER) Slog.v(TAG, - "Skipping hidden or animating token: " + w); - topCurW = null; + "Skipping not hidden or animating token: " + w); continue; } } @@ -1752,9 +1753,18 @@ public class WindowManagerService extends IWindowManager.Stub continue; } break; + } else if (w == mWindowDetachedWallpaper) { + windowDetachedI = i; } } + if (foundW == null && windowDetachedI >= 0) { + if (DEBUG_WALLPAPER) Slog.v(TAG, + "Found animating detached wallpaper activity: #" + i + "=" + w); + foundW = w; + foundI = windowDetachedI; + } + if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { // If we are currently waiting for an app transition, and either // the current target or the next target are involved with it, @@ -8961,6 +8971,12 @@ public class WindowManagerService extends IWindowManager.Stub int curLayer = 0; int i; + if (DEBUG_LAYERS) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Log.v(TAG, "Assigning layers", here); + } + for (i=0; i<N; i++) { WindowState w = mWindows.get(i); if (w.mBaseLayer == curBaseLayer || w.mIsImWindow @@ -9297,6 +9313,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean tokenMayBeDrawn = false; boolean wallpaperMayChange = false; boolean forceHiding = false; + WindowState windowDetachedWallpaper = null; mPolicy.beginAnimationLw(dw, dh); @@ -9318,19 +9335,35 @@ public class WindowManagerService extends IWindowManager.Stub } } - boolean wasAnimating = w.mAnimating; - if (w.stepAnimationLocked(currentTime, dw, dh)) { + final boolean wasAnimating = w.mAnimating; + final boolean nowAnimating = w.stepAnimationLocked(currentTime, dw, dh); + + // If this window is animating, make a note that we have + // an animating window and take care of a request to run + // a detached wallpaper animation. + if (nowAnimating) { + if (w.mAnimation != null && w.mAnimation.getDetachWallpaper()) { + windowDetachedWallpaper = w; + } animating = true; - //w.dump(" "); } + + // If this window's app token is running a detached wallpaper + // animation, make a note so we can ensure the wallpaper is + // displayed behind it. + if (w.mAppToken != null && w.mAppToken.animation != null + && w.mAppToken.animation.getDetachWallpaper()) { + windowDetachedWallpaper = w; + } + if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) { wallpaperMayChange = true; } if (mPolicy.doesForceHide(w, attrs)) { - if (!wasAnimating && animating) { + if (!wasAnimating && nowAnimating) { if (DEBUG_VISIBILITY) Slog.v(TAG, - "Animation done that could impact force hide: " + "Animation started that could impact force hide: " + w); wallpaperForceHidingChanged = true; mFocusMayChange = true; @@ -9754,6 +9787,14 @@ public class WindowManagerService extends IWindowManager.Stub } } + if (mWindowDetachedWallpaper != windowDetachedWallpaper) { + if (DEBUG_WALLPAPER) Slog.v(TAG, + "Detached wallpaper changed from " + mWindowDetachedWallpaper + + windowDetachedWallpaper); + mWindowDetachedWallpaper = windowDetachedWallpaper; + wallpaperMayChange = true; + } + if (wallpaperMayChange) { if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper may change! Adjusting"); @@ -11085,6 +11126,9 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget); pw.print(" mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget); } + if (mWindowDetachedWallpaper != null) { + pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper); + } pw.print(" mCurConfiguration="); pw.println(this.mCurConfiguration); pw.print(" mInTouchMode="); pw.print(mInTouchMode); pw.print(" mLayoutSeq="); pw.println(mLayoutSeq); |