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

Commit 2a0b910e authored by Michael Mikhail's avatar Michael Mikhail Committed by Android (Google) Code Review
Browse files

Merge changes I924eb34d,I275633a0 into main

* changes:
  Add smartspace logs for media cards impression
  Add smartspace logs for click and dismiss events
parents 3c6a0bab 766674fa
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -183,7 +183,10 @@ class MediaFilterRepositoryTest : SysuiTestCase() {
                SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE, true)
                SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE, true)
            )
            )
            underTest.addSelectedUserMediaEntry(playingData)
            underTest.addSelectedUserMediaEntry(playingData)
            underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(playingInstanceId))
            underTest.addMediaDataLoadingState(
                MediaDataLoadingModel.Loaded(playingInstanceId),
                false
            )


            verify(smartspaceLogger)
            verify(smartspaceLogger)
                .logSmartspaceCardReceived(
                .logSmartspaceCardReceived(
@@ -193,7 +196,10 @@ class MediaFilterRepositoryTest : SysuiTestCase() {
                )
                )


            underTest.addSelectedUserMediaEntry(remoteData)
            underTest.addSelectedUserMediaEntry(remoteData)
            underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(remoteInstanceId))
            underTest.addMediaDataLoadingState(
                MediaDataLoadingModel.Loaded(remoteInstanceId),
                false
            )


            verify(smartspaceLogger)
            verify(smartspaceLogger)
                .logSmartspaceCardReceived(
                .logSmartspaceCardReceived(
@@ -442,7 +448,7 @@ class MediaFilterRepositoryTest : SysuiTestCase() {
            reset(smartspaceLogger)
            reset(smartspaceLogger)


            underTest.addSelectedUserMediaEntry(data)
            underTest.addSelectedUserMediaEntry(data)
            underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId))
            underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId), false)


            verify(smartspaceLogger)
            verify(smartspaceLogger)
                .logSmartspaceCardReceived(data.smartspaceId, data.appUid, cardinality = 2)
                .logSmartspaceCardReceived(data.smartspaceId, data.appUid, cardinality = 2)
@@ -451,7 +457,8 @@ class MediaFilterRepositoryTest : SysuiTestCase() {


            underTest.addSelectedUserMediaEntry(data)
            underTest.addSelectedUserMediaEntry(data)
            underTest.addMediaDataLoadingState(
            underTest.addMediaDataLoadingState(
                MediaDataLoadingModel.Loaded(instanceId, receivedSmartspaceCardLatency = 123)
                MediaDataLoadingModel.Loaded(instanceId, receivedSmartspaceCardLatency = 123),
                true
            )
            )


            verify(smartspaceLogger)
            verify(smartspaceLogger)
+101 −2
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.media.controls.domain.interactor


import android.R
import android.R
import android.graphics.drawable.Icon
import android.graphics.drawable.Icon
import android.os.Process
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.internal.logging.InstanceId
import com.android.internal.logging.InstanceId
@@ -38,12 +39,19 @@ import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.controls.shared.model.MediaDataLoadingModel
import com.android.systemui.media.controls.shared.model.MediaDataLoadingModel
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaLoadingModel
import com.android.systemui.media.controls.shared.model.SmartspaceMediaLoadingModel
import com.android.systemui.media.controls.util.MediaSmartspaceLogger
import com.android.systemui.media.controls.util.SmallHash
import com.android.systemui.media.controls.util.mediaSmartspaceLogger
import com.android.systemui.media.controls.util.mockMediaSmartspaceLogger
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
import org.mockito.Mockito.reset
import org.mockito.kotlin.never
import org.mockito.kotlin.verify


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
@@ -52,7 +60,11 @@ class MediaCarouselInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope


    private val mediaFilterRepository: MediaFilterRepository = kosmos.mediaFilterRepository
    private val mediaFilterRepository: MediaFilterRepository =
        with(kosmos) {
            mediaSmartspaceLogger = mockMediaSmartspaceLogger
            mediaFilterRepository
        }
    private val mediaRecommendationsInteractor: MediaRecommendationsInteractor =
    private val mediaRecommendationsInteractor: MediaRecommendationsInteractor =
        kosmos.mediaRecommendationsInteractor
        kosmos.mediaRecommendationsInteractor
    val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
    val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
@@ -63,6 +75,7 @@ class MediaCarouselInteractorTest : SysuiTestCase() {
            packageName = PACKAGE_NAME,
            packageName = PACKAGE_NAME,
            recommendations = MediaTestHelper.getValidRecommendationList(icon),
            recommendations = MediaTestHelper.getValidRecommendationList(icon),
        )
        )
    private val smartspaceLogger = kosmos.mockMediaSmartspaceLogger


    private val underTest: MediaCarouselInteractor = kosmos.mediaCarouselInteractor
    private val underTest: MediaCarouselInteractor = kosmos.mediaCarouselInteractor


