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

Commit e570af67 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Restore keyguard status area header

Fixes: 123340905
Fixes: 123958307
Test: atest KeyguardSliceViewTest
Test: manual, playing media
This reverts commit ed002624.

Change-Id: I1cc60346f9176b913ee0404b2b31981f736664ce
parent 342c633c
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