summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt122
2 files changed, 96 insertions, 33 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt
index 7f25642be5ee..cc06b6c67879 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt
@@ -64,6 +64,11 @@ class MediaResumeListener @Inject constructor(
private lateinit var mediaDataManager: MediaDataManager
private var mediaBrowser: ResumeMediaBrowser? = null
+ set(value) {
+ // Always disconnect the old browser -- see b/225403871.
+ field?.disconnect()
+ field = value
+ }
private var currentUserId: Int = context.userId
@VisibleForTesting
@@ -189,7 +194,6 @@ class MediaResumeListener @Inject constructor(
if (useMediaResumption) {
// If this had been started from a resume state, disconnect now that it's live
if (!key.equals(oldKey)) {
- mediaBrowser?.disconnect()
mediaBrowser = null
}
// If we don't have a resume action, check if we haven't already
@@ -223,7 +227,6 @@ class MediaResumeListener @Inject constructor(
Log.d(TAG, "Testing if we can connect to $componentName")
// Set null action to prevent additional attempts to connect
mediaDataManager.setResumeAction(key, null)
- mediaBrowser?.disconnect()
mediaBrowser = mediaBrowserFactory.create(
object : ResumeMediaBrowser.Callback() {
override fun onConnected() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
index 3e98a12b4564..3d3ac836d264 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
@@ -168,16 +168,7 @@ class MediaResumeListenerTest : SysuiTestCase() {
@Test
fun testOnLoad_checksForResume_badService() {
- // Set up MBS that will allow connection but not return valid media
- val pm = mock(PackageManager::class.java)
- whenever(mockContext.packageManager).thenReturn(pm)
- val resolveInfo = ResolveInfo()
- val serviceInfo = ServiceInfo()
- serviceInfo.packageName = PACKAGE_NAME
- resolveInfo.serviceInfo = serviceInfo
- resolveInfo.serviceInfo.name = CLASS_NAME
- val resumeInfo = listOf(resolveInfo)
- whenever(pm.queryIntentServices(any(), anyInt())).thenReturn(resumeInfo)
+ setUpMbsWithValidResolveInfo()
whenever(resumeBrowser.testConnection()).thenAnswer {
callbackCaptor.value.onError()
@@ -213,16 +204,7 @@ class MediaResumeListenerTest : SysuiTestCase() {
@Test
fun testOnLoad_checksForResume_hasService() {
- // Set up mocks to successfully find a MBS that returns valid media
- val pm = mock(PackageManager::class.java)
- whenever(mockContext.packageManager).thenReturn(pm)
- val resolveInfo = ResolveInfo()
- val serviceInfo = ServiceInfo()
- serviceInfo.packageName = PACKAGE_NAME
- resolveInfo.serviceInfo = serviceInfo
- resolveInfo.serviceInfo.name = CLASS_NAME
- val resumeInfo = listOf(resolveInfo)
- whenever(pm.queryIntentServices(any(), anyInt())).thenReturn(resumeInfo)
+ setUpMbsWithValidResolveInfo()
val description = MediaDescription.Builder().setTitle(TITLE).build()
val component = ComponentName(PACKAGE_NAME, CLASS_NAME)
@@ -288,16 +270,7 @@ class MediaResumeListenerTest : SysuiTestCase() {
@Test
fun testGetResumeAction_restarts() {
- // Set up mocks to successfully find a MBS that returns valid media
- val pm = mock(PackageManager::class.java)
- whenever(mockContext.packageManager).thenReturn(pm)
- val resolveInfo = ResolveInfo()
- val serviceInfo = ServiceInfo()
- serviceInfo.packageName = PACKAGE_NAME
- resolveInfo.serviceInfo = serviceInfo
- resolveInfo.serviceInfo.name = CLASS_NAME
- val resumeInfo = listOf(resolveInfo)
- whenever(pm.queryIntentServices(any(), anyInt())).thenReturn(resumeInfo)
+ setUpMbsWithValidResolveInfo()
val description = MediaDescription.Builder().setTitle(TITLE).build()
val component = ComponentName(PACKAGE_NAME, CLASS_NAME)
@@ -426,4 +399,91 @@ class MediaResumeListenerTest : SysuiTestCase() {
}
verify(sharedPrefsEditor, times(1)).apply()
}
-} \ No newline at end of file
+
+ @Test
+ fun testOnMediaDataLoaded_newKeyDifferent_oldMediaBrowserDisconnected() {
+ setUpMbsWithValidResolveInfo()
+
+ resumeListener.onMediaDataLoaded(key = KEY, oldKey = null, data)
+ executor.runAllReady()
+
+ resumeListener.onMediaDataLoaded(key = "newKey", oldKey = KEY, data)
+
+ verify(resumeBrowser).disconnect()
+ }
+
+ @Test
+ fun testOnMediaDataLoaded_updatingResumptionListError_mediaBrowserDisconnected() {
+ setUpMbsWithValidResolveInfo()
+
+ // Set up mocks to return with an error
+ whenever(resumeBrowser.testConnection()).thenAnswer {
+ callbackCaptor.value.onError()
+ }
+
+ resumeListener.onMediaDataLoaded(key = KEY, oldKey = null, data)
+ executor.runAllReady()
+
+ // Ensure we disconnect the browser
+ verify(resumeBrowser).disconnect()
+ }
+
+ @Test
+ fun testOnMediaDataLoaded_trackAdded_mediaBrowserDisconnected() {
+ setUpMbsWithValidResolveInfo()
+
+ // Set up mocks to return with a track added
+ val description = MediaDescription.Builder().setTitle(TITLE).build()
+ val component = ComponentName(PACKAGE_NAME, CLASS_NAME)
+ whenever(resumeBrowser.testConnection()).thenAnswer {
+ callbackCaptor.value.addTrack(description, component, resumeBrowser)
+ }
+
+ resumeListener.onMediaDataLoaded(key = KEY, oldKey = null, data)
+ executor.runAllReady()
+
+ // Ensure we disconnect the browser
+ verify(resumeBrowser).disconnect()
+ }
+
+ @Test
+ fun testResumeAction_oldMediaBrowserDisconnected() {
+ setUpMbsWithValidResolveInfo()
+
+ val description = MediaDescription.Builder().setTitle(TITLE).build()
+ val component = ComponentName(PACKAGE_NAME, CLASS_NAME)
+ whenever(resumeBrowser.testConnection()).thenAnswer {
+ callbackCaptor.value.addTrack(description, component, resumeBrowser)
+ }
+
+ // Load media data that will require us to get the resume action
+ val dataCopy = data.copy(resumeAction = null, hasCheckedForResume = false)
+ resumeListener.onMediaDataLoaded(KEY, null, dataCopy)
+ executor.runAllReady()
+ verify(mediaDataManager, times(2)).setResumeAction(eq(KEY), capture(actionCaptor))
+
+ // Set up our factory to return a new browser so we can verify we disconnected the old one
+ val newResumeBrowser = mock(ResumeMediaBrowser::class.java)
+ whenever(resumeBrowserFactory.create(capture(callbackCaptor), any()))
+ .thenReturn(newResumeBrowser)
+
+ // When the resume action is run
+ actionCaptor.value.run()
+
+ // Then we disconnect the old one
+ verify(resumeBrowser).disconnect()
+ }
+
+ /** Sets up mocks to successfully find a MBS that returns valid media. */
+ private fun setUpMbsWithValidResolveInfo() {
+ val pm = mock(PackageManager::class.java)
+ whenever(mockContext.packageManager).thenReturn(pm)
+ val resolveInfo = ResolveInfo()
+ val serviceInfo = ServiceInfo()
+ serviceInfo.packageName = PACKAGE_NAME
+ resolveInfo.serviceInfo = serviceInfo
+ resolveInfo.serviceInfo.name = CLASS_NAME
+ val resumeInfo = listOf(resolveInfo)
+ whenever(pm.queryIntentServices(any(), anyInt())).thenReturn(resumeInfo)
+ }
+}