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();