Enable testOnSmartspaceMediaDataLoaded
Enables
testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener
in MediaDataManagerTest. The test was using foreground executor while a
new thread was being used and can't be tracked.
Used uiExecutor like other smartspace media session and change the test
to use uiExecutor. And also added smartspace manager as a constructor
instead of using Context.getSystemService().
Bug: b/233283726
Test: atest MediaDataManagerTest.
Test: used go/abtd to test on a certain device that made this bug appears.
Change-Id: Ia7d14092542c3ff33b8684d8f8fe31096443354d
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt
index 14dd990..3012bb4 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt
@@ -82,7 +82,6 @@
import java.io.IOException
import java.io.PrintWriter
import java.util.concurrent.Executor
-import java.util.concurrent.Executors
import javax.inject.Inject
// URI fields to try loading album art from
@@ -154,6 +153,7 @@
class MediaDataManager(
private val context: Context,
@Background private val backgroundExecutor: Executor,
+ @Main private val uiExecutor: Executor,
@Main private val foregroundExecutor: DelayableExecutor,
private val mediaControllerFactory: MediaControllerFactory,
private val broadcastDispatcher: BroadcastDispatcher,
@@ -171,7 +171,8 @@
private val systemClock: SystemClock,
private val tunerService: TunerService,
private val mediaFlags: MediaFlags,
- private val logger: MediaUiEventLogger
+ private val logger: MediaUiEventLogger,
+ private val smartspaceManager: SmartspaceManager,
) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener {
companion object {
@@ -218,6 +219,7 @@
constructor(
context: Context,
@Background backgroundExecutor: Executor,
+ @Main uiExecutor: Executor,
@Main foregroundExecutor: DelayableExecutor,
mediaControllerFactory: MediaControllerFactory,
dumpManager: DumpManager,
@@ -233,10 +235,12 @@
clock: SystemClock,
tunerService: TunerService,
mediaFlags: MediaFlags,
- logger: MediaUiEventLogger
+ logger: MediaUiEventLogger,
+ smartspaceManager: SmartspaceManager,
) : this(
context,
backgroundExecutor,
+ uiExecutor,
foregroundExecutor,
mediaControllerFactory,
broadcastDispatcher,
@@ -254,7 +258,8 @@
clock,
tunerService,
mediaFlags,
- logger
+ logger,
+ smartspaceManager,
)
private val appChangeReceiver =
@@ -314,21 +319,18 @@
// Register for Smartspace data updates.
smartspaceMediaDataProvider.registerListener(this)
- val smartspaceManager: SmartspaceManager =
- context.getSystemService(SmartspaceManager::class.java)
smartspaceSession =
smartspaceManager.createSmartspaceSession(
SmartspaceConfig.Builder(context, SMARTSPACE_UI_SURFACE_LABEL).build()
)
smartspaceSession?.let {
it.addOnTargetsAvailableListener(
- // Use a new thread listening to Smartspace updates instead of using the existing
- // backgroundExecutor. SmartspaceSession has scheduled routine updates which can be
- // unpredictable on test simulators, using the backgroundExecutor makes it's hard to
- // test the threads numbers.
- // Switch to use backgroundExecutor when SmartspaceSession has a good way to be
- // mocked.
- Executors.newCachedThreadPool(),
+ // Use a main uiExecutor thread listening to Smartspace updates instead of using
+ // the existing background executor.
+ // SmartspaceSession has scheduled routine updates which can be unpredictable on
+ // test simulators, using the backgroundExecutor makes it's hard to test the threads
+ // numbers.
+ uiExecutor,
SmartspaceSession.OnTargetsAvailableListener { targets ->
smartspaceMediaDataProvider.onTargetsAvailable(targets)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt
index 11eb26b..8bd7163 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt
@@ -20,6 +20,8 @@
import android.app.Notification.MediaStyle
import android.app.PendingIntent
import android.app.smartspace.SmartspaceAction
+import android.app.smartspace.SmartspaceConfig
+import android.app.smartspace.SmartspaceManager
import android.app.smartspace.SmartspaceTarget
import android.content.Intent
import android.graphics.Bitmap
@@ -106,6 +108,7 @@
lateinit var metadataBuilder: MediaMetadata.Builder
lateinit var backgroundExecutor: FakeExecutor
lateinit var foregroundExecutor: FakeExecutor
+ lateinit var uiExecutor: FakeExecutor
@Mock lateinit var dumpManager: DumpManager
@Mock lateinit var broadcastDispatcher: BroadcastDispatcher
@Mock lateinit var mediaTimeoutListener: MediaTimeoutListener
@@ -117,6 +120,7 @@
@Mock lateinit var listener: MediaDataManager.Listener
@Mock lateinit var pendingIntent: PendingIntent
@Mock lateinit var activityStarter: ActivityStarter
+ @Mock lateinit var smartspaceManager: SmartspaceManager
lateinit var smartspaceMediaDataProvider: SmartspaceMediaDataProvider
@Mock lateinit var mediaSmartspaceTarget: SmartspaceTarget
@Mock private lateinit var mediaRecommendationItem: SmartspaceAction
@@ -131,6 +135,7 @@
@Mock private lateinit var tunerService: TunerService
@Captor lateinit var tunableCaptor: ArgumentCaptor<TunerService.Tunable>
@Captor lateinit var callbackCaptor: ArgumentCaptor<(String, PlaybackState) -> Unit>
+ @Captor lateinit var smartSpaceConfigBuilderCaptor: ArgumentCaptor<SmartspaceConfig>
private val instanceIdSequence = InstanceIdSequenceFake(1 shl 20)
@@ -145,6 +150,7 @@
fun setup() {
foregroundExecutor = FakeExecutor(clock)
backgroundExecutor = FakeExecutor(clock)
+ uiExecutor = FakeExecutor(clock)
smartspaceMediaDataProvider = SmartspaceMediaDataProvider()
Settings.Secure.putInt(
context.contentResolver,
@@ -155,6 +161,7 @@
MediaDataManager(
context = context,
backgroundExecutor = backgroundExecutor,
+ uiExecutor = uiExecutor,
foregroundExecutor = foregroundExecutor,
mediaControllerFactory = mediaControllerFactory,
broadcastDispatcher = broadcastDispatcher,
@@ -172,7 +179,8 @@
systemClock = clock,
tunerService = tunerService,
mediaFlags = mediaFlags,
- logger = logger
+ logger = logger,
+ smartspaceManager = smartspaceManager,
)
verify(tunerService)
.addTunable(capture(tunableCaptor), eq(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION))
@@ -191,6 +199,7 @@
putString(MediaMetadata.METADATA_KEY_ARTIST, SESSION_ARTIST)
putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_TITLE)
}
+ verify(smartspaceManager).createSmartspaceSession(capture(smartSpaceConfigBuilderCaptor))
whenever(mediaControllerFactory.create(eq(session.sessionToken))).thenReturn(controller)
whenever(controller.transportControls).thenReturn(transportControls)
whenever(controller.playbackInfo).thenReturn(playbackInfo)
@@ -767,15 +776,14 @@
.onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean())
}
- @Ignore("b/233283726")
@Test
fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() {
smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
verify(logger).getNewInstanceId()
smartspaceMediaDataProvider.onTargetsAvailable(listOf())
- foregroundExecutor.advanceClockToLast()
- foregroundExecutor.runAllReady()
+ uiExecutor.advanceClockToLast()
+ uiExecutor.runAllReady()
verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false))
verifyNoMoreInteractions(logger)