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
This commit is contained in:
@@ -32,6 +32,7 @@ import android.util.TypedValue;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
@@ -44,6 +45,9 @@ import com.android.settingslib.bluetooth.BluetoothUtils;
|
|||||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
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
|
* BluetoothDevicePreference is the preference type used to display each remote
|
||||||
* Bluetooth device in the Bluetooth Settings screen.
|
* 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;
|
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 CachedBluetoothDevice mCachedDevice;
|
||||||
private final UserManager mUserManager;
|
private final UserManager mUserManager;
|
||||||
private final boolean mShowDevicesWithoutNames;
|
private final boolean mShowDevicesWithoutNames;
|
||||||
|
private final long mCurrentTime;
|
||||||
|
private final int mType;
|
||||||
|
|
||||||
private AlertDialog mDisconnectDialog;
|
private AlertDialog mDisconnectDialog;
|
||||||
private String contentDescription = null;
|
private String contentDescription = null;
|
||||||
@@ -67,7 +81,7 @@ public final class BluetoothDevicePreference extends GearPreference implements
|
|||||||
Resources mResources;
|
Resources mResources;
|
||||||
|
|
||||||
public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
|
public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
|
||||||
boolean showDeviceWithoutNames) {
|
boolean showDeviceWithoutNames, @SortType int type) {
|
||||||
super(context, null);
|
super(context, null);
|
||||||
mResources = getContext().getResources();
|
mResources = getContext().getResources();
|
||||||
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||||
@@ -81,6 +95,8 @@ public final class BluetoothDevicePreference extends GearPreference implements
|
|||||||
|
|
||||||
mCachedDevice = cachedDevice;
|
mCachedDevice = cachedDevice;
|
||||||
mCachedDevice.registerCallback(this);
|
mCachedDevice.registerCallback(this);
|
||||||
|
mCurrentTime = System.currentTimeMillis();
|
||||||
|
mType = type;
|
||||||
|
|
||||||
onDeviceAttributesChanged();
|
onDeviceAttributesChanged();
|
||||||
}
|
}
|
||||||
@@ -200,8 +216,15 @@ public final class BluetoothDevicePreference extends GearPreference implements
|
|||||||
return super.compareTo(another);
|
return super.compareTo(another);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (mType) {
|
||||||
|
case SortType.TYPE_DEFAULT:
|
||||||
return mCachedDevice
|
return mCachedDevice
|
||||||
.compareTo(((BluetoothDevicePreference) another).mCachedDevice);
|
.compareTo(((BluetoothDevicePreference) another).mCachedDevice);
|
||||||
|
case SortType.TYPE_FIFO:
|
||||||
|
return (int)(mCurrentTime - ((BluetoothDevicePreference) another).mCurrentTime);
|
||||||
|
default:
|
||||||
|
return super.compareTo(another);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onClicked() {
|
void onClicked() {
|
||||||
|
@@ -226,7 +226,8 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback,
|
|||||||
if (!mPreferenceMap.containsKey(device)) {
|
if (!mPreferenceMap.containsKey(device)) {
|
||||||
BluetoothDevicePreference btPreference =
|
BluetoothDevicePreference btPreference =
|
||||||
new BluetoothDevicePreference(mPrefContext, cachedDevice,
|
new BluetoothDevicePreference(mPrefContext, cachedDevice,
|
||||||
true /* showDeviceWithoutNames */);
|
true /* showDeviceWithoutNames */,
|
||||||
|
BluetoothDevicePreference.SortType.TYPE_DEFAULT);
|
||||||
btPreference.setOnGearClickListener(mDeviceProfilesListener);
|
btPreference.setOnGearClickListener(mDeviceProfilesListener);
|
||||||
if (this instanceof Preference.OnPreferenceClickListener) {
|
if (this instanceof Preference.OnPreferenceClickListener) {
|
||||||
btPreference.setOnPreferenceClickListener(
|
btPreference.setOnPreferenceClickListener(
|
||||||
|
@@ -191,7 +191,7 @@ public abstract class DeviceListPreferenceFragment extends
|
|||||||
|
|
||||||
if (preference == null) {
|
if (preference == null) {
|
||||||
preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice,
|
preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice,
|
||||||
mShowDevicesWithoutNames);
|
mShowDevicesWithoutNames, BluetoothDevicePreference.SortType.TYPE_FIFO);
|
||||||
preference.setKey(key);
|
preference.setKey(key);
|
||||||
//Set hideSecondTarget is true if it's bonded device.
|
//Set hideSecondTarget is true if it's bonded device.
|
||||||
preference.hideSecondTarget(true);
|
preference.hideSecondTarget(true);
|
||||||
|
@@ -91,7 +91,8 @@ public class AvailableMediaBluetoothDeviceUpdaterTest {
|
|||||||
mBluetoothDeviceUpdater = spy(new AvailableMediaBluetoothDeviceUpdater(mContext,
|
mBluetoothDeviceUpdater = spy(new AvailableMediaBluetoothDeviceUpdater(mContext,
|
||||||
mDashboardFragment, mDevicePreferenceCallback));
|
mDashboardFragment, mDevicePreferenceCallback));
|
||||||
mBluetoothDeviceUpdater.setPrefContext(mContext);
|
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).addPreference(any());
|
||||||
doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
|
doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,6 @@ import static org.mockito.Mockito.spy;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.bluetooth.BluetoothClass;
|
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
@@ -48,19 +47,36 @@ import org.robolectric.RuntimeEnvironment;
|
|||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.util.ReflectionHelpers;
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(shadows = {ShadowAlertDialogCompat.class})
|
@Config(shadows = {ShadowAlertDialogCompat.class})
|
||||||
public class BluetoothDevicePreferenceTest {
|
public class BluetoothDevicePreferenceTest {
|
||||||
private static final boolean SHOW_DEVICES_WITHOUT_NAMES = true;
|
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 = "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<BluetoothDevicePreference> COMPARATOR =
|
||||||
|
Comparator.naturalOrder();
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@Mock
|
@Mock
|
||||||
private CachedBluetoothDevice mCachedBluetoothDevice;
|
private CachedBluetoothDevice mCachedBluetoothDevice;
|
||||||
|
@Mock
|
||||||
|
private CachedBluetoothDevice mCachedDevice1;
|
||||||
|
@Mock
|
||||||
|
private CachedBluetoothDevice mCachedDevice2;
|
||||||
|
@Mock
|
||||||
|
private CachedBluetoothDevice mCachedDevice3;
|
||||||
|
|
||||||
private FakeFeatureFactory mFakeFeatureFactory;
|
private FakeFeatureFactory mFakeFeatureFactory;
|
||||||
private MetricsFeatureProvider mMetricsFeatureProvider;
|
private MetricsFeatureProvider mMetricsFeatureProvider;
|
||||||
private BluetoothDevicePreference mPreference;
|
private BluetoothDevicePreference mPreference;
|
||||||
|
private List<BluetoothDevicePreference> mPreferenceList = new ArrayList<>();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -70,8 +86,11 @@ public class BluetoothDevicePreferenceTest {
|
|||||||
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
|
mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
|
||||||
when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS);
|
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,
|
mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
|
||||||
SHOW_DEVICES_WITHOUT_NAMES);
|
SHOW_DEVICES_WITHOUT_NAMES, BluetoothDevicePreference.SortType.TYPE_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -170,7 +189,8 @@ public class BluetoothDevicePreferenceTest {
|
|||||||
doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
|
doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
|
||||||
BluetoothDevicePreference preference =
|
BluetoothDevicePreference preference =
|
||||||
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
|
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
|
||||||
SHOW_DEVICES_WITHOUT_NAMES);
|
SHOW_DEVICES_WITHOUT_NAMES,
|
||||||
|
BluetoothDevicePreference.SortType.TYPE_DEFAULT);
|
||||||
|
|
||||||
assertThat(preference.isVisible()).isTrue();
|
assertThat(preference.isVisible()).isTrue();
|
||||||
}
|
}
|
||||||
@@ -179,7 +199,8 @@ public class BluetoothDevicePreferenceTest {
|
|||||||
public void isVisible_hideDeviceWithoutNames_invisible() {
|
public void isVisible_hideDeviceWithoutNames_invisible() {
|
||||||
doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
|
doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
|
||||||
BluetoothDevicePreference preference =
|
BluetoothDevicePreference preference =
|
||||||
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false);
|
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
|
||||||
|
false, BluetoothDevicePreference.SortType.TYPE_DEFAULT);
|
||||||
|
|
||||||
assertThat(preference.isVisible()).isFalse();
|
assertThat(preference.isVisible()).isFalse();
|
||||||
}
|
}
|
||||||
@@ -190,4 +211,48 @@ public class BluetoothDevicePreferenceTest {
|
|||||||
|
|
||||||
assertThat(mPreference.mNeedNotifyHierarchyChanged).isTrue();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -99,7 +99,8 @@ public class BluetoothDeviceUpdaterTest {
|
|||||||
when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS);
|
when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS);
|
||||||
when(mSubBluetoothDevice.getAddress()).thenReturn(SUB_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 =
|
mBluetoothDeviceUpdater =
|
||||||
new BluetoothDeviceUpdater(mDashboardFragment, mDevicePreferenceCallback,
|
new BluetoothDeviceUpdater(mDashboardFragment, mDevicePreferenceCallback,
|
||||||
mLocalManager) {
|
mLocalManager) {
|
||||||
|
@@ -239,7 +239,8 @@ public class ConnectedBluetoothDeviceUpdaterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void addPreference_addPreference_shouldHideSecondTarget() {
|
public void addPreference_addPreference_shouldHideSecondTarget() {
|
||||||
BluetoothDevicePreference btPreference =
|
BluetoothDevicePreference btPreference =
|
||||||
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, true);
|
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
|
||||||
|
true, BluetoothDevicePreference.SortType.TYPE_DEFAULT);
|
||||||
mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, btPreference);
|
mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, btPreference);
|
||||||
|
|
||||||
mBluetoothDeviceUpdater.addPreference(mCachedBluetoothDevice);
|
mBluetoothDeviceUpdater.addPreference(mCachedBluetoothDevice);
|
||||||
|
@@ -72,7 +72,8 @@ public class SavedBluetoothDeviceUpdaterTest {
|
|||||||
mBluetoothDeviceUpdater = spy(new SavedBluetoothDeviceUpdater(mContext, mDashboardFragment,
|
mBluetoothDeviceUpdater = spy(new SavedBluetoothDeviceUpdater(mContext, mDashboardFragment,
|
||||||
mDevicePreferenceCallback));
|
mDevicePreferenceCallback));
|
||||||
mBluetoothDeviceUpdater.setPrefContext(mContext);
|
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).addPreference(any());
|
||||||
doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
|
doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user