[Media SASS] Unregister the muteAwaitConnectionCallback when the Entry

stops.

Bug: 206614671
Test: atest MediaMuteAwaitConnectionManagerTest
Test: atest MediaDeviceManagerTest
Change-Id: I370edb601412af85683fb4d2ff514f35ef44bceb
This commit is contained in:
Caitlin Cassidy
2022-02-09 17:18:10 +00:00
parent 1400c7a35f
commit b56e31385e
4 changed files with 70 additions and 31 deletions

View File

@@ -28,6 +28,7 @@ import com.android.systemui.Dumpable
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManager
import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManagerFactory
import java.io.FileDescriptor
import java.io.PrintWriter
@@ -84,14 +85,14 @@ class MediaDeviceManager @Inject constructor(
controllerFactory.create(it)
}
val localMediaManager = localMediaManagerFactory.create(data.packageName)
// We don't need to set this muteAwaitConnectionManager anywhere; it will just notify
// [localMediaManager] on the appropriate events.
muteAwaitConnectionManagerFactory.create(localMediaManager)
val muteAwaitConnectionManager =
muteAwaitConnectionManagerFactory.create(localMediaManager)
entry = Entry(
key,
oldKey,
controller,
localMediaManager
localMediaManager,
muteAwaitConnectionManager
)
entries[key] = entry
entry.start()
@@ -137,7 +138,8 @@ class MediaDeviceManager @Inject constructor(
val key: String,
val oldKey: String?,
val controller: MediaController?,
val localMediaManager: LocalMediaManager
val localMediaManager: LocalMediaManager,
val muteAwaitConnectionManager: MediaMuteAwaitConnectionManager?
) : LocalMediaManager.DeviceCallback, MediaController.Callback() {
val token
@@ -161,6 +163,7 @@ class MediaDeviceManager @Inject constructor(
fun start() = bgExecutor.execute {
localMediaManager.registerCallback(this)
localMediaManager.startScan()
muteAwaitConnectionManager?.startListening()
playbackType = controller?.playbackInfo?.playbackType ?: PLAYBACK_TYPE_UNKNOWN
controller?.registerCallback(this)
updateCurrent()
@@ -173,6 +176,7 @@ class MediaDeviceManager @Inject constructor(
controller?.unregisterCallback(this)
localMediaManager.stopScan()
localMediaManager.unregisterCallback(this)
muteAwaitConnectionManager?.stopListening()
}
fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) {

View File

@@ -37,8 +37,8 @@ import java.util.concurrent.Executor
* TODO(b/206614671): Add logging.
*/
class MediaMuteAwaitConnectionManager constructor(
@Main mainExecutor: Executor,
localMediaManager: LocalMediaManager,
@Main private val mainExecutor: Executor,
private val localMediaManager: LocalMediaManager,
private val context: Context,
private val deviceIconUtil: DeviceIconUtil
) {
@@ -68,8 +68,8 @@ class MediaMuteAwaitConnectionManager constructor(
}
}
init {
// TODO(b/206614671): Unregister this callback (likely on [MediaDeviceManager.Entry.Stop]).
/** Start listening for mute await events. */
fun startListening() {
audioManager.registerMuteAwaitConnectionCallback(
mainExecutor, muteAwaitConnectionChangeListener
)
@@ -82,6 +82,11 @@ class MediaMuteAwaitConnectionManager constructor(
}
}
/** Stop listening for mute await events. */
fun stopListening() {
audioManager.unregisterMuteAwaitConnectionCallback(muteAwaitConnectionChangeListener)
}
private fun AudioDeviceAttributes.getIcon(): Drawable {
return deviceIconUtil.getIconFromAudioDeviceType(this.type, context)
}

View File

@@ -30,6 +30,7 @@ import com.android.settingslib.media.LocalMediaManager
import com.android.settingslib.media.MediaDevice
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManager
import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManagerFactory
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
@@ -74,6 +75,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
@Mock private lateinit var lmm: LocalMediaManager
@Mock private lateinit var mr2: MediaRouter2Manager
@Mock private lateinit var muteAwaitFactory: MediaMuteAwaitConnectionManagerFactory
@Mock private lateinit var muteAwaitManager: MediaMuteAwaitConnectionManager
private lateinit var fakeFgExecutor: FakeExecutor
private lateinit var fakeBgExecutor: FakeExecutor
@Mock private lateinit var dumpster: DumpManager
@@ -106,6 +108,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
whenever(device.name).thenReturn(DEVICE_NAME)
whenever(device.iconWithoutBackground).thenReturn(icon)
whenever(lmmFactory.create(PACKAGE)).thenReturn(lmm)
whenever(muteAwaitFactory.create(lmm)).thenReturn(muteAwaitManager)
whenever(lmm.getCurrentConnectedDevice()).thenReturn(device)
whenever(mr2.getRoutingSessionForMediaController(any())).thenReturn(route)
@@ -156,6 +159,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
manager.onMediaDataRemoved(KEY)
fakeBgExecutor.runAllReady()
verify(lmm).unregisterCallback(any())
verify(muteAwaitManager).stopListening()
}
@Test
@@ -179,6 +183,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
fakeFgExecutor.runAllReady()
// THEN the listener for the old key should removed.
verify(lmm).unregisterCallback(any())
verify(muteAwaitManager).stopListening()
// AND a new device event emitted
val data = captureDeviceData(KEY, KEY_OLD)
assertThat(data.enabled).isTrue()
@@ -250,6 +255,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
manager.onMediaDataLoaded(KEY, null, mediaData)
fakeBgExecutor.runAllReady()
val deviceCallback = captureCallback()
verify(muteAwaitManager).startListening()
// WHEN the device list changes
deviceCallback.onDeviceListUpdate(mutableListOf(device))
assertThat(fakeBgExecutor.runAllReady()).isEqualTo(1)

View File

@@ -16,7 +16,6 @@
package com.android.systemui.media.muteawait
import android.annotation.DrawableRes
import android.content.Context
import android.graphics.drawable.Drawable
import android.media.AudioAttributes.USAGE_MEDIA
@@ -54,7 +53,6 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
private lateinit var deviceIconUtil: DeviceIconUtil
@Mock
private lateinit var localMediaManager: LocalMediaManager
private lateinit var muteAwaitListener: AudioManager.MuteAwaitConnectionCallback
private lateinit var icon: Drawable
@Before
@@ -63,29 +61,56 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
context.addMockSystemService(Context.AUDIO_SERVICE, audioManager)
icon = context.getDrawable(R.drawable.ic_cake)!!
whenever(deviceIconUtil.getIconFromAudioDeviceType(any(), any())).thenReturn(icon)
muteAwaitConnectionManager = MediaMuteAwaitConnectionManager(
FakeExecutor(FakeSystemClock()),
localMediaManager,
context,
deviceIconUtil
)
}
@Test
fun constructor_audioManagerHasNoMuteAwaitDevice_localMediaMangerNotNotified() {
fun constructor_audioManagerCallbackNotRegistered() {
verify(audioManager, never()).registerMuteAwaitConnectionCallback(any(), any())
}
@Test
fun startListening_audioManagerCallbackRegistered() {
muteAwaitConnectionManager.startListening()
verify(audioManager).registerMuteAwaitConnectionCallback(any(), any())
}
@Test
fun stopListening_audioManagerCallbackUnregistered() {
muteAwaitConnectionManager.stopListening()
verify(audioManager).unregisterMuteAwaitConnectionCallback(any())
}
@Test
fun startListening_audioManagerHasNoMuteAwaitDevice_localMediaMangerNotNotified() {
whenever(audioManager.mutingExpectedDevice).thenReturn(null)
instantiateManager()
muteAwaitConnectionManager.startListening()
verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
}
@Test
fun constructor_audioManagerHasMuteAwaitDevice_localMediaMangerNotified() {
fun startListening_audioManagerHasMuteAwaitDevice_localMediaMangerNotified() {
whenever(audioManager.mutingExpectedDevice).thenReturn(DEVICE)
instantiateManager()
muteAwaitConnectionManager.startListening()
verify(localMediaManager).dispatchAboutToConnectDeviceChanged(eq(DEVICE_NAME), eq(icon))
}
@Test
fun onMutedUntilConnection_notUsageMedia_localMediaManagerNotNotified() {
instantiateManager()
muteAwaitConnectionManager.startListening()
val muteAwaitListener = getMuteAwaitListener()
muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_UNKNOWN))
@@ -94,7 +119,9 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
@Test
fun onMutedUntilConnection_isUsageMedia_localMediaManagerNotified() {
instantiateManager()
muteAwaitConnectionManager.startListening()
val muteAwaitListener = getMuteAwaitListener()
muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
@@ -103,7 +130,9 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
@Test
fun onUnmutedEvent_noDeviceMutedBefore_localMediaManagerNotNotified() {
instantiateManager()
muteAwaitConnectionManager.startListening()
val muteAwaitListener = getMuteAwaitListener()
muteAwaitListener.onUnmutedEvent(EVENT_CONNECTION, DEVICE, intArrayOf(USAGE_MEDIA))
verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
@@ -111,7 +140,8 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
@Test
fun onUnmutedEvent_notSameDevice_localMediaManagerNotNotified() {
instantiateManager()
muteAwaitConnectionManager.startListening()
val muteAwaitListener = getMuteAwaitListener()
muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
reset(localMediaManager)
@@ -130,7 +160,8 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
@Test
fun onUnmutedEvent_notUsageMedia_localMediaManagerNotNotified() {
instantiateManager()
muteAwaitConnectionManager.startListening()
val muteAwaitListener = getMuteAwaitListener()
muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
reset(localMediaManager)
@@ -141,7 +172,8 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
@Test
fun onUnmutedEvent_sameDeviceAndUsageMedia_localMediaManagerNotified() {
instantiateManager()
muteAwaitConnectionManager.startListening()
val muteAwaitListener = getMuteAwaitListener()
muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
reset(localMediaManager)
@@ -150,20 +182,12 @@ class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
verify(localMediaManager).dispatchAboutToConnectDeviceChanged(eq(null), eq(null))
}
// Some classes test the constructor, so don't instantiate the manager in @SetUp.
private fun instantiateManager() {
muteAwaitConnectionManager = MediaMuteAwaitConnectionManager(
FakeExecutor(FakeSystemClock()),
localMediaManager,
context,
deviceIconUtil
)
private fun getMuteAwaitListener(): AudioManager.MuteAwaitConnectionCallback {
val listenerCaptor = ArgumentCaptor.forClass(
AudioManager.MuteAwaitConnectionCallback::class.java
)
verify(audioManager).registerMuteAwaitConnectionCallback(any(), listenerCaptor.capture())
muteAwaitListener = listenerCaptor.value!!
return listenerCaptor.value!!
}
}