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

Commit 84a1a934 authored by Neil Gu's avatar Neil Gu Committed by Android (Google) Code Review
Browse files

Merge "[AmbientCue] Log more status for ambient cue." into main

parents c848f92c 7fbdc2ce
Loading
Loading
Loading
Loading
+39 −1
Original line number Diff line number Diff line
@@ -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
@@ -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 {
+12 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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(
+4 −3
Original line number Diff line number Diff line
@@ -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
@@ -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
}
+4 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
+9 −8
Original line number Diff line number Diff line
@@ -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
@@ -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()
@@ -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