Merge "Refactor various rendering parameters into config structure" into udc-dev

This commit is contained in:
Hawkwood Glazier
2023-04-05 00:00:33 +00:00
committed by Android (Google) Code Review
9 changed files with 70 additions and 63 deletions

View File

@@ -25,8 +25,10 @@ import android.widget.FrameLayout
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import com.android.systemui.customization.R import com.android.systemui.customization.R
import com.android.systemui.plugins.ClockAnimations import com.android.systemui.plugins.ClockAnimations
import com.android.systemui.plugins.ClockConfig
import com.android.systemui.plugins.ClockController import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockEvents import com.android.systemui.plugins.ClockEvents
import com.android.systemui.plugins.ClockFaceConfig
import com.android.systemui.plugins.ClockFaceController import com.android.systemui.plugins.ClockFaceController
import com.android.systemui.plugins.ClockFaceEvents import com.android.systemui.plugins.ClockFaceEvents
import com.android.systemui.plugins.ClockSettings import com.android.systemui.plugins.ClockSettings
@@ -63,6 +65,8 @@ class DefaultClockController(
override lateinit var animations: DefaultClockAnimations override lateinit var animations: DefaultClockAnimations
private set private set
override val config = ClockConfig(hasCustomPositionUpdatedAnimation = true)
init { init {
val parent = FrameLayout(ctx) val parent = FrameLayout(ctx)
smallClock = smallClock =
@@ -103,6 +107,8 @@ class DefaultClockController(
private var isRegionDark = false private var isRegionDark = false
protected var targetRegion: Rect? = null protected var targetRegion: Rect? = null
override val config = ClockFaceConfig()
override var logBuffer: LogBuffer? override var logBuffer: LogBuffer?
get() = view.logBuffer get() = view.logBuffer
set(value) { set(value) {
@@ -254,9 +260,6 @@ class DefaultClockController(
override fun onPositionUpdated(fromRect: Rect, toRect: Rect, fraction: Float) { override fun onPositionUpdated(fromRect: Rect, toRect: Rect, fraction: Float) {
largeClock.moveForSplitShade(fromRect, toRect, fraction) largeClock.moveForSplitShade(fromRect, toRect, fraction)
} }
override val hasCustomPositionUpdatedAnimation: Boolean
get() = true
} }
class AnimationState( class AnimationState(

View File

@@ -63,6 +63,9 @@ interface ClockController {
/** A large version of the clock, appropriate when a bigger viewport is available */ /** A large version of the clock, appropriate when a bigger viewport is available */
val largeClock: ClockFaceController val largeClock: ClockFaceController
/** Determines the way the hosting app should behave when rendering either clock face */
val config: ClockConfig
/** Events that clocks may need to respond to */ /** Events that clocks may need to respond to */
val events: ClockEvents val events: ClockEvents
@@ -91,6 +94,9 @@ interface ClockFaceController {
/** View that renders the clock face */ /** View that renders the clock face */
val view: View val view: View
/** Determines the way the hosting app should behave when rendering this clock face */
val config: ClockFaceConfig
/** Events specific to this clock face */ /** Events specific to this clock face */
val events: ClockFaceEvents val events: ClockFaceEvents
@@ -109,9 +115,6 @@ interface ClockEvents {
/** Call whenever the locale changes */ /** Call whenever the locale changes */
fun onLocaleChanged(locale: Locale) {} fun onLocaleChanged(locale: Locale) {}
val isReactiveToTone
get() = true
/** Call whenever the color palette should update */ /** Call whenever the color palette should update */
fun onColorPaletteChanged(resources: Resources) {} fun onColorPaletteChanged(resources: Resources) {}
@@ -144,14 +147,6 @@ interface ClockAnimations {
* 0.0 -> clock is scaled down in the shade; previewRatio is previewSize / screenSize * 0.0 -> clock is scaled down in the shade; previewRatio is previewSize / screenSize
*/ */
fun onPickerCarouselSwiping(swipingFraction: Float, previewRatio: Float) {} fun onPickerCarouselSwiping(swipingFraction: Float, previewRatio: Float) {}
/**
* Whether this clock has a custom position update animation. If true, the keyguard will call
* `onPositionUpdated` to notify the clock of a position update animation. If false, a default
* animation will be used (e.g. a simple translation).
*/
val hasCustomPositionUpdatedAnimation
get() = false
} }
/** Events that have specific data about the related face */ /** Events that have specific data about the related face */
@@ -159,14 +154,6 @@ interface ClockFaceEvents {
/** Call every time tick */ /** Call every time tick */
fun onTimeTick() {} fun onTimeTick() {}
/** Expected interval between calls to onTimeTick. Can always reduce to PER_MINUTE in AOD. */
val tickRate: ClockTickRate
get() = ClockTickRate.PER_MINUTE
/** Call to check whether the clock consumes weather data */
val hasCustomWeatherDataDisplay: Boolean
get() = false
/** /**
* Region Darkness specific to the clock face. * Region Darkness specific to the clock face.
* - isRegionDark = dark theme -> clock should be light * - isRegionDark = dark theme -> clock should be light
@@ -203,6 +190,28 @@ data class ClockMetadata(
val name: String, val name: String,
) )
/** Render configuration for the full clock. Modifies the way systemUI behaves with this clock. */
data class ClockConfig(
/**
* Whether this clock has a custom position update animation. If true, the keyguard will call
* `onPositionUpdated` to notify the clock of a position update animation. If false, a default
* animation will be used (e.g. a simple translation).
*/
val hasCustomPositionUpdatedAnimation: Boolean = false,
/** True if the clock will react to tone changes in the seed color. */
val isReactiveToTone: Boolean = true,
)
/** Render configuration options for a clock face. Modifies the way SystemUI behaves. */
data class ClockFaceConfig(
/** Expected interval between calls to onTimeTick. Can always reduce to PER_MINUTE in AOD. */
val tickRate: ClockTickRate = ClockTickRate.PER_MINUTE,
/** Call to check whether the clock consumes weather data */
val hasCustomWeatherDataDisplay: Boolean = false,
)
/** Structure for keeping clock-specific settings */ /** Structure for keeping clock-specific settings */
@Keep @Keep
data class ClockSettings( data class ClockSettings(

View File

@@ -46,10 +46,10 @@ import com.android.systemui.log.dagger.KeyguardSmallClockLog
import com.android.systemui.plugins.ClockController import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockFaceController import com.android.systemui.plugins.ClockFaceController
import com.android.systemui.plugins.ClockTickRate import com.android.systemui.plugins.ClockTickRate
import com.android.systemui.plugins.WeatherData
import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel.DEBUG import com.android.systemui.plugins.log.LogLevel.DEBUG
import com.android.systemui.shared.regionsampling.RegionSampler import com.android.systemui.shared.regionsampling.RegionSampler
import com.android.systemui.plugins.WeatherData
import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback
import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
@@ -144,8 +144,10 @@ constructor(
val currentViewRect = Rect(left, top, right, bottom) val currentViewRect = Rect(left, top, right, bottom)
val oldViewRect = Rect(oldLeft, oldTop, oldRight, oldBottom) val oldViewRect = Rect(oldLeft, oldTop, oldRight, oldBottom)
if (currentViewRect.width() != oldViewRect.width() || if (
currentViewRect.height() != oldViewRect.height()) { currentViewRect.width() != oldViewRect.width() ||
currentViewRect.height() != oldViewRect.height()
) {
updateRegionSampler(view) updateRegionSampler(view)
} }
} }
@@ -425,7 +427,7 @@ constructor(
} }
isRunning = true isRunning = true
when (clockFace.events.tickRate) { when (clockFace.config.tickRate) {
ClockTickRate.PER_MINUTE -> { ClockTickRate.PER_MINUTE -> {
/* Handled by KeyguardClockSwitchController */ /* Handled by KeyguardClockSwitchController */
} }

View File

@@ -40,7 +40,6 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.log.dagger.KeyguardClockLog; import com.android.systemui.log.dagger.KeyguardClockLog;
import com.android.systemui.plugins.ClockAnimations;
import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.ClockController;
import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.log.LogBuffer;
import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.plugins.log.LogLevel;
@@ -469,7 +468,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
} }
@Nullable @Nullable
private ClockController getClock() { public ClockController getClock() {
return mClockEventController.getClock(); return mClockEventController.getClock();
} }
@@ -535,13 +534,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
} }
return ((mCurrentClockSize == LARGE) ? clock.getLargeClock() : clock.getSmallClock()) return ((mCurrentClockSize == LARGE) ? clock.getLargeClock() : clock.getSmallClock())
.getEvents().getHasCustomWeatherDataDisplay(); .getConfig().getHasCustomWeatherDataDisplay();
}
/** Gets the animations for the current clock. */
@Nullable
public ClockAnimations getClockAnimations() {
ClockController clock = getClock();
return clock == null ? null : clock.getAnimations();
} }
} }

View File

@@ -16,12 +16,13 @@
package com.android.keyguard; package com.android.keyguard;
import android.annotation.Nullable;
import android.graphics.Rect; import android.graphics.Rect;
import android.util.Slog; import android.util.Slog;
import com.android.keyguard.KeyguardClockSwitch.ClockSize; import com.android.keyguard.KeyguardClockSwitch.ClockSize;
import com.android.keyguard.logging.KeyguardLogger; import com.android.keyguard.logging.KeyguardLogger;
import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.plugins.ClockController;
import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.AnimationProperties;
@@ -241,8 +242,9 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
} }
} }
/** Gets the animations for the current clock. */ /** Gets the current clock controller. */
public ClockAnimations getClockAnimations() { @Nullable
return mKeyguardClockSwitchController.getClockAnimations(); public ClockController getClockController() {
return mKeyguardClockSwitchController.getClock();
} }
} }