@@ -153,6 +166,18 @@ class MediaCarouselInteractorTest : SysuiTestCase() {
                    MediaCommonModel.MediaControl(mediaLoadingModel, true)
                    MediaCommonModel.MediaControl(mediaLoadingModel, true)
                )
                )
                .inOrder()
                .inOrder()

            underTest.logSmartspaceSeenCard(0, 1, false)

            verify(smartspaceLogger)
                .logSmartspaceCardUIEvent(
                    MediaSmartspaceLogger.SMARTSPACE_CARD_SEEN_EVENT,
                    SmallHash.hash(mediaRecommendation.targetId),
                    Process.INVALID_UID,
                    surface = SURFACE,
                    2,
                    true
                )
        }
        }


    @Test
    @Test
@@ -239,7 +264,7 @@ class MediaCarouselInteractorTest : SysuiTestCase() {
                .inOrder()
                .inOrder()


            mediaFilterRepository.addSelectedUserMediaEntry(data.copy(isPlaying = true))
            mediaFilterRepository.addSelectedUserMediaEntry(data.copy(isPlaying = true))
            mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId))
            mediaFilterRepository.addMediaDataLoadingState(mediaLoadingModel)


            assertThat(currentMedia)
            assertThat(currentMedia)
                .containsExactly(
                .containsExactly(
@@ -249,9 +274,83 @@ class MediaCarouselInteractorTest : SysuiTestCase() {
                .inOrder()
                .inOrder()
        }
        }


    @Test
    fun loadMediaAndRecommendation_logSmartspaceSeenCard() {
        val instanceId = InstanceId.fakeInstanceId(123)
        val data =
            MediaData(
                active = true,
                instanceId = instanceId,
                packageName = PACKAGE_NAME,
                notificationKey = KEY
            )
        val smartspaceLoadingModel = SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE)
        val mediaLoadingModel = MediaDataLoadingModel.Loaded(instanceId)

        mediaFilterRepository.addSelectedUserMediaEntry(data)
        mediaFilterRepository.addMediaDataLoadingState(mediaLoadingModel)
        underTest.logSmartspaceSeenCard(0, 1, false)

        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                MediaSmartspaceLogger.SMARTSPACE_CARD_SEEN_EVENT,
                data.smartspaceId,
                data.appUid,
                surface = SURFACE,
                1
            )

        reset(smartspaceLogger)
        mediaFilterRepository.addSelectedUserMediaEntry(data)
        mediaFilterRepository.addMediaDataLoadingState(mediaLoadingModel)
        underTest.logSmartspaceSeenCard(0, 1, true)

        verify(smartspaceLogger, never())
            .logSmartspaceCardUIEvent(
                MediaSmartspaceLogger.SMARTSPACE_CARD_SEEN_EVENT,
                data.smartspaceId,
                data.appUid,
                surface = SURFACE,
                2
            )

        reset(smartspaceLogger)
        mediaFilterRepository.setRecommendation(mediaRecommendation)
        mediaFilterRepository.setRecommendationsLoadingState(smartspaceLoadingModel)
        underTest.logSmartspaceSeenCard(1, 1, true)

        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                MediaSmartspaceLogger.SMARTSPACE_CARD_SEEN_EVENT,
                SmallHash.hash(mediaRecommendation.targetId),
                Process.INVALID_UID,
                surface = SURFACE,
                2,
                true,
                rank = 1
            )

        reset(smartspaceLogger)
        mediaFilterRepository.addSelectedUserMediaEntry(data)
        mediaFilterRepository.addMediaDataLoadingState(
            mediaLoadingModel.copy(receivedSmartspaceCardLatency = 1)
        )
        underTest.logSmartspaceSeenCard(0, 1, true)

        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                MediaSmartspaceLogger.SMARTSPACE_CARD_SEEN_EVENT,
                data.smartspaceId,
                data.appUid,
                surface = SURFACE,
                2
            )
    }

    companion object {
    companion object {
        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
        private const val PACKAGE_NAME = "com.android.example"
        private const val PACKAGE_NAME = "com.android.example"
        private const val KEY = "key"
        private const val KEY = "key"
        private const val SURFACE = 4
    }
    }
}
}
+90 −7
Original line number Original line Diff line number Diff line
@@ -16,7 +16,9 @@


