diff options
| author | 2024-04-12 12:56:19 -0700 | |
|---|---|---|
| committer | 2024-04-15 09:39:58 -0700 | |
| commit | b4ce9161108d569fab1d20f00ebce4ddb43b1c4a (patch) | |
| tree | 198adcccd0991f410a44a71f8dc92199667c9d51 | |
| parent | 494471037600ac98e538a1bd07df8ad026a78b29 (diff) | |
[flexiglass] Unfold transition support in the shade scene.
When a foldable is fully unfolded and then the user begins to fold it
up, there's a subtle animation that happens to elements across the
screen. Left-hand side elements move to the right and right-hand side
elements move to the left, seeming to gently float towards the fold
hinge.
This CL adds that for Flexiglass, only for the (split) shade scene.
Test: added unit and integration tests for the new code that exposes the
unfoldProgress
Test: manually verified that gently folding up the device correctly
slides the elements of the split shade into the center (true for the
left-hand QS side and status bar, but needs more work for the
notifications side, even though the code applies the translation it's
not happening yet)
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT
Bug: 330483283
Change-Id: I91db7922e824ee106faa96709b069f5b862aa7de
22 files changed, 262 insertions, 97 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/fold/ui/composable/UnfoldModifiers.kt b/packages/SystemUI/compose/features/src/com/android/systemui/fold/ui/composable/UnfoldModifiers.kt new file mode 100644 index 000000000000..c2a2696777e5 --- /dev/null +++ b/packages/SystemUI/compose/features/src/com/android/systemui/fold/ui/composable/UnfoldModifiers.kt @@ -0,0 +1,77 @@ +/* + * 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.fold.ui.composable + +import androidx.annotation.FloatRange +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.LayoutDirection +import com.android.compose.modifiers.padding +import kotlin.math.roundToInt + +/** + * Applies a translation that feeds off of the unfold transition that's active while the device is + * being folded or unfolded, effectively shifting the element towards the fold hinge. + * + * @param startSide `true` if the affected element is on the start side (left-hand side in + * left-to-right layouts), `false` otherwise. + * @param fullTranslation The maximum translation to apply when the element is the most shifted. The + * modifier will never apply more than this much translation on the element. + * @param unfoldProgress A provider for the amount of progress of the unfold transition. This should + * be sourced from the `UnfoldTransitionInteractor`, ideally through a view-model. + */ +@Composable +fun Modifier.unfoldTranslation( + startSide: Boolean, + fullTranslation: Dp, + @FloatRange(from = 0.0, to = 1.0) unfoldProgress: () -> Float, +): Modifier { + val translateToTheRight = startSide && LocalLayoutDirection.current == LayoutDirection.Ltr + return this.graphicsLayer { + translationX = + fullTranslation.toPx() * + if (translateToTheRight) { + 1 - unfoldProgress() + } else { + unfoldProgress() - 1 + } + } +} + +/** + * Applies horizontal padding that feeds off of the unfold transition that's active while the device + * is being folded or unfolded, effectively "squishing" the element on both sides. + * + * This is horizontal padding so it's applied on both the start and end sides of the element. + * + * @param fullPadding The maximum padding to apply when the element is the most padded. The modifier + * will never apply more than this much horizontal padding on the element. + * @param unfoldProgress A provider for the amount of progress of the unfold transition. This should + * be sourced from the `UnfoldTransitionInteractor`, ideally through a view-model. + */ +@Composable +fun Modifier.unfoldHorizontalPadding( + fullPadding: Dp, + @FloatRange(from = 0.0, to = 1.0) unfoldProgress: () -> Float, +): Modifier { + return this.padding( + horizontal = { (fullPadding.toPx() * (1 - unfoldProgress())).roundToInt() }, + ) +} diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt index 9bd6f817cff3..01c27a4dcc2a 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt @@ -65,6 +65,8 @@ import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.compose.modifiers.thenIf import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.fold.ui.composable.unfoldHorizontalPadding +import com.android.systemui.fold.ui.composable.unfoldTranslation import com.android.systemui.media.controls.ui.composable.MediaCarousel import com.android.systemui.media.controls.ui.controller.MediaCarouselController import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager @@ -289,6 +291,7 @@ private fun SceneScope.SplitShade( remember(lifecycleOwner, viewModel) { viewModel.getFooterActionsViewModel(lifecycleOwner) } val tileSquishiness by animateSceneFloatAsState(value = 1f, key = QuickSettings.SharedValues.TilesSquishiness) + val unfoldTransitionProgress by viewModel.unfoldTransitionProgress.collectAsState() val navBarBottomHeight = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() val density = LocalDensity.current @@ -337,10 +340,23 @@ private fun SceneScope.SplitShade( modifier = Modifier.padding(horizontal = Shade.Dimensions.HorizontalPadding) .then(brightnessMirrorShowingModifier) + .unfoldHorizontalPadding( + fullPadding = dimensionResource(R.dimen.notification_side_paddings), + ) { + unfoldTransitionProgress + } ) Row(modifier = Modifier.fillMaxWidth().weight(1f)) { - Box(modifier = Modifier.weight(1f)) { + Box( + modifier = + Modifier.weight(1f).unfoldTranslation( + startSide = true, + fullTranslation = dimensionResource(R.dimen.notification_side_paddings), + ) { + unfoldTransitionProgress + }, + ) { BrightnessMirror( viewModel = viewModel.brightnessMirrorViewModel, qsSceneAdapter = viewModel.qsSceneAdapter, @@ -407,7 +423,16 @@ private fun SceneScope.SplitShade( Modifier.weight(1f) .fillMaxHeight() .padding(bottom = navBarBottomHeight) - .then(brightnessMirrorShowingModifier), + .then(brightnessMirrorShowingModifier) + .unfoldTranslation( + startSide = false, + fullTranslation = + dimensionResource( + R.dimen.notification_side_paddings, + ), + ) { + unfoldTransitionProgress + }, ) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 93302e32b607..e7c70826f704 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -93,6 +93,7 @@ import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnec import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor import com.android.systemui.telephony.data.repository.fakeTelephonyRepository import com.android.systemui.testKosmos +import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever @@ -266,6 +267,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { footerActionsController = kosmos.footerActionsController, footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory, sceneInteractor = sceneInteractor, + unfoldTransitionInteractor = kosmos.unfoldTransitionInteractor, ) val displayTracker = FakeDisplayTracker(context) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt index 7a681b383aad..e60b9de3515b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt @@ -55,6 +55,8 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsVi import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.testKosmos +import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor +import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -134,6 +136,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory, footerActionsController = kosmos.footerActionsController, sceneInteractor = kosmos.sceneInteractor, + unfoldTransitionInteractor = kosmos.unfoldTransitionInteractor, ) } @@ -297,4 +300,26 @@ class ShadeSceneViewModelTest : SysuiTestCase() { shadeRepository.setShadeMode(ShadeMode.Split) assertThat(shadeMode).isEqualTo(ShadeMode.Split) } + + @Test + fun unfoldTransitionProgress() = + testScope.runTest { + val unfoldProvider = kosmos.fakeUnfoldTransitionProgressProvider + val progress by collectLastValue(underTest.unfoldTransitionProgress) + + unfoldProvider.onTransitionStarted() + assertThat(progress).isEqualTo(1f) + + repeat(10) { repetition -> + val transitionProgress = 0.1f * (repetition + 1) + unfoldProvider.onTransitionProgress(transitionProgress) + assertThat(progress).isEqualTo(transitionProgress) + } + + unfoldProvider.onTransitionFinishing() + assertThat(progress).isEqualTo(1f) + + unfoldProvider.onTransitionFinished() + assertThat(progress).isEqualTo(1f) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractorTest.kt index 6a801e01a4a5..3b4cce448da9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractorTest.kt @@ -15,42 +15,31 @@ */ package com.android.systemui.unfold.domain.interactor -import android.testing.AndroidTestingRunner +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider -import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider import com.google.common.truth.Truth.assertThat -import java.util.Optional import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.async -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest -import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @SmallTest -@RunWith(AndroidTestingRunner::class) -open class UnfoldTransitionInteractorTest : SysuiTestCase() { +@RunWith(AndroidJUnit4::class) +class UnfoldTransitionInteractorTest : SysuiTestCase() { - private val testScope = TestScope() + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val unfoldTransitionProgressProvider = kosmos.fakeUnfoldTransitionProgressProvider - private val unfoldTransitionProgressProvider = TestUnfoldTransitionProvider() - private val unfoldTransitionRepository = - UnfoldTransitionRepositoryImpl(Optional.of(unfoldTransitionProgressProvider)) - - private lateinit var underTest: UnfoldTransitionInteractor - - @Before - fun setUp() { - MockitoAnnotations.initMocks(this) - - underTest = UnfoldTransitionInteractorImpl(unfoldTransitionRepository) - } + private val underTest: UnfoldTransitionInteractor = kosmos.unfoldTransitionInteractor @Test fun waitForTransitionFinish_noEvents_doesNotComplete() = @@ -88,4 +77,26 @@ open class UnfoldTransitionInteractorTest : SysuiTestCase() { assertThat(deferred.isCompleted).isFalse() deferred.cancel() } + + @Test + fun unfoldProgress() = + testScope.runTest { + val progress by collectLastValue(underTest.unfoldProgress) + runCurrent() + + unfoldTransitionProgressProvider.onTransitionStarted() + assertThat(progress).isEqualTo(1f) + + repeat(10) { repetition -> + val transitionProgress = 0.1f * (repetition + 1) + unfoldTransitionProgressProvider.onTransitionProgress(transitionProgress) + assertThat(progress).isEqualTo(transitionProgress) + } + + unfoldTransitionProgressProvider.onTransitionFinishing() + assertThat(progress).isEqualTo(1f) + + unfoldTransitionProgressProvider.onTransitionFinished() + assertThat(progress).isEqualTo(1f) + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt index 980f665ae61f..6800c6115080 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt @@ -37,6 +37,7 @@ import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorVie import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel +import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -64,6 +65,7 @@ constructor( private val footerActionsViewModelFactory: FooterActionsViewModel.Factory, private val footerActionsController: FooterActionsController, private val sceneInteractor: SceneInteractor, + unfoldTransitionInteractor: UnfoldTransitionInteractor, ) { val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = combine( @@ -106,6 +108,16 @@ constructor( val shadeMode: StateFlow<ShadeMode> = shadeInteractor.shadeMode + /** + * The unfold transition progress. When fully-unfolded, this is `1` and fully folded, it's `0`. + */ + val unfoldTransitionProgress: StateFlow<Float> = + unfoldTransitionInteractor.unfoldProgress.stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = 1f + ) + /** Notifies that some content in the shade was clicked. */ fun onContentClicked() { if (!isClickable.value) { diff --git a/packages/SystemUI/src/com/android/systemui/unfold/data/repository/UnfoldTransitionRepository.kt b/packages/SystemUI/src/com/android/systemui/unfold/data/repository/UnfoldTransitionRepository.kt index 0d3682c9a24b..fbbd2b9c5de8 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/data/repository/UnfoldTransitionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/data/repository/UnfoldTransitionRepository.kt @@ -15,9 +15,11 @@ */ package com.android.systemui.unfold.data.repository +import androidx.annotation.FloatRange import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.data.repository.UnfoldTransitionStatus.TransitionFinished +import com.android.systemui.unfold.data.repository.UnfoldTransitionStatus.TransitionInProgress import com.android.systemui.unfold.data.repository.UnfoldTransitionStatus.TransitionStarted import com.android.systemui.util.kotlin.getOrNull import java.util.Optional @@ -42,6 +44,10 @@ interface UnfoldTransitionRepository { sealed class UnfoldTransitionStatus { /** Status that is sent when fold or unfold transition is in started state */ data object TransitionStarted : UnfoldTransitionStatus() + /** Status that is sent while fold or unfold transition is in progress */ + data class TransitionInProgress( + @FloatRange(from = 0.0, to = 1.0) val progress: Float, + ) : UnfoldTransitionStatus() /** Status that is sent when fold or unfold transition is finished */ data object TransitionFinished : UnfoldTransitionStatus() } @@ -66,6 +72,10 @@ constructor( trySend(TransitionStarted) } + override fun onTransitionProgress(progress: Float) { + trySend(TransitionInProgress(progress)) + } + override fun onTransitionFinished() { trySend(TransitionFinished) } diff --git a/packages/SystemUI/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractor.kt index 3e2e564c307c..a8e4496d7804 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/domain/interactor/UnfoldTransitionInteractor.kt @@ -17,10 +17,14 @@ package com.android.systemui.unfold.domain.interactor import com.android.systemui.unfold.data.repository.UnfoldTransitionRepository import com.android.systemui.unfold.data.repository.UnfoldTransitionStatus.TransitionFinished +import com.android.systemui.unfold.data.repository.UnfoldTransitionStatus.TransitionInProgress import com.android.systemui.unfold.data.repository.UnfoldTransitionStatus.TransitionStarted import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map /** * Contains business-logic related to fold-unfold transitions while interacting with @@ -30,6 +34,8 @@ interface UnfoldTransitionInteractor { /** Returns availability of fold/unfold transitions on the device */ val isAvailable: Boolean + val unfoldProgress: Flow<Float> + /** Suspends and waits for a fold/unfold transition to finish */ suspend fun waitForTransitionFinish() @@ -44,6 +50,11 @@ constructor(private val repository: UnfoldTransitionRepository) : UnfoldTransiti override val isAvailable: Boolean get() = repository.isAvailable + override val unfoldProgress: Flow<Float> = + repository.transitionStatus + .map { (it as? TransitionInProgress)?.progress ?: 1f } + .distinctUntilChanged() + override suspend fun waitForTransitionFinish() { repository.transitionStatus.filter { it is TransitionFinished }.first() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/animation/UnfoldConstantTranslateAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/animation/UnfoldConstantTranslateAnimatorTest.kt index 56fc0c74dafa..a05a23bb8bb1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/animation/UnfoldConstantTranslateAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/animation/UnfoldConstantTranslateAnimatorTest.kt @@ -21,7 +21,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.shared.animation.UnfoldConstantTranslateAnimator.Direction import com.android.systemui.shared.animation.UnfoldConstantTranslateAnimator.ViewIdToTranslate -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -34,21 +34,19 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) class UnfoldConstantTranslateAnimatorTest : SysuiTestCase() { - private val progressProvider = TestUnfoldTransitionProvider() + private val progressProvider = FakeUnfoldTransitionProvider() - @Mock - private lateinit var parent: ViewGroup + @Mock private lateinit var parent: ViewGroup - @Mock - private lateinit var shouldBeAnimated: () -> Boolean + @Mock private lateinit var shouldBeAnimated: () -> Boolean private lateinit var animator: UnfoldConstantTranslateAnimator private val viewsIdToRegister get() = setOf( - ViewIdToTranslate(START_VIEW_ID, Direction.START, shouldBeAnimated), - ViewIdToTranslate(END_VIEW_ID, Direction.END, shouldBeAnimated) + ViewIdToTranslate(START_VIEW_ID, Direction.START, shouldBeAnimated), + ViewIdToTranslate(END_VIEW_ID, Direction.END, shouldBeAnimated) ) @Before @@ -122,11 +120,12 @@ class UnfoldConstantTranslateAnimatorTest : SysuiTestCase() { progressProvider.onTransitionStarted() progressProvider.onTransitionProgress(0f) - val rtlMultiplier = if (layoutDirection == View.LAYOUT_DIRECTION_LTR) { - 1 - } else { - -1 - } + val rtlMultiplier = + if (layoutDirection == View.LAYOUT_DIRECTION_LTR) { + 1 + } else { + -1 + } list.forEach { (view, direction) -> assertEquals( (-MAX_TRANSLATION * direction * rtlMultiplier).toInt(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HideNotificationsInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HideNotificationsInteractorTest.kt index 4bfd7e3bef83..df82df842c65 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HideNotificationsInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/HideNotificationsInteractorTest.kt @@ -31,7 +31,7 @@ import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.shared.model.ScreenPowerState.SCREEN_ON import com.android.systemui.power.shared.model.WakefulnessState.STARTING_TO_SLEEP import com.android.systemui.statusbar.policy.FakeConfigurationController -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractorImpl import com.android.systemui.util.animation.data.repository.FakeAnimationStatusRepository @@ -59,7 +59,7 @@ open class HideNotificationsInteractorTest : SysuiTestCase() { private val animationStatus = FakeAnimationStatusRepository() private val configurationController = FakeConfigurationController() - private val unfoldTransitionProgressProvider = TestUnfoldTransitionProvider() + private val unfoldTransitionProgressProvider = FakeUnfoldTransitionProvider() private val powerRepository = FakePowerRepository() private val powerInteractor = PowerInteractor( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt index feff046bb708..1ec1765e2e57 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt @@ -8,7 +8,7 @@ import android.view.View import android.view.WindowManager import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.unfold.util.CurrentActivityTypeProvider import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider import com.android.systemui.util.mockito.whenever @@ -23,17 +23,14 @@ import org.mockito.MockitoAnnotations @TestableLooper.RunWithLooper class StatusBarMoveFromCenterAnimationControllerTest : SysuiTestCase() { - @Mock - private lateinit var windowManager: WindowManager + @Mock private lateinit var windowManager: WindowManager - @Mock - private lateinit var display: Display + @Mock private lateinit var display: Display - @Mock - private lateinit var currentActivityTypeProvider: CurrentActivityTypeProvider + @Mock private lateinit var currentActivityTypeProvider: CurrentActivityTypeProvider private val view: View = View(context) - private val progressProvider = TestUnfoldTransitionProvider() + private val progressProvider = FakeUnfoldTransitionProvider() private val scopedProvider = ScopedUnfoldTransitionProgressProvider(progressProvider) private lateinit var controller: StatusBarMoveFromCenterAnimationController diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt index 28adbceda847..383f4a33857d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt @@ -86,7 +86,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { private val areAnimationEnabled = MutableStateFlow(true) private val lastWakefulnessEvent = MutableStateFlow(WakefulnessModel()) private val systemClock = FakeSystemClock() - private val unfoldTransitionProgressProvider = TestUnfoldTransitionProvider() + private val unfoldTransitionProgressProvider = FakeUnfoldTransitionProvider() private val unfoldTransitionRepository = UnfoldTransitionRepositoryImpl(Optional.of(unfoldTransitionProgressProvider)) private val unfoldTransitionInteractor = diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldHapticsPlayerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldHapticsPlayerTest.kt index b9c7e6133669..fd513c9c9235 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldHapticsPlayerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldHapticsPlayerTest.kt @@ -35,7 +35,7 @@ import org.mockito.Mockito.verify @SmallTest class UnfoldHapticsPlayerTest : SysuiTestCase() { - private val progressProvider = TestUnfoldTransitionProvider() + private val progressProvider = FakeUnfoldTransitionProvider() private val vibrator: Vibrator = mock() private val testFoldProvider = TestFoldProvider() diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldLatencyTrackerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldLatencyTrackerTest.kt index ba72716997e3..2955384c0bbd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldLatencyTrackerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldLatencyTrackerTest.kt @@ -27,6 +27,7 @@ import com.android.systemui.keyguard.ScreenLifecycle import com.android.systemui.unfold.util.FoldableDeviceStates import com.android.systemui.unfold.util.FoldableTestUtils import com.android.systemui.util.mockito.any +import java.util.Optional import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -37,45 +38,41 @@ import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations -import java.util.Optional @RunWith(AndroidTestingRunner::class) @SmallTest class UnfoldLatencyTrackerTest : SysuiTestCase() { - @Mock - lateinit var latencyTracker: LatencyTracker + @Mock lateinit var latencyTracker: LatencyTracker - @Mock - lateinit var deviceStateManager: DeviceStateManager + @Mock lateinit var deviceStateManager: DeviceStateManager - @Mock - lateinit var screenLifecycle: ScreenLifecycle + @Mock lateinit var screenLifecycle: ScreenLifecycle - @Captor - private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener> + @Captor private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener> - @Captor - private lateinit var screenLifecycleCaptor: ArgumentCaptor<ScreenLifecycle.Observer> + @Captor private lateinit var screenLifecycleCaptor: ArgumentCaptor<ScreenLifecycle.Observer> private lateinit var deviceStates: FoldableDeviceStates private lateinit var unfoldLatencyTracker: UnfoldLatencyTracker - private val transitionProgressProvider = TestUnfoldTransitionProvider() + private val transitionProgressProvider = FakeUnfoldTransitionProvider() @Before fun setUp() { MockitoAnnotations.initMocks(this) - unfoldLatencyTracker = UnfoldLatencyTracker( - latencyTracker, - deviceStateManager, - Optional.of(transitionProgressProvider), - context.mainExecutor, - context, - context.contentResolver, - screenLifecycle - ).apply { init() } + unfoldLatencyTracker = + UnfoldLatencyTracker( + latencyTracker, + deviceStateManager, + Optional.of(transitionProgressProvider), + context.mainExecutor, + context, + context.contentResolver, + screenLifecycle + ) + .apply { init() } deviceStates = FoldableTestUtils.findDeviceStates(context) verify(deviceStateManager).registerCallback(any(), foldStateListenerCaptor.capture()) @@ -107,7 +104,7 @@ class UnfoldLatencyTrackerTest : SysuiTestCase() { } @Test - fun unfold_firstFoldEventAnimationsEnabledOnScreenTurnedOnAndTransitionStarted_eventNotPropagated() { + fun firstFoldEventAnimationsEnabledOnScreenTurnedOnAndTransitionStarted_eventNotPropagated() { setAnimationsEnabled(true) sendFoldEvent(folded = false) @@ -118,7 +115,7 @@ class UnfoldLatencyTrackerTest : SysuiTestCase() { } @Test - fun unfold_secondFoldEventAnimationsEnabledOnScreenTurnedOnAndTransitionStarted_eventPropagated() { + fun secondFoldEventAnimationsEnabledOnScreenTurnedOnAndTransitionStarted_eventPropagated() { setAnimationsEnabled(true) sendFoldEvent(folded = true) sendFoldEvent(folded = false) @@ -131,7 +128,7 @@ class UnfoldLatencyTrackerTest : SysuiTestCase() { } @Test - fun unfold_unfoldFoldUnfoldAnimationsEnabledOnScreenTurnedOnAndTransitionStarted_eventPropagated() { + fun unfoldFoldUnfoldAnimationsEnabledOnScreenTurnedOnAndTransitionStarted_eventPropagated() { setAnimationsEnabled(true) sendFoldEvent(folded = false) sendFoldEvent(folded = true) @@ -196,4 +193,4 @@ class UnfoldLatencyTrackerTest : SysuiTestCase() { durationScale.toString() ) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldTransitionWallpaperControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldTransitionWallpaperControllerTest.kt index 6ec0251d41a5..0c452eb9d461 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldTransitionWallpaperControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/UnfoldTransitionWallpaperControllerTest.kt @@ -17,21 +17,18 @@ import org.mockito.junit.MockitoJUnit @SmallTest class UnfoldTransitionWallpaperControllerTest : SysuiTestCase() { - @Mock - private lateinit var wallpaperController: WallpaperController + @Mock private lateinit var wallpaperController: WallpaperController - private val progressProvider = TestUnfoldTransitionProvider() + private val progressProvider = FakeUnfoldTransitionProvider() - @JvmField - @Rule - val mockitoRule = MockitoJUnit.rule() + @JvmField @Rule val mockitoRule = MockitoJUnit.rule() private lateinit var unfoldWallpaperController: UnfoldTransitionWallpaperController @Before fun setup() { - unfoldWallpaperController = UnfoldTransitionWallpaperController(progressProvider, - wallpaperController) + unfoldWallpaperController = + UnfoldTransitionWallpaperController(progressProvider, wallpaperController) unfoldWallpaperController.init() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt index 2bc05fcc8166..e5f619b299a1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt @@ -23,7 +23,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.utils.os.FakeHandler import kotlin.test.Test import kotlinx.coroutines.test.runTest @@ -34,7 +34,7 @@ import org.junit.runner.RunWith @RunWithLooper(setAsMainLooper = true) class MainThreadUnfoldTransitionProgressProviderTest : SysuiTestCase() { - private val wrappedProgressProvider = TestUnfoldTransitionProvider() + private val wrappedProgressProvider = FakeUnfoldTransitionProvider() private val fakeHandler = FakeHandler(Looper.getMainLooper()) private val listener = TestUnfoldProgressListener() diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProviderTest.kt index d864d53fea32..70ec050afe1d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProviderTest.kt @@ -20,7 +20,7 @@ import android.testing.TestableLooper import android.view.Surface import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.updates.RotationChangeProvider import com.android.systemui.unfold.updates.RotationChangeProvider.RotationListener @@ -43,14 +43,14 @@ class NaturalRotationUnfoldProgressProviderTest : SysuiTestCase() { @Mock lateinit var rotationChangeProvider: RotationChangeProvider - private val sourceProvider = TestUnfoldTransitionProvider() + private val sourceProvider = FakeUnfoldTransitionProvider() @Mock lateinit var transitionListener: TransitionProgressListener @Captor private lateinit var rotationListenerCaptor: ArgumentCaptor<RotationListener> lateinit var progressProvider: NaturalRotationUnfoldProgressProvider - private lateinit var testableLooper : TestableLooper + private lateinit var testableLooper: TestableLooper @Before fun setUp() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScaleAwareUnfoldProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScaleAwareUnfoldProgressProviderTest.kt index 2f29b3bdd3b5..451bd24dd83f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScaleAwareUnfoldProgressProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScaleAwareUnfoldProgressProviderTest.kt @@ -22,7 +22,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.util.mockito.any import org.junit.Before @@ -42,7 +42,7 @@ class ScaleAwareUnfoldProgressProviderTest : SysuiTestCase() { @Mock lateinit var sinkProvider: TransitionProgressListener - private val sourceProvider = TestUnfoldTransitionProvider() + private val sourceProvider = FakeUnfoldTransitionProvider() private lateinit var contentResolver: ContentResolver private lateinit var progressProvider: ScaleAwareTransitionProgressProvider @@ -132,6 +132,6 @@ class ScaleAwareUnfoldProgressProviderTest : SysuiTestCase() { durationScale.toString() ) - animatorDurationScaleListenerCaptor.value.dispatchChange(/* selfChange= */false) + animatorDurationScaleListenerCaptor.value.dispatchChange(/* selfChange= */ false) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProviderTest.kt index 95c934e988e7..4486402f43ec 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProviderTest.kt @@ -23,7 +23,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.unfold.progress.TestUnfoldProgressListener import com.google.common.truth.Truth.assertThat import kotlin.time.Duration.Companion.seconds @@ -43,7 +43,7 @@ import org.junit.runner.RunWith @RunWithLooper class ScopedUnfoldTransitionProgressProviderTest : SysuiTestCase() { - private val rootProvider = TestUnfoldTransitionProvider() + private val rootProvider = FakeUnfoldTransitionProvider() private val listener = TestUnfoldProgressListener() private val testScope = TestScope(UnconfinedTestDispatcher()) private val bgThread = diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/UnfoldOnlyProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/UnfoldOnlyProgressProviderTest.kt index f484ea04bb4f..cd4d7b54916e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/UnfoldOnlyProgressProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/UnfoldOnlyProgressProviderTest.kt @@ -19,7 +19,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.unfold.TestUnfoldTransitionProvider +import com.android.systemui.unfold.FakeUnfoldTransitionProvider import com.android.systemui.unfold.progress.TestUnfoldProgressListener import com.google.common.util.concurrent.MoreExecutors import org.junit.Before @@ -32,7 +32,7 @@ import org.junit.runner.RunWith class UnfoldOnlyProgressProviderTest : SysuiTestCase() { private val listener = TestUnfoldProgressListener() - private val sourceProvider = TestUnfoldTransitionProvider() + private val sourceProvider = FakeUnfoldTransitionProvider() private val foldProvider = TestFoldProvider() diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/TestUnfoldTransitionProvider.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/FakeUnfoldTransitionProvider.kt index 56c624565971..94f0c44a51b2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/TestUnfoldTransitionProvider.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/FakeUnfoldTransitionProvider.kt @@ -2,7 +2,7 @@ package com.android.systemui.unfold import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener -class TestUnfoldTransitionProvider : UnfoldTransitionProgressProvider, TransitionProgressListener { +class FakeUnfoldTransitionProvider : UnfoldTransitionProgressProvider, TransitionProgressListener { private val listeners = mutableListOf<TransitionProgressListener>() diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/UnfoldTransitionProgressProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/UnfoldTransitionProgressProviderKosmos.kt index 7c54a5707bf4..a0f5b58c1cd0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/UnfoldTransitionProgressProviderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/UnfoldTransitionProgressProviderKosmos.kt @@ -18,6 +18,8 @@ package com.android.systemui.unfold import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.util.mockito.mock -var Kosmos.unfoldTransitionProgressProvider by Fixture { mock<UnfoldTransitionProgressProvider>() } +val Kosmos.fakeUnfoldTransitionProgressProvider by Fixture { FakeUnfoldTransitionProvider() } + +val Kosmos.unfoldTransitionProgressProvider by + Fixture<UnfoldTransitionProgressProvider> { fakeUnfoldTransitionProgressProvider } |