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

Commit 830654aa authored by Wenyu Zhang's avatar Wenyu Zhang
Browse files

Use media switcher dialog to control routing during call

When input routing is enabled and in desktop devices, allow use media
switcher dialog to control routing during call.

Change-Id: Id2587a1d33783a02a84cdc5c850b0a9c7908f159
Bug: b/355684672, b/357123258
Test: atest MediaOutputPreferenceControllerTest
Flag: com.android.media.flags.enable_audio_input_device_routing_and_volume_control
parent 8dde780a
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.MediaOutputConstants;
import com.android.settingslib.media.PhoneMediaDevice;

import java.util.List;

@@ -132,6 +133,12 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);

        // Always use media switcher to control routing in desktop.
        if (PhoneMediaDevice.inputRoutingEnabledAndIsDesktop(mContext)) {
            mPreference.setVisible(true);
            return;
        }

        mPreference.setVisible(!Utils.isAudioModeOngoingCall(mContext)
                && (enableOutputSwitcherForSystemRouting() ? true : mMediaController != null));
    }
@@ -153,8 +160,10 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro
        }

        mPreference.setEnabled(true);
        if (Utils.isAudioModeOngoingCall(mContext)) {
            // Ongoing call status, switch entry for media will be disabled.
        if (Utils.isAudioModeOngoingCall(mContext) &&
                !PhoneMediaDevice.inputRoutingEnabledAndIsDesktop(mContext)) {
            // Ongoing call status, switch entry for media will be disabled, unless input routing is
            // enabled in desktop.
            mPreference.setVisible(false);
            preference.setSummary(
                    mContext.getText(R.string.media_out_summary_ongoing_call_state));
+33 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.sound;

import static android.content.pm.PackageManager.FEATURE_PC;
import static android.media.AudioSystem.DEVICE_OUT_BLE_HEADSET;
import static android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
import static android.media.AudioSystem.DEVICE_OUT_EARPIECE;
@@ -42,6 +43,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.media.AudioAttributes;
import android.media.AudioManager;
@@ -49,14 +51,17 @@ import android.media.VolumeProvider;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;

import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;

import com.android.media.flags.Flags;
import com.android.settings.R;
import com.android.settings.bluetooth.Utils;
import com.android.settings.media.MediaOutputUtils;
import com.android.settings.testutils.shadow.ShadowAudioManager;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
import com.android.settingslib.bluetooth.A2dpProfile;
@@ -113,6 +118,8 @@ public class MediaOutputPreferenceControllerTest {
    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    @Mock
    private PackageManager mPackageManager;
    @Mock
    private LocalBluetoothManager mLocalManager;
    @Mock
@@ -486,6 +493,32 @@ public class MediaOutputPreferenceControllerTest {
        assertThat(mPreference.isVisible()).isFalse();
    }

    /**
     * During a call
     * Preference should be visible when input routing is available in desktop
     */
    @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL)
    @Test
    public void updateState_inCall_preferenceVisible_inputRoutingEnabledInDesktop()
            throws PackageManager.NameNotFoundException {
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
        when(mPackageManager.hasSystemFeature(FEATURE_PC)).thenReturn(true);

        ApplicationInfo appInfo = new ApplicationInfo();
        appInfo.flags = ApplicationInfo.FLAG_INSTALLED;
        appInfo.packageName = TEST_PACKAGE_NAME;
        appInfo.name = TEST_APPLICATION_LABEL;
        when(mPackageManager.getApplicationInfo(TEST_PACKAGE_NAME,
                PackageManager.MATCH_DISABLED_COMPONENTS
                        | PackageManager.MATCH_ANY_USER)).thenReturn(appInfo);


        mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        mController.updateState(mPreference);

        assertThat(mPreference.isVisible()).isTrue();
    }

    @Test
    public void findActiveDevice_onlyA2dpDeviceActive_returnA2dpDevice() {
        when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(null);