package com.android.systemui.media.controls.domain.interactor
package com.android.systemui.media.controls.domain.interactor


import android.R
import android.app.PendingIntent
import android.app.PendingIntent
import android.graphics.drawable.Icon
import android.os.Bundle
import android.os.Bundle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
@@ -30,6 +32,7 @@ import com.android.systemui.bluetooth.mockBroadcastDialogController
import com.android.systemui.concurrency.fakeExecutor
import com.android.systemui.concurrency.fakeExecutor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.media.controls.MediaTestHelper
import com.android.systemui.media.controls.data.repository.mediaDataRepository
import com.android.systemui.media.controls.data.repository.mediaDataRepository
import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
import com.android.systemui.media.controls.domain.pipeline.MediaDataProcessor
import com.android.systemui.media.controls.domain.pipeline.MediaDataProcessor
@@ -38,7 +41,12 @@ import com.android.systemui.media.controls.domain.pipeline.interactor.mediaContr
import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
import com.android.systemui.media.controls.domain.pipeline.mediaDataProcessor
import com.android.systemui.media.controls.domain.pipeline.mediaDataProcessor
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_CLICK_EVENT
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT
import com.android.systemui.media.controls.util.mediaInstanceId
import com.android.systemui.media.controls.util.mediaInstanceId
import com.android.systemui.media.controls.util.mediaSmartspaceLogger
import com.android.systemui.media.controls.util.mockMediaSmartspaceLogger
import com.android.systemui.media.mediaOutputDialogManager
import com.android.systemui.media.mediaOutputDialogManager
import com.android.systemui.mockActivityIntentHelper
import com.android.systemui.mockActivityIntentHelper
import com.android.systemui.plugins.activityStarter
import com.android.systemui.plugins.activityStarter
@@ -49,6 +57,8 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.never
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify
import org.mockito.kotlin.any
import org.mockito.kotlin.any
@@ -63,11 +73,23 @@ class MediaControlInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope


    private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
    private val mediaDataFilter: MediaDataFilterImpl =
        with(kosmos) {
            mediaSmartspaceLogger = mockMediaSmartspaceLogger
            mediaDataFilter
        }
    private val activityStarter = kosmos.activityStarter
    private val activityStarter = kosmos.activityStarter
    private val keyguardStateController = kosmos.keyguardStateController
    private val keyguardStateController = kosmos.keyguardStateController
    private val instanceId: InstanceId = kosmos.mediaInstanceId
    private val instanceId: InstanceId = kosmos.mediaInstanceId
    private val notificationLockscreenUserManager = kosmos.notificationLockscreenUserManager
    private val notificationLockscreenUserManager = kosmos.notificationLockscreenUserManager
    private val smartspaceLogger = kosmos.mockMediaSmartspaceLogger
    private val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
    private val mediaRecommendation =
        SmartspaceMediaData(
            targetId = KEY_MEDIA_SMARTSPACE,
            isActive = true,
            recommendations = MediaTestHelper.getValidRecommendationList(icon),
        )


    private val underTest: MediaControlInteractor =
    private val underTest: MediaControlInteractor =
        with(kosmos) {
        with(kosmos) {
@@ -124,13 +146,15 @@ class MediaControlInteractorTest : SysuiTestCase() {
        val clickIntent = mock<PendingIntent> { whenever(it.isActivity).thenReturn(true) }
        val clickIntent = mock<PendingIntent> { whenever(it.isActivity).thenReturn(true) }
        val expandable = mock<Expandable>()
        val expandable = mock<Expandable>()


        underTest.startClickIntent(expandable, clickIntent)
        underTest.startClickIntent(expandable, clickIntent, SMARTSPACE_CARD_CLICK_EVENT, 1)


        verify(clickIntent).send(any<Bundle>())
        verify(clickIntent).send(any<Bundle>())
    }
    }


    @Test
    @Test
    fun startClickIntent_hideOverLockscreen() {
    fun startClickIntent_hideOverLockscreen() {
        whenever(notificationLockscreenUserManager.isCurrentProfile(USER_ID)).thenReturn(true)
        whenever(notificationLockscreenUserManager.isProfileAvailable(USER_ID)).thenReturn(true)
        whenever(keyguardStateController.isShowing).thenReturn(false)
        whenever(keyguardStateController.isShowing).thenReturn(false)


        val clickIntent = mock<PendingIntent> { whenever(it.isActivity).thenReturn(true) }
        val clickIntent = mock<PendingIntent> { whenever(it.isActivity).thenReturn(true) }
@@ -138,8 +162,20 @@ class MediaControlInteractorTest : SysuiTestCase() {
        val activityController = mock<ActivityTransitionAnimator.Controller>()
        val activityController = mock<ActivityTransitionAnimator.Controller>()
        whenever(expandable.activityTransitionController(any())).thenReturn(activityController)
        whenever(expandable.activityTransitionController(any())).thenReturn(activityController)


        underTest.startClickIntent(expandable, clickIntent)
        val mediaData = MediaData(userId = USER_ID, instanceId = instanceId, artist = ARTIST)

        mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, mediaRecommendation, true)
        mediaDataFilter.onMediaDataLoaded(KEY, null, mediaData)
        underTest.startClickIntent(expandable, clickIntent, SMARTSPACE_CARD_CLICK_EVENT, 1)

        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                SMARTSPACE_CARD_CLICK_EVENT,
                mediaData.smartspaceId,
                mediaData.appUid,
                surface = SURFACE,
                cardinality = 2,
                rank = 1
            )
        verify(activityStarter)
        verify(activityStarter)
            .postStartActivityDismissingKeyguard(eq(clickIntent), eq(activityController))
            .postStartActivityDismissingKeyguard(eq(clickIntent), eq(activityController))
    }
    }
