diff options
Diffstat (limited to 'packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java')
-rw-r--r-- | packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java | 110 |
1 files changed, 63 insertions, 47 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index a5b25097a56e..9238b8226bbc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -14,6 +14,9 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.RelativeLayout; +import androidx.annotation.IntDef; +import androidx.annotation.VisibleForTesting; + import com.android.internal.colorextraction.ColorExtractor; import com.android.keyguard.dagger.KeyguardStatusViewScope; import com.android.systemui.R; @@ -22,6 +25,8 @@ import com.android.systemui.plugins.ClockPlugin; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import java.util.TimeZone; @@ -35,7 +40,14 @@ public class KeyguardClockSwitch extends RelativeLayout { private static final long CLOCK_OUT_MILLIS = 150; private static final long CLOCK_IN_MILLIS = 200; - private static final long SMARTSPACE_MOVE_MILLIS = 350; + private static final long STATUS_AREA_MOVE_MILLIS = 350; + + @IntDef({LARGE, SMALL}) + @Retention(RetentionPolicy.SOURCE) + public @interface ClockSize { } + + public static final int LARGE = 0; + public static final int SMALL = 1; /** * Optional/alternative clock injected via plugin. @@ -50,13 +62,7 @@ public class KeyguardClockSwitch extends RelativeLayout { private AnimatableClockView mClockView; private AnimatableClockView mLargeClockView; - /** - * Status area (date and other stuff) shown below the clock. Plugin can decide whether or not to - * show it below the alternate clock. - */ - private View mKeyguardStatusArea; - /** Mutually exclusive with mKeyguardStatusArea */ - private View mSmartspaceView; + private View mStatusArea; private int mSmartspaceTopOffset; /** @@ -65,14 +71,14 @@ public class KeyguardClockSwitch extends RelativeLayout { private float mDarkAmount; /** - * Boolean value indicating if notifications are visible on lock screen. Use null to signify - * it is uninitialized. + * Indicates which clock is currently displayed - should be one of {@link ClockSize}. + * Use null to signify it is uninitialized. */ - private Boolean mHasVisibleNotifications = null; + @ClockSize private Integer mDisplayedClockSize = null; - private AnimatorSet mClockInAnim = null; - private AnimatorSet mClockOutAnim = null; - private ObjectAnimator mSmartspaceAnim = null; + @VisibleForTesting AnimatorSet mClockInAnim = null; + @VisibleForTesting AnimatorSet mClockOutAnim = null; + private ObjectAnimator mStatusAreaAnim = null; /** * If the Keyguard Slice has a header (big center-aligned text.) @@ -81,6 +87,7 @@ public class KeyguardClockSwitch extends RelativeLayout { private int[] mColorPalette; private int mClockSwitchYAmount; + @VisibleForTesting boolean mChildrenAreLaidOut = false; public KeyguardClockSwitch(Context context, AttributeSet attrs) { super(context, attrs); @@ -117,7 +124,7 @@ public class KeyguardClockSwitch extends RelativeLayout { mClockView = findViewById(R.id.animatable_clock_view); mLargeClockFrame = findViewById(R.id.lockscreen_clock_view_large); mLargeClockView = findViewById(R.id.animatable_clock_view_large); - mKeyguardStatusArea = findViewById(R.id.keyguard_status_area); + mStatusArea = findViewById(R.id.keyguard_status_area); onDensityOrFontScaleChanged(); } @@ -186,22 +193,22 @@ public class KeyguardClockSwitch extends RelativeLayout { private void animateClockChange(boolean useLargeClock) { if (mClockInAnim != null) mClockInAnim.cancel(); if (mClockOutAnim != null) mClockOutAnim.cancel(); - if (mSmartspaceAnim != null) mSmartspaceAnim.cancel(); + if (mStatusAreaAnim != null) mStatusAreaAnim.cancel(); View in, out; int direction = 1; - float smartspaceYTranslation; + float statusAreaYTranslation; if (useLargeClock) { out = mClockFrame; in = mLargeClockFrame; if (indexOfChild(in) == -1) addView(in); direction = -1; - smartspaceYTranslation = mSmartspaceView == null ? 0 - : mClockFrame.getTop() - mSmartspaceView.getTop() + mSmartspaceTopOffset; + statusAreaYTranslation = mClockFrame.getTop() - mStatusArea.getTop() + + mSmartspaceTopOffset; } else { in = mClockFrame; out = mLargeClockFrame; - smartspaceYTranslation = 0f; + statusAreaYTranslation = 0f; // Must remove in order for notifications to appear in the proper place removeView(out); @@ -237,18 +244,16 @@ public class KeyguardClockSwitch extends RelativeLayout { mClockInAnim.start(); mClockOutAnim.start(); - if (mSmartspaceView != null) { - mSmartspaceAnim = ObjectAnimator.ofFloat(mSmartspaceView, View.TRANSLATION_Y, - smartspaceYTranslation); - mSmartspaceAnim.setDuration(SMARTSPACE_MOVE_MILLIS); - mSmartspaceAnim.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); - mSmartspaceAnim.addListener(new AnimatorListenerAdapter() { - public void onAnimationEnd(Animator animation) { - mSmartspaceAnim = null; - } - }); - mSmartspaceAnim.start(); - } + mStatusAreaAnim = ObjectAnimator.ofFloat(mStatusArea, View.TRANSLATION_Y, + statusAreaYTranslation); + mStatusAreaAnim.setDuration(STATUS_AREA_MOVE_MILLIS); + mStatusAreaAnim.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + mStatusAreaAnim.addListener(new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animation) { + mStatusAreaAnim = null; + } + }); + mStatusAreaAnim.start(); } /** @@ -264,19 +269,34 @@ public class KeyguardClockSwitch extends RelativeLayout { } /** - * Based upon whether notifications are showing or not, display/hide the large clock and - * the smaller version. + * Display the desired clock and hide the other one + * + * @return true if desired clock appeared and false if it was already visible */ - boolean willSwitchToLargeClock(boolean hasVisibleNotifications) { - if (mHasVisibleNotifications != null - && hasVisibleNotifications == mHasVisibleNotifications) { + boolean switchToClock(@ClockSize int clockSize) { + if (mDisplayedClockSize != null && clockSize == mDisplayedClockSize) { return false; } - boolean useLargeClock = !hasVisibleNotifications; - animateClockChange(useLargeClock); - mHasVisibleNotifications = hasVisibleNotifications; - return useLargeClock; + // let's make sure clock is changed only after all views were laid out so we can + // translate them properly + if (mChildrenAreLaidOut) { + animateClockChange(clockSize == LARGE); + } + + mDisplayedClockSize = clockSize; + return true; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + if (mDisplayedClockSize != null && !mChildrenAreLaidOut) { + animateClockChange(mDisplayedClockSize == LARGE); + } + + mChildrenAreLaidOut = true; } public Paint getPaint() { @@ -320,10 +340,6 @@ public class KeyguardClockSwitch extends RelativeLayout { } } - void setSmartspaceView(View smartspaceView) { - mSmartspaceView = smartspaceView; - } - void updateColors(ColorExtractor.GradientColors colors) { mSupportsDarkText = colors.supportsDarkText(); mColorPalette = colors.getColorPalette(); @@ -337,10 +353,10 @@ public class KeyguardClockSwitch extends RelativeLayout { pw.println(" mClockPlugin: " + mClockPlugin); pw.println(" mClockFrame: " + mClockFrame); pw.println(" mLargeClockFrame: " + mLargeClockFrame); - pw.println(" mKeyguardStatusArea: " + mKeyguardStatusArea); - pw.println(" mSmartspaceView: " + mSmartspaceView); + pw.println(" mStatusArea: " + mStatusArea); pw.println(" mDarkAmount: " + mDarkAmount); pw.println(" mSupportsDarkText: " + mSupportsDarkText); pw.println(" mColorPalette: " + Arrays.toString(mColorPalette)); + pw.println(" mDisplayedClockSize: " + mDisplayedClockSize); } } |