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

Commit b56e3138 authored by Caitlin Cassidy's avatar Caitlin Cassidy
Browse files

[Media SASS] Unregister the muteAwaitConnectionCallback when the Entry

stops.

Bug: 206614671
Test: atest MediaMuteAwaitConnectionManagerTest
Test: atest MediaDeviceManagerTest
Change-Id: I370edb601412af85683fb4d2ff514f35ef44bceb
parent 1400c7a3
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -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.
            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>) {
+9 −4
Original line number Diff line number Diff line
@@ -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)
    }
+6 −0
Original line number Diff line number Diff line
@@ -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)
+46 −22
Original line number Diff line number Diff line
@@ -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_audioManagerCallbackNotRegistered() {
        verify(audioManager, never()).registerMuteAwaitConnectionCallback(any(), any())
    }

    @Test
    fun startListening_audioManagerCallbackRegistered() {
        muteAwaitConnectionManager.startListening()

        verify(audioManager).registerMuteAwaitConnectionCallback(any(), any())
    }

    @Test
    fun constructor_audioManagerHasNoMuteAwaitDevice_localMediaMangerNotNotified() {
    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!!
    }
}