diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt index 84cd3ef622ba8a180559560ab43ba1ebf00c9e0f..3eef6aa37122ab343d1cee1a7e261c236805d4a1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt @@ -25,6 +25,7 @@ import android.util.Log import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionInfo +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import java.util.UUID @@ -48,8 +49,8 @@ import kotlinx.coroutines.flow.filter * [TransitionInteractor]. These interactors will call [startTransition] and [updateTransition] on * this repository. * - * To print all transitions to logcat to help with debugging, run this command: - * adb shell settings put global systemui/buffer/KeyguardLog VERBOSE + * To print all transitions to logcat to help with debugging, run this command: adb shell settings + * put global systemui/buffer/KeyguardLog VERBOSE * * This will print all keyguard transitions to logcat with the KeyguardTransitionAuditLogger tag. */ @@ -73,11 +74,8 @@ interface KeyguardTransitionRepository { /** * Begin a transition from one state to another. Transitions are interruptible, and will issue a * [TransitionStep] with state = [TransitionState.CANCELED] before beginning the next one. - * - * When canceled, there are two options: to continue from the current position of the prior - * transition, or to reset the position. When [resetIfCanceled] == true, it will do the latter. */ - fun startTransition(info: TransitionInfo, resetIfCanceled: Boolean = false): UUID? + fun startTransition(info: TransitionInfo): UUID? /** * Allows manual control of a transition. When calling [startTransition], the consumer must pass @@ -138,10 +136,7 @@ class KeyguardTransitionRepositoryImpl @Inject constructor() : KeyguardTransitio ) } - override fun startTransition( - info: TransitionInfo, - resetIfCanceled: Boolean, - ): UUID? { + override fun startTransition(info: TransitionInfo): UUID? { if (lastStep.from == info.from && lastStep.to == info.to) { Log.i(TAG, "Duplicate call to start the transition, rejecting: $info") return null @@ -149,10 +144,10 @@ class KeyguardTransitionRepositoryImpl @Inject constructor() : KeyguardTransitio val startingValue = if (lastStep.transitionState != TransitionState.FINISHED) { Log.i(TAG, "Transition still active: $lastStep, canceling") - if (resetIfCanceled) { - 0f - } else { - lastStep.value + when (info.modeOnCanceled) { + TransitionModeOnCanceled.LAST_VALUE -> lastStep.value + TransitionModeOnCanceled.RESET -> 0f + TransitionModeOnCanceled.REVERSE -> 1f - lastStep.value } } else { 0f diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt index 6e0aa4c7682d6c91ef1b40cb6b1c33400bfae8b6..a331a668e1351d8018e8167c73b362bfc41bb1bb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt @@ -24,6 +24,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject @@ -65,8 +66,21 @@ constructor( ) .collect { (_, lastStartedStep, occluded) -> if (lastStartedStep.to == KeyguardState.AOD) { - startTransitionTo( + val toState = if (occluded) KeyguardState.OCCLUDED else KeyguardState.LOCKSCREEN + val modeOnCanceled = + if ( + toState == KeyguardState.LOCKSCREEN && + lastStartedStep.from == KeyguardState.LOCKSCREEN + ) { + TransitionModeOnCanceled.REVERSE + } else { + TransitionModeOnCanceled.LAST_VALUE + } + + startTransitionTo( + toState = toState, + modeOnCanceled = modeOnCanceled, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt index c67153a5963da2d60e54d9cbf9bf0f97f0215c61..eace0c70cb5ba8189c868d4c5d196f9291617430 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt @@ -22,6 +22,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample @@ -114,8 +115,9 @@ constructor( .collect { (isAsleep, lastStartedStep, isAodAvailable) -> if (lastStartedStep.to == KeyguardState.GONE && isAsleep) { startTransitionTo( - if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING, - resetIfCancelled = true, + toState = + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING, + modeOnCanceled = TransitionModeOnCanceled.RESET, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt index c39a4c9c41729ed3b4d87fc099c152759844f1e5..d44a9d86a731762f665b03bc49bdf25a190b6874 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt @@ -27,6 +27,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel import com.android.systemui.keyguard.shared.model.StatusBarState.KEYGUARD import com.android.systemui.keyguard.shared.model.TransitionInfo +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.shade.data.repository.ShadeRepository @@ -340,8 +341,20 @@ constructor( ) .collect { (isAsleep, lastStartedStep, isAodAvailable) -> if (lastStartedStep.to == KeyguardState.LOCKSCREEN && isAsleep) { - startTransitionTo( + val toState = if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING + val modeOnCanceled = + if ( + toState == KeyguardState.AOD && + lastStartedStep.from == KeyguardState.AOD + ) { + TransitionModeOnCanceled.REVERSE + } else { + TransitionModeOnCanceled.LAST_VALUE + } + startTransitionTo( + toState = toState, + modeOnCanceled = modeOnCanceled, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt index ad2ec69b77cece370ce1343278ba8a7ccd1a755d..1e52232da416aa4c5dfa44382c2a3f374aae27c8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt @@ -26,20 +26,21 @@ import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.Utils.Companion.toQuint import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import com.android.wm.shell.animation.Interpolators +import javax.inject.Inject +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -import javax.inject.Inject -import kotlin.time.Duration.Companion.milliseconds @SysUISingleton class FromPrimaryBouncerTransitionInteractor @@ -132,7 +133,7 @@ constructor( .collect { ( isBouncerShowing, - isAwake, + isAwake, lastStartedTransitionStep, occluded, isActiveDreamLockscreenHosted) -> @@ -162,8 +163,7 @@ constructor( ), ::toQuad ) - .collect { - (isBouncerShowing, isAsleep, lastStartedTransitionStep, isAodAvailable) + .collect { (isBouncerShowing, isAsleep, lastStartedTransitionStep, isAodAvailable) -> if ( !isBouncerShowing && @@ -181,25 +181,24 @@ constructor( private fun listenForPrimaryBouncerToDreamingLockscreenHosted() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample( - combine( - keyguardInteractor.isActiveDreamLockscreenHosted, - transitionInteractor.startedKeyguardTransitionStep, - ::Pair - ), - ::toTriple - ) - .collect { (isBouncerShowing, - isActiveDreamLockscreenHosted, - lastStartedTransitionStep) -> - if ( - !isBouncerShowing && - isActiveDreamLockscreenHosted && - lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER - ) { - startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED) - } + .sample( + combine( + keyguardInteractor.isActiveDreamLockscreenHosted, + transitionInteractor.startedKeyguardTransitionStep, + ::Pair + ), + ::toTriple + ) + .collect { + (isBouncerShowing, isActiveDreamLockscreenHosted, lastStartedTransitionStep) -> + if ( + !isBouncerShowing && + isActiveDreamLockscreenHosted && + lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER + ) { + startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED) } + } } } @@ -237,7 +236,7 @@ constructor( getDefaultAnimatorForTransitionsToState(KeyguardState.GONE).apply { this.duration = duration.inWholeMilliseconds }, - resetIfCancelled = true + modeOnCanceled = TransitionModeOnCanceled.RESET, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt index 54c6d5f6d09f4eeb16b5770a033d2611b3848c11..76018080848f764e2ee05a7613f3c3919ed948ae 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt @@ -21,6 +21,7 @@ import android.util.Log import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionInfo +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.util.kotlin.sample import java.util.UUID import kotlinx.coroutines.CoroutineScope @@ -49,7 +50,7 @@ sealed class TransitionInteractor( fun startTransitionTo( toState: KeyguardState, animator: ValueAnimator? = getDefaultAnimatorForTransitionsToState(toState), - resetIfCancelled: Boolean = false, + modeOnCanceled: TransitionModeOnCanceled = TransitionModeOnCanceled.LAST_VALUE ): UUID? { if ( fromState != transitionInteractor.startedKeyguardState.value && @@ -73,8 +74,8 @@ sealed class TransitionInteractor( fromState, toState, animator, - ), - resetIfCancelled + modeOnCanceled, + ) ) } @@ -91,8 +92,8 @@ sealed class TransitionInteractor( // so use the last finishedKeyguardState to determine the overriding FROM state if (finishedKeyguardState == fromState) { startTransitionTo( - KeyguardState.OCCLUDED, - resetIfCancelled = true, + toState = KeyguardState.OCCLUDED, + modeOnCanceled = TransitionModeOnCanceled.RESET, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionInfo.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionInfo.kt index bfccf3fe076cbc48b5a619e1cd0fdb515267bc8b..7a37365a9cbea2d6e79d7bb84cc603397aece095 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionInfo.kt @@ -22,7 +22,13 @@ data class TransitionInfo( val ownerName: String, val from: KeyguardState, val to: KeyguardState, - val animator: ValueAnimator?, // 'null' animator signal manual control + /** [null] animator signals manual control, otherwise transition run by the animator */ + val animator: ValueAnimator?, + /** + * If the transition resets in the cancellation of another transition, use this mode to + * determine how to continue. + */ + val modeOnCanceled: TransitionModeOnCanceled = TransitionModeOnCanceled.LAST_VALUE, ) { override fun toString(): String = "TransitionInfo(ownerName=$ownerName, from=$from, to=$to, " + diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionModeOnCanceled.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionModeOnCanceled.kt new file mode 100644 index 0000000000000000000000000000000000000000..56f90bdb4f718c7d7c688c7af3dc4cd56a8431dc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/TransitionModeOnCanceled.kt @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2023 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.shared.model + +/** When canceled, provide different ways to start the next transition. */ +enum class TransitionModeOnCanceled { + /** Proceed from the last value. If canceled at .7, start from .7 and end at 1 */ + LAST_VALUE, + /** Start over from 0. If canceled at .7, start from 0 and end at 1 */ + RESET, + /** Reverse the transition. If canceled at .7, start from 1-.7 (0.3) and end at 1 */ + REVERSE +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt index 5afc4059357c8b3dc6bde1eccf0e5ed5a4f0a800..ad80a06e3fcd6e0e4903be0fd7d48ae5384389a5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.AOD import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN import com.android.systemui.keyguard.shared.model.TransitionInfo +import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.util.KeyguardTransitionRunner @@ -86,7 +87,7 @@ class KeyguardTransitionRepositoryTest : SysuiTestCase() { } @Test - fun startingSecondTransitionWillCancelTheFirstTransition() = + fun startingSecondTransitionWillCancelTheFirstTransitionAndUseLastValue() = TestScope().runTest { val steps = mutableListOf<TransitionStep>() val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this) @@ -100,12 +101,19 @@ class KeyguardTransitionRepositoryTest : SysuiTestCase() { val job2 = underTest.transition(LOCKSCREEN, AOD).onEach { steps.add(it) }.launchIn(this) runner.startTransition( this, - TransitionInfo(OWNER_NAME, LOCKSCREEN, AOD, getAnimator()), + TransitionInfo( + OWNER_NAME, + LOCKSCREEN, + AOD, + getAnimator(), + TransitionModeOnCanceled.LAST_VALUE + ), ) val firstTransitionSteps = listWithStep(step = BigDecimal(.1), stop = BigDecimal(.1)) assertSteps(steps.subList(0, 4), firstTransitionSteps, AOD, LOCKSCREEN) + // Second transition starts from .1 (LAST_VALUE) val secondTransitionSteps = listWithStep(step = BigDecimal(.1), start = BigDecimal(.1)) assertSteps(steps.subList(4, steps.size), secondTransitionSteps, LOCKSCREEN, AOD) @@ -113,6 +121,76 @@ class KeyguardTransitionRepositoryTest : SysuiTestCase() { job2.cancel() } + @Test + fun startingSecondTransitionWillCancelTheFirstTransitionAndUseReset() = + TestScope().runTest { + val steps = mutableListOf<TransitionStep>() + val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this) + runner.startTransition( + this, + TransitionInfo(OWNER_NAME, AOD, LOCKSCREEN, getAnimator()), + maxFrames = 3, + ) + + // Now start 2nd transition, which will interrupt the first + val job2 = underTest.transition(LOCKSCREEN, AOD).onEach { steps.add(it) }.launchIn(this) + runner.startTransition( + this, + TransitionInfo( + OWNER_NAME, + LOCKSCREEN, + AOD, + getAnimator(), + TransitionModeOnCanceled.RESET + ), + ) + + val firstTransitionSteps = listWithStep(step = BigDecimal(.1), stop = BigDecimal(.1)) + assertSteps(steps.subList(0, 4), firstTransitionSteps, AOD, LOCKSCREEN) + + // Second transition starts from 0 (RESET) + val secondTransitionSteps = listWithStep(start = BigDecimal(0), step = BigDecimal(.1)) + assertSteps(steps.subList(4, steps.size), secondTransitionSteps, LOCKSCREEN, AOD) + + job.cancel() + job2.cancel() + } + + @Test + fun startingSecondTransitionWillCancelTheFirstTransitionAndUseReverse() = + TestScope().runTest { + val steps = mutableListOf<TransitionStep>() + val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this) + runner.startTransition( + this, + TransitionInfo(OWNER_NAME, AOD, LOCKSCREEN, getAnimator()), + maxFrames = 3, + ) + + // Now start 2nd transition, which will interrupt the first + val job2 = underTest.transition(LOCKSCREEN, AOD).onEach { steps.add(it) }.launchIn(this) + runner.startTransition( + this, + TransitionInfo( + OWNER_NAME, + LOCKSCREEN, + AOD, + getAnimator(), + TransitionModeOnCanceled.REVERSE + ), + ) + + val firstTransitionSteps = listWithStep(step = BigDecimal(.1), stop = BigDecimal(.1)) + assertSteps(steps.subList(0, 4), firstTransitionSteps, AOD, LOCKSCREEN) + + // Second transition starts from .9 (REVERSE) + val secondTransitionSteps = listWithStep(start = BigDecimal(0.9), step = BigDecimal(.1)) + assertSteps(steps.subList(4, steps.size), secondTransitionSteps, LOCKSCREEN, AOD) + + job.cancel() + job2.cancel() + } + @Test fun nullAnimatorEnablesManualControlWithUpdateTransition() = TestScope().runTest { diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt index 5d5ece0f8dcb2067e0a58a956b75ea5d28926ef3..f0e00f1298d33eb2275421a31c32b5ac71924679 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt @@ -56,7 +56,6 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.clearInvocations @@ -241,7 +240,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -268,7 +267,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -295,7 +294,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -325,7 +324,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -356,7 +355,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DREAMING_LOCKSCREEN_HOSTED should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -383,7 +382,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -410,7 +409,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -443,7 +442,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to Lockscreen should occur assertThat(info.ownerName).isEqualTo("FromDreamingLockscreenHostedTransitionInteractor") @@ -471,7 +470,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to Gone should occur assertThat(info.ownerName).isEqualTo("FromDreamingLockscreenHostedTransitionInteractor") @@ -501,7 +500,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromDreamingLockscreenHostedTransitionInteractor") @@ -534,7 +533,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDreamingLockscreenHostedTransitionInteractor") @@ -566,7 +565,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to OCCLUDED should occur assertThat(info.ownerName).isEqualTo("FromDreamingLockscreenHostedTransitionInteractor") @@ -590,7 +589,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -622,7 +621,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { advanceUntilIdle() // THEN the transition is ignored - verify(transitionRepository, never()).startTransition(any(), anyBoolean()) + verify(transitionRepository, never()).startTransition(any()) coroutineContext.cancelChildren() } @@ -639,7 +638,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -666,7 +665,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -693,7 +692,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -716,7 +715,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -746,7 +745,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -777,7 +776,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DREAMING_LOCKSCREEN_HOSTED should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -803,7 +802,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -835,7 +834,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -868,7 +867,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -898,7 +897,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -926,7 +925,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -954,7 +953,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -978,7 +977,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -1008,7 +1007,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition back to DREAMING_LOCKSCREEN_HOSTED should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -1039,7 +1038,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to GONE should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -1068,7 +1067,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -1093,7 +1092,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to AlternateBouncer should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -1118,7 +1117,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to AlternateBouncer should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -1144,7 +1143,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to OCCLUDED should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -1169,7 +1168,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to OCCLUDED should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -1196,7 +1195,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to OCCLUDED should occur assertThat(info.ownerName).isEqualTo("FromDreamingTransitionInteractor") @@ -1220,7 +1219,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to OCCLUDED should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -1250,7 +1249,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } // THEN a transition to OCCLUDED should occur assertThat(info.ownerName).isEqualTo("FromAodTransitionInteractor") @@ -1284,7 +1283,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { // THEN a transition from LOCKSCREEN => OCCLUDED should occur val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") assertThat(info.from).isEqualTo(KeyguardState.LOCKSCREEN) @@ -1315,7 +1314,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { // THEN a transition from LOCKSCREEN => PRIMARY_BOUNCER should occur val info = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") assertThat(info.from).isEqualTo(KeyguardState.LOCKSCREEN) @@ -1336,7 +1335,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { // THEN a transition from PRIMARY_BOUNCER => LOCKSCREEN should occur val info2 = withArgCaptor<TransitionInfo> { - verify(transitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture()) } assertThat(info2.from).isEqualTo(KeyguardState.PRIMARY_BOUNCER) assertThat(info2.to).isEqualTo(KeyguardState.LOCKSCREEN) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRunner.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRunner.kt index 54fc4938e1b0034909b26efb64b1a65533967747..1abb441439fe0c0d6a697d65e37ea53ab51d9870 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRunner.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRunner.kt @@ -42,7 +42,7 @@ class KeyguardTransitionRunner( private var frameCount = 1L private var frames = MutableStateFlow(Pair<Long, FrameCallback?>(0L, null)) private var job: Job? = null - private var isTerminated = false + @Volatile private var isTerminated = false /** * For transitions being directed by an animator. Will control the number of frames being diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt index e160548fed78095bcb364a499665aea09e950319..71e2bc1339a66ae2a905c6742c5b57765a10d217 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt @@ -42,7 +42,7 @@ class FakeKeyguardTransitionRepository @Inject constructor() : KeyguardTransitio _transitions.emit(step) } - override fun startTransition(info: TransitionInfo, resetIfCanceled: Boolean): UUID? { + override fun startTransition(info: TransitionInfo): UUID? { return if (info.animator == null) UUID.randomUUID() else null }