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

Commit ed67219f authored by Alexandr Shabalin's avatar Alexandr Shabalin Committed by Android (Google) Code Review
Browse files

Merge "Modify routes sorting mechanism to give priority to suggested routes" into main

parents 6af4b17c 4a7e2762
Loading
Loading
Loading
Loading
+1 −21
Original line number Diff line number Diff line
@@ -1085,26 +1085,6 @@ public abstract class InfoMediaManager {

    @RequiresApi(34)
    static class Api34Impl {
        @DoNotInline
        static List<RouteListingPreference.Item> composePreferenceRouteListing(
                RouteListingPreference routeListingPreference) {
            boolean preferRouteListingOrdering =
                    com.android.media.flags.Flags.enableOutputSwitcherDeviceGrouping()
                    && preferRouteListingOrdering(routeListingPreference);
            List<RouteListingPreference.Item> finalizedItemList = new ArrayList<>();
            List<RouteListingPreference.Item> itemList = routeListingPreference.getItems();
            for (RouteListingPreference.Item item : itemList) {
                // Put suggested devices on the top first before further organization
                if (!preferRouteListingOrdering
                        && (item.getFlags() & RouteListingPreference.Item.FLAG_SUGGESTED) != 0) {
                    finalizedItemList.add(0, item);
                } else {
                    finalizedItemList.add(item);
                }
            }
            return finalizedItemList;
        }

        @DoNotInline
        static synchronized List<MediaRoute2Info> filterDuplicatedIds(List<MediaRoute2Info> infos) {
            List<MediaRoute2Info> filteredInfos = new ArrayList<>();
@@ -1153,7 +1133,7 @@ public abstract class InfoMediaManager {
                List<MediaRoute2Info> availableRoutes,
                RouteListingPreference routeListingPreference) {
            final List<RouteListingPreference.Item> routeListingPreferenceItems =
                    Api34Impl.composePreferenceRouteListing(routeListingPreference);
                    routeListingPreference.getItems();

            Set<String> sortedRouteIds = new LinkedHashSet<>();

+6 −0
Original line number Diff line number Diff line
@@ -506,6 +506,12 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
            return 1;
        }

        if (isSuggestedDevice()) {
            return -1;
        } else if (another.isSuggestedDevice()) {
            return 1;
        }

        if (mType == another.mType) {
            // Check device is muting expected device
            if (isMutingExpectedDevice()) {
+3 −27
Original line number Diff line number Diff line
@@ -372,9 +372,9 @@ public class InfoMediaManagerTest {
        assertThat(mInfoMediaManager.mMediaDevices).hasSize(4);
        assertThat(mInfoMediaManager.mMediaDevices.get(0).getId()).isEqualTo(TEST_ID);
        assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_1);
        assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_4);
        assertThat(mInfoMediaManager.mMediaDevices.get(2).isSuggestedDevice()).isTrue();
        assertThat(mInfoMediaManager.mMediaDevices.get(3).getId()).isEqualTo(TEST_ID_3);
        assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_3);
        assertThat(mInfoMediaManager.mMediaDevices.get(3).getId()).isEqualTo(TEST_ID_4);
        assertThat(mInfoMediaManager.mMediaDevices.get(3).isSuggestedDevice()).isTrue();
    }

    private RouteListingPreference setUpPreferenceList(boolean useSystemOrdering) {
@@ -1550,30 +1550,6 @@ public class InfoMediaManagerTest {
                .isEqualTo(LocalMediaManager.MediaDeviceState.STATE_CONNECTED);
    }

    @EnableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
    @Test
    public void composePreferenceRouteListing_useSystemOrderingIsFalse() {
        RouteListingPreference routeListingPreference = setUpPreferenceList(false);

        List<RouteListingPreference.Item> routeOrder =
                Api34Impl.composePreferenceRouteListing(routeListingPreference);

        assertThat(routeOrder.get(0).getRouteId()).isEqualTo(TEST_ID_3);
        assertThat(routeOrder.get(1).getRouteId()).isEqualTo(TEST_ID_4);
    }

    @EnableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
    @Test
    public void composePreferenceRouteListing_useSystemOrderingIsTrue() {
        RouteListingPreference routeListingPreference = setUpPreferenceList(true);

        List<RouteListingPreference.Item> routeOrder =
                Api34Impl.composePreferenceRouteListing(routeListingPreference);

        assertThat(routeOrder.get(0).getRouteId()).isEqualTo(TEST_ID_4);
        assertThat(routeOrder.get(1).getRouteId()).isEqualTo(TEST_ID_3);
    }

    @EnableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
    @Test
    public void arrangeRouteListByPreference_useSystemOrderingIsFalse() {
+35 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
import static android.media.RouteListingPreference.Item.SELECTION_BEHAVIOR_GO_TO_APP;

import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_SELECTED;
import static com.android.settingslib.media.MediaDevice.SelectionBehavior.SELECTION_BEHAVIOR_TRANSFER;

import static com.google.common.truth.Truth.assertThat;
@@ -154,6 +155,9 @@ public class MediaDeviceTest {
        when(mBluetoothRouteInfo1.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
        when(mBluetoothRouteInfo2.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
        when(mBluetoothRouteInfo3.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
        when(mBluetoothRouteInfo1.getName()).thenReturn(DEVICE_NAME_1);
        when(mBluetoothRouteInfo2.getName()).thenReturn(DEVICE_NAME_2);
        when(mBluetoothRouteInfo3.getName()).thenReturn(DEVICE_NAME_3);
        when(mRouteInfo1.getId()).thenReturn(ROUTER_ID_1);
        when(mRouteInfo2.getId()).thenReturn(ROUTER_ID_2);
        when(mRouteInfo3.getId()).thenReturn(ROUTER_ID_3);
@@ -381,6 +385,36 @@ public class MediaDeviceTest {
        assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice2);
    }

    @Test
    public void compareTo_suggestedDevice_comesBeforeNonSuggested() {
        mInfoMediaDevice2.setIsSuggested(true);
        mInfoMediaDevice1.setIsSuggested(false);

        mMediaDevices.add(mInfoMediaDevice1);
        mMediaDevices.add(mInfoMediaDevice2);

        assertThat(mMediaDevices.get(0)).isEqualTo(mInfoMediaDevice1);
        Collections.sort(mMediaDevices, COMPARATOR);

        assertThat(mMediaDevices.get(0)).isEqualTo(mInfoMediaDevice2);
        assertThat(mMediaDevices.get(1)).isEqualTo(mInfoMediaDevice1);
    }

    @Test
    public void compareTo_selectedAndSuggested_selectedIsFirst() {
        mInfoMediaDevice1.setIsSuggested(true);
        mInfoMediaDevice2.setState(STATE_SELECTED);

        mMediaDevices.add(mInfoMediaDevice1);
        mMediaDevices.add(mInfoMediaDevice2);

        assertThat(mMediaDevices.get(0)).isEqualTo(mInfoMediaDevice1);
        Collections.sort(mMediaDevices, COMPARATOR);

        assertThat(mMediaDevices.get(0)).isEqualTo(mInfoMediaDevice2);
        assertThat(mMediaDevices.get(1)).isEqualTo(mInfoMediaDevice1);
    }

    // 1.mInfoMediaDevice1:      Last Selected device
    // 2.mBluetoothMediaDevice1: CarKit device
    // 3.mInfoMediaDevice2:      * 2 times usage
@@ -567,7 +601,7 @@ public class MediaDeviceTest {
                /* deselectable= */ true);
        MediaDevice mediaDevice =
                new PhoneMediaDevice(mContext, mRouteInfo1, /* dynamicRouteAttributes= */
                        dynamicRouteAttributes, /* item= */ null);
                        null, /* item= */ null);

        assertThat(mediaDevice.isTransferable()).isFalse();
        assertThat(mediaDevice.isSelected()).isFalse();