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

Commit 59dd8840 authored by Wenyu Zhang's avatar Wenyu Zhang Committed by Android (Google) Code Review
Browse files

Merge "Use media switcher dialog to control routing during call" into main

parents 276c3dfc 830654aa
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);