@@ -217,17 +253,62 @@ class MediaControlInteractorTest : SysuiTestCase() {
    }
    }


    @Test
    @Test
    fun removeMediaControl() {
    fun removeMediaControl_noRecommendation() {
        whenever(notificationLockscreenUserManager.isCurrentProfile(USER_ID)).thenReturn(true)
        whenever(notificationLockscreenUserManager.isProfileAvailable(USER_ID)).thenReturn(true)
        val listener = mock<MediaDataProcessor.Listener>()
        val listener = mock<MediaDataProcessor.Listener>()
        kosmos.mediaDataProcessor.addInternalListener(listener)
        kosmos.mediaDataProcessor.addInternalListener(listener)


        var mediaData = MediaData(userId = USER_ID, instanceId = instanceId, artist = ARTIST)
        val mediaData = MediaData(userId = USER_ID, instanceId = instanceId, artist = ARTIST)
        kosmos.mediaDataRepository.addMediaEntry(KEY, mediaData)
        kosmos.mediaDataFilter.onMediaDataLoaded(KEY, null, mediaData)

        underTest.removeMediaControl(null, instanceId, 0L, SMARTSPACE_CARD_DISMISS_EVENT, 1)
        kosmos.fakeExecutor.advanceClockToNext()
        kosmos.fakeExecutor.runAllReady()

        verify(smartspaceLogger, never())
            .logSmartspaceCardUIEvent(
                anyInt(),
                anyInt(),
                anyInt(),
                anyInt(),
                anyInt(),
                anyBoolean(),
                anyBoolean(),
                anyInt(),
                anyInt(),
                anyInt(),
                anyBoolean()
            )
        verify(listener).onMediaDataRemoved(eq(KEY), eq(true))
    }

    @Test
    fun removeMediaControl_recommendationsExist() {
        whenever(notificationLockscreenUserManager.isCurrentProfile(USER_ID)).thenReturn(true)
        whenever(notificationLockscreenUserManager.isProfileAvailable(USER_ID)).thenReturn(true)
        val listener = mock<MediaDataProcessor.Listener>()
        kosmos.mediaDataProcessor.addInternalListener(listener)

        val mediaData = MediaData(userId = USER_ID, instanceId = instanceId, artist = ARTIST)
        kosmos.mediaDataRepository.addMediaEntry(KEY, mediaData)
        kosmos.mediaDataRepository.addMediaEntry(KEY, mediaData)
        mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, mediaRecommendation, true)
        mediaDataFilter.onMediaDataLoaded(KEY, null, mediaData)


        underTest.removeMediaControl(null, instanceId, 0L)
        underTest.removeMediaControl(null, instanceId, 0L, SMARTSPACE_CARD_DISMISS_EVENT, 1)
        kosmos.fakeExecutor.advanceClockToNext()
        kosmos.fakeExecutor.advanceClockToNext()
        kosmos.fakeExecutor.runAllReady()
        kosmos.fakeExecutor.runAllReady()


        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                SMARTSPACE_CARD_DISMISS_EVENT,
                mediaData.smartspaceId,
                mediaData.appUid,
                surface = SURFACE,
                cardinality = 2,
                rank = 1
            )
        verify(listener).onMediaDataRemoved(eq(KEY), eq(true))
        verify(listener).onMediaDataRemoved(eq(KEY), eq(true))
    }
    }


