From 14e0fe270744c47cca8136b4ec160e405c562334 Mon Sep 17 00:00:00 2001 From: hughchen Date: Tue, 23 Jul 2019 16:18:15 +0800 Subject: [PATCH] Put newly discovered devices to the bottom of the list Add two type SortType.TYPE_DEFAULT and SortType.TYPE_FIFO in BluetoothDevicePreference. It needs to decide the sort type when you create the BluetoothDevicePreference. TYPE_DEFAULT - According to the CacheBluetoothDevice state to sort TYPE_FIFO - According to the timestamp to sort Bug: 112546918 Test: make -j42 RunSettingsRoboTests Change-Id: Icd25d9b76a44d5a105f8daf64e5bc1f9ead8cd92 --- .../bluetooth/BluetoothDevicePreference.java | 29 +++++++- .../bluetooth/BluetoothDeviceUpdater.java | 3 +- .../DeviceListPreferenceFragment.java | 2 +- ...ilableMediaBluetoothDeviceUpdaterTest.java | 3 +- .../BluetoothDevicePreferenceTest.java | 73 ++++++++++++++++++- .../bluetooth/BluetoothDeviceUpdaterTest.java | 3 +- .../ConnectedBluetoothDeviceUpdaterTest.java | 3 +- .../SavedBluetoothDeviceUpdaterTest.java | 3 +- 8 files changed, 106 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index 74d3b6a0594..c56c50e45d3 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -32,6 +32,7 @@ import android.util.TypedValue; import android.view.View; import android.widget.ImageView; +import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; @@ -44,6 +45,9 @@ import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * BluetoothDevicePreference is the preference type used to display each remote * Bluetooth device in the Bluetooth Settings screen. @@ -54,9 +58,19 @@ public final class BluetoothDevicePreference extends GearPreference implements private static int sDimAlpha = Integer.MIN_VALUE; + @Retention(RetentionPolicy.SOURCE) + @IntDef({SortType.TYPE_DEFAULT, + SortType.TYPE_FIFO}) + public @interface SortType { + int TYPE_DEFAULT = 1; + int TYPE_FIFO = 2; + } + private final CachedBluetoothDevice mCachedDevice; private final UserManager mUserManager; private final boolean mShowDevicesWithoutNames; + private final long mCurrentTime; + private final int mType; private AlertDialog mDisconnectDialog; private String contentDescription = null; @@ -67,7 +81,7 @@ public final class BluetoothDevicePreference extends GearPreference implements Resources mResources; public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice, - boolean showDeviceWithoutNames) { + boolean showDeviceWithoutNames, @SortType int type) { super(context, null); mResources = getContext().getResources(); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); @@ -81,6 +95,8 @@ public final class BluetoothDevicePreference extends GearPreference implements mCachedDevice = cachedDevice; mCachedDevice.registerCallback(this); + mCurrentTime = System.currentTimeMillis(); + mType = type; onDeviceAttributesChanged(); } @@ -200,8 +216,15 @@ public final class BluetoothDevicePreference extends GearPreference implements return super.compareTo(another); } - return mCachedDevice - .compareTo(((BluetoothDevicePreference) another).mCachedDevice); + switch (mType) { + case SortType.TYPE_DEFAULT: + return mCachedDevice + .compareTo(((BluetoothDevicePreference) another).mCachedDevice); + case SortType.TYPE_FIFO: + return (int)(mCurrentTime - ((BluetoothDevicePreference) another).mCurrentTime); + default: + return super.compareTo(another); + } } void onClicked() { diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index 31055cca057..7cf7fd5833e 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -226,7 +226,8 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, if (!mPreferenceMap.containsKey(device)) { BluetoothDevicePreference btPreference = new BluetoothDevicePreference(mPrefContext, cachedDevice, - true /* showDeviceWithoutNames */); + true /* showDeviceWithoutNames */, + BluetoothDevicePreference.SortType.TYPE_DEFAULT); btPreference.setOnGearClickListener(mDeviceProfilesListener); if (this instanceof Preference.OnPreferenceClickListener) { btPreference.setOnPreferenceClickListener( diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java index 4f27a39f9c0..8a286e411ca 100644 --- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java +++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java @@ -191,7 +191,7 @@ public abstract class DeviceListPreferenceFragment extends if (preference == null) { preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice, - mShowDevicesWithoutNames); + mShowDevicesWithoutNames, BluetoothDevicePreference.SortType.TYPE_FIFO); preference.setKey(key); //Set hideSecondTarget is true if it's bonded device. preference.hideSecondTarget(true); diff --git a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java index 29640d6d470..4348e1b358f 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java @@ -91,7 +91,8 @@ public class AvailableMediaBluetoothDeviceUpdaterTest { mBluetoothDeviceUpdater = spy(new AvailableMediaBluetoothDeviceUpdater(mContext, mDashboardFragment, mDevicePreferenceCallback)); mBluetoothDeviceUpdater.setPrefContext(mContext); - mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); + mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false, + BluetoothDevicePreference.SortType.TYPE_DEFAULT); doNothing().when(mBluetoothDeviceUpdater).addPreference(any()); doNothing().when(mBluetoothDeviceUpdater).removePreference(any()); } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java index 92f2354f5fd..a02ab4af949 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java @@ -24,7 +24,6 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.UserManager; @@ -48,19 +47,36 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowAlertDialogCompat.class}) public class BluetoothDevicePreferenceTest { private static final boolean SHOW_DEVICES_WITHOUT_NAMES = true; private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C"; + private static final String MAC_ADDRESS_2 = "05:52:C7:0B:D8:3C"; + private static final String MAC_ADDRESS_3 = "06:52:C7:0B:D8:3C"; + private static final String MAC_ADDRESS_4 = "07:52:C7:0B:D8:3C"; + private static final Comparator COMPARATOR = + Comparator.naturalOrder(); private Context mContext; @Mock private CachedBluetoothDevice mCachedBluetoothDevice; + @Mock + private CachedBluetoothDevice mCachedDevice1; + @Mock + private CachedBluetoothDevice mCachedDevice2; + @Mock + private CachedBluetoothDevice mCachedDevice3; private FakeFeatureFactory mFakeFeatureFactory; private MetricsFeatureProvider mMetricsFeatureProvider; private BluetoothDevicePreference mPreference; + private List mPreferenceList = new ArrayList<>(); @Before public void setUp() { @@ -70,8 +86,11 @@ public class BluetoothDevicePreferenceTest { mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider(); when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS); + when(mCachedDevice1.getAddress()).thenReturn(MAC_ADDRESS_2); + when(mCachedDevice2.getAddress()).thenReturn(MAC_ADDRESS_3); + when(mCachedDevice3.getAddress()).thenReturn(MAC_ADDRESS_4); mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, - SHOW_DEVICES_WITHOUT_NAMES); + SHOW_DEVICES_WITHOUT_NAMES, BluetoothDevicePreference.SortType.TYPE_DEFAULT); } @Test @@ -170,7 +189,8 @@ public class BluetoothDevicePreferenceTest { doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName(); BluetoothDevicePreference preference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, - SHOW_DEVICES_WITHOUT_NAMES); + SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_DEFAULT); assertThat(preference.isVisible()).isTrue(); } @@ -179,7 +199,8 @@ public class BluetoothDevicePreferenceTest { public void isVisible_hideDeviceWithoutNames_invisible() { doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName(); BluetoothDevicePreference preference = - new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); + new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, + false, BluetoothDevicePreference.SortType.TYPE_DEFAULT); assertThat(preference.isVisible()).isFalse(); } @@ -190,4 +211,48 @@ public class BluetoothDevicePreferenceTest { assertThat(mPreference.mNeedNotifyHierarchyChanged).isTrue(); } + + @Test + public void compareTo_sortTypeFIFO() { + final BluetoothDevicePreference preference3 = new BluetoothDevicePreference(mContext, + mCachedDevice3, SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_FIFO); + final BluetoothDevicePreference preference2 = new BluetoothDevicePreference(mContext, + mCachedDevice2, SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_FIFO); + final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(mContext, + mCachedDevice1, SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_FIFO); + + mPreferenceList.add(preference1); + mPreferenceList.add(preference2); + mPreferenceList.add(preference3); + Collections.sort(mPreferenceList, COMPARATOR); + + assertThat(mPreferenceList.get(0)).isEqualTo(preference3); + assertThat(mPreferenceList.get(1)).isEqualTo(preference2); + assertThat(mPreferenceList.get(2)).isEqualTo(preference1); + } + + @Test + public void compareTo_sortTypeDefault() { + final BluetoothDevicePreference preference3 = new BluetoothDevicePreference(mContext, + mCachedDevice3, SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_DEFAULT); + final BluetoothDevicePreference preference2 = new BluetoothDevicePreference(mContext, + mCachedDevice2, SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_DEFAULT); + final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(mContext, + mCachedDevice1, SHOW_DEVICES_WITHOUT_NAMES, + BluetoothDevicePreference.SortType.TYPE_DEFAULT); + + mPreferenceList.add(preference1); + mPreferenceList.add(preference2); + mPreferenceList.add(preference3); + Collections.sort(mPreferenceList, COMPARATOR); + + assertThat(mPreferenceList.get(0)).isEqualTo(preference1); + assertThat(mPreferenceList.get(1)).isEqualTo(preference2); + assertThat(mPreferenceList.get(2)).isEqualTo(preference3); + } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java index 10665529a86..66bf959de61 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java @@ -99,7 +99,8 @@ public class BluetoothDeviceUpdaterTest { when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS); when(mSubBluetoothDevice.getAddress()).thenReturn(SUB_MAC_ADDRESS); - mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); + mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, + false, BluetoothDevicePreference.SortType.TYPE_DEFAULT); mBluetoothDeviceUpdater = new BluetoothDeviceUpdater(mDashboardFragment, mDevicePreferenceCallback, mLocalManager) { diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java index 615f67a99cc..13e138cbb70 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java @@ -239,7 +239,8 @@ public class ConnectedBluetoothDeviceUpdaterTest { @Test public void addPreference_addPreference_shouldHideSecondTarget() { BluetoothDevicePreference btPreference = - new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, true); + new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, + true, BluetoothDevicePreference.SortType.TYPE_DEFAULT); mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, btPreference); mBluetoothDeviceUpdater.addPreference(mCachedBluetoothDevice); diff --git a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java index ac7692d470a..4cc9b87cb2c 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java @@ -72,7 +72,8 @@ public class SavedBluetoothDeviceUpdaterTest { mBluetoothDeviceUpdater = spy(new SavedBluetoothDeviceUpdater(mContext, mDashboardFragment, mDevicePreferenceCallback)); mBluetoothDeviceUpdater.setPrefContext(mContext); - mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); + mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, + false, BluetoothDevicePreference.SortType.TYPE_DEFAULT); doNothing().when(mBluetoothDeviceUpdater).addPreference(any()); doNothing().when(mBluetoothDeviceUpdater).removePreference(any()); }