From bbbae9af8aa17ef19cf49b2d3195e8405d3dc537 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Mon, 8 Mar 2021 15:21:33 +0800 Subject: [PATCH] Fix battery level of earbuds bt devices is inconsistent Before this CL, bluetooth settings update the battery level of earbuds when receiving first pair status callback. But sometimes the callback will not send immediately cause the battery level is inconsistent. This CL will update the earbuds battery level when onResum() to refresh battery level immediately. Bug: 174929347 Bug: 159544311 Test: make -j42 RunSettingsRoboTests Change-Id: I8505f8fed4ec821b9fa2d88bc437bddd7a30f0e2 --- .../bluetooth/BluetoothDevicePreference.java | 2 +- .../settings/bluetooth/BluetoothDeviceUpdater.java | 9 +++++++++ .../AvailableMediaDeviceGroupController.java | 1 + .../ConnectedDeviceGroupController.java | 1 + ...reviouslyConnectedDevicePreferenceController.java | 1 + .../connecteddevice/SavedDeviceGroupController.java | 1 + .../bluetooth/BluetoothDeviceUpdaterTest.java | 12 ++++++++++++ .../AvailableMediaDeviceGroupControllerTest.java | 2 ++ .../ConnectedDeviceGroupControllerTest.java | 2 ++ ...ouslyConnectedDevicePreferenceControllerTest.java | 3 +++ .../SavedDeviceGroupControllerTest.java | 2 ++ 11 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index f8950325904..373d9296f29 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -175,7 +175,7 @@ public final class BluetoothDevicePreference extends GearPreference { mHideSecondTarget = hideSecondTarget; } - private void onPreferenceAttributesChanged() { + void onPreferenceAttributesChanged() { ThreadUtils.postOnBackgroundThread(() -> { final Pair pair = BluetoothUtils.getBtRainbowDrawableWithDescription(getContext(), mCachedDevice); diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index 8cb698faaf4..d65500be27a 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -317,4 +317,13 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, } return device.getBondState() == BluetoothDevice.BOND_BONDED && device.isConnected(); } + + /** + * Update the attributes of {@link Preference}. + */ + public void refreshPreference() { + for (Preference preference : mPreferenceMap.values()) { + ((BluetoothDevicePreference) preference).onPreferenceAttributesChanged(); + } + } } diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java index d895154aac0..ec122dfd506 100644 --- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java @@ -68,6 +68,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle } mBluetoothDeviceUpdater.registerCallback(); mLocalBluetoothManager.getEventManager().registerCallback(this); + mBluetoothDeviceUpdater.refreshPreference(); } @Override diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java b/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java index 957737a118f..8cec9a68221 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java @@ -61,6 +61,7 @@ public class ConnectedDeviceGroupController extends BasePreferenceController mBluetoothDeviceUpdater.registerCallback(); mConnectedUsbDeviceUpdater.registerCallback(); mConnectedDockUpdater.registerCallback(); + mBluetoothDeviceUpdater.refreshPreference(); } @Override diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java index a7bae3b863e..4a29485cfff 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java @@ -111,6 +111,7 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc mBluetoothDeviceUpdater.registerCallback(); mSavedDockUpdater.registerCallback(); mContext.registerReceiver(mReceiver, mIntentFilter); + mBluetoothDeviceUpdater.refreshPreference(); } @Override diff --git a/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java b/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java index 062fa2db792..df721f18bcd 100644 --- a/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java @@ -63,6 +63,7 @@ public class SavedDeviceGroupController extends BasePreferenceController public void onStart() { mBluetoothDeviceUpdater.registerCallback(); mSavedDockUpdater.registerCallback(); + mBluetoothDeviceUpdater.refreshPreference(); } @Override diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java index fcc7f51b7ec..e0a61fedc87 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java @@ -58,6 +58,7 @@ public class BluetoothDeviceUpdaterTest { private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C"; private static final String SUB_MAC_ADDRESS = "05:52:C7:0B:D8:3C"; + private static final String TEST_NAME = "test_name"; @Mock private DashboardFragment mDashboardFragment; @@ -256,4 +257,15 @@ public class BluetoothDeviceUpdaterTest { verify(mDevicePreferenceCallback).onDeviceRemoved(mPreference); assertThat(mBluetoothDeviceUpdater.mPreferenceMap.containsKey(mBluetoothDevice)).isFalse(); } + + @Test + public void havePreference_refreshPreference() { + mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, mPreference); + mPreference.setTitle("fake_name"); + + when(mCachedBluetoothDevice.getName()).thenReturn(TEST_NAME); + mBluetoothDeviceUpdater.refreshPreference(); + + assertThat(mPreference.getTitle()).isEqualTo(TEST_NAME); + } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java index ad630ffd2c9..da1c4930d81 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java @@ -157,9 +157,11 @@ public class AvailableMediaDeviceGroupControllerTest { public void testRegister() { // register the callback in onStart() mAvailableMediaDeviceGroupController.onStart(); + verify(mAvailableMediaBluetoothDeviceUpdater).registerCallback(); verify(mLocalBluetoothManager.getEventManager()).registerCallback( any(BluetoothCallback.class)); + verify(mAvailableMediaBluetoothDeviceUpdater).refreshPreference(); } @Test diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java index 946d639e909..4c857133b68 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java @@ -139,9 +139,11 @@ public class ConnectedDeviceGroupControllerTest { public void onStart_shouldRegisterUpdaters() { // register the callback in onStart() mConnectedDeviceGroupController.onStart(); + verify(mConnectedBluetoothDeviceUpdater).registerCallback(); verify(mConnectedUsbDeviceUpdater).registerCallback(); verify(mConnectedDockUpdater).registerCallback(); + verify(mConnectedBluetoothDeviceUpdater).refreshPreference(); } @Test diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index 420b1a464f0..0e033658afe 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -147,13 +147,16 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { public void callbackCanRegisterAndUnregister() { // register the callback in onStart() mPreConnectedDeviceController.onStart(); + verify(mBluetoothDeviceUpdater).registerCallback(); verify(mDockUpdater).registerCallback(); verify(mContext).registerReceiver(mPreConnectedDeviceController.mReceiver, mPreConnectedDeviceController.mIntentFilter); + verify(mBluetoothDeviceUpdater).refreshPreference(); // unregister the callback in onStop() mPreConnectedDeviceController.onStop(); + verify(mBluetoothDeviceUpdater).unregisterCallback(); verify(mDockUpdater).unregisterCallback(); verify(mContext).unregisterReceiver(mPreConnectedDeviceController.mReceiver); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java index 6c6cf472c18..d2c44f938e4 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java @@ -79,8 +79,10 @@ public class SavedDeviceGroupControllerTest { public void testRegister() { // register the callback in onStart() mSavedDeviceGroupController.onStart(); + verify(mBluetoothDeviceUpdater).registerCallback(); verify(mSavedDockUpdater).registerCallback(); + verify(mBluetoothDeviceUpdater).refreshPreference(); } @Test