@@ -238,5 +319,7 @@ class MediaControlInteractorTest : SysuiTestCase() {
        private const val APP_NAME = "app"
        private const val APP_NAME = "app"
        private const val ARTIST = "artist"
        private const val ARTIST = "artist"
        private const val ARTIST_2 = "artist2"
        private const val ARTIST_2 = "artist2"
        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
        private const val SURFACE = 4
    }
    }
}
}
+52 −6
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.ComponentName
import android.content.Intent
import android.content.Intent
import android.content.applicationContext
import android.content.applicationContext
import android.graphics.drawable.Icon
import android.graphics.drawable.Icon
import android.os.Process
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
@@ -40,10 +41,14 @@ import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
import com.android.systemui.media.controls.shared.model.MediaRecModel
import com.android.systemui.media.controls.shared.model.MediaRecModel
import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_CLICK_EVENT
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT
import com.android.systemui.media.controls.util.SmallHash
import com.android.systemui.media.controls.util.mediaSmartspaceLogger
import com.android.systemui.media.controls.util.mockMediaSmartspaceLogger
import com.android.systemui.plugins.activityStarter
import com.android.systemui.plugins.activityStarter
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
@@ -53,6 +58,7 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.doNothing
import org.mockito.Mockito.doNothing
import org.mockito.Mockito.spy
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify
import org.mockito.kotlin.eq


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
@@ -62,7 +68,11 @@ class MediaRecommendationsInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos().apply { applicationContext = spyContext }
    private val kosmos = testKosmos().apply { applicationContext = spyContext }
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope


    private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
    private val mediaDataFilter: MediaDataFilterImpl =
        with(kosmos) {
            mediaSmartspaceLogger = mockMediaSmartspaceLogger
            mediaDataFilter
        }
    private val activityStarter = kosmos.activityStarter
    private val activityStarter = kosmos.activityStarter
    private val icon: Icon = Icon.createWithResource(context, R.drawable.ic_media_play)
    private val icon: Icon = Icon.createWithResource(context, R.drawable.ic_media_play)
    private val smartspaceMediaData: SmartspaceMediaData =
    private val smartspaceMediaData: SmartspaceMediaData =
