Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9da5456a authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Restore keyguard status area header"

parents d5635575 e570af67
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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
@@ -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);
+10 −1
Original line number Diff line number Diff line
@@ -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"
    />
+2 −1
Original line number Diff line number Diff line
@@ -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"
+6 −6
Original line number Diff line number Diff line
@@ -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>
+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;
@@ -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;
@@ -28,6 +38,7 @@ import java.util.TimeZone;
 */
public class KeyguardClockSwitch extends RelativeLayout {

    private final Transition mTransition;
    /**
     * Optional/alternative clock injected via plugin.
     */
@@ -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;

@@ -98,6 +113,7 @@ public class KeyguardClockSwitch extends RelativeLayout {

    public KeyguardClockSwitch(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTransition = new ClockBoundsTransition();
    }

    /**
@@ -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;
@@ -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