View File

@@ -162,7 +162,7 @@ import com.android.systemui.multishade.domain.interactor.MultiShadeInteractor;
import com.android.systemui.navigationbar.NavigationBarController; import com.android.systemui.navigationbar.NavigationBarController;
import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationBarView;
import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.plugins.ClockController;
import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.FalsingManager.FalsingTapListener; import com.android.systemui.plugins.FalsingManager.FalsingTapListener;
import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.QS;
@@ -1627,9 +1627,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
transition.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); transition.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
transition.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); transition.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
ClockAnimations clockAnims = mKeyguardStatusViewController.getClockAnimations(); ClockController clock = mKeyguardStatusViewController.getClockController();
boolean customClockAnimation = clockAnims != null boolean customClockAnimation = clock != null
&& clockAnims.getHasCustomPositionUpdatedAnimation(); && clock.getConfig().getHasCustomPositionUpdatedAnimation();
if (mFeatureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION) && customClockAnimation) { if (mFeatureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION) && customClockAnimation) {
// Find the clock, so we can exclude it from this transition. // Find the clock, so we can exclude it from this transition.
@@ -5159,12 +5159,12 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
Rect to = (Rect) endValues.values.get(PROP_BOUNDS); Rect to = (Rect) endValues.values.get(PROP_BOUNDS);
anim.addUpdateListener(animation -> { anim.addUpdateListener(animation -> {
ClockAnimations clockAnims = mController.getClockAnimations(); ClockController clock = mController.getClockController();
if (clockAnims == null) { if (clock == null) {
return; return;
} }
clockAnims.onPositionUpdated(from, to, animation.getAnimatedFraction()); clock.getAnimations().onPositionUpdated(from, to, animation.getAnimatedFraction());
}); });
return anim; return anim;

View File

@@ -32,6 +32,7 @@ import com.android.systemui.plugins.ClockAnimations
import com.android.systemui.plugins.ClockController import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockEvents import com.android.systemui.plugins.ClockEvents
import com.android.systemui.plugins.ClockFaceController import com.android.systemui.plugins.ClockFaceController
import com.android.systemui.plugins.ClockFaceConfig
import com.android.systemui.plugins.ClockFaceEvents import com.android.systemui.plugins.ClockFaceEvents
import com.android.systemui.plugins.ClockTickRate import com.android.systemui.plugins.ClockTickRate
import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogBuffer
@@ -101,8 +102,10 @@ class ClockEventControllerTest : SysuiTestCase() {
whenever(largeClockController.events).thenReturn(largeClockEvents) whenever(largeClockController.events).thenReturn(largeClockEvents)
whenever(clock.events).thenReturn(events) whenever(clock.events).thenReturn(events)
whenever(clock.animations).thenReturn(animations) whenever(clock.animations).thenReturn(animations)
whenever(smallClockEvents.tickRate).thenReturn(ClockTickRate.PER_MINUTE) whenever(smallClockController.config)
whenever(largeClockEvents.tickRate).thenReturn(ClockTickRate.PER_MINUTE) .thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE))
whenever(largeClockController.config)
.thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE))
repository = FakeKeyguardRepository() repository = FakeKeyguardRepository()
bouncerRepository = FakeKeyguardBouncerRepository() bouncerRepository = FakeKeyguardBouncerRepository()