@@ -72,6 +82,7 @@ class MediaRecommendationsInteractorTest : SysuiTestCase() {
            packageName = PACKAGE_NAME,
            packageName = PACKAGE_NAME,
            recommendations = MediaTestHelper.getValidRecommendationList(icon),
            recommendations = MediaTestHelper.getValidRecommendationList(icon),
        )
        )
    private val smartspaceLogger = kosmos.mockMediaSmartspaceLogger


    private val underTest: MediaRecommendationsInteractor =
    private val underTest: MediaRecommendationsInteractor =
        with(kosmos) {
        with(kosmos) {
@@ -138,8 +149,24 @@ class MediaRecommendationsInteractorTest : SysuiTestCase() {


        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)


        underTest.removeMediaRecommendations(KEY_MEDIA_SMARTSPACE, intent, 0)
        mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
        underTest.removeMediaRecommendations(
            KEY_MEDIA_SMARTSPACE,
            intent,
            0,
            SMARTSPACE_CARD_DISMISS_EVENT,
            1
        )


        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                SMARTSPACE_CARD_DISMISS_EVENT,
                SmallHash.hash(smartspaceMediaData.targetId),
                Process.INVALID_UID,
                surface = SURFACE,
                cardinality = 1,
                isRecommendationCard = true,
            )
        verify(kosmos.mockBroadcastSender).sendBroadcast(eq(intent))
        verify(kosmos.mockBroadcastSender).sendBroadcast(eq(intent))
    }
    }


@@ -151,7 +178,13 @@ class MediaRecommendationsInteractorTest : SysuiTestCase() {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        intent.component = ComponentName(PACKAGE_NAME, EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME)
        intent.component = ComponentName(PACKAGE_NAME, EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME)


        underTest.removeMediaRecommendations(KEY_MEDIA_SMARTSPACE, intent, 0)
        underTest.removeMediaRecommendations(
            KEY_MEDIA_SMARTSPACE,
            intent,
            0,
            SMARTSPACE_CARD_DISMISS_EVENT,
            1
        )


        verify(spyContext).startActivity(eq(intent))
        verify(spyContext).startActivity(eq(intent))
    }
    }
