From 44eb8b772984164666195ea71c685292b234549a Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Tue, 4 Nov 2014 20:34:41 -0800 Subject: [PATCH] Revert "When keyguard exits use same anim for all windows" Broke window animations. This reverts commit b83408018176ec58f50e792590a22fdc9eb87fff. BUG: 18248641 Change-Id: Ic456a5666c3199e8bb8c9c2fb1ecdbb82afaad86 --- .../policy/impl/PhoneWindowManager.java | 24 +-- .../com/android/server/wm/WindowAnimator.java | 138 ++++++++---------- 2 files changed, 74 insertions(+), 88 deletions(-) diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index b516f00bd84bc..792712f66e1b7 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -116,7 +116,6 @@ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.util.HashSet; -import java.util.List; import static android.view.WindowManager.LayoutParams.*; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT; @@ -2300,19 +2299,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean goingToNotificationShade) { if (goingToNotificationShade) { return AnimationUtils.loadAnimation(mContext, R.anim.lock_screen_behind_enter_fade_in); - } + } else if (onWallpaper) { + Animation a = AnimationUtils.loadAnimation(mContext, + R.anim.lock_screen_behind_enter_wallpaper); + AnimationSet set = (AnimationSet) a; - AnimationSet set = (AnimationSet) AnimationUtils.loadAnimation(mContext, onWallpaper ? - R.anim.lock_screen_behind_enter_wallpaper : + // TODO: Use XML interpolators when we have log interpolators available in XML. + set.getAnimations().get(0).setInterpolator(mLogDecelerateInterpolator); + set.getAnimations().get(1).setInterpolator(mLogDecelerateInterpolator); + return set; + } else { + Animation a = AnimationUtils.loadAnimation(mContext, R.anim.lock_screen_behind_enter); + AnimationSet set = (AnimationSet) a; - // TODO: Use XML interpolators when we have log interpolators available in XML. - final List animations = set.getAnimations(); - for (int i = animations.size() - 1; i >= 0; --i) { - animations.get(i).setInterpolator(mLogDecelerateInterpolator); + // TODO: Use XML interpolators when we have log interpolators available in XML. + set.getAnimations().get(0).setInterpolator(mLogDecelerateInterpolator); + return set; } - - return set; } diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 8d931418b9153..61ea1e8d061ff 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -91,9 +91,6 @@ public class WindowAnimator { boolean mKeyguardGoingAwayToNotificationShade; boolean mKeyguardGoingAwayDisableWindowAnimations; - /** Use one animation for all entering activities after keyguard is dismissed. */ - Animation mPostKeyguardExitAnimation; - // forceHiding states. static final int KEYGUARD_NOT_SHOWN = 0; static final int KEYGUARD_ANIMATING_IN = 1; @@ -223,6 +220,9 @@ public class WindowAnimator { ++mAnimTransactionSequence; final WindowList windows = mService.getWindowListLocked(displayId); + ArrayList unForceHiding = null; + boolean wallpaperInUnForceHiding = false; + WindowState wallpaper = null; if (mKeyguardGoingAway) { for (int i = windows.size() - 1; i >= 0; i--) { @@ -261,9 +261,6 @@ public class WindowAnimator { final AppWindowToken appShowWhenLocked = winShowWhenLocked == null ? null : winShowWhenLocked.mAppToken; - boolean wallpaperInUnForceHiding = false; - ArrayList unForceHiding = null; - WindowState wallpaper = null; for (int i = windows.size() - 1; i >= 0; i--) { WindowState win = windows.get(i); WindowStateAnimator winAnimator = win.mWinAnimator; @@ -330,53 +327,40 @@ public class WindowAnimator { } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) { final boolean hideWhenLocked = !((win.mIsImWindow && showImeOverKeyguard) || (appShowWhenLocked != null && appShowWhenLocked == win.mAppToken)); + final boolean changed; if (((mForceHiding == KEYGUARD_ANIMATING_IN) && (!winAnimator.isAnimating() || hideWhenLocked)) || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) { - if (!win.hideLw(false, false)) { - // Was already hidden - continue; - } - if (DEBUG_KEYGUARD || WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, - "Now policy hidden: " + win); + changed = win.hideLw(false, false); + if ((DEBUG_KEYGUARD || WindowManagerService.DEBUG_VISIBILITY) + && changed) Slog.v(TAG, "Now policy hidden: " + win); } else { - if (!win.showLw(false, false)) { - // Was already showing. - continue; - } - final boolean visibleNow = win.isVisibleNow(); - if (!visibleNow) { - // Couldn't really show, must showLw() again when win becomes visible. - win.hideLw(false, false); - continue; - } - if (DEBUG_KEYGUARD || WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, - "Now policy shown: " + win); - if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) { - if (unForceHiding == null) { - unForceHiding = new ArrayList<>(); + changed = win.showLw(false, false); + if ((DEBUG_KEYGUARD || WindowManagerService.DEBUG_VISIBILITY) + && changed) Slog.v(TAG, "Now policy shown: " + win); + if (changed) { + if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0 + && win.isVisibleNow() /*w.isReadyForDisplay()*/) { + if (unForceHiding == null) { + unForceHiding = new ArrayList(); + } + unForceHiding.add(winAnimator); + if ((flags & FLAG_SHOW_WALLPAPER) != 0) { + wallpaperInUnForceHiding = true; + } } - unForceHiding.add(winAnimator); - if ((flags & FLAG_SHOW_WALLPAPER) != 0) { - wallpaperInUnForceHiding = true; + final WindowState currentFocus = mService.mCurrentFocus; + if (currentFocus == null || currentFocus.mLayer < win.mLayer) { + // We are showing on to of the current + // focus, so re-evaluate focus to make + // sure it is correct. + if (WindowManagerService.DEBUG_FOCUS_LIGHT) Slog.v(TAG, + "updateWindowsLocked: setting mFocusMayChange true"); + mService.mFocusMayChange = true; } - } else if (mPostKeyguardExitAnimation != null) { - // We're already in the middle of an animation. Use the existing - // animation to bring in this window. - winAnimator.setAnimation(mPostKeyguardExitAnimation); - winAnimator.keyguardGoingAwayAnimation = true; - } - final WindowState currentFocus = mService.mCurrentFocus; - if (currentFocus == null || currentFocus.mLayer < win.mLayer) { - // We are showing on top of the current - // focus, so re-evaluate focus to make - // sure it is correct. - if (WindowManagerService.DEBUG_FOCUS_LIGHT) Slog.v(TAG, - "updateWindowsLocked: setting mFocusMayChange true"); - mService.mFocusMayChange = true; } } - if ((flags & FLAG_SHOW_WALLPAPER) != 0) { + if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) { mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE; setPendingLayoutChanges(Display.DEFAULT_DISPLAY, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); @@ -419,44 +403,42 @@ public class WindowAnimator { // If we have windows that are being show due to them no longer // being force-hidden, apply the appropriate animation to them. if (unForceHiding != null) { - // This only happens the first time that we detect the keyguard is animating out. - if (mKeyguardGoingAwayDisableWindowAnimations) { - if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: skipping anim for windows"); - } else { - if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: created anim for windows"); - mPostKeyguardExitAnimation = mPolicy.createForceHideEnterAnimation( - wallpaperInUnForceHiding, mKeyguardGoingAwayToNotificationShade); - } - if (mPostKeyguardExitAnimation != null) { - for (int i=unForceHiding.size()-1; i>=0; i--) { + boolean startKeyguardExit = true; + for (int i=unForceHiding.size()-1; i>=0; i--) { + Animation a = null; + if (!mKeyguardGoingAwayDisableWindowAnimations) { + a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding, + mKeyguardGoingAwayToNotificationShade); + if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: created anim=" + a + + " for win=" + unForceHiding.get(i)); + } else { + if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: skipping anim for win=" + + unForceHiding.get(i)); + } + if (a != null) { final WindowStateAnimator winAnimator = unForceHiding.get(i); - winAnimator.setAnimation(mPostKeyguardExitAnimation); + winAnimator.setAnimation(a); winAnimator.keyguardGoingAwayAnimation = true; + if (startKeyguardExit && mKeyguardGoingAway) { + // Do one time only. + mPolicy.startKeyguardExitAnimation(mCurrentTime + a.getStartOffset(), + a.getDuration()); + mKeyguardGoingAway = false; + startKeyguardExit = false; + } } } - } - if (mPostKeyguardExitAnimation != null) { - // We're in the midst of a keyguard exit animation. - if (mKeyguardGoingAway) { - mPolicy.startKeyguardExitAnimation(mCurrentTime + - mPostKeyguardExitAnimation.getStartOffset(), - mPostKeyguardExitAnimation.getDuration()); - mKeyguardGoingAway = false; - } else if (mPostKeyguardExitAnimation.hasEnded()) { - // Done with the animation, reset. - mPostKeyguardExitAnimation = null; - } - } - - // Wallpaper is going away in un-force-hide motion, animate it as well. - if (!wallpaperInUnForceHiding && wallpaper != null - && !mKeyguardGoingAwayDisableWindowAnimations) { - if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: wallpaper animating away"); - Animation a = mPolicy.createForceHideWallpaperExitAnimation( - mKeyguardGoingAwayToNotificationShade); - if (a != null) { - wallpaper.mWinAnimator.setAnimation(a); + // Wallpaper is going away in un-force-hide motion, animate it as well. + if (!wallpaperInUnForceHiding && wallpaper != null + && !mKeyguardGoingAwayDisableWindowAnimations) { + if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: wallpaper animating away"); + Animation a = mPolicy.createForceHideWallpaperExitAnimation( + mKeyguardGoingAwayToNotificationShade); + if (a != null) { + WindowStateAnimator animator = wallpaper.mWinAnimator; + animator.setAnimation(a); + } } } }