diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 010d7384330cc..b929f8c03905b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -77,9 +77,7 @@ public class CachedBluetoothDevice implements Comparable private final LocalBluetoothProfileManager mProfileManager; private final Object mProfileLock = new Object(); BluetoothDevice mDevice; - private int mDeviceSide; - private int mDeviceMode; - private long mHiSyncId; + private HearingAidInfo mHearingAidInfo; private int mGroupId; // Need this since there is no method for getting RSSI @@ -160,9 +158,6 @@ public class CachedBluetoothDevice implements Comparable mProfileManager = profileManager; mDevice = device; fillData(); - mHiSyncId = BluetoothHearingAid.HI_SYNC_ID_INVALID; - mDeviceSide = HearingAidProfile.DeviceSide.SIDE_INVALID; - mDeviceMode = HearingAidProfile.DeviceMode.MODE_INVALID; mGroupId = BluetoothCsipSetCoordinator.GROUP_ID_INVALID; initDrawableCache(); mUnpairing = false; @@ -341,28 +336,34 @@ public class CachedBluetoothDevice implements Comparable connectDevice(); } - public int getDeviceSide() { - return mDeviceSide; + public HearingAidInfo getHearingAidInfo() { + return mHearingAidInfo; } - public void setDeviceSide(int side) { - mDeviceSide = side; + public void setHearingAidInfo(HearingAidInfo hearingAidInfo) { + mHearingAidInfo = hearingAidInfo; + } + + /** + * @return {@code true} if {@code cachedBluetoothDevice} is hearing aid device + */ + public boolean isHearingAidDevice() { + return mHearingAidInfo != null; + } + + public int getDeviceSide() { + return mHearingAidInfo != null + ? mHearingAidInfo.getSide() : HearingAidInfo.DeviceSide.SIDE_INVALID; } public int getDeviceMode() { - return mDeviceMode; - } - - public void setDeviceMode(int mode) { - mDeviceMode = mode; + return mHearingAidInfo != null + ? mHearingAidInfo.getMode() : HearingAidInfo.DeviceMode.MODE_INVALID; } public long getHiSyncId() { - return mHiSyncId; - } - - public void setHiSyncId(long id) { - mHiSyncId = id; + return mHearingAidInfo != null + ? mHearingAidInfo.getHiSyncId() : BluetoothHearingAid.HI_SYNC_ID_INVALID; } /** @@ -1169,9 +1170,10 @@ public class CachedBluetoothDevice implements Comparable if (subDevice != null && subDevice.isConnected()) { stringRes = R.string.bluetooth_hearing_aid_left_and_right_active; } else { - if (mDeviceSide == HearingAidProfile.DeviceSide.SIDE_LEFT) { + int deviceSide = getDeviceSide(); + if (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT) { stringRes = R.string.bluetooth_hearing_aid_left_active; - } else if (mDeviceSide == HearingAidProfile.DeviceSide.SIDE_RIGHT) { + } else if (deviceSide == HearingAidInfo.DeviceSide.SIDE_RIGHT) { stringRes = R.string.bluetooth_hearing_aid_right_active; } else { stringRes = R.string.bluetooth_active_no_battery_level; @@ -1397,7 +1399,7 @@ public class CachedBluetoothDevice implements Comparable * The device may be an ASHA hearing aid that supports {@link HearingAidProfile} or a LeAudio * hearing aid that supports {@link HapClientProfile} and {@link LeAudioProfile}. */ - public boolean isHearingAidDevice() { + public boolean isConnectedHearingAidDevice() { return isConnectedAshaHearingAidDevice() || isConnectedLeAudioHearingAidDevice(); } @@ -1429,17 +1431,17 @@ public class CachedBluetoothDevice implements Comparable BluetoothDevice tmpDevice = mDevice; final short tmpRssi = mRssi; final boolean tmpJustDiscovered = mJustDiscovered; - final int tmpDeviceSide = mDeviceSide; + final HearingAidInfo tmpHearingAidInfo = mHearingAidInfo; // Set main device from sub device mDevice = mSubDevice.mDevice; mRssi = mSubDevice.mRssi; mJustDiscovered = mSubDevice.mJustDiscovered; - mDeviceSide = mSubDevice.mDeviceSide; + mHearingAidInfo = mSubDevice.mHearingAidInfo; // Set sub device from backup mSubDevice.mDevice = tmpDevice; mSubDevice.mRssi = tmpRssi; mSubDevice.mJustDiscovered = tmpJustDiscovered; - mSubDevice.mDeviceSide = tmpDeviceSide; + mSubDevice.mHearingAidInfo = tmpHearingAidInfo; fetchActiveDevices(); } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java index cf4e1ee99f921..ebfec0aee1b7f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java @@ -27,7 +27,7 @@ import java.util.List; import java.util.Set; /** - * HearingAidDeviceManager manages the set of remote HearingAid Bluetooth devices. + * HearingAidDeviceManager manages the set of remote HearingAid(ASHA) Bluetooth devices. */ public class HearingAidDeviceManager { private static final String TAG = "HearingAidDeviceManager"; @@ -44,12 +44,12 @@ public class HearingAidDeviceManager { void initHearingAidDeviceIfNeeded(CachedBluetoothDevice newDevice) { long hiSyncId = getHiSyncId(newDevice.getDevice()); if (isValidHiSyncId(hiSyncId)) { - // Once hiSyncId is valid, assign hiSyncId - newDevice.setHiSyncId(hiSyncId); - final int side = getDeviceSide(newDevice.getDevice()); - final int mode = getDeviceMode(newDevice.getDevice()); - newDevice.setDeviceSide(side); - newDevice.setDeviceMode(mode); + // Once hiSyncId is valid, assign hearing aid info + final HearingAidInfo.Builder infoBuilder = new HearingAidInfo.Builder() + .setAshaDeviceSide(getDeviceSide(newDevice.getDevice())) + .setAshaDeviceMode(getDeviceMode(newDevice.getDevice())) + .setHiSyncId(hiSyncId); + newDevice.setHearingAidInfo(infoBuilder.build()); } } @@ -123,12 +123,14 @@ public class HearingAidDeviceManager { final long newHiSyncId = getHiSyncId(cachedDevice.getDevice()); // Do nothing if there is no HiSyncId on Bluetooth device if (isValidHiSyncId(newHiSyncId)) { - cachedDevice.setHiSyncId(newHiSyncId); + // Once hiSyncId is valid, assign hearing aid info + final HearingAidInfo.Builder infoBuilder = new HearingAidInfo.Builder() + .setAshaDeviceSide(getDeviceSide(cachedDevice.getDevice())) + .setAshaDeviceMode(getDeviceMode(cachedDevice.getDevice())) + .setHiSyncId(newHiSyncId); + cachedDevice.setHearingAidInfo(infoBuilder.build()); + newSyncIdSet.add(newHiSyncId); - final int side = getDeviceSide(cachedDevice.getDevice()); - final int mode = getDeviceMode(cachedDevice.getDevice()); - cachedDevice.setDeviceSide(side); - cachedDevice.setDeviceMode(mode); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java new file mode 100644 index 0000000000000..ef08c924b8443 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.bluetooth; + +import android.annotation.IntDef; +import android.bluetooth.BluetoothHearingAid; +import android.bluetooth.BluetoothLeAudio; +import android.util.SparseIntArray; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Objects; + +/** Hearing aids information and constants that shared within hearing aids related profiles */ +public class HearingAidInfo { + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + DeviceSide.SIDE_INVALID, + DeviceSide.SIDE_LEFT, + DeviceSide.SIDE_RIGHT, + DeviceSide.SIDE_LEFT_AND_RIGHT, + }) + + /** Side definition for hearing aids. */ + public @interface DeviceSide { + int SIDE_INVALID = -1; + int SIDE_LEFT = 0; + int SIDE_RIGHT = 1; + int SIDE_LEFT_AND_RIGHT = 2; + } + + @Retention(java.lang.annotation.RetentionPolicy.SOURCE) + @IntDef({ + DeviceMode.MODE_INVALID, + DeviceMode.MODE_MONAURAL, + DeviceMode.MODE_BINAURAL, + DeviceMode.MODE_BANDED, + }) + + /** Mode definition for hearing aids. */ + public @interface DeviceMode { + int MODE_INVALID = -1; + int MODE_MONAURAL = 0; + int MODE_BINAURAL = 1; + int MODE_BANDED = 2; + } + + private final int mSide; + private final int mMode; + private final long mHiSyncId; + + private HearingAidInfo(int side, int mode, long hiSyncId) { + mSide = side; + mMode = mode; + mHiSyncId = hiSyncId; + } + + @DeviceSide + public int getSide() { + return mSide; + } + + @DeviceMode + public int getMode() { + return mMode; + } + + public long getHiSyncId() { + return mHiSyncId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof HearingAidInfo)) { + return false; + } + HearingAidInfo that = (HearingAidInfo) o; + return mSide == that.mSide && mMode == that.mMode && mHiSyncId == that.mHiSyncId; + } + + @Override + public int hashCode() { + return Objects.hash(mSide, mMode, mHiSyncId); + } + + @Override + public String toString() { + return "HearingAidInfo{" + + "mSide=" + mSide + + ", mMode=" + mMode + + ", mHiSyncId=" + mHiSyncId + + '}'; + } + + @DeviceSide + private static int convertAshaDeviceSideToInternalSide(int ashaDeviceSide) { + return ASHA_DEVICE_SIDE_TO_INTERNAL_SIDE_MAPPING.get( + ashaDeviceSide, DeviceSide.SIDE_INVALID); + } + + @DeviceMode + private static int convertAshaDeviceModeToInternalMode(int ashaDeviceMode) { + return ASHA_DEVICE_MODE_TO_INTERNAL_MODE_MAPPING.get( + ashaDeviceMode, DeviceMode.MODE_INVALID); + } + + @DeviceSide + private static int convertLeAudioLocationToInternalSide(int leAudioLocation) { + boolean isLeft = (leAudioLocation & LE_AUDIO_LOCATION_LEFT) != 0; + boolean isRight = (leAudioLocation & LE_AUDIO_LOCATION_RIGHT) != 0; + if (isLeft && isRight) { + return DeviceSide.SIDE_LEFT_AND_RIGHT; + } else if (isLeft) { + return DeviceSide.SIDE_LEFT; + } else if (isRight) { + return DeviceSide.SIDE_RIGHT; + } + return DeviceSide.SIDE_INVALID; + } + + @DeviceMode + private static int convertHapDeviceTypeToInternalMode(int hapDeviceType) { + return HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING.get(hapDeviceType, DeviceMode.MODE_INVALID); + } + + /** Builder class for constructing {@link HearingAidInfo} objects. */ + public static final class Builder { + private int mSide = DeviceSide.SIDE_INVALID; + private int mMode = DeviceMode.MODE_INVALID; + private long mHiSyncId = BluetoothHearingAid.HI_SYNC_ID_INVALID; + + /** + * Configure the hearing device mode. + * @param ashaDeviceMode one of the hearing aid device modes defined in HearingAidProfile + * {@link HearingAidProfile.DeviceMode} + */ + public Builder setAshaDeviceMode(int ashaDeviceMode) { + mMode = convertAshaDeviceModeToInternalMode(ashaDeviceMode); + return this; + } + + /** + * Configure the hearing device mode. + * @param hapDeviceType one of the hearing aid device types defined in HapClientProfile + * {@link HapClientProfile.HearingAidType} + */ + public Builder setHapDeviceType(int hapDeviceType) { + mMode = convertHapDeviceTypeToInternalMode(hapDeviceType); + return this; + } + + /** + * Configure the hearing device side. + * @param ashaDeviceSide one of the hearing aid device sides defined in HearingAidProfile + * {@link HearingAidProfile.DeviceSide} + */ + public Builder setAshaDeviceSide(int ashaDeviceSide) { + mSide = convertAshaDeviceSideToInternalSide(ashaDeviceSide); + return this; + } + + /** + * Configure the hearing device side. + * @param leAudioLocation one of the audio location defined in BluetoothLeAudio + * {@link BluetoothLeAudio.AudioLocation} + */ + public Builder setLeAudioLocation(int leAudioLocation) { + mSide = convertLeAudioLocationToInternalSide(leAudioLocation); + return this; + } + + /** + * Configure the hearing aid hiSyncId. + * @param hiSyncId the ASHA hearing aid id + */ + public Builder setHiSyncId(long hiSyncId) { + mHiSyncId = hiSyncId; + return this; + } + + /** Build the configured {@link HearingAidInfo} */ + public HearingAidInfo build() { + return new HearingAidInfo(mSide, mMode, mHiSyncId); + } + } + + private static final int LE_AUDIO_LOCATION_LEFT = + BluetoothLeAudio.AUDIO_LOCATION_FRONT_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_BACK_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_FRONT_LEFT_OF_CENTER + | BluetoothLeAudio.AUDIO_LOCATION_SIDE_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_TOP_FRONT_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_TOP_BACK_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_TOP_SIDE_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_BOTTOM_FRONT_LEFT + | BluetoothLeAudio.AUDIO_LOCATION_FRONT_LEFT_WIDE + | BluetoothLeAudio.AUDIO_LOCATION_LEFT_SURROUND; + + private static final int LE_AUDIO_LOCATION_RIGHT = + BluetoothLeAudio.AUDIO_LOCATION_FRONT_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_BACK_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_FRONT_RIGHT_OF_CENTER + | BluetoothLeAudio.AUDIO_LOCATION_SIDE_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_TOP_FRONT_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_TOP_BACK_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_TOP_SIDE_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_BOTTOM_FRONT_RIGHT + | BluetoothLeAudio.AUDIO_LOCATION_FRONT_RIGHT_WIDE + | BluetoothLeAudio.AUDIO_LOCATION_RIGHT_SURROUND; + + private static final SparseIntArray ASHA_DEVICE_SIDE_TO_INTERNAL_SIDE_MAPPING; + private static final SparseIntArray ASHA_DEVICE_MODE_TO_INTERNAL_MODE_MAPPING; + private static final SparseIntArray HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING; + + static { + ASHA_DEVICE_SIDE_TO_INTERNAL_SIDE_MAPPING = new SparseIntArray(); + ASHA_DEVICE_SIDE_TO_INTERNAL_SIDE_MAPPING.put( + HearingAidProfile.DeviceSide.SIDE_INVALID, DeviceSide.SIDE_INVALID); + ASHA_DEVICE_SIDE_TO_INTERNAL_SIDE_MAPPING.put( + HearingAidProfile.DeviceSide.SIDE_LEFT, DeviceSide.SIDE_LEFT); + ASHA_DEVICE_SIDE_TO_INTERNAL_SIDE_MAPPING.put( + HearingAidProfile.DeviceSide.SIDE_RIGHT, DeviceSide.SIDE_RIGHT); + + ASHA_DEVICE_MODE_TO_INTERNAL_MODE_MAPPING = new SparseIntArray(); + ASHA_DEVICE_MODE_TO_INTERNAL_MODE_MAPPING.put( + HearingAidProfile.DeviceMode.MODE_INVALID, DeviceMode.MODE_INVALID); + ASHA_DEVICE_MODE_TO_INTERNAL_MODE_MAPPING.put( + HearingAidProfile.DeviceMode.MODE_MONAURAL, DeviceMode.MODE_MONAURAL); + ASHA_DEVICE_MODE_TO_INTERNAL_MODE_MAPPING.put( + HearingAidProfile.DeviceMode.MODE_BINAURAL, DeviceMode.MODE_BINAURAL); + + HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING = new SparseIntArray(); + HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING.put( + HapClientProfile.HearingAidType.TYPE_INVALID, DeviceMode.MODE_INVALID); + HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING.put( + HapClientProfile.HearingAidType.TYPE_BINAURAL, DeviceMode.MODE_BINAURAL); + HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING.put( + HapClientProfile.HearingAidType.TYPE_MONAURAL, DeviceMode.MODE_MONAURAL); + HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING.put( + HapClientProfile.HearingAidType.TYPE_BANDED, DeviceMode.MODE_BANDED); + HAP_DEVICE_TYPE_TO_INTERNAL_MODE_MAPPING.put( + HapClientProfile.HearingAidType.TYPE_RFU, DeviceMode.MODE_INVALID); + + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 4e9073ce5a61e..a3c2e70c7da40 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -345,25 +345,44 @@ public class LocalBluetoothProfileManager { Log.i(TAG, "Failed to connect " + mProfile + " device"); } - if (getHearingAidProfile() != null && - mProfile instanceof HearingAidProfile && - (newState == BluetoothProfile.STATE_CONNECTED)) { - final int side = getHearingAidProfile().getDeviceSide(cachedDevice.getDevice()); - final int mode = getHearingAidProfile().getDeviceMode(cachedDevice.getDevice()); - cachedDevice.setDeviceSide(side); - cachedDevice.setDeviceMode(mode); + if (getHearingAidProfile() != null + && mProfile instanceof HearingAidProfile + && (newState == BluetoothProfile.STATE_CONNECTED)) { // Check if the HiSyncID has being initialized if (cachedDevice.getHiSyncId() == BluetoothHearingAid.HI_SYNC_ID_INVALID) { long newHiSyncId = getHearingAidProfile().getHiSyncId(cachedDevice.getDevice()); if (newHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID) { - cachedDevice.setHiSyncId(newHiSyncId); + final BluetoothDevice device = cachedDevice.getDevice(); + final HearingAidInfo.Builder infoBuilder = new HearingAidInfo.Builder() + .setAshaDeviceSide(getHearingAidProfile().getDeviceSide(device)) + .setAshaDeviceMode(getHearingAidProfile().getDeviceMode(device)) + .setHiSyncId(newHiSyncId); + cachedDevice.setHearingAidInfo(infoBuilder.build()); } } - HearingAidStatsLogUtils.logHearingAidInfo(cachedDevice); } + final boolean isHapClientProfile = getHapClientProfile() != null + && mProfile instanceof HapClientProfile; + final boolean isLeAudioProfile = getLeAudioProfile() != null + && mProfile instanceof LeAudioProfile; + final boolean isHapClientOrLeAudioProfile = isHapClientProfile || isLeAudioProfile; + if (isHapClientOrLeAudioProfile && newState == BluetoothProfile.STATE_CONNECTED) { + + // Checks if both profiles are connected to the device. Hearing aid info need + // to be retrieved from these profiles separately. + if (cachedDevice.isConnectedLeAudioHearingAidDevice()) { + final BluetoothDevice device = cachedDevice.getDevice(); + final HearingAidInfo.Builder infoBuilder = new HearingAidInfo.Builder() + .setLeAudioLocation(getLeAudioProfile().getAudioLocation(device)) + .setHapDeviceType(getHapClientProfile().getHearingAidType(device)); + cachedDevice.setHearingAidInfo(infoBuilder.build()); + HearingAidStatsLogUtils.logHearingAidInfo(cachedDevice); + } + } + if (getCsipSetCoordinatorProfile() != null && mProfile instanceof CsipSetCoordinatorProfile && newState == BluetoothProfile.STATE_CONNECTED) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java index 61802a87361cf..f06623d0bd4a0 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java @@ -327,8 +327,10 @@ public class CachedBluetoothDeviceManagerTest { when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); - cachedDevice1.setHiSyncId(HISYNCID1); - cachedDevice2.setHiSyncId(HISYNCID1); + cachedDevice1.setHearingAidInfo( + new HearingAidInfo.Builder().setHiSyncId(HISYNCID1).build()); + cachedDevice2.setHearingAidInfo( + new HearingAidInfo.Builder().setHiSyncId(HISYNCID1).build()); cachedDevice1.setSubDevice(cachedDevice2); // Call onDeviceUnpaired for the one in mCachedDevices. diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 864725ba600c8..1f518ec17f55d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -358,7 +358,7 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.getConnectionSummary()).isNull(); // Set device as Active for Hearing Aid and test connection state summary - mCachedDevice.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_LEFT); + mCachedDevice.setHearingAidInfo(getLeftAshaHearingAidInfo()); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active, left only"); @@ -403,7 +403,7 @@ public class CachedBluetoothDeviceTest { // 1. Profile: {HEARING_AID, Connected, Active, Right ear} // 2. Audio Manager: In Call updateProfileStatus(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); - mCachedDevice.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_RIGHT); + mCachedDevice.setHearingAidInfo(getRightAshaHearingAidInfo()); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID); mAudioManager.setMode(AudioManager.MODE_IN_CALL); @@ -417,9 +417,9 @@ public class CachedBluetoothDeviceTest { // Arrange: // 1. Profile: {HEARING_AID, Connected, Active, Both ear} // 2. Audio Manager: In Call - mCachedDevice.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_RIGHT); + mCachedDevice.setHearingAidInfo(getRightAshaHearingAidInfo()); updateProfileStatus(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); - mSubCachedDevice.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_LEFT); + mSubCachedDevice.setHearingAidInfo(getLeftAshaHearingAidInfo()); updateSubDeviceProfileStatus(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.setSubDevice(mSubCachedDevice); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID); @@ -969,10 +969,10 @@ public class CachedBluetoothDeviceTest { mCachedDevice.mRssi = RSSI_1; mCachedDevice.mJustDiscovered = JUSTDISCOVERED_1; - mCachedDevice.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_LEFT); + mCachedDevice.setHearingAidInfo(getLeftAshaHearingAidInfo()); mSubCachedDevice.mRssi = RSSI_2; mSubCachedDevice.mJustDiscovered = JUSTDISCOVERED_2; - mSubCachedDevice.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_RIGHT); + mSubCachedDevice.setHearingAidInfo(getRightAshaHearingAidInfo()); mCachedDevice.setSubDevice(mSubCachedDevice); mCachedDevice.switchSubDeviceContent(); @@ -980,13 +980,11 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.mRssi).isEqualTo(RSSI_2); assertThat(mCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_2); assertThat(mCachedDevice.mDevice).isEqualTo(mSubDevice); - assertThat(mCachedDevice.getDeviceSide()).isEqualTo( - HearingAidProfile.DeviceSide.SIDE_RIGHT); + assertThat(mCachedDevice.getDeviceSide()).isEqualTo(HearingAidInfo.DeviceSide.SIDE_RIGHT); assertThat(mSubCachedDevice.mRssi).isEqualTo(RSSI_1); assertThat(mSubCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_1); assertThat(mSubCachedDevice.mDevice).isEqualTo(mDevice); - assertThat(mSubCachedDevice.getDeviceSide()).isEqualTo( - HearingAidProfile.DeviceSide.SIDE_LEFT); + assertThat(mSubCachedDevice.getDeviceSide()).isEqualTo(HearingAidInfo.DeviceSide.SIDE_LEFT); } @Test @@ -1080,7 +1078,7 @@ public class CachedBluetoothDeviceTest { updateProfileStatus(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.isHearingAidDevice()).isTrue(); + assertThat(mCachedDevice.isConnectedHearingAidDevice()).isTrue(); } @Test @@ -1091,7 +1089,7 @@ public class CachedBluetoothDeviceTest { updateProfileStatus(mHapClientProfile, BluetoothProfile.STATE_CONNECTED); updateProfileStatus(mLeAudioProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.isHearingAidDevice()).isTrue(); + assertThat(mCachedDevice.isConnectedHearingAidDevice()).isTrue(); } @Test @@ -1104,6 +1102,17 @@ public class CachedBluetoothDeviceTest { updateProfileStatus(mHapClientProfile, BluetoothProfile.STATE_DISCONNECTED); updateProfileStatus(mLeAudioProfile, BluetoothProfile.STATE_DISCONNECTED); - assertThat(mCachedDevice.isHearingAidDevice()).isFalse(); + assertThat(mCachedDevice.isConnectedHearingAidDevice()).isFalse(); + } + + private HearingAidInfo getLeftAshaHearingAidInfo() { + return new HearingAidInfo.Builder() + .setAshaDeviceSide(HearingAidProfile.DeviceSide.SIDE_LEFT) + .build(); + } + private HearingAidInfo getRightAshaHearingAidInfo() { + return new HearingAidInfo.Builder() + .setAshaDeviceSide(HearingAidProfile.DeviceSide.SIDE_RIGHT) + .build(); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java index 611b0a4a28b8d..470d8e07f1f82 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java @@ -17,6 +17,7 @@ package com.android.settingslib.bluetooth; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -106,7 +107,7 @@ public class HearingAidDeviceManagerTest { * deviceSide, deviceMode. */ @Test - public void initHearingAidDeviceIfNeeded_validHiSyncId_setHearingAidInfos() { + public void initHearingAidDeviceIfNeeded_validHiSyncId_setHearingAidInfo() { when(mHearingAidProfile.getHiSyncId(mDevice1)).thenReturn(HISYNCID1); when(mHearingAidProfile.getDeviceMode(mDevice1)).thenReturn( HearingAidProfile.DeviceMode.MODE_BINAURAL); @@ -118,21 +119,22 @@ public class HearingAidDeviceManagerTest { assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1); assertThat(mCachedDevice1.getDeviceMode()).isEqualTo( - HearingAidProfile.DeviceMode.MODE_BINAURAL); + HearingAidInfo.DeviceMode.MODE_BINAURAL); assertThat(mCachedDevice1.getDeviceSide()).isEqualTo( - HearingAidProfile.DeviceSide.SIDE_RIGHT); + HearingAidInfo.DeviceSide.SIDE_RIGHT); } /** * Test initHearingAidDeviceIfNeeded, an invalid HiSyncId will not be assigned */ @Test - public void initHearingAidDeviceIfNeeded_invalidHiSyncId_notToSetHiSyncId() { + public void initHearingAidDeviceIfNeeded_invalidHiSyncId_notToSetHearingAidInfo() { when(mHearingAidProfile.getHiSyncId(mDevice1)).thenReturn( BluetoothHearingAid.HI_SYNC_ID_INVALID); + mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(mCachedDevice1); - verify(mCachedDevice1, never()).setHiSyncId(anyLong()); + verify(mCachedDevice1, never()).setHearingAidInfo(any(HearingAidInfo.class)); } /** @@ -140,9 +142,10 @@ public class HearingAidDeviceManagerTest { */ @Test public void setSubDeviceIfNeeded_sameHiSyncId_setSubDevice() { - mCachedDevice1.setHiSyncId(HISYNCID1); - mCachedDevice2.setHiSyncId(HISYNCID1); + mCachedDevice1.setHearingAidInfo(getLeftAshaHearingAidInfo(HISYNCID1)); + mCachedDevice2.setHearingAidInfo(getRightAshaHearingAidInfo(HISYNCID1)); mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + mHearingAidDeviceManager.setSubDeviceIfNeeded(mCachedDevice2); assertThat(mCachedDevice1.getSubDevice()).isEqualTo(mCachedDevice2); @@ -153,9 +156,10 @@ public class HearingAidDeviceManagerTest { */ @Test public void setSubDeviceIfNeeded_differentHiSyncId_notSetSubDevice() { - mCachedDevice1.setHiSyncId(HISYNCID1); - mCachedDevice2.setHiSyncId(HISYNCID2); + mCachedDevice1.setHearingAidInfo(getLeftAshaHearingAidInfo(HISYNCID1)); + mCachedDevice2.setHearingAidInfo(getRightAshaHearingAidInfo(HISYNCID2)); mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + mHearingAidDeviceManager.setSubDeviceIfNeeded(mCachedDevice2); assertThat(mCachedDevice1.getSubDevice()).isNull(); @@ -276,9 +280,9 @@ public class HearingAidDeviceManagerTest { assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1); assertThat(mCachedDevice1.getDeviceMode()).isEqualTo( - HearingAidProfile.DeviceMode.MODE_BINAURAL); + HearingAidInfo.DeviceMode.MODE_BINAURAL); assertThat(mCachedDevice1.getDeviceSide()).isEqualTo( - HearingAidProfile.DeviceSide.SIDE_RIGHT); + HearingAidInfo.DeviceSide.SIDE_RIGHT); verify(mHearingAidDeviceManager).onHiSyncIdChanged(HISYNCID1); } @@ -389,11 +393,9 @@ public class HearingAidDeviceManagerTest { @Test public void onProfileConnectionStateChanged_disconnected_mainDevice_subDeviceConnected_switch() { - when(mCachedDevice1.getHiSyncId()).thenReturn(HISYNCID1); - mCachedDevice1.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_LEFT); - when(mCachedDevice2.getHiSyncId()).thenReturn(HISYNCID1); + mCachedDevice1.setHearingAidInfo(getLeftAshaHearingAidInfo(HISYNCID1)); + mCachedDevice2.setHearingAidInfo(getRightAshaHearingAidInfo(HISYNCID1)); when(mCachedDevice2.isConnected()).thenReturn(true); - mCachedDevice2.setDeviceSide(HearingAidProfile.DeviceSide.SIDE_RIGHT); mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); mCachedDevice1.setSubDevice(mCachedDevice2); @@ -404,10 +406,8 @@ public class HearingAidDeviceManagerTest { assertThat(mCachedDevice1.mDevice).isEqualTo(mDevice2); assertThat(mCachedDevice2.mDevice).isEqualTo(mDevice1); - assertThat(mCachedDevice1.getDeviceSide()).isEqualTo( - HearingAidProfile.DeviceSide.SIDE_RIGHT); - assertThat(mCachedDevice2.getDeviceSide()).isEqualTo( - HearingAidProfile.DeviceSide.SIDE_LEFT); + assertThat(mCachedDevice1.getDeviceSide()).isEqualTo(HearingAidInfo.DeviceSide.SIDE_RIGHT); + assertThat(mCachedDevice2.getDeviceSide()).isEqualTo(HearingAidInfo.DeviceSide.SIDE_LEFT); verify(mCachedDevice1).refresh(); } @@ -455,4 +455,18 @@ public class HearingAidDeviceManagerTest { assertThat(mHearingAidDeviceManager.findMainDevice(mCachedDevice2)). isEqualTo(mCachedDevice1); } + + private HearingAidInfo getLeftAshaHearingAidInfo(long hiSyncId) { + return new HearingAidInfo.Builder() + .setAshaDeviceSide(HearingAidInfo.DeviceSide.SIDE_LEFT) + .setHiSyncId(hiSyncId) + .build(); + } + + private HearingAidInfo getRightAshaHearingAidInfo(long hiSyncId) { + return new HearingAidInfo.Builder() + .setAshaDeviceSide(HearingAidInfo.DeviceSide.SIDE_RIGHT) + .setHiSyncId(hiSyncId) + .build(); + } }