@@ -171,13 +204,26 @@ class MediaRecommendationsInteractorTest : SysuiTestCase() {


        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)


        underTest.startClickIntent(expandable, intent)
        mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)

        underTest.startClickIntent(expandable, intent, SMARTSPACE_CARD_CLICK_EVENT, 1, 2, 3)

        verify(smartspaceLogger)
            .logSmartspaceCardUIEvent(
                SMARTSPACE_CARD_CLICK_EVENT,
                SmallHash.hash(smartspaceMediaData.targetId),
                Process.INVALID_UID,
                surface = SURFACE,
                cardinality = 1,
                isRecommendationCard = true,
                interactedSubcardRank = 2,
                interactedSubcardCardinality = 3
            )
        verify(spyContext).startActivity(eq(intent))
        verify(spyContext).startActivity(eq(intent))
    }
    }


    companion object {
    companion object {
        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
        private const val PACKAGE_NAME = "com.example.app"
        private const val PACKAGE_NAME = "com.example.app"
        private const val SURFACE = 4
    }
    }
}
}
+8 −8
Original line number Original line Diff line number Diff line
@@ -47,7 +47,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> assertThat(commonViewModel).isEqualTo(mediaControl) },
                { commonViewModel, _ -> assertThat(commonViewModel).isEqualTo(mediaControl) },
                { fail("Unexpected to update $it") },
                { commonViewModel, _ -> fail("Unexpected to update $commonViewModel") },
                { fail("Unexpected to remove $it") },
                { fail("Unexpected to remove $it") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
            )
            )
@@ -66,7 +66,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> assertThat(commonViewModel).isEqualTo(mediaRecs) },
                { commonViewModel, _ -> assertThat(commonViewModel).isEqualTo(mediaRecs) },
                { fail("Unexpected to update $it") },
                { commonViewModel, _ -> fail("Unexpected to update $commonViewModel") },
                { fail("Unexpected to remove $it") },
                { fail("Unexpected to remove $it") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
            )
            )
@@ -85,7 +85,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel -> assertThat(commonViewModel).isNotEqualTo(mediaControl) },
                { commonViewModel, _ -> assertThat(commonViewModel).isNotEqualTo(mediaControl) },
                { fail("Unexpected to remove $it") },
                { fail("Unexpected to remove $it") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
            )
            )
@@ -104,7 +104,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel -> assertThat(commonViewModel).isNotEqualTo(mediaRecs) },
                { commonViewModel, _ -> assertThat(commonViewModel).isNotEqualTo(mediaRecs) },
                { fail("Unexpected to remove $it") },
                { fail("Unexpected to remove $it") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
            )
            )
@@ -124,7 +124,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { fail("Unexpected to update $it") },
                { commonViewModel, _ -> fail("Unexpected to update $commonViewModel") },
                { fail("Unexpected to remove $it") },
                { fail("Unexpected to remove $it") },
                { commonViewModel, _, _ -> assertThat(commonViewModel).isEqualTo(mediaControl1) },
                { commonViewModel, _, _ -> assertThat(commonViewModel).isEqualTo(mediaControl1) },
            )
            )
@@ -145,7 +145,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { fail("Unexpected to update $it") },
                { commonViewModel, _ -> fail("Unexpected to update $commonViewModel") },
                { fail("Unexpected to remove $it") },
                { fail("Unexpected to remove $it") },
                { commonViewModel, _, _ -> assertThat(commonViewModel).isEqualTo(mediaRecs) },
                { commonViewModel, _, _ -> assertThat(commonViewModel).isEqualTo(mediaRecs) },
            )
            )
@@ -164,7 +164,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { fail("Unexpected to update $it") },
                { commonViewModel, _ -> fail("Unexpected to update $commonViewModel") },
                { commonViewModel -> assertThat(commonViewModel).isEqualTo(mediaControl) },
                { commonViewModel -> assertThat(commonViewModel).isEqualTo(mediaControl) },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
            )
            )
@@ -183,7 +183,7 @@ class MediaDiffUtilTest : SysuiTestCase() {
                oldList,
                oldList,
                newList,
                newList,
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { commonViewModel, _ -> fail("Unexpected to add $commonViewModel") },
                { fail("Unexpected to update $it") },
                { commonViewModel, _ -> fail("Unexpected to update $commonViewModel") },
                { commonViewModel -> assertThat(commonViewModel).isEqualTo(mediaRecs) },
                { commonViewModel -> assertThat(commonViewModel).isEqualTo(mediaRecs) },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
                { commonViewModel, _, _ -> fail("Unexpected to move $commonViewModel ") },
            )
            )
Loading