Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a6dbf60 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Put newly discovered devices to the bottom of the list"

parents 6c4c542f 14e0fe27
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -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);
        }

        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() {
+2 −1
Original line number Diff line number Diff line
@@ -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(
+1 −1
Original line number Diff line number Diff line
@@ -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);
+2 −1
Original line number Diff line number Diff line
@@ -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());
    }
+69 −4
Original line number Diff line number Diff line
@@ -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<BluetoothDevicePreference> 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<BluetoothDevicePreference> 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);
    }
}
Loading