Merge "Enable testOnSmartspaceMediaDataLoaded" into tm-qpr-dev

This commit is contained in:
Michael Mikhail
2022-11-16 20:10:17 +00:00
committed by Android (Google) Code Review
2 changed files with 27 additions and 17 deletions

View File

@@ -82,7 +82,6 @@ import com.android.systemui.util.traceSection
import java.io.IOException import java.io.IOException
import java.io.PrintWriter import java.io.PrintWriter
import java.util.concurrent.Executor import java.util.concurrent.Executor
import java.util.concurrent.Executors
import javax.inject.Inject import javax.inject.Inject
// URI fields to try loading album art from // URI fields to try loading album art from
@@ -154,6 +153,7 @@ private fun allowMediaRecommendations(context: Context): Boolean {
class MediaDataManager( class MediaDataManager(
private val context: Context, private val context: Context,
@Background private val backgroundExecutor: Executor, @Background private val backgroundExecutor: Executor,
@Main private val uiExecutor: Executor,
@Main private val foregroundExecutor: DelayableExecutor, @Main private val foregroundExecutor: DelayableExecutor,
private val mediaControllerFactory: MediaControllerFactory, private val mediaControllerFactory: MediaControllerFactory,
private val broadcastDispatcher: BroadcastDispatcher, private val broadcastDispatcher: BroadcastDispatcher,
@@ -171,7 +171,8 @@ class MediaDataManager(
private val systemClock: SystemClock, private val systemClock: SystemClock,
private val tunerService: TunerService, private val tunerService: TunerService,
private val mediaFlags: MediaFlags, private val mediaFlags: MediaFlags,
private val logger: MediaUiEventLogger private val logger: MediaUiEventLogger,
private val smartspaceManager: SmartspaceManager,
) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener { ) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener {
companion object { companion object {
@@ -218,6 +219,7 @@ class MediaDataManager(
constructor( constructor(
context: Context, context: Context,
@Background backgroundExecutor: Executor, @Background backgroundExecutor: Executor,
@Main uiExecutor: Executor,
@Main foregroundExecutor: DelayableExecutor, @Main foregroundExecutor: DelayableExecutor,
mediaControllerFactory: MediaControllerFactory, mediaControllerFactory: MediaControllerFactory,
dumpManager: DumpManager, dumpManager: DumpManager,
@@ -233,10 +235,12 @@ class MediaDataManager(
clock: SystemClock, clock: SystemClock,
tunerService: TunerService, tunerService: TunerService,
mediaFlags: MediaFlags, mediaFlags: MediaFlags,
logger: MediaUiEventLogger logger: MediaUiEventLogger,
smartspaceManager: SmartspaceManager,
) : this( ) : this(
context, context,
backgroundExecutor, backgroundExecutor,
uiExecutor,
foregroundExecutor, foregroundExecutor,
mediaControllerFactory, mediaControllerFactory,
broadcastDispatcher, broadcastDispatcher,
@@ -254,7 +258,8 @@ class MediaDataManager(
clock, clock,
tunerService, tunerService,
mediaFlags, mediaFlags,
logger logger,
smartspaceManager,
) )
private val appChangeReceiver = private val appChangeReceiver =
@@ -314,21 +319,18 @@ class MediaDataManager(
// Register for Smartspace data updates. // Register for Smartspace data updates.
smartspaceMediaDataProvider.registerListener(this) smartspaceMediaDataProvider.registerListener(this)
val smartspaceManager: SmartspaceManager =
context.getSystemService(SmartspaceManager::class.java)
smartspaceSession = smartspaceSession =
smartspaceManager.createSmartspaceSession( smartspaceManager.createSmartspaceSession(
SmartspaceConfig.Builder(context, SMARTSPACE_UI_SURFACE_LABEL).build() SmartspaceConfig.Builder(context, SMARTSPACE_UI_SURFACE_LABEL).build()
) )
smartspaceSession?.let { smartspaceSession?.let {
it.addOnTargetsAvailableListener( it.addOnTargetsAvailableListener(
// Use a new thread listening to Smartspace updates instead of using the existing // Use a main uiExecutor thread listening to Smartspace updates instead of using
// backgroundExecutor. SmartspaceSession has scheduled routine updates which can be // the existing background executor.
// unpredictable on test simulators, using the backgroundExecutor makes it's hard to // SmartspaceSession has scheduled routine updates which can be unpredictable on
// test the threads numbers. // test simulators, using the backgroundExecutor makes it's hard to test the threads
// Switch to use backgroundExecutor when SmartspaceSession has a good way to be // numbers.
// mocked. uiExecutor,
Executors.newCachedThreadPool(),
SmartspaceSession.OnTargetsAvailableListener { targets -> SmartspaceSession.OnTargetsAvailableListener { targets ->
smartspaceMediaDataProvider.onTargetsAvailable(targets) smartspaceMediaDataProvider.onTargetsAvailable(targets)
} }

View File

@@ -20,6 +20,8 @@ import android.app.Notification
import android.app.Notification.MediaStyle import android.app.Notification.MediaStyle
import android.app.PendingIntent import android.app.PendingIntent
import android.app.smartspace.SmartspaceAction import android.app.smartspace.SmartspaceAction
import android.app.smartspace.SmartspaceConfig
import android.app.smartspace.SmartspaceManager
import android.app.smartspace.SmartspaceTarget import android.app.smartspace.SmartspaceTarget
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
@@ -106,6 +108,7 @@ class MediaDataManagerTest : SysuiTestCase() {
lateinit var metadataBuilder: MediaMetadata.Builder lateinit var metadataBuilder: MediaMetadata.Builder
lateinit var backgroundExecutor: FakeExecutor lateinit var backgroundExecutor: FakeExecutor
lateinit var foregroundExecutor: FakeExecutor lateinit var foregroundExecutor: FakeExecutor
lateinit var uiExecutor: FakeExecutor
@Mock lateinit var dumpManager: DumpManager @Mock lateinit var dumpManager: DumpManager
@Mock lateinit var broadcastDispatcher: BroadcastDispatcher @Mock lateinit var broadcastDispatcher: BroadcastDispatcher
@Mock lateinit var mediaTimeoutListener: MediaTimeoutListener @Mock lateinit var mediaTimeoutListener: MediaTimeoutListener
@@ -117,6 +120,7 @@ class MediaDataManagerTest : SysuiTestCase() {
@Mock lateinit var listener: MediaDataManager.Listener @Mock lateinit var listener: MediaDataManager.Listener
@Mock lateinit var pendingIntent: PendingIntent @Mock lateinit var pendingIntent: PendingIntent
@Mock lateinit var activityStarter: ActivityStarter @Mock lateinit var activityStarter: ActivityStarter
@Mock lateinit var smartspaceManager: SmartspaceManager
lateinit var smartspaceMediaDataProvider: SmartspaceMediaDataProvider lateinit var smartspaceMediaDataProvider: SmartspaceMediaDataProvider
@Mock lateinit var mediaSmartspaceTarget: SmartspaceTarget @Mock lateinit var mediaSmartspaceTarget: SmartspaceTarget
@Mock private lateinit var mediaRecommendationItem: SmartspaceAction @Mock private lateinit var mediaRecommendationItem: SmartspaceAction
@@ -131,6 +135,7 @@ class MediaDataManagerTest : SysuiTestCase() {
@Mock private lateinit var tunerService: TunerService @Mock private lateinit var tunerService: TunerService
@Captor lateinit var tunableCaptor: ArgumentCaptor<TunerService.Tunable> @Captor lateinit var tunableCaptor: ArgumentCaptor<TunerService.Tunable>
@Captor lateinit var callbackCaptor: ArgumentCaptor<(String, PlaybackState) -> Unit> @Captor lateinit var callbackCaptor: ArgumentCaptor<(String, PlaybackState) -> Unit>
@Captor lateinit var smartSpaceConfigBuilderCaptor: ArgumentCaptor<SmartspaceConfig>
private val instanceIdSequence = InstanceIdSequenceFake(1 shl 20) private val instanceIdSequence = InstanceIdSequenceFake(1 shl 20)
@@ -145,6 +150,7 @@ class MediaDataManagerTest : SysuiTestCase() {
fun setup() { fun setup() {
foregroundExecutor = FakeExecutor(clock) foregroundExecutor = FakeExecutor(clock)
backgroundExecutor = FakeExecutor(clock) backgroundExecutor = FakeExecutor(clock)
uiExecutor = FakeExecutor(clock)
smartspaceMediaDataProvider = SmartspaceMediaDataProvider() smartspaceMediaDataProvider = SmartspaceMediaDataProvider()
Settings.Secure.putInt( Settings.Secure.putInt(
context.contentResolver, context.contentResolver,
@@ -155,6 +161,7 @@ class MediaDataManagerTest : SysuiTestCase() {
MediaDataManager( MediaDataManager(
context = context, context = context,
backgroundExecutor = backgroundExecutor, backgroundExecutor = backgroundExecutor,
uiExecutor = uiExecutor,
foregroundExecutor = foregroundExecutor, foregroundExecutor = foregroundExecutor,
mediaControllerFactory = mediaControllerFactory, mediaControllerFactory = mediaControllerFactory,
broadcastDispatcher = broadcastDispatcher, broadcastDispatcher = broadcastDispatcher,
@@ -172,7 +179,8 @@ class MediaDataManagerTest : SysuiTestCase() {
systemClock = clock, systemClock = clock,
tunerService = tunerService, tunerService = tunerService,
mediaFlags = mediaFlags, mediaFlags = mediaFlags,
logger = logger logger = logger,
smartspaceManager = smartspaceManager,
) )
verify(tunerService) verify(tunerService)
.addTunable(capture(tunableCaptor), eq(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION)) .addTunable(capture(tunableCaptor), eq(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION))
@@ -191,6 +199,7 @@ class MediaDataManagerTest : SysuiTestCase() {
putString(MediaMetadata.METADATA_KEY_ARTIST, SESSION_ARTIST) putString(MediaMetadata.METADATA_KEY_ARTIST, SESSION_ARTIST)
putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_TITLE) putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_TITLE)
} }
verify(smartspaceManager).createSmartspaceSession(capture(smartSpaceConfigBuilderCaptor))
whenever(mediaControllerFactory.create(eq(session.sessionToken))).thenReturn(controller) whenever(mediaControllerFactory.create(eq(session.sessionToken))).thenReturn(controller)
whenever(controller.transportControls).thenReturn(transportControls) whenever(controller.transportControls).thenReturn(transportControls)
whenever(controller.playbackInfo).thenReturn(playbackInfo) whenever(controller.playbackInfo).thenReturn(playbackInfo)
@@ -767,15 +776,14 @@ class MediaDataManagerTest : SysuiTestCase() {
.onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean()) .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean())
} }
@Ignore("b/233283726")
@Test @Test
fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() { fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() {
smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget)) smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
verify(logger).getNewInstanceId() verify(logger).getNewInstanceId()
smartspaceMediaDataProvider.onTargetsAvailable(listOf()) smartspaceMediaDataProvider.onTargetsAvailable(listOf())
foregroundExecutor.advanceClockToLast() uiExecutor.advanceClockToLast()
foregroundExecutor.runAllReady() uiExecutor.runAllReady()
verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false)) verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false))
verifyNoMoreInteractions(logger) verifyNoMoreInteractions(logger)