Loading packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt +39 −14 Original line number Original line Diff line number Diff line Loading @@ -47,13 +47,14 @@ import com.android.systemui.power.shared.model.ScreenPowerState.SCREEN_ON import com.android.systemui.shared.system.SysUiStatsLog import com.android.systemui.shared.system.SysUiStatsLog import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.testKosmos import com.android.systemui.testKosmos import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.COOL_DOWN_DURATION import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_CLOSED import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_CLOSED import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_HALF_OPEN import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_HALF_OPEN import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.SCREEN_EVENT_TIMEOUT import com.android.systemui.unfold.DisplaySwitchLatencyTracker.DisplaySwitchLatencyEvent import com.android.systemui.unfold.DisplaySwitchLatencyTracker.DisplaySwitchLatencyEvent import com.android.systemui.unfold.data.repository.ScreenTimeoutPolicyRepository import com.android.systemui.unfold.data.repository.ScreenTimeoutPolicyRepository import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl import com.android.systemui.unfold.domain.interactor.FoldableDisplaySwitchTrackingInteractor import com.android.systemui.unfold.domain.interactor.FoldableDisplaySwitchTrackingInteractor.Companion.COOL_DOWN_DURATION import com.android.systemui.unfold.domain.interactor.FoldableDisplaySwitchTrackingInteractor.Companion.SCREEN_EVENT_TIMEOUT import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor import com.android.systemui.unfoldedDeviceState import com.android.systemui.unfoldedDeviceState import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository Loading @@ -62,7 +63,6 @@ import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat import java.util.Optional import java.util.Optional import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.asExecutor import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.TestDispatcher Loading Loading @@ -93,7 +93,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { private val kosmos = testKosmos() private val kosmos = testKosmos() private val mockContext = mock<Context>() private val mockContext = mock<Context>() private val resources = mock<Resources>() private val resources = mock<Resources>() private val foldStateRepository = kosmos.fakeDeviceStateRepository private val deviceStateRepository = kosmos.fakeDeviceStateRepository private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val animationStatusRepository = kosmos.fakeAnimationStatusRepository private val animationStatusRepository = kosmos.fakeAnimationStatusRepository private val keyguardInteractor = mock<KeyguardInteractor>() private val keyguardInteractor = mock<KeyguardInteractor>() Loading Loading @@ -143,20 +143,29 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { animationStatusRepository.onAnimationStatusChanged(true) animationStatusRepository.onAnimationStatusChanged(true) powerInteractor.setAwakeForTest() powerInteractor.setAwakeForTest() powerInteractor.setScreenPowerState(SCREEN_ON) powerInteractor.setScreenPowerState(SCREEN_ON) val displaySwitchInteractor = FoldableDisplaySwitchTrackingInteractor( deviceStateRepository, powerInteractor, unfoldTransitionInteractor, animationStatusRepository, keyguardInteractor, systemClock, testScope.backgroundScope, ) displaySwitchInteractor.start() displaySwitchLatencyTracker = displaySwitchLatencyTracker = DisplaySwitchLatencyTracker( DisplaySwitchLatencyTracker( mockContext, mockContext, foldStateRepository, powerInteractor, powerInteractor, screenTimeoutPolicyRepository, screenTimeoutPolicyRepository, unfoldTransitionInteractor, animationStatusRepository, keyguardInteractor, keyguardInteractor, testDispatcher.asExecutor(), testScope.backgroundScope, testScope.backgroundScope, displaySwitchLatencyLogger, displaySwitchLatencyLogger, systemClock, systemClock, deviceStateManager, deviceStateManager, displaySwitchInteractor, latencyTracker, latencyTracker, ) ) } } Loading Loading @@ -196,20 +205,28 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { UnfoldTransitionRepositoryImpl(Optional.empty()), UnfoldTransitionRepositoryImpl(Optional.empty()), configurationInteractor, configurationInteractor, ) ) val displaySwitchInteractor = FoldableDisplaySwitchTrackingInteractor( deviceStateRepository, powerInteractor, unfoldTransitionInteractorWithEmptyProgressProvider, animationStatusRepository, keyguardInteractor, systemClock, testScope.backgroundScope, ) displaySwitchInteractor.start() displaySwitchLatencyTracker = displaySwitchLatencyTracker = DisplaySwitchLatencyTracker( DisplaySwitchLatencyTracker( mockContext, mockContext, foldStateRepository, powerInteractor, powerInteractor, screenTimeoutPolicyRepository, screenTimeoutPolicyRepository, unfoldTransitionInteractorWithEmptyProgressProvider, animationStatusRepository, keyguardInteractor, keyguardInteractor, testDispatcher.asExecutor(), testScope.backgroundScope, testScope.backgroundScope, displaySwitchLatencyLogger, displaySwitchLatencyLogger, systemClock, systemClock, deviceStateManager, deviceStateManager, displaySwitchInteractor, latencyTracker, latencyTracker, ) ) Loading Loading @@ -467,13 +484,14 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { } } @Test @Test fun displaySwitchInterrupted_cancelsTrackingWhenNewDeviceStateEmitted() { fun displaySwitchInterrupted_newDeviceState_trackingNotSent() { testScope.runTest { testScope.runTest { startInFoldedState(displaySwitchLatencyTracker) startInFoldedState(displaySwitchLatencyTracker) startUnfolding() startUnfolding() startFolding() startFolding() finishFolding() finishFolding() waitForCorruptedStateToPass() verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) Loading @@ -491,6 +509,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { startFolding() startFolding() startUnfolding() startUnfolding() finishUnfolding() finishUnfolding() waitForCorruptedStateToPass() verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) Loading Loading @@ -621,6 +640,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { startInFoldedState(displaySwitchLatencyTracker) startInFoldedState(displaySwitchLatencyTracker) startUnfolding() startUnfolding() systemClock.advanceTime(SCREEN_EVENT_TIMEOUT.inWholeMilliseconds) advanceTimeBy(SCREEN_EVENT_TIMEOUT + 10.milliseconds) advanceTimeBy(SCREEN_EVENT_TIMEOUT + 10.milliseconds) finishUnfolding() finishUnfolding() Loading Loading @@ -747,7 +767,12 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { runCurrent() runCurrent() } } private fun TestScope.waitForCorruptedStateToPass() { // extra buffer time so corrupted state is finished advanceTimeBy(COOL_DOWN_DURATION.plus(10.milliseconds)) } private suspend fun setDeviceState(state: DeviceState) { private suspend fun setDeviceState(state: DeviceState) { foldStateRepository.emit(state) deviceStateRepository.emit(state) } } } } packages/SystemUI/shared/src/com/android/systemui/unfold/system/SystemUnfoldSharedModule.kt +25 −12 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ import android.os.Handler import android.os.HandlerThread import android.os.HandlerThread import android.os.Looper import android.os.Looper import android.os.Process import android.os.Process import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.UiBackground import com.android.systemui.dagger.qualifiers.UiBackground import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig Loading @@ -25,6 +26,7 @@ import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.dagger.UnfoldBg import com.android.systemui.unfold.dagger.UnfoldBg import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg import com.android.systemui.unfold.dagger.UnfoldTracking import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.util.CurrentActivityTypeProvider import com.android.systemui.unfold.util.CurrentActivityTypeProvider import dagger.Binds import dagger.Binds Loading @@ -33,7 +35,10 @@ import dagger.Provides import java.util.concurrent.Executor import java.util.concurrent.Executor import javax.inject.Singleton import javax.inject.Singleton import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.plus /** /** * Dagger module with system-only dependencies for the unfold animation. The code that is used to * Dagger module with system-only dependencies for the unfold animation. The code that is used to Loading @@ -45,25 +50,20 @@ import kotlinx.coroutines.android.asCoroutineDispatcher abstract class SystemUnfoldSharedModule { abstract class SystemUnfoldSharedModule { @Binds @Binds abstract fun activityTypeProvider(executor: ActivityManagerActivityTypeProvider): abstract fun activityTypeProvider( CurrentActivityTypeProvider executor: ActivityManagerActivityTypeProvider ): CurrentActivityTypeProvider @Binds @Binds abstract fun config(config: ResourceUnfoldTransitionConfig): UnfoldTransitionConfig abstract fun config(config: ResourceUnfoldTransitionConfig): UnfoldTransitionConfig @Binds @Binds abstract fun foldState(provider: DeviceStateManagerFoldProvider): FoldProvider abstract fun foldState(provider: DeviceStateManagerFoldProvider): FoldProvider @Binds @Binds abstract fun deviceStateRepository(provider: DeviceStateRepositoryImpl): DeviceStateRepository abstract fun deviceStateRepository(provider: DeviceStateRepositoryImpl): DeviceStateRepository @Binds @Binds @UnfoldMain abstract fun mainExecutor(@Main executor: Executor): Executor @UnfoldMain abstract fun mainExecutor(@Main executor: Executor): Executor @Binds @Binds @UnfoldMain abstract fun mainHandler(@Main handler: Handler): Handler @UnfoldMain abstract fun mainHandler(@Main handler: Handler): Handler @Binds @Binds @UnfoldSingleThreadBg @UnfoldSingleThreadBg Loading Loading @@ -92,5 +92,18 @@ abstract class SystemUnfoldSharedModule { .apply { start() } .apply { start() } .looper .looper } } @Provides @UnfoldTracking @Singleton fun unfoldTrackingContext( @UnfoldSingleThreadBg singleThreadBgExecutor: Executor, @Application applicationScope: CoroutineScope, ): CoroutineScope { // tracking depends on being executed on a single thread so when changing it, ensure all // consumers are not accessing shared state val backgroundDispatcher = singleThreadBgExecutor.asCoroutineDispatcher() return applicationScope + backgroundDispatcher } } } } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt +39 −14 Original line number Original line Diff line number Diff line Loading @@ -47,13 +47,14 @@ import com.android.systemui.power.shared.model.ScreenPowerState.SCREEN_ON import com.android.systemui.shared.system.SysUiStatsLog import com.android.systemui.shared.system.SysUiStatsLog import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.testKosmos import com.android.systemui.testKosmos import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.COOL_DOWN_DURATION import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_CLOSED import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_CLOSED import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_HALF_OPEN import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_HALF_OPEN import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.SCREEN_EVENT_TIMEOUT import com.android.systemui.unfold.DisplaySwitchLatencyTracker.DisplaySwitchLatencyEvent import com.android.systemui.unfold.DisplaySwitchLatencyTracker.DisplaySwitchLatencyEvent import com.android.systemui.unfold.data.repository.ScreenTimeoutPolicyRepository import com.android.systemui.unfold.data.repository.ScreenTimeoutPolicyRepository import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl import com.android.systemui.unfold.domain.interactor.FoldableDisplaySwitchTrackingInteractor import com.android.systemui.unfold.domain.interactor.FoldableDisplaySwitchTrackingInteractor.Companion.COOL_DOWN_DURATION import com.android.systemui.unfold.domain.interactor.FoldableDisplaySwitchTrackingInteractor.Companion.SCREEN_EVENT_TIMEOUT import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor import com.android.systemui.unfoldedDeviceState import com.android.systemui.unfoldedDeviceState import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository Loading @@ -62,7 +63,6 @@ import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat import java.util.Optional import java.util.Optional import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.asExecutor import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.TestDispatcher Loading Loading @@ -93,7 +93,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { private val kosmos = testKosmos() private val kosmos = testKosmos() private val mockContext = mock<Context>() private val mockContext = mock<Context>() private val resources = mock<Resources>() private val resources = mock<Resources>() private val foldStateRepository = kosmos.fakeDeviceStateRepository private val deviceStateRepository = kosmos.fakeDeviceStateRepository private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val animationStatusRepository = kosmos.fakeAnimationStatusRepository private val animationStatusRepository = kosmos.fakeAnimationStatusRepository private val keyguardInteractor = mock<KeyguardInteractor>() private val keyguardInteractor = mock<KeyguardInteractor>() Loading Loading @@ -143,20 +143,29 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { animationStatusRepository.onAnimationStatusChanged(true) animationStatusRepository.onAnimationStatusChanged(true) powerInteractor.setAwakeForTest() powerInteractor.setAwakeForTest() powerInteractor.setScreenPowerState(SCREEN_ON) powerInteractor.setScreenPowerState(SCREEN_ON) val displaySwitchInteractor = FoldableDisplaySwitchTrackingInteractor( deviceStateRepository, powerInteractor, unfoldTransitionInteractor, animationStatusRepository, keyguardInteractor, systemClock, testScope.backgroundScope, ) displaySwitchInteractor.start() displaySwitchLatencyTracker = displaySwitchLatencyTracker = DisplaySwitchLatencyTracker( DisplaySwitchLatencyTracker( mockContext, mockContext, foldStateRepository, powerInteractor, powerInteractor, screenTimeoutPolicyRepository, screenTimeoutPolicyRepository, unfoldTransitionInteractor, animationStatusRepository, keyguardInteractor, keyguardInteractor, testDispatcher.asExecutor(), testScope.backgroundScope, testScope.backgroundScope, displaySwitchLatencyLogger, displaySwitchLatencyLogger, systemClock, systemClock, deviceStateManager, deviceStateManager, displaySwitchInteractor, latencyTracker, latencyTracker, ) ) } } Loading Loading @@ -196,20 +205,28 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { UnfoldTransitionRepositoryImpl(Optional.empty()), UnfoldTransitionRepositoryImpl(Optional.empty()), configurationInteractor, configurationInteractor, ) ) val displaySwitchInteractor = FoldableDisplaySwitchTrackingInteractor( deviceStateRepository, powerInteractor, unfoldTransitionInteractorWithEmptyProgressProvider, animationStatusRepository, keyguardInteractor, systemClock, testScope.backgroundScope, ) displaySwitchInteractor.start() displaySwitchLatencyTracker = displaySwitchLatencyTracker = DisplaySwitchLatencyTracker( DisplaySwitchLatencyTracker( mockContext, mockContext, foldStateRepository, powerInteractor, powerInteractor, screenTimeoutPolicyRepository, screenTimeoutPolicyRepository, unfoldTransitionInteractorWithEmptyProgressProvider, animationStatusRepository, keyguardInteractor, keyguardInteractor, testDispatcher.asExecutor(), testScope.backgroundScope, testScope.backgroundScope, displaySwitchLatencyLogger, displaySwitchLatencyLogger, systemClock, systemClock, deviceStateManager, deviceStateManager, displaySwitchInteractor, latencyTracker, latencyTracker, ) ) Loading Loading @@ -467,13 +484,14 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { } } @Test @Test fun displaySwitchInterrupted_cancelsTrackingWhenNewDeviceStateEmitted() { fun displaySwitchInterrupted_newDeviceState_trackingNotSent() { testScope.runTest { testScope.runTest { startInFoldedState(displaySwitchLatencyTracker) startInFoldedState(displaySwitchLatencyTracker) startUnfolding() startUnfolding() startFolding() startFolding() finishFolding() finishFolding() waitForCorruptedStateToPass() verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) Loading @@ -491,6 +509,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { startFolding() startFolding() startUnfolding() startUnfolding() finishUnfolding() finishUnfolding() waitForCorruptedStateToPass() verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker).onActionCancel(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) verify(latencyTracker, never()).onActionEnd(ACTION_SWITCH_DISPLAY_UNFOLD) Loading Loading @@ -621,6 +640,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { startInFoldedState(displaySwitchLatencyTracker) startInFoldedState(displaySwitchLatencyTracker) startUnfolding() startUnfolding() systemClock.advanceTime(SCREEN_EVENT_TIMEOUT.inWholeMilliseconds) advanceTimeBy(SCREEN_EVENT_TIMEOUT + 10.milliseconds) advanceTimeBy(SCREEN_EVENT_TIMEOUT + 10.milliseconds) finishUnfolding() finishUnfolding() Loading Loading @@ -747,7 +767,12 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() { runCurrent() runCurrent() } } private fun TestScope.waitForCorruptedStateToPass() { // extra buffer time so corrupted state is finished advanceTimeBy(COOL_DOWN_DURATION.plus(10.milliseconds)) } private suspend fun setDeviceState(state: DeviceState) { private suspend fun setDeviceState(state: DeviceState) { foldStateRepository.emit(state) deviceStateRepository.emit(state) } } } }
packages/SystemUI/shared/src/com/android/systemui/unfold/system/SystemUnfoldSharedModule.kt +25 −12 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ import android.os.Handler import android.os.HandlerThread import android.os.HandlerThread import android.os.Looper import android.os.Looper import android.os.Process import android.os.Process import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.UiBackground import com.android.systemui.dagger.qualifiers.UiBackground import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig Loading @@ -25,6 +26,7 @@ import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.dagger.UnfoldBg import com.android.systemui.unfold.dagger.UnfoldBg import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg import com.android.systemui.unfold.dagger.UnfoldTracking import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.util.CurrentActivityTypeProvider import com.android.systemui.unfold.util.CurrentActivityTypeProvider import dagger.Binds import dagger.Binds Loading @@ -33,7 +35,10 @@ import dagger.Provides import java.util.concurrent.Executor import java.util.concurrent.Executor import javax.inject.Singleton import javax.inject.Singleton import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.plus /** /** * Dagger module with system-only dependencies for the unfold animation. The code that is used to * Dagger module with system-only dependencies for the unfold animation. The code that is used to Loading @@ -45,25 +50,20 @@ import kotlinx.coroutines.android.asCoroutineDispatcher abstract class SystemUnfoldSharedModule { abstract class SystemUnfoldSharedModule { @Binds @Binds abstract fun activityTypeProvider(executor: ActivityManagerActivityTypeProvider): abstract fun activityTypeProvider( CurrentActivityTypeProvider executor: ActivityManagerActivityTypeProvider ): CurrentActivityTypeProvider @Binds @Binds abstract fun config(config: ResourceUnfoldTransitionConfig): UnfoldTransitionConfig abstract fun config(config: ResourceUnfoldTransitionConfig): UnfoldTransitionConfig @Binds @Binds abstract fun foldState(provider: DeviceStateManagerFoldProvider): FoldProvider abstract fun foldState(provider: DeviceStateManagerFoldProvider): FoldProvider @Binds @Binds abstract fun deviceStateRepository(provider: DeviceStateRepositoryImpl): DeviceStateRepository abstract fun deviceStateRepository(provider: DeviceStateRepositoryImpl): DeviceStateRepository @Binds @Binds @UnfoldMain abstract fun mainExecutor(@Main executor: Executor): Executor @UnfoldMain abstract fun mainExecutor(@Main executor: Executor): Executor @Binds @Binds @UnfoldMain abstract fun mainHandler(@Main handler: Handler): Handler @UnfoldMain abstract fun mainHandler(@Main handler: Handler): Handler @Binds @Binds @UnfoldSingleThreadBg @UnfoldSingleThreadBg Loading Loading @@ -92,5 +92,18 @@ abstract class SystemUnfoldSharedModule { .apply { start() } .apply { start() } .looper .looper } } @Provides @UnfoldTracking @Singleton fun unfoldTrackingContext( @UnfoldSingleThreadBg singleThreadBgExecutor: Executor, @Application applicationScope: CoroutineScope, ): CoroutineScope { // tracking depends on being executed on a single thread so when changing it, ensure all // consumers are not accessing shared state val backgroundDispatcher = singleThreadBgExecutor.asCoroutineDispatcher() return applicationScope + backgroundDispatcher } } } } }