From 830654aa85d2543420d39acde4ed6d68eb031149 Mon Sep 17 00:00:00 2001 From: Wenyu Zhang Date: Thu, 10 Oct 2024 02:20:21 +0000 Subject: [PATCH] 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 --- .../MediaOutputPreferenceController.java | 13 ++++++-- .../MediaOutputPreferenceControllerTest.java | 33 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java index e116422c7b9..060fa26f879 100644 --- a/src/com/android/settings/sound/MediaOutputPreferenceController.java +++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java @@ -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)); diff --git a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java index cd642255f03..53ea81fae33 100644 --- a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java @@ -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);