From e7a4b1f13d7d1aec90cee9a4d543b2d0377fdeaf Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Thu, 6 Oct 2022 10:34:46 +0000 Subject: [PATCH] Shows LE audio hearing aid device in a11y settings page (3/3) Shows connected hearing aid in a11y settings page whether it's ASHA hearing aid or LE audio hearing aid. Makes sure preference summary is updated as expected when BluetoothHapClient profile connects or disconnects. LE audio hearing aid will be a CSIP set. According to the CSIP spec, we will show the device is active without side information if there is only one device in the CSIP set and show the device is active left and right if both side of hearing aids are in the CSIP set. Bug: 249235823 Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilityHearingAidPreferenceControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=HearingAidPairingDialogFragmentTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=HearingAidUtilsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=AvailableMediaBluetoothDeviceUpdaterTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothDetailsPairOtherControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothDetailsRelatedToolsControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=ConnectedBluetoothDeviceUpdaterTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=AvailableMediaDeviceGroupControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothDevicesSliceTest Change-Id: Ifd66cbd81481a1eb94613d89dfd8df16b8c43ae8 --- ...ibilityHearingAidPreferenceController.java | 133 ++++++++++-------- .../accessibility/HearingAidUtils.java | 2 +- .../AvailableMediaBluetoothDeviceUpdater.java | 2 +- .../BluetoothDetailsPairOtherController.java | 4 +- .../ConnectedBluetoothDeviceUpdater.java | 2 +- .../HearingAidPairingDialogFragment.java | 2 +- ...ityHearingAidPreferenceControllerTest.java | 121 ++++++++++++---- .../HearingAidPairingDialogFragmentTest.java | 4 +- .../accessibility/HearingAidUtilsTest.java | 14 +- ...ilableMediaBluetoothDeviceUpdaterTest.java | 9 +- ...uetoothDetailsPairOtherControllerTest.java | 30 ++-- ...oothDetailsRelatedToolsControllerTest.java | 2 +- .../ConnectedBluetoothDeviceUpdaterTest.java | 10 +- ...ailableMediaDeviceGroupControllerTest.java | 2 +- .../slices/BluetoothDevicesSliceTest.java | 2 +- 15 files changed, 215 insertions(+), 124 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java index 4e933894db0..82d23aa17e4 100644 --- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java @@ -19,7 +19,9 @@ package com.android.settings.accessibility; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHapClient; import android.bluetooth.BluetoothHearingAid; +import android.bluetooth.BluetoothLeAudio; import android.bluetooth.BluetoothProfile; import android.content.BroadcastReceiver; import android.content.Context; @@ -41,6 +43,7 @@ import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HapClientProfile; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; @@ -48,9 +51,12 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; +import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; +import java.util.stream.Collectors; /** * Controller that shows and updates the bluetooth device name @@ -64,23 +70,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC private final BroadcastReceiver mHearingAidChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED.equals(intent.getAction())) { - final int state = intent.getIntExtra(BluetoothHearingAid.EXTRA_STATE, - BluetoothHearingAid.STATE_DISCONNECTED); - if (state == BluetoothHearingAid.STATE_CONNECTED) { - updateState(mHearingAidPreference); - } else { - mHearingAidPreference - .setSummary(R.string.accessibility_hearingaid_not_connected_summary); - } - } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) { - final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, - BluetoothAdapter.ERROR); - if (state != BluetoothAdapter.STATE_ON) { - mHearingAidPreference - .setSummary(R.string.accessibility_hearingaid_not_connected_summary); - } - } + updateState(mHearingAidPreference); } }; @@ -107,17 +97,24 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public int getAvailabilityStatus() { - return isHearingAidProfileSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return isHearingAidSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public void onStart() { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); + filter.addAction(BluetoothHapClient.ACTION_HAP_CONNECTION_STATE_CHANGED); + filter.addAction(BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); mContext.registerReceiver(mHearingAidChangedReceiver, filter); mLocalBluetoothManager.getEventManager().registerCallback(this); - mProfileManager.addServiceListener(this); + // Can't get connected hearing aids when hearing aids related profiles are not ready. The + // profiles will be ready after the services are connected. Needs to add listener and + // updates the information when all hearing aids related services are connected. + if (isAnyHearingAidRelatedProfilesNotReady()) { + mProfileManager.addServiceListener(this); + } } @Override @@ -143,6 +140,9 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public CharSequence getSummary() { + if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { + return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary); + } final CachedBluetoothDevice device = getConnectedHearingAidDevice(); if (device == null) { return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary); @@ -150,24 +150,37 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC final int connectedNum = getConnectedHearingAidDeviceNum(); final CharSequence name = device.getName(); - final int side = device.getDeviceSide(); - final CachedBluetoothDevice subDevice = device.getSubDevice(); if (connectedNum > 1) { return mContext.getString(R.string.accessibility_hearingaid_more_device_summary, name); } + + // Check if another side of LE audio hearing aid is connected as a pair + final Set memberDevices = device.getMemberDevice(); + if (memberDevices.stream().anyMatch(m -> m.isConnected())) { + return mContext.getString( + R.string.accessibility_hearingaid_left_and_right_side_device_summary, + name); + } + + // Check if another side of ASHA hearing aid is connected as a pair + final CachedBluetoothDevice subDevice = device.getSubDevice(); if (subDevice != null && subDevice.isConnected()) { return mContext.getString( R.string.accessibility_hearingaid_left_and_right_side_device_summary, name); } - if (side == HearingAidProfile.DeviceSide.SIDE_INVALID) { + + final int side = device.getDeviceSide(); + if (side == HearingAidProfile.DeviceSide.SIDE_LEFT) { return mContext.getString( - R.string.accessibility_hearingaid_active_device_summary, name); + R.string.accessibility_hearingaid_left_side_device_summary, name); + } else if (side == HearingAidProfile.DeviceSide.SIDE_RIGHT) { + return mContext.getString( + R.string.accessibility_hearingaid_right_side_device_summary, name); } - return (side == HearingAidProfile.DeviceSide.SIDE_LEFT) - ? mContext.getString( - R.string.accessibility_hearingaid_left_side_device_summary, name) - : mContext.getString( - R.string.accessibility_hearingaid_right_side_device_summary, name); + + // Invalid side + return mContext.getString( + R.string.accessibility_hearingaid_active_device_summary, name); } @Override @@ -183,10 +196,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public void onServiceConnected() { - // Every registered ProfileService will callback. So we need to use isProfileReady() to - // check is the HearingAidService callback here, not other service. - // When hearing aids service connected, updating the UI. - if (mProfileManager.getHearingAidProfile().isProfileReady()) { + if (!isAnyHearingAidRelatedProfilesNotReady()) { updateState(mHearingAidPreference); mProfileManager.removeServiceListener(this); } @@ -203,38 +213,51 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @VisibleForTesting CachedBluetoothDevice getConnectedHearingAidDevice() { - if (!isHearingAidProfileSupported()) { - return null; - } - - final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); - final List deviceList = hearingAidProfile.getConnectedDevices(); - for (BluetoothDevice obj : deviceList) { - if (!mCachedDeviceManager.isSubDevice(obj)) { - return mCachedDeviceManager.findDevice(obj); - } - } - return null; + final List deviceList = getConnectedHearingAidDeviceList(); + return deviceList.isEmpty() ? null : mCachedDeviceManager.findDevice(deviceList.get(0)); } private int getConnectedHearingAidDeviceNum() { - if (!isHearingAidProfileSupported()) { - return 0; - } - - final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); - final List deviceList = hearingAidProfile.getConnectedDevices(); - return (int) deviceList.stream() - .filter(device -> !mCachedDeviceManager.isSubDevice(device)) - .count(); + return getConnectedHearingAidDeviceList().size(); } - private boolean isHearingAidProfileSupported() { + private List getConnectedHearingAidDeviceList() { + if (!isHearingAidSupported()) { + return new ArrayList<>(); + } + final List deviceList = new ArrayList<>(); + final HapClientProfile hapClientProfile = mProfileManager.getHapClientProfile(); + if (hapClientProfile != null) { + deviceList.addAll(hapClientProfile.getConnectedDevices()); + } + final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); + if (hearingAidProfile != null) { + deviceList.addAll(hearingAidProfile.getConnectedDevices()); + } + return deviceList.stream() + .distinct() + .filter(d -> !mCachedDeviceManager.isSubDevice(d)).collect(Collectors.toList()); + } + + private boolean isHearingAidSupported() { if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { return false; } final List supportedList = mBluetoothAdapter.getSupportedProfiles(); - return supportedList.contains(BluetoothProfile.HEARING_AID); + return supportedList.contains(BluetoothProfile.HEARING_AID) + || supportedList.contains(BluetoothProfile.HAP_CLIENT); + } + + private boolean isAnyHearingAidRelatedProfilesNotReady() { + HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); + if (hearingAidProfile != null && !hearingAidProfile.isProfileReady()) { + return true; + } + HapClientProfile hapClientProfile = mProfileManager.getHapClientProfile(); + if (hapClientProfile != null && !hapClientProfile.isProfileReady()) { + return true; + } + return false; } private LocalBluetoothManager getLocalBluetoothManager() { diff --git a/src/com/android/settings/accessibility/HearingAidUtils.java b/src/com/android/settings/accessibility/HearingAidUtils.java index dcbac5b2b90..85861ce3508 100644 --- a/src/com/android/settings/accessibility/HearingAidUtils.java +++ b/src/com/android/settings/accessibility/HearingAidUtils.java @@ -40,7 +40,7 @@ public final class HearingAidUtils { */ public static void launchHearingAidPairingDialog(FragmentManager fragmentManager, @NonNull CachedBluetoothDevice device) { - if (device.isConnectedHearingAidDevice() + if (device.isConnectedAshaHearingAidDevice() && device.getDeviceMode() == HearingAidProfile.DeviceMode.MODE_BINAURAL && device.getSubDevice() == null) { launchHearingAidPairingDialogInternal(fragmentManager, device); diff --git a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java index 3d8e148d742..c3d3b82a6f4 100644 --- a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java @@ -72,7 +72,7 @@ public class AvailableMediaBluetoothDeviceUpdater extends BluetoothDeviceUpdater } // If device is Hearing Aid or LE Audio, it is compatible with HFP and A2DP. // It would show in Available Devices group. - if (cachedDevice.isConnectedHearingAidDevice() + if (cachedDevice.isConnectedAshaHearingAidDevice() || cachedDevice.isConnectedLeAudioDevice()) { Log.d(TAG, "isFilterMatched() device : " + cachedDevice.getName() + ", the profile is connected."); diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java b/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java index e07b0eda18c..f1227fb5722 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java @@ -107,12 +107,12 @@ public class BluetoothDetailsPairOtherController extends BluetoothDetailsControl } private boolean isOnlyOneSideConnected(CachedBluetoothDevice cachedDevice) { - if (!cachedDevice.isConnectedHearingAidDevice()) { + if (!cachedDevice.isConnectedAshaHearingAidDevice()) { return false; } final CachedBluetoothDevice subDevice = cachedDevice.getSubDevice(); - if (subDevice != null && subDevice.isConnectedHearingAidDevice()) { + if (subDevice != null && subDevice.isConnectedAshaHearingAidDevice()) { return false; } diff --git a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java index 5c3dda362ff..46c4fc31646 100644 --- a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java @@ -72,7 +72,7 @@ public class ConnectedBluetoothDeviceUpdater extends BluetoothDeviceUpdater { } // If device is Hearing Aid or LE Audio, it is compatible with HFP and A2DP. // It would not show in Connected Devices group. - if (cachedDevice.isConnectedHearingAidDevice() + if (cachedDevice.isConnectedAshaHearingAidDevice() || cachedDevice.isConnectedLeAudioDevice()) { return false; } diff --git a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java index 5ae7c1711d8..8bd926a986e 100644 --- a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java +++ b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java @@ -120,7 +120,7 @@ public class HearingAidPairingDialogFragment extends InstrumentedDialogFragment @Override public void onDeviceAttributesChanged() { final CachedBluetoothDevice subDevice = mDevice.getSubDevice(); - if (subDevice != null && subDevice.isConnectedHearingAidDevice()) { + if (subDevice != null && subDevice.isConnectedAshaHearingAidDevice()) { this.dismiss(); } } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java index dc37d234ff3..6de25fc4480 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHapClient; import android.bluetooth.BluetoothHearingAid; import android.bluetooth.BluetoothProfile; import android.content.BroadcastReceiver; @@ -44,6 +45,7 @@ import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settingslib.bluetooth.BluetoothEventManager; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HapClientProfile; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; @@ -61,13 +63,16 @@ import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowApplication; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** Tests for {@link AccessibilityHearingAidPreferenceController}. */ @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class}) public class AccessibilityHearingAidPreferenceControllerTest { private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; + private static final String TEST_DEVICE_ADDRESS_2 = "00:A2:A2:A2:A2:A2"; private static final String TEST_DEVICE_NAME = "TEST_HEARING_AID_BT_DEVICE_NAME"; private static final String HEARING_AID_PREFERENCE = "hearing_aid_preference"; @@ -93,6 +98,8 @@ public class AccessibilityHearingAidPreferenceControllerTest { private LocalBluetoothProfileManager mLocalBluetoothProfileManager; @Mock private HearingAidProfile mHearingAidProfile; + @Mock + private HapClientProfile mHapClientProfile; @Before public void setUp() { @@ -115,10 +122,11 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void getSummary_connectedHearingAidRightSide_connectedRightSideSummary() { + public void getSummary_connectedAshaHearingAidRightSide_connectedRightSideSummary() { when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( HearingAidProfile.DeviceSide.SIDE_RIGHT); when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + mPreferenceController.onStart(); Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED); @@ -129,12 +137,13 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void getSummary_connectedHearingAidBothSide_connectedBothSideSummary() { + public void getSummary_connectedAshaHearingAidBothSide_connectedBothSideSummary() { when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( HearingAidProfile.DeviceSide.SIDE_LEFT); when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true); when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice); when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + mPreferenceController.onStart(); Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED); @@ -145,13 +154,43 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void getSummary_connectedMultipleHearingAids_connectedBothSideSummary() { + public void getSummary_connectedLeAudioHearingAidOneSide_connectedOneSideSummary() { + when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( + HearingAidProfile.DeviceSide.SIDE_INVALID); + when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(new HashSet<>()); + when(mHapClientProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + + mPreferenceController.onStart(); + Intent intent = new Intent(BluetoothHapClient.ACTION_HAP_CONNECTION_STATE_CHANGED); + intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHapClient.STATE_CONNECTED); + sendIntent(intent); + + assertThat(mHearingAidPreference.getSummary().toString().contentEquals( + "TEST_HEARING_AID_BT_DEVICE_NAME active")).isTrue(); + } + + @Test + public void getSummary_connectedLeAudioHearingAidBothSide_connectedBothSideSummary() { + when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(generateMemberDevices()); + when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true); + when(mHapClientProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + + mPreferenceController.onStart(); + Intent intent = new Intent(BluetoothHapClient.ACTION_HAP_CONNECTION_STATE_CHANGED); + intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHapClient.STATE_CONNECTED); + sendIntent(intent); + + assertThat(mHearingAidPreference.getSummary().toString()).isEqualTo( + "TEST_HEARING_AID_BT_DEVICE_NAME, left and right"); + } + + @Test + public void getSummary_connectedMultipleHearingAids_connectedMultipleDevicesSummary() { when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( HearingAidProfile.DeviceSide.SIDE_LEFT); - when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true); - when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice); when(mHearingAidProfile.getConnectedDevices()).thenReturn( generateMultipleHearingAidDeviceList()); + mPreferenceController.onStart(); Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED); @@ -161,17 +200,6 @@ public class AccessibilityHearingAidPreferenceControllerTest { "TEST_HEARING_AID_BT_DEVICE_NAME +1 more")).isTrue(); } - @Test - public void getSummary_disconnectedHearingAid_disconnectedSummary() { - mPreferenceController.onStart(); - Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); - intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_DISCONNECTED); - sendIntent(intent); - - assertThat(mHearingAidPreference.getSummary()).isEqualTo( - mContext.getText(R.string.accessibility_hearingaid_not_connected_summary)); - } - @Test public void getSummary_bluetoothOff_disconnectedSummary() { mPreferenceController.onStart(); @@ -208,8 +236,29 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void onNotSupportHearingAidProfile_isNotAvailable() { - //clear bluetooth supported profile + public void onSupportHearingAidProfile_isAvailable() { + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, + HEARING_AID_PREFERENCE); + mPreferenceController.setPreference(mHearingAidPreference); + + assertThat(mPreferenceController.isAvailable()).isTrue(); + } + + @Test + public void onSupportHapClientProfile_isAvailable() { + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HAP_CLIENT); + mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, + HEARING_AID_PREFERENCE); + mPreferenceController.setPreference(mHearingAidPreference); + + assertThat(mPreferenceController.isAvailable()).isTrue(); + } + + @Test + public void onNotSupportAnyHearingAidRelatedProfile_isNotAvailable() { mShadowBluetoothAdapter.clearSupportedProfiles(); mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, HEARING_AID_PREFERENCE); @@ -231,7 +280,7 @@ public class AccessibilityHearingAidPreferenceControllerTest { @Config(shadows = ShadowAlertDialogCompat.class) public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() { final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class); - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( HearingAidProfile.DeviceMode.MODE_BINAURAL); when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( @@ -246,27 +295,38 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void onServiceConnected_updateSummary() { - mPreferenceController.onStart(); - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); - when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( - HearingAidProfile.DeviceMode.MODE_BINAURAL); + public void onServiceConnected_onHearingAidProfileConnected_updateSummary() { when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( HearingAidProfile.DeviceSide.SIDE_LEFT); when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + mPreferenceController.onStart(); mPreferenceController.onServiceConnected(); assertThat(mHearingAidPreference.getSummary().toString()).isEqualTo( "TEST_HEARING_AID_BT_DEVICE_NAME, left only"); } + @Test + public void onServiceConnected_onHapClientProfileConnected_updateSummary() { + when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( + HearingAidProfile.DeviceSide.SIDE_INVALID); + when(mHapClientProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + + mPreferenceController.onStart(); + mPreferenceController.onServiceConnected(); + + assertThat(mHearingAidPreference.getSummary().toString()).isEqualTo( + "TEST_HEARING_AID_BT_DEVICE_NAME active"); + } + private void setupEnvironment() { ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; mLocalBluetoothManager = Utils.getLocalBtManager(mContext); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter); mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HAP_CLIENT); mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS); mBluetoothAdapter.enable(); @@ -274,10 +334,12 @@ public class AccessibilityHearingAidPreferenceControllerTest { when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); + when(mLocalBluetoothProfileManager.getHapClientProfile()).thenReturn(mHapClientProfile); + when(mHearingAidProfile.isProfileReady()).thenReturn(true); + when(mHapClientProfile.isProfileReady()).thenReturn(true); when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice); when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); when(mCachedBluetoothDevice.getName()).thenReturn(TEST_DEVICE_NAME); - when(mHearingAidProfile.isProfileReady()).thenReturn(true); } private void sendIntent(Intent intent) { @@ -293,9 +355,16 @@ public class AccessibilityHearingAidPreferenceControllerTest { } private List generateMultipleHearingAidDeviceList() { + // Generates different Bluetooth devices for testing multiple devices final List deviceList = new ArrayList<>(2); deviceList.add(mBluetoothDevice); - deviceList.add(mBluetoothDevice); + deviceList.add(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_2)); return deviceList; } + + private Set generateMemberDevices() { + final Set memberDevices = new HashSet<>(); + memberDevices.add(mCachedSubBluetoothDevice); + return memberDevices; + } } diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java index bda60d49995..1623d40e7fd 100644 --- a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java @@ -143,8 +143,8 @@ public class HearingAidPairingDialogFragmentTest { } @Test - public void onDeviceAttributesChanged_subHearingAidDeviceConnected_dialogDismiss() { - when(mCachedSubBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + public void onDeviceAttributesChanged_subAshaHearingAidDeviceConnected_dialogDismiss() { + when(mCachedSubBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice); mFragment.onDeviceAttributesChanged(); diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java index 6fdd210a860..efdda733752 100644 --- a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java @@ -86,8 +86,8 @@ public class HearingAidUtilsTest { } @Test - public void launchHearingAidPairingDialog_deviceNotConnectedHearingAid_noDialog() { - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(false); + public void launchHearingAidPairingDialog_deviceIsNotConnectedAshaHearingAid_noDialog() { + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice); @@ -96,8 +96,8 @@ public class HearingAidUtilsTest { } @Test - public void launchHearingAidPairingDialog_deviceIsModeMonaural_noDialog() { - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + public void launchHearingAidPairingDialog_deviceIsMonauralMode_noDialog() { + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( HearingAidProfile.DeviceMode.MODE_MONAURAL); @@ -109,7 +109,7 @@ public class HearingAidUtilsTest { @Test public void launchHearingAidPairingDialog_deviceHasSubDevice_noDialog() { - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( HearingAidProfile.DeviceMode.MODE_BINAURAL); when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mSubCachedBluetoothDevice); @@ -122,7 +122,7 @@ public class HearingAidUtilsTest { @Test public void launchHearingAidPairingDialog_deviceIsInvalidSide_noDialog() { - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( HearingAidProfile.DeviceMode.MODE_BINAURAL); when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( @@ -136,7 +136,7 @@ public class HearingAidUtilsTest { @Test public void launchHearingAidPairingDialog_dialogShown() { - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( HearingAidProfile.DeviceMode.MODE_BINAURAL); when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( diff --git a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java index 4427127cc65..0b06f3e42f1 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java @@ -205,12 +205,11 @@ public class AvailableMediaBluetoothDeviceUpdaterTest { } @Test - public void onProfileConnectionStateChanged_hearingAidDeviceConnected_notInCall_addPreference() - { + public void onProfileConnectionStateChanged_ashaHearingAidConnected_notInCall_addPreference() { mAudioManager.setMode(AudioManager.MODE_NORMAL); when(mBluetoothDeviceUpdater. isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.HEARING_AID); @@ -219,11 +218,11 @@ public class AvailableMediaBluetoothDeviceUpdaterTest { } @Test - public void onProfileConnectionStateChanged_hearingAidDeviceConnected_inCall_addPreference() { + public void onProfileConnectionStateChanged_ashaHearingAidConnected_inCall_addPreference() { mAudioManager.setMode(AudioManager.MODE_IN_CALL); when(mBluetoothDeviceUpdater. isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.HEARING_AID); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java index ae47698f3a9..9ccdf99ada6 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java @@ -81,8 +81,8 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon } @Test - public void init_isNotConnectedHearingAidDevice_notVisiblePreference() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); + public void init_isNotConnectedAshaHearingAidDevice_notVisiblePreference() { + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); mController.init(mScreen); @@ -91,35 +91,35 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon } @Test - public void isAvailable_isNotConnectedHearingAidDevice_notAvailable() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); + public void isAvailable_isNotConnectedAshaHearingAidDevice_notAvailable() { + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); assertThat(mController.isAvailable()).isFalse(); } @Test - public void isAvailable_notConnectedHearingAidDevice_notAvailable() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + public void isAvailable_isConnectedAshaHearingAidDevice_isMonaural_notAvailable() { + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidProfile.DeviceMode.MODE_MONAURAL); assertThat(mController.isAvailable()).isFalse(); } @Test - public void isAvailable_subDeviceIsConnectedHearingAidDevice_notAvailable() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + public void isAvailable_subDeviceIsConnectedAshaHearingAidDevice_notAvailable() { + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidProfile.DeviceMode.MODE_BINAURAL); - when(mSubCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mSubCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getSubDevice()).thenReturn(mSubCachedDevice); assertThat(mController.isAvailable()).isFalse(); } @Test - public void isAvailable_subDeviceNotConnectedHearingAidDevice_available() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + public void isAvailable_subDeviceIsNotConnectedAshaHearingAidDevice_available() { + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidProfile.DeviceMode.MODE_BINAURAL); - when(mSubCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); + when(mSubCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); when(mCachedDevice.getSubDevice()).thenReturn(mSubCachedDevice); assertThat(mController.isAvailable()).isTrue(); @@ -127,7 +127,7 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon @Test public void isAvailable_subDeviceNotExist_available() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidProfile.DeviceMode.MODE_BINAURAL); when(mCachedDevice.getSubDevice()).thenReturn(null); @@ -146,8 +146,8 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon } @Test - public void refresh_isNotConnectedHearingAidDevice_notVisiblePreference() { - when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); + public void refresh_isNotConnectedAshaHearingAidDevice_notVisiblePreference() { + when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); mController.init(mScreen); mController.refresh(); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java index 31d6397fff6..b0a3433895e 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java @@ -89,7 +89,7 @@ public class BluetoothDetailsRelatedToolsControllerTest extends BluetoothDetails } @Test - public void isAvailable_notHearingAidDevice_notAvailable() { + public void isAvailable_isNotHearingAidDevice_notAvailable() { when(mCachedDevice.isHearingAidDevice()).thenReturn(false); assertThat(mController.isAvailable()).isFalse(); diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java index 7472dc148f2..1f909812bec 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java @@ -218,12 +218,12 @@ public class ConnectedBluetoothDeviceUpdaterTest { } @Test - public void onProfileConnectionStateChanged_hearingAidDeviceConnected_inCall_removePreference() + public void onProfileConnectionStateChanged_ashaHearingAidConnected_inCall_removePreference() { mAudioManager.setMode(AudioManager.MODE_IN_CALL); when(mBluetoothDeviceUpdater. isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.HEARING_AID); @@ -232,12 +232,12 @@ public class ConnectedBluetoothDeviceUpdaterTest { } @Test - public void onProfileConnectionStateChanged_hearingAidDeviceConnected_notInCall_removePreference - () { + public void onProfileConnectionStateChanged_ashaHearingAidConnected_notInCall_removePreference() + { mAudioManager.setMode(AudioManager.MODE_NORMAL); when(mBluetoothDeviceUpdater. isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.HEARING_AID); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java index 2b6250396b1..93ebd3f6f4e 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java @@ -244,7 +244,7 @@ public class AvailableMediaDeviceGroupControllerTest { @Test @Config(shadows = ShadowAlertDialogCompat.class) public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() { - when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( HearingAidProfile.DeviceMode.MODE_BINAURAL); when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSliceTest.java index 2d5a0e9540a..b09fa7d8cbc 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSliceTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSliceTest.java @@ -191,7 +191,7 @@ public class BluetoothDevicesSliceTest { public void getSlice_hasAvailableMediaDevice_shouldBuildPrimaryBluetoothAction() { mockBluetoothDeviceList(1); when(mBluetoothDeviceList.get(0).getDevice().isConnected()).thenReturn(true); - doReturn(true).when(mBluetoothDeviceList.get(0)).isConnectedHearingAidDevice(); + doReturn(true).when(mBluetoothDeviceList.get(0)).isConnectedAshaHearingAidDevice(); doReturn(mBluetoothDeviceList).when(mBluetoothDevicesSlice).getPairedBluetoothDevices(); mBluetoothDevicesSlice.getSlice();