Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToLockscreenTransitionViewModelTest.kt 0 → 100644 +125 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.keyguard.ui.viewmodel import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith @ExperimentalCoroutinesApi @SmallTest @RunWith(AndroidJUnit4::class) class AlternateBouncerToLockscreenTransitionViewModelTest : SysuiTestCase() { val kosmos = testKosmos() val testScope = kosmos.testScope val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository val underTest = kosmos.alternateBouncerToLockscreenTransitionViewModel @Test fun lockscreenAlpha_zeroInitialAlpha() = testScope.runTest { // ViewState starts at 0 alpha. val viewState = ViewStateAccessor(alpha = { 0f }) val alpha by collectValues(underTest.lockscreenAlpha(viewState)) keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.LOCKSCREEN, testScope ) assertThat(alpha[0]).isEqualTo(0f) // alpha duration is 250ms of the 300ms total, so 0.5f of the total is 0.6 assertThat(alpha[1]).isEqualTo(0.6f) assertThat(alpha[2]).isEqualTo(1f) } @Test fun deviceEntryParentViewAlpha() = testScope.runTest { val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha) // immediately 1f keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(0.4f)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(.85f)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(1f)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) } @Test fun deviceEntryBackgroundViewAlpha_udfpsEnrolled_show() = testScope.runTest { fingerprintPropertyRepository.supportsUdfps() val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha) runCurrent() // immediately 1f keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(0.1f)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(.3f)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(.5f)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED)) assertThat(bgViewAlpha).isEqualTo(1f) } private fun step( value: Float, state: TransitionState = TransitionState.RUNNING ): TransitionStep { return TransitionStep( from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.LOCKSCREEN, value = value, transitionState = state, ownerName = "AlternateBouncerToLockscreenTransitionViewModelTest" ) } } packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.keyguard; import android.util.Log; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.UiBackground; Loading @@ -33,6 +34,7 @@ public class DismissCallbackRegistry { private final ArrayList<DismissCallbackWrapper> mDismissCallbacks = new ArrayList<>(); private final Executor mUiBgExecutor; private final static String TAG = "DismissCallbackRegistry"; @Inject public DismissCallbackRegistry(@UiBackground Executor uiBgExecutor) { Loading @@ -40,10 +42,12 @@ public class DismissCallbackRegistry { } public void addCallback(IKeyguardDismissCallback callback) { Log.d(TAG, "Adding callback: " + callback); mDismissCallbacks.add(new DismissCallbackWrapper(callback)); } public void notifyDismissCancelled() { Log.d(TAG, "notifyDismissCancelled(" + mDismissCallbacks.size() + ")"); for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) { DismissCallbackWrapper callback = mDismissCallbacks.get(i); mUiBgExecutor.execute(callback::notifyDismissCancelled); Loading @@ -52,6 +56,7 @@ public class DismissCallbackRegistry { } public void notifyDismissSucceeded() { Log.d(TAG, "notifyDismissSucceeded(" + mDismissCallbacks.size() + ")"); for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) { DismissCallbackWrapper callback = mDismissCallbacks.get(i); mUiBgExecutor.execute(callback::notifyDismissSucceeded); Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +8 −2 Original line number Diff line number Diff line Loading @@ -198,7 +198,12 @@ constructor( interpolator = Interpolators.LINEAR duration = when (toState) { KeyguardState.AOD -> TO_AOD_DURATION KeyguardState.DOZING -> TO_DOZING_DURATION KeyguardState.GONE -> TO_GONE_DURATION KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION KeyguardState.OCCLUDED -> TO_OCCLUDED_DURATION KeyguardState.PRIMARY_BOUNCER -> TO_PRIMARY_BOUNCER_DURATION else -> TRANSITION_DURATION_MS }.inWholeMilliseconds } Loading @@ -211,10 +216,11 @@ constructor( companion object { const val TAG = "FromAlternateBouncerTransitionInteractor" val TRANSITION_DURATION_MS = 300.milliseconds val TO_GONE_DURATION = 500.milliseconds val TO_AOD_DURATION = TRANSITION_DURATION_MS val TO_PRIMARY_BOUNCER_DURATION = TRANSITION_DURATION_MS val TO_DOZING_DURATION = TRANSITION_DURATION_MS val TO_GONE_DURATION = 500.milliseconds val TO_LOCKSCREEN_DURATION = 300.milliseconds val TO_OCCLUDED_DURATION = TRANSITION_DURATION_MS val TO_PRIMARY_BOUNCER_DURATION = TRANSITION_DURATION_MS } } packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt +3 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor import com.android.systemui.deviceentry.ui.binder.UdfpsAccessibilityOverlayBinder import com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.keyguard.DismissCallbackRegistry import com.android.systemui.keyguard.ui.view.DeviceEntryIconView import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerUdfpsIconViewModel Loading Loading @@ -66,6 +67,7 @@ constructor( private val alternateBouncerDependencies: Lazy<AlternateBouncerDependencies>, private val windowManager: Lazy<WindowManager>, private val layoutInflater: Lazy<LayoutInflater>, private val dismissCallbackRegistry: DismissCallbackRegistry, ) : CoreStartable { private val layoutParams: WindowManager.LayoutParams get() = Loading Loading @@ -162,6 +164,7 @@ constructor( fun onBackRequested() { alternateBouncerDependencies.get().viewModel.hideAlternateBouncer() dismissCallbackRegistry.notifyDismissCancelled() } } Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/transitions/DeviceEntryIconTransitionModule.kt +7 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.ui.transitions import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToAodTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToDozingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToLockscreenTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToOccludedTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AodToGoneTransitionViewModel Loading Loading @@ -78,6 +79,12 @@ abstract class DeviceEntryIconTransitionModule { impl: AlternateBouncerToGoneTransitionViewModel ): DeviceEntryIconTransition @Binds @IntoSet abstract fun alternateBouncerToLockscreen( impl: AlternateBouncerToLockscreenTransitionViewModel ): DeviceEntryIconTransition @Binds @IntoSet abstract fun alternateBouncerToOccluded( Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToLockscreenTransitionViewModelTest.kt 0 → 100644 +125 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.keyguard.ui.viewmodel import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith @ExperimentalCoroutinesApi @SmallTest @RunWith(AndroidJUnit4::class) class AlternateBouncerToLockscreenTransitionViewModelTest : SysuiTestCase() { val kosmos = testKosmos() val testScope = kosmos.testScope val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository val underTest = kosmos.alternateBouncerToLockscreenTransitionViewModel @Test fun lockscreenAlpha_zeroInitialAlpha() = testScope.runTest { // ViewState starts at 0 alpha. val viewState = ViewStateAccessor(alpha = { 0f }) val alpha by collectValues(underTest.lockscreenAlpha(viewState)) keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.LOCKSCREEN, testScope ) assertThat(alpha[0]).isEqualTo(0f) // alpha duration is 250ms of the 300ms total, so 0.5f of the total is 0.6 assertThat(alpha[1]).isEqualTo(0.6f) assertThat(alpha[2]).isEqualTo(1f) } @Test fun deviceEntryParentViewAlpha() = testScope.runTest { val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha) // immediately 1f keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(0.4f)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(.85f)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(1f)) assertThat(deviceEntryParentViewAlpha).isEqualTo(1f) } @Test fun deviceEntryBackgroundViewAlpha_udfpsEnrolled_show() = testScope.runTest { fingerprintPropertyRepository.supportsUdfps() val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha) runCurrent() // immediately 1f keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(0.1f)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(.3f)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(.5f)) assertThat(bgViewAlpha).isEqualTo(1f) keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED)) assertThat(bgViewAlpha).isEqualTo(1f) } private fun step( value: Float, state: TransitionState = TransitionState.RUNNING ): TransitionStep { return TransitionStep( from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.LOCKSCREEN, value = value, transitionState = state, ownerName = "AlternateBouncerToLockscreenTransitionViewModelTest" ) } }
packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.keyguard; import android.util.Log; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.UiBackground; Loading @@ -33,6 +34,7 @@ public class DismissCallbackRegistry { private final ArrayList<DismissCallbackWrapper> mDismissCallbacks = new ArrayList<>(); private final Executor mUiBgExecutor; private final static String TAG = "DismissCallbackRegistry"; @Inject public DismissCallbackRegistry(@UiBackground Executor uiBgExecutor) { Loading @@ -40,10 +42,12 @@ public class DismissCallbackRegistry { } public void addCallback(IKeyguardDismissCallback callback) { Log.d(TAG, "Adding callback: " + callback); mDismissCallbacks.add(new DismissCallbackWrapper(callback)); } public void notifyDismissCancelled() { Log.d(TAG, "notifyDismissCancelled(" + mDismissCallbacks.size() + ")"); for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) { DismissCallbackWrapper callback = mDismissCallbacks.get(i); mUiBgExecutor.execute(callback::notifyDismissCancelled); Loading @@ -52,6 +56,7 @@ public class DismissCallbackRegistry { } public void notifyDismissSucceeded() { Log.d(TAG, "notifyDismissSucceeded(" + mDismissCallbacks.size() + ")"); for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) { DismissCallbackWrapper callback = mDismissCallbacks.get(i); mUiBgExecutor.execute(callback::notifyDismissSucceeded); Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +8 −2 Original line number Diff line number Diff line Loading @@ -198,7 +198,12 @@ constructor( interpolator = Interpolators.LINEAR duration = when (toState) { KeyguardState.AOD -> TO_AOD_DURATION KeyguardState.DOZING -> TO_DOZING_DURATION KeyguardState.GONE -> TO_GONE_DURATION KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION KeyguardState.OCCLUDED -> TO_OCCLUDED_DURATION KeyguardState.PRIMARY_BOUNCER -> TO_PRIMARY_BOUNCER_DURATION else -> TRANSITION_DURATION_MS }.inWholeMilliseconds } Loading @@ -211,10 +216,11 @@ constructor( companion object { const val TAG = "FromAlternateBouncerTransitionInteractor" val TRANSITION_DURATION_MS = 300.milliseconds val TO_GONE_DURATION = 500.milliseconds val TO_AOD_DURATION = TRANSITION_DURATION_MS val TO_PRIMARY_BOUNCER_DURATION = TRANSITION_DURATION_MS val TO_DOZING_DURATION = TRANSITION_DURATION_MS val TO_GONE_DURATION = 500.milliseconds val TO_LOCKSCREEN_DURATION = 300.milliseconds val TO_OCCLUDED_DURATION = TRANSITION_DURATION_MS val TO_PRIMARY_BOUNCER_DURATION = TRANSITION_DURATION_MS } }
packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt +3 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor import com.android.systemui.deviceentry.ui.binder.UdfpsAccessibilityOverlayBinder import com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel import com.android.systemui.keyguard.DismissCallbackRegistry import com.android.systemui.keyguard.ui.view.DeviceEntryIconView import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerUdfpsIconViewModel Loading Loading @@ -66,6 +67,7 @@ constructor( private val alternateBouncerDependencies: Lazy<AlternateBouncerDependencies>, private val windowManager: Lazy<WindowManager>, private val layoutInflater: Lazy<LayoutInflater>, private val dismissCallbackRegistry: DismissCallbackRegistry, ) : CoreStartable { private val layoutParams: WindowManager.LayoutParams get() = Loading Loading @@ -162,6 +164,7 @@ constructor( fun onBackRequested() { alternateBouncerDependencies.get().viewModel.hideAlternateBouncer() dismissCallbackRegistry.notifyDismissCancelled() } } Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/transitions/DeviceEntryIconTransitionModule.kt +7 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.ui.transitions import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToAodTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToDozingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToLockscreenTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToOccludedTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AodToGoneTransitionViewModel Loading Loading @@ -78,6 +79,12 @@ abstract class DeviceEntryIconTransitionModule { impl: AlternateBouncerToGoneTransitionViewModel ): DeviceEntryIconTransition @Binds @IntoSet abstract fun alternateBouncerToLockscreen( impl: AlternateBouncerToLockscreenTransitionViewModel ): DeviceEntryIconTransition @Binds @IntoSet abstract fun alternateBouncerToOccluded( Loading