diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java index 8f0ca3e5721..2cb74262f0a 100644 --- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java @@ -39,12 +39,13 @@ import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; 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.Iterator; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; @@ -82,15 +83,13 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC private final LocalBluetoothManager mLocalBluetoothManager; private final BluetoothAdapter mBluetoothAdapter; - //cache value of supporting hearing aid or not - private boolean mHearingAidProfileSupported; + private FragmentManager mFragmentManager; public AccessibilityHearingAidPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); mLocalBluetoothManager = getLocalBluetoothManager(); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - mHearingAidProfileSupported = isHearingAidProfileSupported(); } @Override @@ -101,29 +100,25 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public int getAvailabilityStatus() { - return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return isHearingAidProfileSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public void onStart() { - if (mHearingAidProfileSupported) { - IntentFilter filter = new IntentFilter(); - filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); - filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); - mContext.registerReceiver(mHearingAidChangedReceiver, filter); - } + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); + filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + mContext.registerReceiver(mHearingAidChangedReceiver, filter); } @Override public void onStop() { - if (mHearingAidProfileSupported) { - mContext.unregisterReceiver(mHearingAidChangedReceiver); - } + mContext.unregisterReceiver(mHearingAidChangedReceiver); } @Override public boolean handlePreferenceTreeClick(Preference preference) { - if (TextUtils.equals(preference.getKey(), getPreferenceKey())){ + if (TextUtils.equals(preference.getKey(), getPreferenceKey())) { final CachedBluetoothDevice device = getConnectedHearingAidDevice(); if (device == null) { launchHearingAidInstructionDialog(); @@ -141,7 +136,27 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC if (device == null) { return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary); } - return device.getName(); + + 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); + } + 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) { + return mContext.getString( + R.string.accessibility_hearingaid_active_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); } public void setFragmentManager(FragmentManager fragmentManager) { @@ -150,33 +165,44 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @VisibleForTesting CachedBluetoothDevice getConnectedHearingAidDevice() { - if (!mHearingAidProfileSupported) { + if (!isHearingAidProfileSupported()) { return null; } - if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { - return null; - } - final List deviceList = mLocalBluetoothManager.getProfileManager() - .getHearingAidProfile().getConnectedDevices(); - final Iterator it = deviceList.iterator(); - while (it.hasNext()) { - BluetoothDevice obj = (BluetoothDevice)it.next(); - if (!mLocalBluetoothManager.getCachedDeviceManager().isSubDevice(obj)) { - return mLocalBluetoothManager.getCachedDeviceManager().findDevice(obj); + + final CachedBluetoothDeviceManager deviceManager = + mLocalBluetoothManager.getCachedDeviceManager(); + final HearingAidProfile hearingAidProfile = + mLocalBluetoothManager.getProfileManager().getHearingAidProfile(); + final List deviceList = hearingAidProfile.getConnectedDevices(); + for (BluetoothDevice obj : deviceList) { + if (!deviceManager.isSubDevice(obj)) { + return deviceManager.findDevice(obj); } } return null; } + private int getConnectedHearingAidDeviceNum() { + if (!isHearingAidProfileSupported()) { + return 0; + } + + final CachedBluetoothDeviceManager deviceManager = + mLocalBluetoothManager.getCachedDeviceManager(); + final HearingAidProfile hearingAidProfile = + mLocalBluetoothManager.getProfileManager().getHearingAidProfile(); + final List deviceList = hearingAidProfile.getConnectedDevices(); + return (int) deviceList.stream() + .filter(device -> !deviceManager.isSubDevice(device)) + .count(); + } + private boolean isHearingAidProfileSupported() { if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { return false; } final List supportedList = mBluetoothAdapter.getSupportedProfiles(); - if (supportedList.contains(BluetoothProfile.HEARING_AID)) { - return true; - } - return false; + return supportedList.contains(BluetoothProfile.HEARING_AID); } private LocalBluetoothManager getLocalBluetoothManager() { diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java index a45564812e2..1b8c8c3b5a7 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java @@ -18,9 +18,7 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -48,7 +46,6 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -63,7 +60,6 @@ import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class}) public class AccessibilityHearingAidPreferenceControllerTest { private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; @@ -82,6 +78,8 @@ public class AccessibilityHearingAidPreferenceControllerTest { @Mock private CachedBluetoothDevice mCachedBluetoothDevice; @Mock + private CachedBluetoothDevice mCachedSubBluetoothDevice; + @Mock private CachedBluetoothDeviceManager mCachedDeviceManager; @Mock private LocalBluetoothManager mLocalBluetoothManager; @@ -111,18 +109,54 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void onHearingAidStateChanged_connected_updateHearingAidSummary() { + public void getSummary_connectedHearingAidRightSide_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); sendIntent(intent); - assertThat(mHearingAidPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME); + assertThat(mHearingAidPreference.getSummary().toString().contentEquals( + "TEST_HEARING_AID_BT_DEVICE_NAME, right only")).isTrue(); } @Test - public void onHearingAidStateChanged_disconnected_updateHearingAidSummary() { + public void getSummary_connectedHearingAidBothSide_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); + sendIntent(intent); + + assertThat(mHearingAidPreference.getSummary().toString().contentEquals( + "TEST_HEARING_AID_BT_DEVICE_NAME, left and right")).isTrue(); + } + + @Test + public void getSummary_connectedMultipleHearingAids_connectedBothSideSummary() { + 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); + sendIntent(intent); + + assertThat(mHearingAidPreference.getSummary().toString().contentEquals( + "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); @@ -133,7 +167,7 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void onBluetoothStateChanged_bluetoothOff_updateHearingAidSummary() { + public void getSummary_bluetoothOff_disconnectedSummary() { mPreferenceController.onStart(); Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED); intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF); @@ -168,19 +202,14 @@ public class AccessibilityHearingAidPreferenceControllerTest { } @Test - public void onNotSupportHearingAidProfile_doNotDoReceiverOperation() { + public void onNotSupportHearingAidProfile_isNotAvailable() { //clear bluetooth supported profile mShadowBluetoothAdapter.clearSupportedProfiles(); mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, HEARING_AID_PREFERENCE); mPreferenceController.setPreference(mHearingAidPreference); - //not call registerReceiver() - mPreferenceController.onStart(); - verify(mContext, never()).registerReceiver(any(), any()); - //not call unregisterReceiver() - mPreferenceController.onStop(); - verify(mContext, never()).unregisterReceiver(any()); + assertThat(mPreferenceController.isAvailable()).isFalse(); } @Test @@ -224,4 +253,11 @@ public class AccessibilityHearingAidPreferenceControllerTest { deviceList.add(mBluetoothDevice); return deviceList; } + + private List generateMultipleHearingAidDeviceList() { + final List deviceList = new ArrayList<>(2); + deviceList.add(mBluetoothDevice); + deviceList.add(mBluetoothDevice); + return deviceList; + } }