diff options
| author | 2025-02-05 20:35:39 +0000 | |
|---|---|---|
| committer | 2025-02-06 16:13:05 +0000 | |
| commit | 36e4b1b8183ec2ef9febf07a6f3e2943f911cc2a (patch) | |
| tree | e619c63e7daf3852b7a7a3150fee0524395ebf9e | |
| parent | 7f5039f8c4a46a31f9c4da592038d8609c390c0a (diff) | |
Implement Placeholder Clock Fidget Animation
Bug: 374306512
Test: Checked fidget animation
Flag: com.android.systemui.shared.clock_reactive_variants
Change-Id: I6584b7f9c8d93e3cd00293b00450021f03214ede
5 files changed, 54 insertions, 13 deletions
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt index 3fd796a9481a..2e5b5b56c982 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt @@ -16,6 +16,7 @@ package com.android.systemui.shared.clocks import android.content.Context import android.content.res.Resources import android.graphics.Typeface +import android.os.Vibrator import android.view.LayoutInflater import com.android.systemui.customization.R import com.android.systemui.log.core.MessageBuffer @@ -40,6 +41,7 @@ data class ClockContext( val typefaceCache: TypefaceCache, val messageBuffers: ClockMessageBuffers, val messageBuffer: MessageBuffer, + val vibrator: Vibrator?, ) /** Provides the default system clock */ @@ -48,6 +50,7 @@ class DefaultClockProvider( val layoutInflater: LayoutInflater, val resources: Resources, private val isClockReactiveVariantsEnabled: Boolean = false, + private val vibrator: Vibrator?, ) : ClockProvider { private var messageBuffers: ClockMessageBuffers? = null @@ -82,6 +85,7 @@ class DefaultClockProvider( typefaceCache, buffers, buffers.infraMessageBuffer, + vibrator, ) ) } else { diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt index c6d31a58bc7d..b9a5f1f18210 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt @@ -24,6 +24,7 @@ import android.graphics.Point import android.graphics.PorterDuff import android.graphics.PorterDuffXfermode import android.graphics.Rect +import android.os.VibrationEffect import android.text.Layout import android.text.TextPaint import android.util.AttributeSet @@ -67,7 +68,7 @@ enum class HorizontalAlignment { @SuppressLint("AppCompatCustomView") open class SimpleDigitalClockTextView( - clockCtx: ClockContext, + val clockCtx: ClockContext, isLargeClock: Boolean, attrs: AttributeSet? = null, ) : TextView(clockCtx.context, attrs) { @@ -92,6 +93,9 @@ open class SimpleDigitalClockTextView( (fixedAodAxes + listOf(roundAxis, SLANT_AXIS)).toFVar() } + // TODO(b/374306512): Fidget endpoint to spec + private var fidgetFontVariation = aodFontVariation + private val parser = DimensionParser(clockCtx.context) var maxSingleDigitHeight = -1 var maxSingleDigitWidth = -1 @@ -289,24 +293,45 @@ open class SimpleDigitalClockTextView( return } logger.d("animateCharge()") - val startAnimPhase2 = Runnable { - textAnimator.setTextStyle( - fvar = if (dozeFraction == 0F) lsFontVariation else aodFontVariation, - animate = isAnimationEnabled, - ) - updateTextBoundsForTextAnimator() - } textAnimator.setTextStyle( fvar = if (dozeFraction == 0F) aodFontVariation else lsFontVariation, animate = isAnimationEnabled, - onAnimationEnd = startAnimPhase2, + onAnimationEnd = + Runnable { + textAnimator.setTextStyle( + fvar = if (dozeFraction == 0F) lsFontVariation else aodFontVariation, + animate = isAnimationEnabled, + ) + updateTextBoundsForTextAnimator() + }, ) updateTextBoundsForTextAnimator() } fun animateFidget(x: Float, y: Float) { - // TODO(b/374306512): Implement Fidget Animation + if (!this::textAnimator.isInitialized || textAnimator.isRunning()) { + // Skip fidget animation if other animation is already playing. + return + } + logger.animateFidget(x, y) + clockCtx.vibrator?.vibrate(FIDGET_HAPTICS) + + // TODO(b/374306512): Duplicated charge animation as placeholder. Implement final version + // when we have a complete spec. May require additional code to animate individual digits. + textAnimator.setTextStyle( + fvar = fidgetFontVariation, + animate = isAnimationEnabled, + onAnimationEnd = + Runnable { + textAnimator.setTextStyle( + fvar = if (dozeFraction == 0F) lsFontVariation else aodFontVariation, + animate = isAnimationEnabled, + ) + updateTextBoundsForTextAnimator() + }, + ) + updateTextBoundsForTextAnimator() } fun refreshText() { @@ -533,6 +558,12 @@ open class SimpleDigitalClockTextView( private val PORTER_DUFF_XFER_MODE_PAINT = Paint().also { it.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT) } + val FIDGET_HAPTICS = + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_THUD, 1.0f, 0) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_RISE, 1.0f, 43) + .compose() + val AOD_COLOR = Color.WHITE val LS_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 400f) val AOD_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 200f) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt index 4423426945eb..9eba410ffdb5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt @@ -81,7 +81,7 @@ class DefaultClockProviderTest : SysuiTestCase() { whenever(mockSmallClockView.getLayoutParams()).thenReturn(FrameLayout.LayoutParams(10, 10)) whenever(mockLargeClockView.getLayoutParams()).thenReturn(FrameLayout.LayoutParams(10, 10)) - provider = DefaultClockProvider(context, layoutInflater, resources) + provider = DefaultClockProvider(context, layoutInflater, resources, vibrator = null) } @Test diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java index 9507b0483a06..6e2adc0a74ca 100644 --- a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java +++ b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java @@ -18,8 +18,11 @@ package com.android.keyguard.dagger; import android.content.Context; import android.content.res.Resources; +import android.os.Vibrator; import android.view.LayoutInflater; +import androidx.annotation.Nullable; + import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Application; import com.android.systemui.dagger.qualifiers.Background; @@ -55,7 +58,8 @@ public abstract class ClockRegistryModule { FeatureFlags featureFlags, @Main Resources resources, LayoutInflater layoutInflater, - ClockMessageBuffers clockBuffers) { + ClockMessageBuffers clockBuffers, + @Nullable Vibrator vibrator) { ClockRegistry registry = new ClockRegistry( context, pluginManager, @@ -69,7 +73,8 @@ public abstract class ClockRegistryModule { context, layoutInflater, resources, - com.android.systemui.shared.Flags.clockReactiveVariants() + com.android.systemui.shared.Flags.clockReactiveVariants(), + vibrator ), context.getString(R.string.lockscreen_clock_id_fallback), clockBuffers, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt index b75dd0402175..bc16f7e0df5f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt @@ -58,6 +58,7 @@ class SimpleDigitalClockTextViewTest : SysuiTestCase() { }, ClockMessageBuffers(messageBuffer), messageBuffer, + vibrator = null, ), isLargeClock = false, ) |