diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java index 3dde687328c..4e933894db0 100644 --- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java @@ -43,6 +43,7 @@ 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.bluetooth.LocalBluetoothProfileManager; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -55,7 +56,8 @@ import java.util.concurrent.FutureTask; * Controller that shows and updates the bluetooth device name */ public class AccessibilityHearingAidPreferenceController extends BasePreferenceController - implements LifecycleObserver, OnStart, OnStop, BluetoothCallback { + implements LifecycleObserver, OnStart, OnStop, BluetoothCallback, + LocalBluetoothProfileManager.ServiceListener { private static final String TAG = "AccessibilityHearingAidPreferenceController"; private Preference mHearingAidPreference; @@ -84,12 +86,16 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC private final LocalBluetoothManager mLocalBluetoothManager; private final BluetoothAdapter mBluetoothAdapter; + private final LocalBluetoothProfileManager mProfileManager; + private final CachedBluetoothDeviceManager mCachedDeviceManager; private FragmentManager mFragmentManager; public AccessibilityHearingAidPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); mLocalBluetoothManager = getLocalBluetoothManager(); + mProfileManager = mLocalBluetoothManager.getProfileManager(); + mCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager(); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); } @@ -111,12 +117,14 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); mContext.registerReceiver(mHearingAidChangedReceiver, filter); mLocalBluetoothManager.getEventManager().registerCallback(this); + mProfileManager.addServiceListener(this); } @Override public void onStop() { mContext.unregisterReceiver(mHearingAidChangedReceiver); mLocalBluetoothManager.getEventManager().unregisterCallback(this); + mProfileManager.removeServiceListener(this); } @Override @@ -173,6 +181,22 @@ 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()) { + updateState(mHearingAidPreference); + mProfileManager.removeServiceListener(this); + } + } + + @Override + public void onServiceDisconnected() { + // Do nothing + } + public void setFragmentManager(FragmentManager fragmentManager) { mFragmentManager = fragmentManager; } @@ -183,14 +207,11 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC return null; } - final CachedBluetoothDeviceManager deviceManager = - mLocalBluetoothManager.getCachedDeviceManager(); - final HearingAidProfile hearingAidProfile = - mLocalBluetoothManager.getProfileManager().getHearingAidProfile(); + final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); final List deviceList = hearingAidProfile.getConnectedDevices(); for (BluetoothDevice obj : deviceList) { - if (!deviceManager.isSubDevice(obj)) { - return deviceManager.findDevice(obj); + if (!mCachedDeviceManager.isSubDevice(obj)) { + return mCachedDeviceManager.findDevice(obj); } } return null; @@ -201,13 +222,10 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC return 0; } - final CachedBluetoothDeviceManager deviceManager = - mLocalBluetoothManager.getCachedDeviceManager(); - final HearingAidProfile hearingAidProfile = - mLocalBluetoothManager.getProfileManager().getHearingAidProfile(); + final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); final List deviceList = hearingAidProfile.getConnectedDevices(); return (int) deviceList.stream() - .filter(device -> !deviceManager.isSubDevice(device)) + .filter(device -> !mCachedDeviceManager.isSubDevice(device)) .count(); } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java index 94483150caa..dc37d234ff3 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java @@ -28,7 +28,6 @@ import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHearingAid; -import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.BroadcastReceiver; import android.content.Intent; @@ -74,7 +73,6 @@ public class AccessibilityHearingAidPreferenceControllerTest { private BluetoothAdapter mBluetoothAdapter; private ShadowBluetoothAdapter mShadowBluetoothAdapter; - private BluetoothManager mBluetoothManager; private BluetoothDevice mBluetoothDevice; private Activity mContext; private Preference mHearingAidPreference; @@ -101,8 +99,8 @@ public class AccessibilityHearingAidPreferenceControllerTest { MockitoAnnotations.initMocks(this); mShadowApplication = ShadowApplication.getInstance(); mContext = spy(Robolectric.setupActivity(Activity.class)); - setupBluetoothEnvironment(); - setupHearingAidEnvironment(); + setupEnvironment(); + mHearingAidPreference = new Preference(mContext); mHearingAidPreference.setKey(HEARING_AID_PREFERENCE); mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, @@ -247,26 +245,39 @@ public class AccessibilityHearingAidPreferenceControllerTest { assertThat(dialog.isShowing()).isTrue(); } - private void setupBluetoothEnvironment() { + @Test + public void onServiceConnected_updateSummary() { + mPreferenceController.onStart(); + when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( + HearingAidProfile.DeviceMode.MODE_BINAURAL); + when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( + HearingAidProfile.DeviceSide.SIDE_LEFT); + when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); + + mPreferenceController.onServiceConnected(); + + assertThat(mHearingAidPreference.getSummary().toString()).isEqualTo( + "TEST_HEARING_AID_BT_DEVICE_NAME, left only"); + } + + private void setupEnvironment() { ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; mLocalBluetoothManager = Utils.getLocalBtManager(mContext); - mBluetoothManager = mContext.getSystemService(BluetoothManager.class); - mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS); + mBluetoothAdapter.enable(); + + doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager(); when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); - doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager(); - } - - private void setupHearingAidEnvironment() { - mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter); - mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS); - mBluetoothAdapter.enable(); - mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); 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) {