Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6df6f068 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Extracting display switch logic to FoldableDisplaySwitchTrackingInteractor" into main

parents 1f1c7fe0 920b161b
Loading
Loading
Loading
Loading
+39 −14
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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>()
@@ -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,
            )
            )
    }
    }
@@ -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,
                )
                )


@@ -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)
@@ -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)
@@ -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()


@@ -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)
    }
    }
}
}
+25 −12
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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