Merge "Don't animate clock when turning screen off." into qt-dev

This commit is contained in:
bsears
2019-07-24 01:22:21 +00:00
committed by Android (Google) Code Review
4 changed files with 66 additions and 27 deletions

View File

@@ -540,6 +540,9 @@ public class KeyguardClockSwitch extends RelativeLayout {
@Override @Override
public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
TransitionValues endValues) { TransitionValues endValues) {
if (!sceneRoot.isShown()) {
return null;
}
final float cutoff = mCutoff; final float cutoff = mCutoff;
final int startVisibility = View.INVISIBLE; final int startVisibility = View.INVISIBLE;
final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY);
@@ -552,6 +555,9 @@ public class KeyguardClockSwitch extends RelativeLayout {
@Override @Override
public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues, public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
TransitionValues endValues) { TransitionValues endValues) {
if (!sceneRoot.isShown()) {
return null;
}
final float cutoff = 1f - mCutoff; final float cutoff = 1f - mCutoff;
final int startVisibility = View.VISIBLE; final int startVisibility = View.VISIBLE;
final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY);

View File

@@ -89,6 +89,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
private final HashMap<View, PendingIntent> mClickActions; private final HashMap<View, PendingIntent> mClickActions;
private final ActivityStarter mActivityStarter; private final ActivityStarter mActivityStarter;
private final ConfigurationController mConfigurationController; private final ConfigurationController mConfigurationController;
private final LayoutTransition mLayoutTransition;
private Uri mKeyguardSliceUri; private Uri mKeyguardSliceUri;
@VisibleForTesting @VisibleForTesting
TextView mTitle; TextView mTitle;
@@ -126,16 +127,16 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
mActivityStarter = activityStarter; mActivityStarter = activityStarter;
mConfigurationController = configurationController; mConfigurationController = configurationController;
LayoutTransition transition = new LayoutTransition(); mLayoutTransition = new LayoutTransition();
transition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); mLayoutTransition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2);
transition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); mLayoutTransition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION);
transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2);
transition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.FAST_OUT_SLOW_IN); mLayoutTransition.setInterpolator(LayoutTransition.APPEARING,
transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); Interpolators.FAST_OUT_SLOW_IN);
transition.setAnimateParentHierarchy(false); mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT);
setLayoutTransition(transition); mLayoutTransition.setAnimateParentHierarchy(false);
} }
@Override @Override
@@ -174,6 +175,12 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
mConfigurationController.removeCallback(this); 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. * Returns whether the current visible slice has a title/header.
*/ */
@@ -419,6 +426,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
* their desired positions. * their desired positions.
*/ */
private final Animation.AnimationListener mKeepAwakeListener; private final Animation.AnimationListener mKeepAwakeListener;
private LayoutTransition mLayoutTransition;
private float mDarkAmount; private float mDarkAmount;
public Row(Context context) { public Row(Context context) {
@@ -440,33 +448,41 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
LayoutTransition transition = new LayoutTransition(); mLayoutTransition = new LayoutTransition();
transition.setDuration(DEFAULT_ANIM_DURATION); mLayoutTransition.setDuration(DEFAULT_ANIM_DURATION);
PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1); PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1);
PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1); PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1);
ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null, ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null,
left, right); left, right);
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator);
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator);
transition.setInterpolator(LayoutTransition.CHANGE_APPEARING, mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING,
Interpolators.ACCELERATE_DECELERATE); Interpolators.ACCELERATE_DECELERATE);
transition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING,
Interpolators.ACCELERATE_DECELERATE); Interpolators.ACCELERATE_DECELERATE);
transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION); mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_APPEARING,
transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, DEFAULT_ANIM_DURATION); DEFAULT_ANIM_DURATION);
mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING,
DEFAULT_ANIM_DURATION);
ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f); ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f);
transition.setAnimator(LayoutTransition.APPEARING, appearAnimator); mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearAnimator);
transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN);
ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f); ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f);
transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING,
transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); Interpolators.ALPHA_OUT);
transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4);
mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator);
transition.setAnimateParentHierarchy(false); mLayoutTransition.setAnimateParentHierarchy(false);
setLayoutTransition(transition); }
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
setLayoutTransition(isVisible ? mLayoutTransition : null);
} }
@Override @Override

View File

@@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl;
import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeController;
@@ -125,6 +126,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
private CharSequence mMediaTitle; private CharSequence mMediaTitle;
private CharSequence mMediaArtist; private CharSequence mMediaArtist;
protected boolean mDozing; protected boolean mDozing;
private int mStatusBarState;
private boolean mMediaIsVisible; private boolean mMediaIsVisible;
/** /**
@@ -227,7 +229,10 @@ public class KeyguardSliceProvider extends SliceProvider implements
} }
protected boolean needsMediaLocked() { protected boolean needsMediaLocked() {
return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && mDozing; // 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 || keepWhenShade);
} }
protected void addMediaLocked(ListBuilder listBuilder) { protected void addMediaLocked(ListBuilder listBuilder) {
@@ -454,7 +459,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
synchronized (this) { synchronized (this) {
boolean nextVisible = !mMediaInvisibleStates.contains(state); boolean nextVisible = !mMediaInvisibleStates.contains(state);
mHandler.removeCallbacksAndMessages(mMediaToken); 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 // 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 // animation. The media app might not send its update when buffering, and the slice
// would end up without a header for 0.5 second. // would end up without a header for 0.5 second.
@@ -511,5 +516,14 @@ public class KeyguardSliceProvider extends SliceProvider implements
@Override @Override
public void onStateChanged(int newState) { public void onStateChanged(int newState) {
final boolean notify;
synchronized (this) {
boolean needsMedia = needsMediaLocked();
mStatusBarState = newState;
notify = needsMedia != needsMediaLocked();
}
if (notify) {
notifyChange();
}
} }
} }

View File

@@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.wakelock.SettableWakeLock; import com.android.systemui.util.wakelock.SettableWakeLock;
@@ -177,6 +178,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
@Test @Test
public void onMetadataChanged_updatesSlice() { public void onMetadataChanged_updatesSlice() {
mProvider.onStateChanged(StatusBarState.KEYGUARD);
mProvider.onDozingChanged(true); mProvider.onDozingChanged(true);
reset(mContentResolver); reset(mContentResolver);
mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING);
@@ -190,6 +192,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
@Test @Test
public void onDozingChanged_updatesSliceIfMedia() { public void onDozingChanged_updatesSliceIfMedia() {
mProvider.onStateChanged(StatusBarState.KEYGUARD);
mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING);
reset(mContentResolver); reset(mContentResolver);
// Show media when dozing // Show media when dozing