diff options
10 files changed, 94 insertions, 110 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt index 40a9add40c9b..7f0937059494 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt @@ -129,6 +129,53 @@ class AodBurnInViewModelTest : SysuiTestCase() { } @Test + fun translationX_aodToLockscreen() = + testScope.runTest { + underTest.updateBurnInParams(burnInParameters.copy(translationX = { -100f })) + val movement by collectLastValue(underTest.movement) + assertThat(movement?.translationX).isEqualTo(0) + + // Trigger a change to the burn-in model + burnInFlow.value = BurnInModel(translationX = 20, translationY = 30, scale = 0.5f) + + // Set to not dozing (on lockscreen) + keyguardTransitionRepository.sendTransitionStep( + TransitionStep( + from = KeyguardState.AOD, + to = KeyguardState.LOCKSCREEN, + value = 0f, + transitionState = TransitionState.STARTED, + ), + validateStep = false, + ) + // Set to not dozing (on lockscreen) + keyguardTransitionRepository.sendTransitionStep( + TransitionStep( + from = KeyguardState.AOD, + to = KeyguardState.LOCKSCREEN, + value = 0f, + transitionState = TransitionState.RUNNING, + ), + validateStep = false, + ) + assertThat(movement?.translationX).isEqualTo(-100) + keyguardTransitionRepository.sendTransitionStep( + TransitionStep( + from = KeyguardState.AOD, + to = KeyguardState.LOCKSCREEN, + value = 1f, + transitionState = TransitionState.FINISHED, + ), + validateStep = false, + ) + + assertThat(movement?.translationX).isEqualTo(0) + assertThat(movement?.translationY).isEqualTo(0) + assertThat(movement?.scale).isEqualTo(1f) + assertThat(movement?.scaleClockOnly).isEqualTo(true) + } + + @Test fun translationAndScale_whenFullyDozing() = testScope.runTest { underTest.updateBurnInParams(burnInParameters.copy(minViewY = 100)) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt index 5d606c67a4d7..51865368d91a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt @@ -26,7 +26,6 @@ import androidx.test.filters.SmallTest import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT -import com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION import com.android.systemui.SysuiTestCase import com.android.systemui.communal.data.repository.communalSceneRepository import com.android.systemui.communal.shared.model.CommunalScenes @@ -74,11 +73,7 @@ import platform.test.runner.parameterized.Parameters @SmallTest @RunWith(ParameterizedAndroidJunit4::class) -@EnableFlags( - FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, - FLAG_NEW_AOD_TRANSITION, - FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR, -) +@EnableFlags(FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR) class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { private val kosmos = testKosmos() private val testScope = kosmos.testScope diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt index 6569e4cdd557..ee2ee522cd0e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt @@ -45,7 +45,6 @@ import com.android.internal.jank.InteractionJankMonitor.CUJ_SCREEN_OFF_SHOW_AOD import com.android.keyguard.AuthInteractionProperties import com.android.systemui.Flags import com.android.systemui.Flags.msdlFeedback -import com.android.systemui.Flags.newAodTransition import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Text import com.android.systemui.common.shared.model.TintedIcon @@ -414,7 +413,10 @@ object KeyguardRootViewBinder { if (MigrateClocksToBlueprint.isEnabled) { burnInParams.update { current -> - current.copy(translationY = { childViews[burnInLayerId]?.translationY }) + current.copy( + translationX = { childViews[burnInLayerId]?.translationX }, + translationY = { childViews[burnInLayerId]?.translationY }, + ) } } @@ -593,7 +595,7 @@ object KeyguardRootViewBinder { View.INVISIBLE } } - newAodTransition() -> { + else -> { animateInIconTranslation() if (isVisible.value) { CrossFadeHelper.fadeIn(this, animatorListener) @@ -601,52 +603,6 @@ object KeyguardRootViewBinder { CrossFadeHelper.fadeOut(this, animatorListener) } } - !isVisible.value -> { - // Let's make sure the icon are translated to 0, since we cancelled it above - animateInIconTranslation() - CrossFadeHelper.fadeOut(this, animatorListener) - } - visibility != View.VISIBLE -> { - // No fading here, let's just appear the icons instead! - visibility = View.VISIBLE - alpha = 1f - appearIcons( - animate = screenOffAnimationController.shouldAnimateAodIcons(), - iconsAppearTranslationPx, - animatorListener, - ) - } - else -> { - // Let's make sure the icons are translated to 0, since we cancelled it above - animateInIconTranslation() - // We were fading out, let's fade in instead - CrossFadeHelper.fadeIn(this, animatorListener) - } - } - } - - private fun View.appearIcons( - animate: Boolean, - iconAppearTranslation: Int, - animatorListener: Animator.AnimatorListener, - ) { - if (animate) { - if (!MigrateClocksToBlueprint.isEnabled) { - translationY = -iconAppearTranslation.toFloat() - } - alpha = 0f - animate() - .alpha(1f) - .setInterpolator(Interpolators.LINEAR) - .setDuration(AOD_ICONS_APPEAR_DURATION) - .apply { if (MigrateClocksToBlueprint.isEnabled) animateInIconTranslation() } - .setListener(animatorListener) - .start() - } else { - alpha = 1.0f - if (!MigrateClocksToBlueprint.isEnabled) { - translationY = 0f - } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt index 998c1c84931f..c78e0c9f5266 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt @@ -114,6 +114,9 @@ constructor( emit(0f) }, aodToLockscreenTransitionViewModel + .translationX(params.translationX) + .onStart { emit(StateToValue()) }, + aodToLockscreenTransitionViewModel .translationY(params.translationY) .onStart { emit(StateToValue()) }, ) { flows -> @@ -123,11 +126,12 @@ constructor( val goneToAodTranslationX = flows[3] as StateToValue val lockscreenToAodTranslationX = flows[4] as StateToValue val occludedToLockscreen = flows[5] as Float - val aodToLockscreen = flows[6] as StateToValue + val aodToLockscreenTranslationX = flows[6] as StateToValue + val aodToLockscreenTranslationY = flows[7] as StateToValue val translationY = - if (aodToLockscreen.transitionState.isTransitioning()) { - aodToLockscreen.value ?: 0f + if (aodToLockscreenTranslationY.transitionState.isTransitioning()) { + aodToLockscreenTranslationY.value ?: 0f } else if ( goneToAodTranslationY.transitionState.isTransitioning() ) { @@ -138,9 +142,13 @@ constructor( keyguardTranslationY } val translationX = - burnInModel.translationX + - (goneToAodTranslationX.value ?: 0f) + - (lockscreenToAodTranslationX.value ?: 0f) + if (aodToLockscreenTranslationX.transitionState.isTransitioning()) { + aodToLockscreenTranslationX.value ?: 0f + } else { + burnInModel.translationX + + (goneToAodTranslationX.value ?: 0f) + + (lockscreenToAodTranslationX.value ?: 0f) + } burnInModel.copy( translationX = translationX.toInt(), translationY = translationY.toInt(), @@ -198,6 +206,8 @@ data class BurnInParameters( val minViewY: Int = Int.MAX_VALUE, /** The current y translation of the view */ val translationY: () -> Float? = { null }, + /** The current x translation of the view */ + val translationX: () -> Float? = { null }, ) /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt index 6b22c0f07908..6eeab8db2a45 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt @@ -39,10 +39,8 @@ import kotlinx.coroutines.flow.Flow @SysUISingleton class AodToLockscreenTransitionViewModel @Inject -constructor( - shadeInteractor: ShadeInteractor, - animationFlow: KeyguardTransitionAnimationFlow, -) : DeviceEntryIconTransition { +constructor(shadeInteractor: ShadeInteractor, animationFlow: KeyguardTransitionAnimationFlow) : + DeviceEntryIconTransition { private val transitionAnimation = animationFlow.setup( @@ -54,7 +52,7 @@ constructor( /** * Begin the transition from wherever the y-translation value is currently. This helps ensure a - * smooth transition if a transition in canceled. + * smooth transition if the prior transition was canceled. */ fun translationY(currentTranslationY: () -> Float?): Flow<StateToValue> { var startValue = 0f @@ -65,6 +63,19 @@ constructor( ) } + /** + * Begin the transition from wherever the x-translation value is currently. This helps ensure a + * smooth transition if the prior transition was canceled. + */ + fun translationX(currentTranslationX: () -> Float?): Flow<StateToValue> { + var startValue = 0f + return transitionAnimation.sharedFlowWithState( + duration = 500.milliseconds, + onStart = { startValue = currentTranslationX() ?: 0f }, + onStep = { MathUtils.lerp(startValue, 0f, FAST_OUT_SLOW_IN.getInterpolation(it)) }, + ) + } + /** Ensure alpha is set to be visible */ fun lockscreenAlpha(viewState: ViewStateAccessor): Flow<Float> { var startAlpha = 1f diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt index dc0ce34614d1..10a2e5c04b00 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt @@ -20,7 +20,7 @@ package com.android.systemui.keyguard.ui.viewmodel import android.graphics.Point import android.util.MathUtils import android.view.View.VISIBLE -import com.android.systemui.Flags.newAodTransition +import com.android.app.tracing.coroutines.launch import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.dagger.SysUISingleton @@ -386,10 +386,7 @@ constructor( !dozeParameters.alwaysOn -> false // Don't animate when going to AOD if the display needs blanking. dozeParameters.displayNeedsBlanking -> false - // We only want the appear animations to happen when the notifications - // get fully hidden, since otherwise the un-hide animation overlaps. - newAodTransition() -> true - else -> fullyHidden + else -> true } AnimatableEvent(fullyHidden, animate) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index ccc3d6350356..cd3516dadbad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -22,7 +22,6 @@ import static android.view.MotionEvent.ACTION_UP; import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SHADE_CLEAR_ALL; -import static com.android.systemui.Flags.newAodTransition; import static com.android.systemui.Flags.notificationOverExpansionClippingFix; import static com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt.BUCKET_SILENT; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE; @@ -1549,15 +1548,6 @@ public class NotificationStackScrollLayout @VisibleForTesting public void updateInterpolatedStackHeight(float endHeight, float fraction) { - if (!newAodTransition()) { - // During the (AOD<=>LS) transition where dozeAmount is changing, - // apply dozeAmount to stack height instead of expansionFraction - // to unfurl notifications on AOD=>LS wakeup (and furl up on LS=>AOD sleep) - final float dozeAmount = mAmbientState.getDozeAmount(); - if (0f < dozeAmount && dozeAmount < 1f) { - fraction = 1f - dozeAmount; - } - } mAmbientState.setInterpolatedStackHeight( MathUtils.lerp(endHeight * StackScrollAlgorithm.START_FRACTION, endHeight, fraction)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 5a1fca1e2df6..1d3f0e1f6dc3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -29,7 +29,6 @@ import static androidx.lifecycle.Lifecycle.State.RESUMED; import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import static com.android.systemui.Flags.keyboardShortcutHelperRewrite; import static com.android.systemui.Flags.lightRevealMigration; -import static com.android.systemui.Flags.newAodTransition; import static com.android.systemui.Flags.relockWithPowerButtonImmediately; import static com.android.systemui.Flags.statusBarSignalPolicyRefactor; import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL; @@ -2550,7 +2549,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mNotificationShadeWindowController.batchApplyWindowLayoutParams(()-> { mDeviceInteractive = true; - boolean isFlaggedOff = newAodTransition() && MigrateClocksToBlueprint.isEnabled(); + boolean isFlaggedOff = MigrateClocksToBlueprint.isEnabled(); if (!isFlaggedOff && shouldAnimateDozeWakeup()) { // If this is false, the power button must be physically pressed in order to // trigger fingerprint authentication. diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt index 1f4e80e48bb7..740abf359e92 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt @@ -21,7 +21,6 @@ import android.platform.test.annotations.DisableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR -import com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.Flags @@ -85,7 +84,6 @@ class NotificationIconContainerAlwaysOnDisplayViewModelTest : SysuiTestCase() { lastWakeReason = WakeSleepReason.OTHER, lastSleepReason = WakeSleepReason.OTHER, ) - mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION) } @Test @@ -97,14 +95,10 @@ class NotificationIconContainerAlwaysOnDisplayViewModelTest : SysuiTestCase() { lastSleepReason = WakeSleepReason.OTHER, ) keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - ) + TransitionStep(transitionState = TransitionState.STARTED) ) keyguardRepository.setDozeTransitionModel( - DozeTransitionModel( - to = DozeStateModel.DOZE_AOD, - ) + DozeTransitionModel(to = DozeStateModel.DOZE_AOD) ) val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated) runCurrent() @@ -120,14 +114,10 @@ class NotificationIconContainerAlwaysOnDisplayViewModelTest : SysuiTestCase() { lastSleepReason = WakeSleepReason.OTHER, ) keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - ) + TransitionStep(transitionState = TransitionState.STARTED) ) keyguardRepository.setDozeTransitionModel( - DozeTransitionModel( - to = DozeStateModel.DOZE_PULSING, - ) + DozeTransitionModel(to = DozeStateModel.DOZE_PULSING) ) val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated) runCurrent() @@ -186,9 +176,7 @@ class NotificationIconContainerAlwaysOnDisplayViewModelTest : SysuiTestCase() { lastSleepReason = WakeSleepReason.OTHER, ) keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - ) + TransitionStep(transitionState = TransitionState.STARTED) ) val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated) runCurrent() @@ -200,9 +188,7 @@ class NotificationIconContainerAlwaysOnDisplayViewModelTest : SysuiTestCase() { fun animationsEnabled_isTrue_whenKeyguardIsShowing() = testScope.runTest { keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - ) + TransitionStep(transitionState = TransitionState.STARTED) ) val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated) runCurrent() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 3809d51b6d24..bb9f12b4de31 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.stack; import static android.view.View.GONE; import static android.view.WindowInsets.Type.ime; -import static com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_GENTLE; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.RUBBER_BAND_FACTOR_NORMAL; @@ -174,12 +173,6 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mFeatureFlags.set(Flags.NSSL_DEBUG_REMOVE_ANIMATION, false); mFeatureFlags.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false); - // Register the feature flags we use - // TODO: Ideally we wouldn't need to set these unless a test actually reads them, - // and then we would test both configurations, but currently they are all read - // in the constructor. - mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION); - // Inject dependencies before initializing the layout mDependency.injectTestDependency(FeatureFlags.class, mFeatureFlags); mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState); |