diff options
16 files changed, 156 insertions, 79 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index d45d686..2b4677c 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1199,6 +1199,9 @@ public interface WindowManagerPolicy { /** * Notifies the keyguard to start fading out. + * + * @param startTime the start time of the animation in uptime milliseconds + * @param fadeoutDuration the duration of the exit animation, in milliseconds */ - public void startKeyguardExitAnimation(long fadeoutDuration); + public void startKeyguardExitAnimation(long startTime, long fadeoutDuration); } diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index f22800c..a5421f5 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -60,6 +60,9 @@ interface IKeyguardService { /** * Notifies that the activity behind has now been drawn and it's safe to remove the wallpaper * and keyguard flag. + * + * @param startTime the start time of the animation in uptime milliseconds + * @param fadeoutDuration the duration of the exit animation, in milliseconds */ - oneway void startKeyguardExitAnimation(long fadeoutDuration); + oneway void startKeyguardExitAnimation(long startTime, long fadeoutDuration); } diff --git a/core/res/res/anim/lock_screen_behind_enter.xml b/core/res/res/anim/lock_screen_behind_enter.xml index 4a956d7..7e212be 100644 --- a/core/res/res/anim/lock_screen_behind_enter.xml +++ b/core/res/res/anim/lock_screen_behind_enter.xml @@ -18,10 +18,17 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:background="#ff000000" android:shareInterpolator="false"> + android:detachWallpaper="true" android:shareInterpolator="false" android:startOffset="60"> <alpha - android:fromAlpha="1.0" android:toAlpha="1.0" + android:fromAlpha="0.0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" - android:interpolator="@interpolator/decelerate_quint" - android:duration="0"/> + android:interpolator="@interpolator/linear_out_slow_in" + android:duration="@integer/config_shortAnimTime"/> + <scale + android:fromXScale="0.95" android:toXScale="1.0" + android:fromYScale="0.95" android:toYScale="1.0" + android:pivotX="50%" android:pivotY="50%" + android:fillEnabled="true" android:fillBefore="true" + android:interpolator="@interpolator/linear_out_slow_in" + android:duration="@integer/config_shortAnimTime" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim/lock_screen_wallpaper_behind_enter.xml b/core/res/res/anim/lock_screen_wallpaper_behind_enter.xml deleted file mode 100644 index f7a6a65..0000000 --- a/core/res/res/anim/lock_screen_wallpaper_behind_enter.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2007, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" - android:detachWallpaper="true" android:shareInterpolator="false"> - <alpha - android:fromAlpha="0.0" android:toAlpha="1.0" - android:fillEnabled="true" android:fillBefore="true" - android:interpolator="@interpolator/decelerate_quad" - android:startOffset="@android:integer/config_mediumAnimTime" - android:duration="@android:integer/config_shortAnimTime"/> -</set> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6e1629b..6cd7cd2 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1679,7 +1679,6 @@ <java-symbol type="anim" name="push_down_out" /> <java-symbol type="anim" name="push_up_in" /> <java-symbol type="anim" name="push_up_out" /> - <java-symbol type="anim" name="lock_screen_wallpaper_behind_enter" /> <java-symbol type="anim" name="lock_screen_behind_enter" /> <java-symbol type="bool" name="config_alwaysUseCdmaRssi" /> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 4c7f3df..b280ab7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -204,9 +204,9 @@ public class KeyguardService extends Service { } @Override - public void startKeyguardExitAnimation(long fadeoutDuration) { + public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { checkPermission(); - mKeyguardViewMediator.startKeyguardExitAnimation(fadeoutDuration); + mKeyguardViewMediator.startKeyguardExitAnimation(startTime, fadeoutDuration); } }; } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 7110d8d..f7b4994 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1083,7 +1083,8 @@ public class KeyguardViewMediator extends SystemUI { handleDismiss(); break; case START_KEYGUARD_EXIT_ANIM: - handleStartKeyguardExitAnimation((Long) msg.obj); + StartKeyguardExitAnimParams params = (StartKeyguardExitAnimParams) msg.obj; + handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration); break; } } @@ -1227,7 +1228,7 @@ public class KeyguardViewMediator extends SystemUI { } } - private void handleStartKeyguardExitAnimation(long fadeoutDuration) { + private void handleStartKeyguardExitAnimation(long startTime, long fadeoutDuration) { synchronized (KeyguardViewMediator.this) { // only play "unlock" noises if not on a call (since the incall UI @@ -1236,7 +1237,7 @@ public class KeyguardViewMediator extends SystemUI { playSounds(false); } - mStatusBarKeyguardViewManager.hide(); + mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); mShowing = false; mKeyguardDonePending = false; updateActivityLockScreenState(); @@ -1346,12 +1347,24 @@ public class KeyguardViewMediator extends SystemUI { return mStatusBarKeyguardViewManager; } - public void startKeyguardExitAnimation(long fadeoutDuration) { - Message msg = mHandler.obtainMessage(START_KEYGUARD_EXIT_ANIM, fadeoutDuration); + public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { + Message msg = mHandler.obtainMessage(START_KEYGUARD_EXIT_ANIM, + new StartKeyguardExitAnimParams(startTime, fadeoutDuration)); mHandler.sendMessage(msg); } public ViewMediatorCallback getViewMediatorCallback() { return mViewMediatorCallback; } + + private static class StartKeyguardExitAnimParams { + + long startTime; + long fadeoutDuration; + + private StartKeyguardExitAnimParams(long startTime, long fadeoutDuration) { + this.startTime = startTime; + this.fadeoutDuration = fadeoutDuration; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index b7a7b0a..3aaace4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -17,10 +17,14 @@ package com.android.systemui.statusbar.phone; import android.content.Context; +import android.os.SystemClock; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardViewBase; @@ -43,6 +47,8 @@ public class KeyguardBouncer { private StatusBarWindowManager mWindowManager; private KeyguardViewBase mKeyguardView; private ViewGroup mRoot; + private Interpolator mFadeOutInterpolator = new LinearInterpolator(); + private boolean mFadingOut; public KeyguardBouncer(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils, StatusBarWindowManager windowManager, @@ -86,6 +92,29 @@ public class KeyguardBouncer { } } + public void animateHide(long delay, long duration) { + if (isShowing()) { + mFadingOut = true; + mKeyguardView.animate() + .alpha(0) + .withLayer() + + // Make it disappear faster, as the focus should be on the activity behind. + .setDuration(duration / 3) + .setInterpolator(mFadeOutInterpolator) + .setStartDelay(delay) + .withEndAction(new Runnable() { + @Override + public void run() { + mFadingOut = false; + hide(true /* destroyView */); + } + }); + } else { + hide(true /* destroyView */); + } + } + /** * Reset the state of the view. */ @@ -110,7 +139,7 @@ public class KeyguardBouncer { } public boolean isShowing() { - return mRoot != null && mRoot.getVisibility() == View.VISIBLE; + return mRoot != null && mRoot.getVisibility() == View.VISIBLE && !mFadingOut; } public void prepare() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index c5a9b85..220b691 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -200,8 +200,10 @@ public abstract class PanelView extends FrameLayout { case MotionEvent.ACTION_CANCEL: mTrackingPointer = -1; trackMovement(event); - boolean expand = flingWithCurrentVelocity(); + float vel = getCurrentVelocity(); + boolean expand = flingExpands(vel); onTrackingStopped(expand); + fling(vel, expand); if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; @@ -323,18 +325,15 @@ public abstract class PanelView extends FrameLayout { } /** - * @return whether the panel will be expanded after the animation + * @param vel the current velocity of the motion + * @return whether a fling should expands the panel; contracts otherwise */ - private boolean flingWithCurrentVelocity() { - float vel = getCurrentVelocity(); - boolean expand; + private boolean flingExpands(float vel) { if (Math.abs(vel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { - expand = getExpandedFraction() > 0.5f; + return getExpandedFraction() > 0.5f; } else { - expand = vel > 0; + return vel > 0; } - fling(vel, expand); - return expand; } protected void fling(float vel, boolean expand) { @@ -342,6 +341,7 @@ public abstract class PanelView extends FrameLayout { float target = expand ? getMaxPanelHeight() : 0.0f; if (target == mExpandedHeight) { onExpandingFinished(); + mBar.panelExpansionChanged(this, mExpandedFraction); return; } ValueAnimator animator = ValueAnimator.ofFloat(mExpandedHeight, target); @@ -430,7 +430,7 @@ public abstract class PanelView extends FrameLayout { public void setExpandedHeightInternal(float h) { float fh = getMaxPanelHeight(); - mExpandedHeight = Math.min(fh, h); + mExpandedHeight = Math.max(0, Math.min(fh, h)); float overExpansion = h - fh; overExpansion = Math.max(0, overExpansion); if (overExpansion != mOverExpansion) { @@ -442,7 +442,7 @@ public abstract class PanelView extends FrameLayout { } onHeightUpdated(mExpandedHeight); - mExpandedFraction = Math.min(1f, (fh == 0) ? 0 : h / fh); + mExpandedFraction = Math.min(1f, (fh == 0) ? 0 : mExpandedHeight / fh); } protected void onOverExpansionChanged(float overExpansion) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 6156fc3..1264d75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -19,16 +19,12 @@ package com.android.systemui.statusbar.phone; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; -import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.view.View; import android.view.ViewTreeObserver; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; /** * Controls both the scrim behind the notifications and in front of the notifications (when a @@ -53,6 +49,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { private boolean mAnimateChange; private boolean mUpdatePending; private boolean mExpanding; + private boolean mAnimateKeyguardFadingOut; + private long mDurationOverride = -1; + private long mAnimationDelay; + private Runnable mOnAnimationFinished; + private boolean mAnimationStarted; private final Interpolator mInterpolator = new DecelerateInterpolator(); @@ -87,14 +88,26 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { scheduleUpdate(); } + public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished) { + mAnimateKeyguardFadingOut = true; + mDurationOverride = duration; + mAnimationDelay = delay; + mAnimateChange = true; + mOnAnimationFinished = onAnimationFinished; + scheduleUpdate(); + } + private void scheduleUpdate() { if (mUpdatePending) return; + + // Make sure that a frame gets scheduled. + mScrimBehind.invalidate(); mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this); mUpdatePending = true; } private void updateScrims() { - if (!mKeyguardShowing) { + if (!mKeyguardShowing || mAnimateKeyguardFadingOut) { updateScrimNormal(); setScrimInFrontColor(0); } else { @@ -170,8 +183,20 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { } }); anim.setInterpolator(mInterpolator); - anim.setDuration(ANIMATION_DURATION); + anim.setStartDelay(mAnimationDelay); + anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION); + anim.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationEnd(Animator animation) { + if (mOnAnimationFinished != null) { + mOnAnimationFinished.run(); + mOnAnimationFinished = null; + } + } + }); anim.start(); + mAnimationStarted = true; } private int getBackgroundAlpha(View scrim) { @@ -188,6 +213,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this); mUpdatePending = false; updateScrims(); + mAnimateKeyguardFadingOut = false; + mDurationOverride = -1; + mAnimationDelay = 0; + + // Make sure that we always call the listener even if we didn't start an animation. + if (!mAnimationStarted && mOnAnimationFinished != null) { + mOnAnimationFinished.run(); + mOnAnimationFinished = null; + } + mAnimationStarted = false; return true; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index d5551b8..e3145a6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import android.content.Context; import android.os.Bundle; import android.os.RemoteException; +import android.os.SystemClock; import android.util.Slog; import android.view.KeyEvent; import android.view.View; @@ -183,11 +184,23 @@ public class StatusBarKeyguardViewManager { /** * Hides the keyguard view */ - public void hide() { + public void hide(long startTime, long fadeoutDuration) { mShowing = false; mPhoneStatusBar.hideKeyguard(); + mStatusBarWindowManager.setKeyguardFadingAway(true); mStatusBarWindowManager.setKeyguardShowing(false); - mBouncer.hide(true /* destroyView */); + long uptimeMillis = SystemClock.uptimeMillis(); + long delay = startTime - uptimeMillis; + if (delay < 0) { + delay = 0; + } + mBouncer.animateHide(delay, fadeoutDuration); + mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() { + @Override + public void run() { + mStatusBarWindowManager.setKeyguardFadingAway(false); + } + }); mViewMediatorCallback.keyguardGone(); updateStates(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index b7bf6cd..fe57cef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -124,7 +124,8 @@ public class StatusBarWindowManager { } private void applyHeight(State state) { - boolean expanded = state.isKeyguardShowingAndNotOccluded() || state.statusBarExpanded; + boolean expanded = state.isKeyguardShowingAndNotOccluded() || state.statusBarExpanded + || state.keyguardFadingAway; if (expanded) { mLp.height = ViewGroup.LayoutParams.MATCH_PARENT; } else { @@ -201,6 +202,11 @@ public class StatusBarWindowManager { apply(mCurrentState); } + public void setKeyguardFadingAway(boolean keyguardFadingAway) { + mCurrentState.keyguardFadingAway = keyguardFadingAway; + apply(mCurrentState); + } + /** * @param state The {@link StatusBarState} of the status bar. */ @@ -217,6 +223,7 @@ public class StatusBarWindowManager { boolean statusBarFocusable; long keyguardUserActivityTimeout; boolean bouncerShowing; + boolean keyguardFadingAway; /** * The {@link BaseStatusBar} state from the status bar. diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index c483836..30282dd 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1914,9 +1914,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public Animation createForceHideEnterAnimation(boolean onWallpaper) { - return AnimationUtils.loadAnimation(mContext, onWallpaper - ? com.android.internal.R.anim.lock_screen_wallpaper_behind_enter - : com.android.internal.R.anim.lock_screen_behind_enter); + return AnimationUtils.loadAnimation(mContext, + com.android.internal.R.anim.lock_screen_behind_enter); } private static void awakenDreams() { @@ -4571,14 +4570,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override - public void startKeyguardExitAnimation(final long fadeoutDuration) { + public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { if (mKeyguardDelegate != null) { - mHandler.post(new Runnable() { - @Override - public void run() { - mKeyguardDelegate.startKeyguardExitAnimation(fadeoutDuration); - } - }); + mKeyguardDelegate.startKeyguardExitAnimation(startTime, fadeoutDuration); } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java index faf7020..63a5850 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java @@ -274,9 +274,9 @@ public class KeyguardServiceDelegate { mKeyguardState.currentUser = newUserId; } - public void startKeyguardExitAnimation(long fadeoutDuration) { + public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { if (mKeyguardService != null) { - mKeyguardService.startKeyguardExitAnimation(fadeoutDuration); + mKeyguardService.startKeyguardExitAnimation(startTime, fadeoutDuration); } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java index f236ce7..5096bd3 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java @@ -190,9 +190,9 @@ public class KeyguardServiceWrapper implements IKeyguardService { } } - public void startKeyguardExitAnimation(long fadeoutDuration) { + public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { try { - mService.startKeyguardExitAnimation(fadeoutDuration); + mService.startKeyguardExitAnimation(startTime, fadeoutDuration); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 6fdd535..008d2fc 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -284,7 +284,7 @@ public class WindowAnimator { } else if (mKeyguardGoingAway && !nowAnimating) { // Timeout!! Slog.e(TAG, "Timeout waiting for animation to startup"); - mPolicy.startKeyguardExitAnimation(0); + mPolicy.startKeyguardExitAnimation(0, 0); mKeyguardGoingAway = false; } if (win.isReadyForDisplay()) { @@ -392,7 +392,9 @@ public class WindowAnimator { winAnimator.mAnimationIsEntrance = true; if (startKeyguardExit) { // Do one time only. - mPolicy.startKeyguardExitAnimation(a.getStartOffset()); + mPolicy.startKeyguardExitAnimation(mCurrentTime + a.getStartOffset(), + a.getDuration()); + mKeyguardGoingAway = false; startKeyguardExit = false; } } |