Loading packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/data/repository/AmbientCueRepositoryTest.kt +39 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.LauncherProxyService import com.android.systemui.LauncherProxyService.LauncherProxyListener import com.android.systemui.SysuiTestCase import com.android.systemui.ambientcue.data.logger.ambientCueLogger import com.android.systemui.ambientcue.shared.logger.ambientCueLogger import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.AMBIENT_CUE_SURFACE import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.DEBOUNCE_DELAY_MS import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.EXTRA_ACTION_TYPE Loading Loading @@ -275,6 +275,44 @@ class AmbientCueRepositoryTest : SysuiTestCase() { assertThat(isRootViewAttached).isFalse() } @Test fun isRootViewAttached_isAttachedAndSessionNotStartedBefore_setsAmbientCueDisplayStatus() = kosmos.runTest { val actions by collectLastValue(underTest.actions) val isRootViewAttached by collectLastValue(underTest.isRootViewAttached) underTest.isDeactivated.update { true } secureSettingsRepository.setInt( AmbientCueRepositoryImpl.AMBIENT_CUE_SETTING, AmbientCueRepositoryImpl.OPTED_IN, ) runCurrent() taskStackChangeListeners.listenerImpl.onTaskMovedToFront( RunningTaskInfo().apply { taskId = TASK_ID } ) verify(smartSpaceSession) .addOnTargetsAvailableListener(any(), onTargetsAvailableListenerCaptor.capture()) onTargetsAvailableListenerCaptor.firstValue.onTargetsAvailable( listOf(attributionDialogPendingIntentTarget) ) underTest.isDeactivated.update { false } advanceTimeBy(DEBOUNCE_DELAY_MS) // Verify that the ambient cue displayed status is set. verify(kosmos.ambientCueLogger).setAmbientCueDisplayStatus(any(), any()) taskStackChangeListeners.listenerImpl.onTaskMovedToFront( RunningTaskInfo().apply { taskId = TASK_ID_2 } ) underTest.isDeactivated.update { true } advanceTimeBy(DEBOUNCE_DELAY_MS) // Verify that the ambient cue dismissed status is set. verify(kosmos.ambientCueLogger).setLoseFocusMillis() verify(kosmos.ambientCueLogger).flushAmbientCueEventReported() verify(kosmos.ambientCueLogger).clear() } @Test fun actions_whenHasSmartSpaceAction() = kosmos.runTest { Loading packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/ui/viewmodel/AmbientCueViewModelTest.kt +12 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.ambientcue.data.repository.ambientCueRepository import com.android.systemui.ambientcue.data.repository.fake import com.android.systemui.ambientcue.domain.interactor.ambientCueInteractor import com.android.systemui.ambientcue.shared.logger.ambientCueLogger import com.android.systemui.ambientcue.shared.model.ActionModel import com.android.systemui.ambientcue.shared.model.IconModel import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository Loading @@ -44,6 +45,7 @@ import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.launch import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.verify @RunWith(AndroidJUnit4::class) @SmallTest Loading Loading @@ -295,6 +297,16 @@ class AmbientCueViewModelTest : SysuiTestCase() { assertThat(viewModel.showLongPressEducation).isFalse() } @Test fun hide_setsClickedClosedButtonStatus() = kosmos.runTest { viewModel.activateIn(kosmos.testScope) viewModel.hide() runCurrent() verify(kosmos.ambientCueLogger).setClickedCloseButtonStatus() } private fun testActions(applicationContext: Context) = listOf( ActionModel( Loading packages/SystemUI/src/com/android/systemui/ambientcue/AmbientCueModule.kt +4 −3 Original line number Diff line number Diff line Loading @@ -19,9 +19,10 @@ package com.android.systemui.ambientcue import com.android.systemui.CoreStartable import com.android.systemui.ambientcue.data.repository.AmbientCueRepository import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl import com.android.systemui.ambientcue.data.logger.AmbientCueLogger import com.android.systemui.ambientcue.data.logger.AmbientCueLoggerImpl import com.android.systemui.ambientcue.shared.logger.AmbientCueLogger import com.android.systemui.ambientcue.shared.logger.AmbientCueLoggerImpl import com.android.systemui.ambientcue.ui.startable.AmbientCueCoreStartable import com.android.systemui.dagger.SysUISingleton import dagger.Binds import dagger.Module import dagger.multibindings.ClassKey Loading @@ -37,5 +38,5 @@ interface AmbientCueModule { @Binds fun bindsAmbientCueRepository(impl: AmbientCueRepositoryImpl): AmbientCueRepository @Binds fun bindsAmbientCueLogger(impl: AmbientCueLoggerImpl): AmbientCueLogger @Binds @SysUISingleton fun bindsAmbientCueLogger(impl: AmbientCueLoggerImpl): AmbientCueLogger } packages/SystemUI/src/com/android/systemui/ambientcue/data/repository/AmbientCueRepository.kt +4 −1 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ import androidx.tracing.trace import com.android.systemui.Dumpable import com.android.systemui.LauncherProxyService import com.android.systemui.LauncherProxyService.LauncherProxyListener import com.android.systemui.ambientcue.data.logger.AmbientCueLogger import com.android.systemui.ambientcue.shared.logger.AmbientCueLogger import com.android.systemui.ambientcue.shared.model.ActionModel import com.android.systemui.ambientcue.shared.model.IconModel import com.android.systemui.dagger.SysUISingleton Loading Loading @@ -363,6 +363,9 @@ constructor( ambientCueLogger.setAmbientCueDisplayStatus(maCount, mrCount) } if (!isAttached && isSessionStarted) { if (globallyFocusedTaskId.value != targetTaskId.value) { ambientCueLogger.setLoseFocusMillis() } ambientCueLogger.flushAmbientCueEventReported() ambientCueLogger.clear() isSessionStarted = false Loading packages/SystemUI/src/com/android/systemui/ambientcue/data/logger/AmbientCueLogger.kt→packages/SystemUI/src/com/android/systemui/ambientcue/shared/logger/AmbientCueLogger.kt +9 −8 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.systemui.ambientcue.data.logger package com.android.systemui.ambientcue.shared.logger import com.android.internal.util.FrameworkStatsLog import com.android.systemui.util.time.SystemClock Loading Loading @@ -56,7 +56,7 @@ interface AmbientCueLogger { * * @param loseFocusMillis The time in milliseconds that the cue bar lost focus. */ fun setLoseFocusMillis(loseFocusMillis: Long) fun setLoseFocusMillis() /** Sets fulfilled with ma intent events. */ fun setFulfilledWithMaStatus() Loading Loading @@ -91,32 +91,33 @@ class AmbientCueLoggerImpl @Inject constructor(private val systemClock: SystemCl } /** {@see AmbientCueLogger#setLoseFocusMillis} */ override fun setLoseFocusMillis(loseFocusMillis: Long) { // TODO(b/425279501): Count loseFocusMillis. override fun setLoseFocusMillis() { report.loseFocusMillis = systemClock.currentTimeMillis() } /** {@see AmbientCueLogger#setFulfilledWithMaStatus} */ override fun setFulfilledWithMaStatus() { // TODO(b/425279501): Count fulfilledWithMaIntentMillis. report.fulfilledWithMaIntent = true report.fulfilledWithMaIntentMillis = systemClock.currentTimeMillis() - displayTimeMillis } /** {@see AmbientCueLogger#setFulfilledWithMrStatus} */ override fun setFulfilledWithMrStatus() { // TODO(b/425279501): Count fulfilledWithMrIntentMillis. report.fulfilledWithMrIntent = true report.fulfilledWithMrIntentMillis = systemClock.currentTimeMillis() - displayTimeMillis } override fun setClickedCloseButtonStatus() { // TODO(b/425279501): Add logic to set clickedCloseButton report.clickedCloseButton = true } override fun setReachedTimeoutStatus() { // TODO(b/425279501): Add logic to set reachedTimeout report.reachedTimeout = true } /** {@see AmbientCueLogger#flushAmbientCueEventReported} */ override fun flushAmbientCueEventReported() { report.displayDurationMillis = systemClock.currentTimeMillis() - displayTimeMillis FrameworkStatsLog.write( FrameworkStatsLog.AMBIENT_CUE_EVENT_REPORTED, report.displayDurationMillis, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/data/repository/AmbientCueRepositoryTest.kt +39 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.LauncherProxyService import com.android.systemui.LauncherProxyService.LauncherProxyListener import com.android.systemui.SysuiTestCase import com.android.systemui.ambientcue.data.logger.ambientCueLogger import com.android.systemui.ambientcue.shared.logger.ambientCueLogger import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.AMBIENT_CUE_SURFACE import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.DEBOUNCE_DELAY_MS import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.EXTRA_ACTION_TYPE Loading Loading @@ -275,6 +275,44 @@ class AmbientCueRepositoryTest : SysuiTestCase() { assertThat(isRootViewAttached).isFalse() } @Test fun isRootViewAttached_isAttachedAndSessionNotStartedBefore_setsAmbientCueDisplayStatus() = kosmos.runTest { val actions by collectLastValue(underTest.actions) val isRootViewAttached by collectLastValue(underTest.isRootViewAttached) underTest.isDeactivated.update { true } secureSettingsRepository.setInt( AmbientCueRepositoryImpl.AMBIENT_CUE_SETTING, AmbientCueRepositoryImpl.OPTED_IN, ) runCurrent() taskStackChangeListeners.listenerImpl.onTaskMovedToFront( RunningTaskInfo().apply { taskId = TASK_ID } ) verify(smartSpaceSession) .addOnTargetsAvailableListener(any(), onTargetsAvailableListenerCaptor.capture()) onTargetsAvailableListenerCaptor.firstValue.onTargetsAvailable( listOf(attributionDialogPendingIntentTarget) ) underTest.isDeactivated.update { false } advanceTimeBy(DEBOUNCE_DELAY_MS) // Verify that the ambient cue displayed status is set. verify(kosmos.ambientCueLogger).setAmbientCueDisplayStatus(any(), any()) taskStackChangeListeners.listenerImpl.onTaskMovedToFront( RunningTaskInfo().apply { taskId = TASK_ID_2 } ) underTest.isDeactivated.update { true } advanceTimeBy(DEBOUNCE_DELAY_MS) // Verify that the ambient cue dismissed status is set. verify(kosmos.ambientCueLogger).setLoseFocusMillis() verify(kosmos.ambientCueLogger).flushAmbientCueEventReported() verify(kosmos.ambientCueLogger).clear() } @Test fun actions_whenHasSmartSpaceAction() = kosmos.runTest { Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/ambientcue/ui/viewmodel/AmbientCueViewModelTest.kt +12 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.ambientcue.data.repository.ambientCueRepository import com.android.systemui.ambientcue.data.repository.fake import com.android.systemui.ambientcue.domain.interactor.ambientCueInteractor import com.android.systemui.ambientcue.shared.logger.ambientCueLogger import com.android.systemui.ambientcue.shared.model.ActionModel import com.android.systemui.ambientcue.shared.model.IconModel import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository Loading @@ -44,6 +45,7 @@ import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.launch import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.verify @RunWith(AndroidJUnit4::class) @SmallTest Loading Loading @@ -295,6 +297,16 @@ class AmbientCueViewModelTest : SysuiTestCase() { assertThat(viewModel.showLongPressEducation).isFalse() } @Test fun hide_setsClickedClosedButtonStatus() = kosmos.runTest { viewModel.activateIn(kosmos.testScope) viewModel.hide() runCurrent() verify(kosmos.ambientCueLogger).setClickedCloseButtonStatus() } private fun testActions(applicationContext: Context) = listOf( ActionModel( Loading
packages/SystemUI/src/com/android/systemui/ambientcue/AmbientCueModule.kt +4 −3 Original line number Diff line number Diff line Loading @@ -19,9 +19,10 @@ package com.android.systemui.ambientcue import com.android.systemui.CoreStartable import com.android.systemui.ambientcue.data.repository.AmbientCueRepository import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl import com.android.systemui.ambientcue.data.logger.AmbientCueLogger import com.android.systemui.ambientcue.data.logger.AmbientCueLoggerImpl import com.android.systemui.ambientcue.shared.logger.AmbientCueLogger import com.android.systemui.ambientcue.shared.logger.AmbientCueLoggerImpl import com.android.systemui.ambientcue.ui.startable.AmbientCueCoreStartable import com.android.systemui.dagger.SysUISingleton import dagger.Binds import dagger.Module import dagger.multibindings.ClassKey Loading @@ -37,5 +38,5 @@ interface AmbientCueModule { @Binds fun bindsAmbientCueRepository(impl: AmbientCueRepositoryImpl): AmbientCueRepository @Binds fun bindsAmbientCueLogger(impl: AmbientCueLoggerImpl): AmbientCueLogger @Binds @SysUISingleton fun bindsAmbientCueLogger(impl: AmbientCueLoggerImpl): AmbientCueLogger }
packages/SystemUI/src/com/android/systemui/ambientcue/data/repository/AmbientCueRepository.kt +4 −1 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ import androidx.tracing.trace import com.android.systemui.Dumpable import com.android.systemui.LauncherProxyService import com.android.systemui.LauncherProxyService.LauncherProxyListener import com.android.systemui.ambientcue.data.logger.AmbientCueLogger import com.android.systemui.ambientcue.shared.logger.AmbientCueLogger import com.android.systemui.ambientcue.shared.model.ActionModel import com.android.systemui.ambientcue.shared.model.IconModel import com.android.systemui.dagger.SysUISingleton Loading Loading @@ -363,6 +363,9 @@ constructor( ambientCueLogger.setAmbientCueDisplayStatus(maCount, mrCount) } if (!isAttached && isSessionStarted) { if (globallyFocusedTaskId.value != targetTaskId.value) { ambientCueLogger.setLoseFocusMillis() } ambientCueLogger.flushAmbientCueEventReported() ambientCueLogger.clear() isSessionStarted = false Loading
packages/SystemUI/src/com/android/systemui/ambientcue/data/logger/AmbientCueLogger.kt→packages/SystemUI/src/com/android/systemui/ambientcue/shared/logger/AmbientCueLogger.kt +9 −8 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.systemui.ambientcue.data.logger package com.android.systemui.ambientcue.shared.logger import com.android.internal.util.FrameworkStatsLog import com.android.systemui.util.time.SystemClock Loading Loading @@ -56,7 +56,7 @@ interface AmbientCueLogger { * * @param loseFocusMillis The time in milliseconds that the cue bar lost focus. */ fun setLoseFocusMillis(loseFocusMillis: Long) fun setLoseFocusMillis() /** Sets fulfilled with ma intent events. */ fun setFulfilledWithMaStatus() Loading Loading @@ -91,32 +91,33 @@ class AmbientCueLoggerImpl @Inject constructor(private val systemClock: SystemCl } /** {@see AmbientCueLogger#setLoseFocusMillis} */ override fun setLoseFocusMillis(loseFocusMillis: Long) { // TODO(b/425279501): Count loseFocusMillis. override fun setLoseFocusMillis() { report.loseFocusMillis = systemClock.currentTimeMillis() } /** {@see AmbientCueLogger#setFulfilledWithMaStatus} */ override fun setFulfilledWithMaStatus() { // TODO(b/425279501): Count fulfilledWithMaIntentMillis. report.fulfilledWithMaIntent = true report.fulfilledWithMaIntentMillis = systemClock.currentTimeMillis() - displayTimeMillis } /** {@see AmbientCueLogger#setFulfilledWithMrStatus} */ override fun setFulfilledWithMrStatus() { // TODO(b/425279501): Count fulfilledWithMrIntentMillis. report.fulfilledWithMrIntent = true report.fulfilledWithMrIntentMillis = systemClock.currentTimeMillis() - displayTimeMillis } override fun setClickedCloseButtonStatus() { // TODO(b/425279501): Add logic to set clickedCloseButton report.clickedCloseButton = true } override fun setReachedTimeoutStatus() { // TODO(b/425279501): Add logic to set reachedTimeout report.reachedTimeout = true } /** {@see AmbientCueLogger#flushAmbientCueEventReported} */ override fun flushAmbientCueEventReported() { report.displayDurationMillis = systemClock.currentTimeMillis() - displayTimeMillis FrameworkStatsLog.write( FrameworkStatsLog.AMBIENT_CUE_EVENT_REPORTED, report.displayDurationMillis, Loading