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

This commit is contained in:
Wenyu Zhang
2024-10-11 22:07:26 +00:00
committed by Android (Google) Code Review
2 changed files with 44 additions and 2 deletions

View File

@@ -41,6 +41,7 @@ import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.MediaOutputConstants; import com.android.settingslib.media.MediaOutputConstants;
import com.android.settingslib.media.PhoneMediaDevice;
import java.util.List; import java.util.List;
@@ -132,6 +133,12 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(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) mPreference.setVisible(!Utils.isAudioModeOngoingCall(mContext)
&& (enableOutputSwitcherForSystemRouting() ? true : mMediaController != null)); && (enableOutputSwitcherForSystemRouting() ? true : mMediaController != null));
} }
@@ -153,8 +160,10 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro
} }
mPreference.setEnabled(true); mPreference.setEnabled(true);
if (Utils.isAudioModeOngoingCall(mContext)) { if (Utils.isAudioModeOngoingCall(mContext) &&
// Ongoing call status, switch entry for media will be disabled. !PhoneMediaDevice.inputRoutingEnabledAndIsDesktop(mContext)) {
// Ongoing call status, switch entry for media will be disabled, unless input routing is
// enabled in desktop.
mPreference.setVisible(false); mPreference.setVisible(false);
preference.setSummary( preference.setSummary(
mContext.getText(R.string.media_out_summary_ongoing_call_state)); mContext.getText(R.string.media_out_summary_ongoing_call_state));

View File

@@ -16,6 +16,7 @@
package com.android.settings.sound; 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_BLE_HEADSET;
import static android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP; import static android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
import static android.media.AudioSystem.DEVICE_OUT_EARPIECE; import static android.media.AudioSystem.DEVICE_OUT_EARPIECE;
@@ -42,6 +43,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats; import android.content.pm.PackageStats;
import android.media.AudioAttributes; import android.media.AudioAttributes;
import android.media.AudioManager; import android.media.AudioManager;
@@ -49,14 +51,17 @@ import android.media.VolumeProvider;
import android.media.session.MediaController; import android.media.session.MediaController;
import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState; import android.media.session.PlaybackState;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule; import android.platform.test.flag.junit.SetFlagsRule;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.media.flags.Flags;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.bluetooth.Utils; 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.ShadowAudioManager;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.A2dpProfile;
@@ -113,6 +118,8 @@ public class MediaOutputPreferenceControllerTest {
@Rule @Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock
private PackageManager mPackageManager;
@Mock @Mock
private LocalBluetoothManager mLocalManager; private LocalBluetoothManager mLocalManager;
@Mock @Mock
@@ -486,6 +493,32 @@ public class MediaOutputPreferenceControllerTest {
assertThat(mPreference.isVisible()).isFalse(); 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 @Test
public void findActiveDevice_onlyA2dpDeviceActive_returnA2dpDevice() { public void findActiveDevice_onlyA2dpDeviceActive_returnA2dpDevice() {
when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(null); when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(null);