From 7c11a45735e2ca96d4a38157f692746792607458 Mon Sep 17 00:00:00 2001 From: Ze Li Date: Fri, 29 Nov 2024 16:41:12 +0800 Subject: [PATCH] [Connected devices page] Move the refresh logic to main thread. As the caller of adding or removing devices may not be performing on background thread, sync problem could occur. So here we make sure all updates to UI happens on the main thread. Test: atest: com.android.settings.connecteddevice.PreviouslyConnectedDevicePreferenceControllerTest Bug: 365044575 Flag: EXEMPT bugfix Change-Id: I5b697acb7cf7469fe3bbff33b820b4e9f4c5104f --- ...lyConnectedDevicePreferenceController.java | 48 ++++++++++--------- ...nnectedDevicePreferenceControllerTest.java | 10 ++++ 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java index 24294b0e328..f300fb00b86 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java @@ -170,34 +170,36 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc /** Sort the preferenceGroup by most recently used. */ public void updatePreferenceGroup() { - mPreferenceGroup.removeAll(); - if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { - // Bluetooth is supported - int order = 0; - for (BluetoothDevice device : mBluetoothAdapter.getMostRecentlyConnectedDevices()) { - Preference preference = mDevicePreferenceMap.getOrDefault(device, null); - if (preference != null) { - Log.d(TAG, "Adding preference with order " + order + " when there are " - + mPreferenceGroup.getPreferenceCount()); + mContext.getMainExecutor().execute(() -> { + mPreferenceGroup.removeAll(); + if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { + // Bluetooth is supported + int order = 0; + for (BluetoothDevice device : mBluetoothAdapter.getMostRecentlyConnectedDevices()) { + Preference preference = mDevicePreferenceMap.getOrDefault(device, null); + if (preference != null) { + Log.d(TAG, "Adding preference with order " + order + " when there are " + + mPreferenceGroup.getPreferenceCount()); + preference.setOrder(order); + mPreferenceGroup.addPreference(preference); + order += 1; + } + if (order == MAX_DEVICE_NUM) { + break; + } + } + for (Preference preference : mDockDevicesList) { + if (order == MAX_DEVICE_NUM) { + break; + } preference.setOrder(order); mPreferenceGroup.addPreference(preference); order += 1; } - if (order == MAX_DEVICE_NUM) { - break; - } } - for (Preference preference : mDockDevicesList) { - if (order == MAX_DEVICE_NUM) { - break; - } - preference.setOrder(order); - mPreferenceGroup.addPreference(preference); - order += 1; - } - } - mPreferenceGroup.addPreference(mSeeAllPreference); - updatePreferenceVisibility(); + mPreferenceGroup.addPreference(mSeeAllPreference); + updatePreferenceVisibility(); + }); } @VisibleForTesting diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index 910e696d374..8b6f460ec3f 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.robolectric.Shadows.shadowOf; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; @@ -31,6 +32,7 @@ import android.bluetooth.BluetoothManager; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; +import android.os.Looper; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.Pair; @@ -226,6 +228,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); mPreConnectedDeviceController.onDeviceAdded(preference1); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2); } @@ -236,6 +239,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mContext, null /* AttributeSet */); mPreConnectedDeviceController.onDeviceAdded(dockPreference); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2); } @@ -258,6 +262,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mPreConnectedDeviceController.onDeviceAdded(preference3); mPreConnectedDeviceController.onDeviceAdded(preference4); mPreConnectedDeviceController.onDeviceAdded(dockPreference); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); // 3 BluetoothDevicePreference and 1 see all preference assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4); @@ -269,6 +274,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mContext, mCachedDevice5, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); mPreConnectedDeviceController.onDeviceAdded(preference); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); // 1 see all preference assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); @@ -280,6 +286,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mContext, mCachedDevice5, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); mPreConnectedDeviceController.onDeviceAdded(preference); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); // 1 see all preference assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); @@ -296,6 +303,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mPreConnectedDeviceController.onDeviceRemoved(preference1); mPreConnectedDeviceController.onDeviceRemoved(dockPreference); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); } @@ -345,6 +353,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mPreConnectedDeviceController.onDeviceAdded(preference2); mPreConnectedDeviceController.updatePreferenceGroup(); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); // Refer to the order of {@link #mMostRecentlyConnectedDevices}, the first one is see all // preference @@ -380,6 +389,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mPreConnectedDeviceController.onDeviceAdded(preference2); mPreConnectedDeviceController.updatePreferenceGroup(); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); // 1 see all preference assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);