Loading packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +6 −0 Original line number Diff line number Diff line Loading @@ -584,6 +584,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @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); Loading @@ -596,6 +599,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @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); Loading packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +41 −25 Original line number Diff line number Diff line Loading @@ -89,6 +89,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe private final HashMap<View, PendingIntent> mClickActions; private final ActivityStarter mActivityStarter; private final ConfigurationController mConfigurationController; private final LayoutTransition mLayoutTransition; private Uri mKeyguardSliceUri; @VisibleForTesting TextView mTitle; Loading Loading @@ -126,16 +127,16 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe 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 Loading Loading @@ -174,6 +175,12 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe 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. */ Loading Loading @@ -419,6 +426,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe * their desired positions. */ private final Animation.AnimationListener mKeepAwakeListener; private LayoutTransition mLayoutTransition; private float mDarkAmount; public Row(Context context) { Loading @@ -440,33 +448,41 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe @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 Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +17 −3 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; 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; Loading @@ -62,7 +63,6 @@ import com.android.systemui.util.wakelock.SettableWakeLock; 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; Loading Loading @@ -128,6 +128,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; private int mStatusBarState; private boolean mMediaIsVisible; /** Loading Loading @@ -231,7 +232,11 @@ public class KeyguardSliceProvider extends SliceProvider implements 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) { Loading Loading @@ -458,7 +463,7 @@ public class KeyguardSliceProvider extends SliceProvider implements 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. Loading Loading @@ -515,5 +520,14 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onStateChanged(int newState) { final boolean notify; synchronized (this) { boolean needsMedia = needsMediaLocked(); mStatusBarState = newState; notify = needsMedia != needsMediaLocked(); } if (notify) { notifyChange(); } } } packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; 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; Loading Loading @@ -197,6 +198,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onDozingChanged(true); reset(mContentResolver); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); Loading @@ -210,6 +212,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onDozingChanged_updatesSliceIfMedia() { mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); reset(mContentResolver); // Show media when dozing Loading Loading
packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +6 −0 Original line number Diff line number Diff line Loading @@ -584,6 +584,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @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); Loading @@ -596,6 +599,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @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); Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +41 −25 Original line number Diff line number Diff line Loading @@ -89,6 +89,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe private final HashMap<View, PendingIntent> mClickActions; private final ActivityStarter mActivityStarter; private final ConfigurationController mConfigurationController; private final LayoutTransition mLayoutTransition; private Uri mKeyguardSliceUri; @VisibleForTesting TextView mTitle; Loading Loading @@ -126,16 +127,16 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe 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 Loading Loading @@ -174,6 +175,12 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe 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. */ Loading Loading @@ -419,6 +426,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe * their desired positions. */ private final Animation.AnimationListener mKeepAwakeListener; private LayoutTransition mLayoutTransition; private float mDarkAmount; public Row(Context context) { Loading @@ -440,33 +448,41 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe @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 Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +17 −3 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; 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; Loading @@ -62,7 +63,6 @@ import com.android.systemui.util.wakelock.SettableWakeLock; 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; Loading Loading @@ -128,6 +128,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; private int mStatusBarState; private boolean mMediaIsVisible; /** Loading Loading @@ -231,7 +232,11 @@ public class KeyguardSliceProvider extends SliceProvider implements 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) { Loading Loading @@ -458,7 +463,7 @@ public class KeyguardSliceProvider extends SliceProvider implements 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. Loading Loading @@ -515,5 +520,14 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onStateChanged(int newState) { final boolean notify; synchronized (this) { boolean needsMedia = needsMediaLocked(); mStatusBarState = newState; notify = needsMedia != needsMediaLocked(); } if (notify) { notifyChange(); } } }
packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; 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; Loading Loading @@ -197,6 +198,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onDozingChanged(true); reset(mContentResolver); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); Loading @@ -210,6 +212,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onDozingChanged_updatesSliceIfMedia() { mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); reset(mContentResolver); // Show media when dozing Loading