Don't animate clock when turning screen off.
This change stops the animation because there isn't a
transition from the no-header state to the music header
state when turning the screen off (to AOD). Since there
isn't a transition, there isn't an animation.
This assumes that there isn't a transition from unlocked to
lock screen. If there is, then there would be an animation
of the music going away while arriving at the lock screen.
Fixes: 137383007
Test: Checked repro steps in bug, clock doesn't animate.
Test: Also checked repro steps when audio is paused, clock doesn't
animate.
Test: atest KeyguardSliceProviderTest.java
Change-Id: If39777340b72bc623d6690bc4f784c7f5c26ea8d
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 2483192..5097216 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -584,6 +584,9 @@
@Override
public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
TransitionValues endValues) {
+ if (!sceneRoot.isShown()) {
+ return null;
+ }
final float cutoff = mCutoff;
final int startVisibility = View.INVISIBLE;
final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY);
@@ -596,6 +599,9 @@
@Override
public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
TransitionValues endValues) {
+ if (!sceneRoot.isShown()) {
+ return null;
+ }
final float cutoff = 1f - mCutoff;
final int startVisibility = View.VISIBLE;
final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index e219e24..af4e61b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -89,6 +89,7 @@
private final HashMap<View, PendingIntent> mClickActions;
private final ActivityStarter mActivityStarter;
private final ConfigurationController mConfigurationController;
+ private final LayoutTransition mLayoutTransition;
private Uri mKeyguardSliceUri;
@VisibleForTesting
TextView mTitle;
@@ -126,16 +127,16 @@
mActivityStarter = activityStarter;
mConfigurationController = configurationController;
- LayoutTransition transition = new LayoutTransition();
- transition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2);
- transition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION);
- transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2);
- transition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
- transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
- transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.FAST_OUT_SLOW_IN);
- transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT);
- transition.setAnimateParentHierarchy(false);
- setLayoutTransition(transition);
+ mLayoutTransition = new LayoutTransition();
+ mLayoutTransition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2);
+ mLayoutTransition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION);
+ mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2);
+ mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
+ mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
+ mLayoutTransition.setInterpolator(LayoutTransition.APPEARING,
+ Interpolators.FAST_OUT_SLOW_IN);
+ mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT);
+ mLayoutTransition.setAnimateParentHierarchy(false);
}
@Override
@@ -174,6 +175,12 @@
mConfigurationController.removeCallback(this);
}
+ @Override
+ public void onVisibilityAggregated(boolean isVisible) {
+ super.onVisibilityAggregated(isVisible);
+ setLayoutTransition(isVisible ? mLayoutTransition : null);
+ }
+
/**
* Returns whether the current visible slice has a title/header.
*/
@@ -419,6 +426,7 @@
* their desired positions.
*/
private final Animation.AnimationListener mKeepAwakeListener;
+ private LayoutTransition mLayoutTransition;
private float mDarkAmount;
public Row(Context context) {
@@ -440,33 +448,41 @@
@Override
protected void onFinishInflate() {
- LayoutTransition transition = new LayoutTransition();
- transition.setDuration(DEFAULT_ANIM_DURATION);
+ mLayoutTransition = new LayoutTransition();
+ mLayoutTransition.setDuration(DEFAULT_ANIM_DURATION);
PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1);
PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1);
ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null,
left, right);
- transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator);
- transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator);
- transition.setInterpolator(LayoutTransition.CHANGE_APPEARING,
+ mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator);
+ mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator);
+ mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING,
Interpolators.ACCELERATE_DECELERATE);
- transition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING,
+ mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING,
Interpolators.ACCELERATE_DECELERATE);
- transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION);
- transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, DEFAULT_ANIM_DURATION);
+ mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_APPEARING,
+ DEFAULT_ANIM_DURATION);
+ mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING,
+ DEFAULT_ANIM_DURATION);
ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f);
- transition.setAnimator(LayoutTransition.APPEARING, appearAnimator);
- transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN);
+ mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearAnimator);
+ mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN);
ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f);
- transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT);
- transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4);
- transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator);
+ mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING,
+ Interpolators.ALPHA_OUT);
+ mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4);
+ mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator);
- transition.setAnimateParentHierarchy(false);
- setLayoutTransition(transition);
+ mLayoutTransition.setAnimateParentHierarchy(false);
+ }
+
+ @Override
+ public void onVisibilityAggregated(boolean isVisible) {
+ super.onVisibilityAggregated(isVisible);
+ setLayoutTransition(isVisible ? mLayoutTransition : null);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
index 5136682..48f32cf 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
@@ -52,6 +52,7 @@
import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.policy.NextAlarmController;
@@ -62,7 +63,6 @@
import com.android.systemui.util.wakelock.WakeLock;
import java.util.Date;
-import java.util.HashSet;
import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
@@ -128,6 +128,7 @@
private CharSequence mMediaTitle;
private CharSequence mMediaArtist;
protected boolean mDozing;
+ private int mStatusBarState;
private boolean mMediaIsVisible;
/**
@@ -231,7 +232,11 @@
protected boolean needsMediaLocked() {
boolean keepWhenAwake = mKeyguardBypassController != null
&& mKeyguardBypassController.getBypassEnabled() && mDozeParameters.getAlwaysOn();
- return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenAwake);
+ // Show header if music is playing and the status bar is in the shade state. This way, an
+ // animation isn't necessary when pressing power and transitioning to AOD.
+ boolean keepWhenShade = mStatusBarState == StatusBarState.SHADE && mMediaIsVisible;
+ return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenAwake
+ || keepWhenShade);
}
protected void addMediaLocked(ListBuilder listBuilder) {
@@ -458,7 +463,7 @@
synchronized (this) {
boolean nextVisible = NotificationMediaManager.isPlayingState(state);
mHandler.removeCallbacksAndMessages(mMediaToken);
- if (mMediaIsVisible && !nextVisible) {
+ if (mMediaIsVisible && !nextVisible && mStatusBarState != StatusBarState.SHADE) {
// We need to delay this event for a few millis when stopping to avoid jank in the
// animation. The media app might not send its update when buffering, and the slice
// would end up without a header for 0.5 second.
@@ -515,5 +520,14 @@
@Override
public void onStateChanged(int newState) {
+ final boolean notify;
+ synchronized (this) {
+ boolean needsMedia = needsMediaLocked();
+ mStatusBarState = newState;
+ notify = needsMedia != needsMediaLocked();
+ }
+ if (notify) {
+ notifyChange();
+ }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
index 893f3d1..9576cb2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
@@ -48,6 +48,7 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -197,6 +198,7 @@
@Test
public void onMetadataChanged_updatesSlice() {
+ mProvider.onStateChanged(StatusBarState.KEYGUARD);
mProvider.onDozingChanged(true);
reset(mContentResolver);
mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING);
@@ -210,6 +212,7 @@
@Test
public void onDozingChanged_updatesSliceIfMedia() {
+ mProvider.onStateChanged(StatusBarState.KEYGUARD);
mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING);
reset(mContentResolver);
// Show media when dozing