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

Commit 4a7e2762 authored by rashipatil's avatar rashipatil
Browse files

Modify routes sorting mechanism to give priority to suggested routes

Bug: 427665219
Test: unit tests
Flag: EXEMPT minor fix

Change-Id: Idca315aea8e76371d0be712b5e602be60684a7f1
parent 9a8e23f8
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();