Loading core/java/android/text/style/DynamicDrawableSpan.java +9 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,13 @@ public abstract class DynamicDrawableSpan extends ReplacementSpan { */ public static final int ALIGN_BASELINE = 1; /** * A constant indicating that this span should be vertically centered between * the top and the lowest descender. * @hide */ public static final int ALIGN_CENTER = 2; protected final int mVerticalAlignment; @UnsupportedAppUsage Loading Loading @@ -142,6 +149,8 @@ public abstract class DynamicDrawableSpan extends ReplacementSpan { int transY = bottom - b.getBounds().bottom; if (mVerticalAlignment == ALIGN_BASELINE) { transY -= paint.getFontMetricsInt().descent; } else if (mVerticalAlignment == ALIGN_CENTER) { transY = (bottom - top) / 2 - b.getBounds().height() / 2; } canvas.translate(x, transY); Loading packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml +10 −1 Original line number Diff line number Diff line Loading @@ -28,11 +28,20 @@ android:clipToPadding="false" android:orientation="vertical" android:layout_centerHorizontal="true"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="64dp" android:paddingEnd="64dp" android:visibility="gone" android:textColor="?attr/wallpaperTextColor" android:theme="@style/TextAppearance.Keyguard" /> <view class="com.android.keyguard.KeyguardSliceView$Row" android:id="@+id/row" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/subtitle_clock_padding" android:orientation="horizontal" android:gravity="center" /> Loading packages/SystemUI/res-keyguard/layout/text_clock.xml +2 −1 Original line number Diff line number Diff line Loading @@ -16,9 +16,10 @@ --> <TextClock xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center_horizontal" android:letterSpacing="0.03" android:textColor="?attr/wallpaperTextColor" android:singleLine="true" Loading packages/SystemUI/res-keyguard/values/dimens.xml +6 −6 Original line number Diff line number Diff line Loading @@ -42,18 +42,18 @@ <dimen name="eca_overlap">-10dip</dimen> <!-- Slice header --> <dimen name="widget_title_font_size">24dp</dimen> <dimen name="widget_title_bottom_margin">14dp</dimen> <dimen name="bottom_text_spacing_digital">0dp</dimen> <dimen name="widget_title_font_size">22dp</dimen> <dimen name="header_subtitle_padding">4dp</dimen> <dimen name="header_icon_size">20dp</dimen> <!-- Slice subtitle --> <dimen name="widget_label_font_size">16dp</dimen> <!-- Clock without header --> <dimen name="widget_big_font_size">64dp</dimen> <dimen name="bottom_text_spacing_digital">0dp</dimen> <!-- Clock with header --> <dimen name="widget_small_clock_padding">-25dp</dimen> <dimen name="widget_small_font_size">24dp</dimen> <dimen name="widget_small_font_stroke">0.6dp</dimen> <dimen name="widget_small_font_size">22dp</dimen> <dimen name="widget_vertical_padding">32dp</dimen> <dimen name="widget_vertical_padding_clock">30dp</dimen> <!-- Subtitle paddings --> <dimen name="widget_horizontal_padding">8dp</dimen> <dimen name="widget_icon_size">16dp</dimen> Loading packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +86 −0 Original line number Diff line number Diff line package com.android.keyguard; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.app.WallpaperManager; import android.content.Context; import android.graphics.Paint; import android.graphics.Paint.Style; import android.transition.ChangeBounds; import android.transition.Transition; import android.transition.TransitionManager; import android.transition.TransitionValues; import android.util.AttributeSet; import android.util.MathUtils; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; Loading @@ -16,6 +25,7 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; import com.android.keyguard.clock.ClockManager; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; Loading @@ -28,6 +38,7 @@ import java.util.TimeZone; */ public class KeyguardClockSwitch extends RelativeLayout { private final Transition mTransition; /** * Optional/alternative clock injected via plugin. */ Loading @@ -53,6 +64,10 @@ public class KeyguardClockSwitch extends RelativeLayout { * Maintain state so that a newly connected plugin can be initialized. */ private float mDarkAmount; /** * If the Keyguard Slice has a header (big center-aligned text.) */ private boolean mShowingHeader; private boolean mSupportsDarkText; private int[] mColorPalette; Loading Loading @@ -98,6 +113,7 @@ public class KeyguardClockSwitch extends RelativeLayout { public KeyguardClockSwitch(Context context, AttributeSet attrs) { super(context, attrs); mTransition = new ClockBoundsTransition(); } /** Loading Loading @@ -286,6 +302,26 @@ public class KeyguardClockSwitch extends RelativeLayout { } } /** * Sets if the keyguard slice is showing a center-aligned header. We need a smaller clock * in these cases. */ public void setKeyguardShowingHeader(boolean hasHeader) { if (mShowingHeader == hasHeader || hasCustomClock()) { return; } mShowingHeader = hasHeader; TransitionManager.beginDelayedTransition((ViewGroup) mClockView.getParent(), mTransition); int fontSize = mContext.getResources().getDimensionPixelSize(mShowingHeader ? R.dimen.widget_small_font_size : R.dimen.widget_big_font_size); int paddingBottom = mContext.getResources().getDimensionPixelSize(mShowingHeader ? R.dimen.widget_vertical_padding_clock : R.dimen.header_subtitle_padding); mClockView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize); mClockView.setPadding(mClockView.getPaddingLeft(), mClockView.getPaddingTop(), mClockView.getPaddingRight(), paddingBottom); } @VisibleForTesting (otherwise = VisibleForTesting.NONE) ClockManager.ClockChangedListener getClockChangedListener() { return mClockChangedListener; Loading @@ -295,4 +331,54 @@ public class KeyguardClockSwitch extends RelativeLayout { StatusBarStateController.StateListener getStateListener() { return mStateListener; } /** * Special layout transition that scales the clock view as its bounds change, to make it look * like the text is shrinking. */ private class ClockBoundsTransition extends ChangeBounds { ClockBoundsTransition() { setDuration(KeyguardSliceView.DEFAULT_ANIM_DURATION / 2); setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); } @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { Animator animator = super.createAnimator(sceneRoot, startValues, endValues); if (animator == null || startValues.view != mClockView) { return animator; } ValueAnimator boundsAnimator = null; if (animator instanceof AnimatorSet) { Animator first = ((AnimatorSet) animator).getChildAnimations().get(0); if (first instanceof ValueAnimator) { boundsAnimator = (ValueAnimator) first; } } else if (animator instanceof ValueAnimator) { boundsAnimator = (ValueAnimator) animator; } if (boundsAnimator != null) { float bigFontSize = mContext.getResources() .getDimensionPixelSize(R.dimen.widget_big_font_size); float smallFontSize = mContext.getResources() .getDimensionPixelSize(R.dimen.widget_small_font_size); float startScale = mShowingHeader ? bigFontSize / smallFontSize : smallFontSize / bigFontSize; boundsAnimator.addUpdateListener(animation -> { float scale = MathUtils.lerp(startScale, 1f /* stop */, animation.getAnimatedFraction()); mClockView.setPivotX(mClockView.getWidth() / 2); mClockView.setPivotY(0); mClockView.setScaleX(scale); mClockView.setScaleY(scale); }); } return animator; } } } Loading
core/java/android/text/style/DynamicDrawableSpan.java +9 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,13 @@ public abstract class DynamicDrawableSpan extends ReplacementSpan { */ public static final int ALIGN_BASELINE = 1; /** * A constant indicating that this span should be vertically centered between * the top and the lowest descender. * @hide */ public static final int ALIGN_CENTER = 2; protected final int mVerticalAlignment; @UnsupportedAppUsage Loading Loading @@ -142,6 +149,8 @@ public abstract class DynamicDrawableSpan extends ReplacementSpan { int transY = bottom - b.getBounds().bottom; if (mVerticalAlignment == ALIGN_BASELINE) { transY -= paint.getFontMetricsInt().descent; } else if (mVerticalAlignment == ALIGN_CENTER) { transY = (bottom - top) / 2 - b.getBounds().height() / 2; } canvas.translate(x, transY); Loading
packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml +10 −1 Original line number Diff line number Diff line Loading @@ -28,11 +28,20 @@ android:clipToPadding="false" android:orientation="vertical" android:layout_centerHorizontal="true"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="64dp" android:paddingEnd="64dp" android:visibility="gone" android:textColor="?attr/wallpaperTextColor" android:theme="@style/TextAppearance.Keyguard" /> <view class="com.android.keyguard.KeyguardSliceView$Row" android:id="@+id/row" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/subtitle_clock_padding" android:orientation="horizontal" android:gravity="center" /> Loading
packages/SystemUI/res-keyguard/layout/text_clock.xml +2 −1 Original line number Diff line number Diff line Loading @@ -16,9 +16,10 @@ --> <TextClock xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center_horizontal" android:letterSpacing="0.03" android:textColor="?attr/wallpaperTextColor" android:singleLine="true" Loading
packages/SystemUI/res-keyguard/values/dimens.xml +6 −6 Original line number Diff line number Diff line Loading @@ -42,18 +42,18 @@ <dimen name="eca_overlap">-10dip</dimen> <!-- Slice header --> <dimen name="widget_title_font_size">24dp</dimen> <dimen name="widget_title_bottom_margin">14dp</dimen> <dimen name="bottom_text_spacing_digital">0dp</dimen> <dimen name="widget_title_font_size">22dp</dimen> <dimen name="header_subtitle_padding">4dp</dimen> <dimen name="header_icon_size">20dp</dimen> <!-- Slice subtitle --> <dimen name="widget_label_font_size">16dp</dimen> <!-- Clock without header --> <dimen name="widget_big_font_size">64dp</dimen> <dimen name="bottom_text_spacing_digital">0dp</dimen> <!-- Clock with header --> <dimen name="widget_small_clock_padding">-25dp</dimen> <dimen name="widget_small_font_size">24dp</dimen> <dimen name="widget_small_font_stroke">0.6dp</dimen> <dimen name="widget_small_font_size">22dp</dimen> <dimen name="widget_vertical_padding">32dp</dimen> <dimen name="widget_vertical_padding_clock">30dp</dimen> <!-- Subtitle paddings --> <dimen name="widget_horizontal_padding">8dp</dimen> <dimen name="widget_icon_size">16dp</dimen> Loading
packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +86 −0 Original line number Diff line number Diff line package com.android.keyguard; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.app.WallpaperManager; import android.content.Context; import android.graphics.Paint; import android.graphics.Paint.Style; import android.transition.ChangeBounds; import android.transition.Transition; import android.transition.TransitionManager; import android.transition.TransitionValues; import android.util.AttributeSet; import android.util.MathUtils; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; Loading @@ -16,6 +25,7 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; import com.android.keyguard.clock.ClockManager; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; Loading @@ -28,6 +38,7 @@ import java.util.TimeZone; */ public class KeyguardClockSwitch extends RelativeLayout { private final Transition mTransition; /** * Optional/alternative clock injected via plugin. */ Loading @@ -53,6 +64,10 @@ public class KeyguardClockSwitch extends RelativeLayout { * Maintain state so that a newly connected plugin can be initialized. */ private float mDarkAmount; /** * If the Keyguard Slice has a header (big center-aligned text.) */ private boolean mShowingHeader; private boolean mSupportsDarkText; private int[] mColorPalette; Loading Loading @@ -98,6 +113,7 @@ public class KeyguardClockSwitch extends RelativeLayout { public KeyguardClockSwitch(Context context, AttributeSet attrs) { super(context, attrs); mTransition = new ClockBoundsTransition(); } /** Loading Loading @@ -286,6 +302,26 @@ public class KeyguardClockSwitch extends RelativeLayout { } } /** * Sets if the keyguard slice is showing a center-aligned header. We need a smaller clock * in these cases. */ public void setKeyguardShowingHeader(boolean hasHeader) { if (mShowingHeader == hasHeader || hasCustomClock()) { return; } mShowingHeader = hasHeader; TransitionManager.beginDelayedTransition((ViewGroup) mClockView.getParent(), mTransition); int fontSize = mContext.getResources().getDimensionPixelSize(mShowingHeader ? R.dimen.widget_small_font_size : R.dimen.widget_big_font_size); int paddingBottom = mContext.getResources().getDimensionPixelSize(mShowingHeader ? R.dimen.widget_vertical_padding_clock : R.dimen.header_subtitle_padding); mClockView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize); mClockView.setPadding(mClockView.getPaddingLeft(), mClockView.getPaddingTop(), mClockView.getPaddingRight(), paddingBottom); } @VisibleForTesting (otherwise = VisibleForTesting.NONE) ClockManager.ClockChangedListener getClockChangedListener() { return mClockChangedListener; Loading @@ -295,4 +331,54 @@ public class KeyguardClockSwitch extends RelativeLayout { StatusBarStateController.StateListener getStateListener() { return mStateListener; } /** * Special layout transition that scales the clock view as its bounds change, to make it look * like the text is shrinking. */ private class ClockBoundsTransition extends ChangeBounds { ClockBoundsTransition() { setDuration(KeyguardSliceView.DEFAULT_ANIM_DURATION / 2); setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); } @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { Animator animator = super.createAnimator(sceneRoot, startValues, endValues); if (animator == null || startValues.view != mClockView) { return animator; } ValueAnimator boundsAnimator = null; if (animator instanceof AnimatorSet) { Animator first = ((AnimatorSet) animator).getChildAnimations().get(0); if (first instanceof ValueAnimator) { boundsAnimator = (ValueAnimator) first; } } else if (animator instanceof ValueAnimator) { boundsAnimator = (ValueAnimator) animator; } if (boundsAnimator != null) { float bigFontSize = mContext.getResources() .getDimensionPixelSize(R.dimen.widget_big_font_size); float smallFontSize = mContext.getResources() .getDimensionPixelSize(R.dimen.widget_small_font_size); float startScale = mShowingHeader ? bigFontSize / smallFontSize : smallFontSize / bigFontSize; boundsAnimator.addUpdateListener(animation -> { float scale = MathUtils.lerp(startScale, 1f /* stop */, animation.getAnimatedFraction()); mClockView.setPivotX(mClockView.getWidth() / 2); mClockView.setPivotY(0); mClockView.setScaleX(scale); mClockView.setScaleY(scale); }); } return animator; } } }