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

Commit 7101628a authored by Hsin-yu Chao's avatar Hsin-yu Chao
Browse files

InputRouteManager: apply default only when the selected is removed

Bug: 411019255
Test: atest InputRouteManagerTest
Flag:com.android.media.flags.enable_audio_input_device_routing_and_volume_control

Change-Id: I21b6dcbc9093a60b151b7882c5a79e8e542fb1c4
parent 29a31fa7
Loading
Loading
Loading
Loading
+25 −1
Original line number Original line Diff line number Diff line
@@ -117,7 +117,31 @@ public final class InputRouteManager {


                @Override
                @Override
                public void onAudioDevicesRemoved(@NonNull AudioDeviceInfo[] removedDevices) {
                public void onAudioDevicesRemoved(@NonNull AudioDeviceInfo[] removedDevices) {
                    for (AudioDeviceInfo info : removedDevices) {
                        Slog.v(TAG,
                                "onAudioDevicesRemoved: enumerating"
                                + ": type=" + info.getType()
                                + ", name=" + info.getProductName()
                                + ", isSource=" + info.isSource()
                                + ", isSink=" + info.isSink());

                        if (!info.isSource()) {
                            continue;
                        }

                        @AudioDeviceType int type = info.getType();
                        String addr = info.getAddress();
                        // Only when the selected input got removed, apply default as fallback.
                        if (InputMediaDevice.isSupportedInputDevice(type)
                                && (mSelectedInputDeviceType == type)
                                && (mSelectedInputDeviceAddr == addr)) {
                            Slog.v(TAG,
                                    "selected input is removed: updated type="
                                    + type + ", addr=" + addr);
                            applyDefaultSelectedTypeToAllPresets();
                            applyDefaultSelectedTypeToAllPresets();
                            break;
                        }
                    }
                }
                }
            };
            };


+62 −12
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -184,15 +185,7 @@ public class InputRouteManagerTest {
                MediaRecorder.AudioSource.MIC, audioDeviceAttributesList);
                MediaRecorder.AudioSource.MIC, audioDeviceAttributesList);
    }
    }


    @Before
    private void addListOfAudioDevices() {
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mInputRouteManager = new InputRouteManager(mContext, mAudioManager, mInfoMediaManager);
    }

    @Test
    public void onAudioDevicesAdded_shouldUpdateInputMediaDevice() {
        AudioDeviceInfo[] devices = {
        AudioDeviceInfo[] devices = {
            mockBuiltinMicInfo(),
            mockBuiltinMicInfo(),
            mockWiredHeadsetInfo(),
            mockWiredHeadsetInfo(),
@@ -207,9 +200,22 @@ public class InputRouteManagerTest {


        mInputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices);
        mInputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices);
        onPreferredDevicesForCapturePresetChanged();
        onPreferredDevicesForCapturePresetChanged();
    }

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mInputRouteManager = new InputRouteManager(mContext, mAudioManager, mInfoMediaManager);
    }

    @Test
    public void onAudioDevicesAdded_shouldUpdateInputMediaDevice() {
        addListOfAudioDevices();


        // The unsupported (hdmi) info should be filtered out.
        // The unsupported (hdmi) info should be filtered out.
        assertThat(mInputRouteManager.mInputMediaDevices).hasSize(devices.length - 1);
        // devices.length - 1 = 5
        assertThat(mInputRouteManager.mInputMediaDevices).hasSize(5);
        assertThat(mInputRouteManager.mInputMediaDevices.get(0).getId())
        assertThat(mInputRouteManager.mInputMediaDevices.get(0).getId())
                .isEqualTo(String.valueOf(BUILTIN_MIC_ID));
                .isEqualTo(String.valueOf(BUILTIN_MIC_ID));
        assertThat(mInputRouteManager.mInputMediaDevices.get(1).getId())
        assertThat(mInputRouteManager.mInputMediaDevices.get(1).getId())
@@ -397,12 +403,56 @@ public class InputRouteManagerTest {
    @Test
    @Test
    public void onAudioDevicesRemoved_shouldApplyDefaultSelectedDeviceToAllPresets() {
    public void onAudioDevicesRemoved_shouldApplyDefaultSelectedDeviceToAllPresets() {
        AudioDeviceInfo[] devices = {mockWiredHeadsetInfo()};
        AudioDeviceInfo[] devices = {mockWiredHeadsetInfo()};
        MediaDevice inputWiredHeadset = createInputMediaDeviceFromDeviceInfo(devices[0]);

        addListOfAudioDevices();
        mInputRouteManager.selectDevice(inputWiredHeadset);
        mInputRouteManager.mAudioDeviceCallback.onAudioDevicesRemoved(devices);

        // Called three times, one after initiation, one at devices added
        // and the other after onAudioDevicesRemoved call.
        verify(mAudioManager, times(3)).getDevicesForAttributes(INPUT_ATTRIBUTES);
        for (@MediaRecorder.Source int preset : PRESETS) {
            verify(mAudioManager, times(3))
                    .setPreferredDeviceForCapturePreset(preset, getBuiltinMicDeviceAttributes());
        }
    }

    @Test
    public void onAudioDevicesRemoved_doNotApplyDefaultSelectedTypeUnselectedDevRemoved() {
        final MediaDevice usbAccessory =
                InputMediaDevice.create(
                        mContext,
                        String.valueOf(INPUT_USB_ACCESSORY_ID),
                        "",
                        AudioDeviceInfo.TYPE_USB_ACCESSORY,
                        MAX_VOLUME,
                        CURRENT_VOLUME,
                        VOLUME_FIXED_TRUE,
                        PRODUCT_NAME_USB_ACCESSORY);
        AudioDeviceInfo[] devices = {mockUsbHeadsetInfo()};

        addListOfAudioDevices();
        mInputRouteManager.selectDevice(usbAccessory);
        mInputRouteManager.mAudioDeviceCallback.onAudioDevicesRemoved(devices);
        mInputRouteManager.mAudioDeviceCallback.onAudioDevicesRemoved(devices);


        // Called twice, one after initiation, the other after onAudioDevicesRemoved call.
        // Called two times, one after init, one at devices added
        verify(mAudioManager, atLeast(2)).getDevicesForAttributes(INPUT_ATTRIBUTES);
        verify(mAudioManager, atLeast(2)).getDevicesForAttributes(INPUT_ATTRIBUTES);
        for (@MediaRecorder.Source int preset : PRESETS) {
        for (@MediaRecorder.Source int preset : PRESETS) {
            verify(mAudioManager, atLeast(2))
            verify(mAudioManager, times(2))
                    .setPreferredDeviceForCapturePreset(preset, getBuiltinMicDeviceAttributes());
        }
    }

    @Test
    public void onAudioDevicesRemoved_doNotApplyDefaultSelectedTypeAtOutputRemoval() {
        AudioDeviceInfo[] devices = {mockUsbHeadsetOutputInfo()};

        mInputRouteManager.mAudioDeviceCallback.onAudioDevicesRemoved(devices);

        // Called just once after init.
        for (@MediaRecorder.Source int preset : PRESETS) {
            verify(mAudioManager, times(1))
                    .setPreferredDeviceForCapturePreset(preset, getBuiltinMicDeviceAttributes());
                    .setPreferredDeviceForCapturePreset(preset, getBuiltinMicDeviceAttributes());
        }
        }
    }
    }