View File

@@ -315,8 +315,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
} }
@Test @Test
public void testGetClockAnimationsForwardsToClock() { public void testGetClock_ForwardsToClock() {
assertEquals(mClockAnimations, mController.getClockAnimations()); assertEquals(mClockController, mController.getClock());
} }
@Test @Test
@@ -367,9 +367,9 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
} }
@Test @Test
public void testGetClockAnimations_nullClock_returnsNull() { public void testGetClock_nullClock_returnsNull() {
when(mClockEventController.getClock()).thenReturn(null); when(mClockEventController.getClock()).thenReturn(null);
assertNull(mController.getClockAnimations()); assertNull(mController.getClock());
} }
private void verifyAttachment(VerificationMode times) { private void verifyAttachment(VerificationMode times) {

View File

@@ -16,17 +16,17 @@
package com.android.keyguard; package com.android.keyguard;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.graphics.Rect;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import com.android.keyguard.logging.KeyguardLogger; import com.android.keyguard.logging.KeyguardLogger;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.plugins.ClockController;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -118,14 +118,10 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase {
} }
@Test @Test
public void getClockAnimations_forwardsToClockSwitch() { public void getClock_forwardsToClockSwitch() {
ClockAnimations mockClockAnimations = mock(ClockAnimations.class); ClockController mockClock = mock(ClockController.class);
when(mKeyguardClockSwitchController.getClockAnimations()).thenReturn(mockClockAnimations); when(mKeyguardClockSwitchController.getClock()).thenReturn(mockClock);
Rect r1 = new Rect(1, 2, 3, 4); assertEquals(mockClock, mController.getClockController());
Rect r2 = new Rect(5, 6, 7, 8);
mController.getClockAnimations().onPositionUpdated(r1, r2, 0.3f);
verify(mockClockAnimations).onPositionUpdated(r1, r2, 0.3f);
} }
} }