From f782872cfd76fbbe85843a565e795d75b4950b96 Mon Sep 17 00:00:00 2001 From: Vlad Popa Date: Tue, 28 Nov 2023 19:05:13 -0800 Subject: [PATCH] Disable the Bt categorization list when audio type is known The audio framework can deduce the type with the help of the BluetoothDevice metadata API. In case this is known we will grey out the list with the manual selection of the audio device type. Test: adb shell device_config put media_audio android.media.audio.automatic_bt_device_type true Test: atest BluetoothDetailsAudioDeviceTypeControllerTest Bug: 302323921 Change-Id: Ia2cab27f2dce5493aa4326333699b5908d8a09ee --- ...toothDetailsAudioDeviceTypeController.java | 31 +++++++++++++++---- ...hDetailsAudioDeviceTypeControllerTest.java | 18 ++++++++--- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java b/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java index 9571767253c..d62543bb64f 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java @@ -23,6 +23,7 @@ import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_HEARING_AID; import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_OTHER; import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_SPEAKER; import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_UNKNOWN; +import static android.media.audio.Flags.automaticBtDeviceType; import android.content.Context; import android.media.AudioManager; @@ -106,9 +107,15 @@ public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsC final int index = pref.findIndexOfValue(value); if (index >= 0) { pref.setSummary(pref.getEntries()[index]); - mAudioManager.setBluetoothAudioDeviceCategory(mCachedDevice.getAddress(), - mCachedDevice.getDevice().getType() == DEVICE_TYPE_LE, - Integer.parseInt(value)); + if (automaticBtDeviceType()) { + mAudioManager.setBluetoothAudioDeviceCategory( + mCachedDevice.getAddress(), Integer.parseInt(value)); + } else { + mAudioManager.setBluetoothAudioDeviceCategory_legacy( + mCachedDevice.getAddress(), + mCachedDevice.getDevice().getType() == DEVICE_TYPE_LE, + Integer.parseInt(value)); + } mCachedDevice.onAudioDeviceCategoryChanged(); } } @@ -163,9 +170,15 @@ public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsC Integer.toString(AUDIO_DEVICE_CATEGORY_OTHER), }); - @AudioDeviceCategory final int deviceCategory = - mAudioManager.getBluetoothAudioDeviceCategory(mCachedDevice.getAddress(), - mCachedDevice.getDevice().getType() == DEVICE_TYPE_LE); + @AudioDeviceCategory int deviceCategory; + if (automaticBtDeviceType()) { + deviceCategory = mAudioManager.getBluetoothAudioDeviceCategory( + mCachedDevice.getAddress()); + } else { + deviceCategory = mAudioManager.getBluetoothAudioDeviceCategory_legacy( + mCachedDevice.getAddress(), + mCachedDevice.getDevice().getType() == DEVICE_TYPE_LE); + } if (DEBUG) { Log.v(TAG, "getBluetoothAudioDeviceCategory() device: " + mCachedDevice.getDevice().getAnonymizedAddress() @@ -173,6 +186,12 @@ public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsC } mAudioDeviceTypePreference.setValue(Integer.toString(deviceCategory)); + if (automaticBtDeviceType()) { + if (mAudioManager.isBluetoothAudioDeviceCategoryFixed(mCachedDevice.getAddress())) { + mAudioDeviceTypePreference.setEnabled(false); + } + } + mAudioDeviceTypePreference.setSummary(mAudioDeviceTypePreference.getEntry()); mAudioDeviceTypePreference.setOnPreferenceChangeListener(this); } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java index 0fc06476ca8..20105022ef1 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java @@ -18,6 +18,7 @@ package com.android.settings.bluetooth; import static android.bluetooth.BluetoothDevice.DEVICE_TYPE_LE; import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_SPEAKER; +import static android.media.audio.Flags.automaticBtDeviceType; import static com.google.common.truth.Truth.assertThat; @@ -97,8 +98,12 @@ public class BluetoothDetailsAudioDeviceTypeControllerTest extends @Test public void createAudioDeviceTypePreference_btDeviceIsCategorized_checkSelection() { int deviceType = AUDIO_DEVICE_CATEGORY_SPEAKER; - when(mAudioManager.getBluetoothAudioDeviceCategory(MAC_ADDRESS, /*isBle=*/true)).thenReturn( - deviceType); + if (automaticBtDeviceType()) { + when(mAudioManager.getBluetoothAudioDeviceCategory(MAC_ADDRESS)).thenReturn(deviceType); + } else { + when(mAudioManager.getBluetoothAudioDeviceCategory_legacy(MAC_ADDRESS, /*isBle=*/ + true)).thenReturn(deviceType); + } mController.createAudioDeviceTypePreference(mContext); mAudioDeviceTypePref = mController.getAudioDeviceTypePreference(); @@ -113,7 +118,12 @@ public class BluetoothDetailsAudioDeviceTypeControllerTest extends mController.onPreferenceChange(mAudioDeviceTypePref, Integer.toString(deviceType)); - verify(mAudioManager).setBluetoothAudioDeviceCategory(eq(MAC_ADDRESS), eq(true), - eq(AUDIO_DEVICE_CATEGORY_SPEAKER)); + if (automaticBtDeviceType()) { + verify(mAudioManager).setBluetoothAudioDeviceCategory(eq(MAC_ADDRESS), + eq(AUDIO_DEVICE_CATEGORY_SPEAKER)); + } else { + verify(mAudioManager).setBluetoothAudioDeviceCategory_legacy(eq(MAC_ADDRESS), eq(true), + eq(AUDIO_DEVICE_CATEGORY_SPEAKER)); + } } }