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

Commit f80c9e5d authored by Iván Budnik's avatar Iván Budnik
Browse files

Non-functionally simplify getRoutingSession() and fix nullability

Test: atest com.android.settingslib.media
Bug: 291277292
Flag: NA
Change-Id: If82e99355ab689dfb2d5a95931bd057d84f3318e
parent c96d9001
Loading
Loading
Loading
Loading
+37 −84
Original line number Diff line number Diff line
@@ -199,6 +199,12 @@ public abstract class InfoMediaManager extends MediaManager {
    @NonNull
    protected abstract List<RoutingSessionInfo> getRemoteSessions();

    /**
     * Returns a non-empty list containing the routing sessions associated to the target media app.
     *
     * <p> The first item of the list is always the {@link RoutingSessionInfo#isSystemSession()
     * system session}, followed other remote sessions linked to the target media app.
     */
    @NonNull
    protected abstract List<RoutingSessionInfo> getRoutingSessionsForPackage();

@@ -256,8 +262,8 @@ public abstract class InfoMediaManager extends MediaManager {
     * @return If add device successful return {@code true}, otherwise return {@code false}
     */
    boolean addDeviceToPlayMedia(MediaDevice device) {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null || !info.getSelectableRoutes().contains(device.mRouteInfo.getId())) {
        final RoutingSessionInfo info = getActiveRoutingSession();
        if (!info.getSelectableRoutes().contains(device.mRouteInfo.getId())) {
            Log.w(TAG, "addDeviceToPlayMedia() Ignoring selecting a non-selectable device : "
                    + device.getName());
            return false;
@@ -267,13 +273,11 @@ public abstract class InfoMediaManager extends MediaManager {
        return true;
    }

    private RoutingSessionInfo getRoutingSessionInfo() {
        final List<RoutingSessionInfo> sessionInfos = getRoutingSessionsForPackage();

        if (sessionInfos.isEmpty()) {
            return null;
        }
        return sessionInfos.get(sessionInfos.size() - 1);
    @NonNull
    private RoutingSessionInfo getActiveRoutingSession() {
        // List is never empty.
        final List<RoutingSessionInfo> sessions = getRoutingSessionsForPackage();
        return sessions.get(sessions.size() - 1);
    }

    boolean isRoutingSessionAvailableForVolumeControl() {
@@ -311,8 +315,8 @@ public abstract class InfoMediaManager extends MediaManager {
     * @return If device stop successful return {@code true}, otherwise return {@code false}
     */
    boolean removeDeviceFromPlayMedia(MediaDevice device) {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null || !info.getSelectedRoutes().contains(device.mRouteInfo.getId())) {
        final RoutingSessionInfo info = getActiveRoutingSession();
        if (!info.getSelectedRoutes().contains(device.mRouteInfo.getId())) {
            Log.w(TAG, "removeDeviceFromMedia() Ignoring deselecting a non-deselectable device : "
                    + device.getName());
            return false;
@@ -326,13 +330,7 @@ public abstract class InfoMediaManager extends MediaManager {
     * Release session to stop playing media on MediaDevice.
     */
    boolean releaseSession() {
        final RoutingSessionInfo sessionInfo = getRoutingSessionInfo();
        if (sessionInfo == null) {
            Log.w(TAG, "releaseSession() Ignoring release session : " + mPackageName);
            return false;
        }

        releaseSession(sessionInfo);
        releaseSession(getActiveRoutingSession());
        return true;
    }

@@ -342,12 +340,7 @@ public abstract class InfoMediaManager extends MediaManager {
     */
    @NonNull
    List<MediaDevice> getSelectableMediaDevices() {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null) {
            Log.w(TAG, "getSelectableMediaDevices() cannot find selectable MediaDevice from : "
                    + mPackageName);
            return Collections.emptyList();
        }
        final RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getSelectableRoutes(info)) {
@@ -364,12 +357,7 @@ public abstract class InfoMediaManager extends MediaManager {
     */
    @NonNull
    List<MediaDevice> getDeselectableMediaDevices() {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null) {
            Log.d(TAG, "getDeselectableMediaDevices() cannot find deselectable MediaDevice from : "
                    + mPackageName);
            return Collections.emptyList();
        }
        final RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getDeselectableRoutes(info)) {
@@ -387,13 +375,7 @@ public abstract class InfoMediaManager extends MediaManager {
     */
    @NonNull
    List<MediaDevice> getSelectedMediaDevices() {
        RoutingSessionInfo info = getRoutingSessionInfo();

        if (info == null) {
            Log.w(TAG, "getSelectedMediaDevices() cannot find selectable MediaDevice from : "
                    + mPackageName);
            return Collections.emptyList();
        }
        RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getSelectedRoutes(info)) {
@@ -427,15 +409,8 @@ public abstract class InfoMediaManager extends MediaManager {
     * @param volume the value of volume
     */
    void adjustSessionVolume(int volume) {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null) {
            Log.w(TAG, "adjustSessionVolume() can't found corresponding RoutingSession with : "
                    + mPackageName);
            return;
        }

        Log.d(TAG, "adjustSessionVolume() adjust volume: " + volume + ", with : " + mPackageName);
        setSessionVolume(info, volume);
        setSessionVolume(getActiveRoutingSession(), volume);
    }

    /**
@@ -444,14 +419,7 @@ public abstract class InfoMediaManager extends MediaManager {
     * @return  maximum volume of the session, and return -1 if not found.
     */
    public int getSessionVolumeMax() {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null) {
            Log.w(TAG, "getSessionVolumeMax() can't find corresponding RoutingSession with : "
                    + mPackageName);
            return -1;
        }

        return info.getVolumeMax();
        return getActiveRoutingSession().getVolumeMax();
    }

    /**
@@ -460,24 +428,11 @@ public abstract class InfoMediaManager extends MediaManager {
     * @return current volume of the session, and return -1 if not found.
     */
    public int getSessionVolume() {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null) {
            Log.w(TAG, "getSessionVolume() can't find corresponding RoutingSession with : "
                    + mPackageName);
            return -1;
        }

        return info.getVolume();
        return getActiveRoutingSession().getVolume();
    }

    CharSequence getSessionName() {
        final RoutingSessionInfo info = getRoutingSessionInfo();
        if (info == null) {
            Log.w(TAG, "Unable to get session name for package: " + mPackageName);
            return null;
        }

        return info.getName();
        return getActiveRoutingSession().getName();
    }

    @TargetApi(Build.VERSION_CODES.R)
@@ -503,26 +458,24 @@ public abstract class InfoMediaManager extends MediaManager {
        }
    }
    private synchronized List<MediaRoute2Info> getAvailableRoutes() {
        List<MediaRoute2Info> infos = new ArrayList<>();
        RoutingSessionInfo routingSessionInfo = getRoutingSessionInfo();
        List<MediaRoute2Info> selectedRouteInfos = new ArrayList<>();
        if (routingSessionInfo != null) {
            selectedRouteInfos = getSelectedRoutes(routingSessionInfo);
            infos.addAll(selectedRouteInfos);
            infos.addAll(getSelectableRoutes(routingSessionInfo));
        }
        final List<MediaRoute2Info> transferableRoutes =
                getTransferableRoutes(mPackageName);
        List<MediaRoute2Info> availableRoutes = new ArrayList<>();
        RoutingSessionInfo activeSession = getActiveRoutingSession();

        List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(activeSession);
        availableRoutes.addAll(selectedRoutes);
        availableRoutes.addAll(getSelectableRoutes(activeSession));

        final List<MediaRoute2Info> transferableRoutes = getTransferableRoutes(mPackageName);
        for (MediaRoute2Info transferableRoute : transferableRoutes) {
            boolean alreadyAdded = false;
            for (MediaRoute2Info mediaRoute2Info : infos) {
            for (MediaRoute2Info mediaRoute2Info : availableRoutes) {
                if (TextUtils.equals(transferableRoute.getId(), mediaRoute2Info.getId())) {
                    alreadyAdded = true;
                    break;
                }
            }
            if (!alreadyAdded) {
                infos.add(transferableRoute);
                availableRoutes.add(transferableRoute);
            }
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
@@ -531,13 +484,13 @@ public abstract class InfoMediaManager extends MediaManager {
                final List<RouteListingPreference.Item> preferenceRouteListing =
                        Api34Impl.composePreferenceRouteListing(
                                routeListingPreference);
                infos = Api34Impl.arrangeRouteListByPreference(selectedRouteInfos,
                availableRoutes = Api34Impl.arrangeRouteListByPreference(selectedRoutes,
                        getAvailableRoutesFromRouter(),
                                preferenceRouteListing);
            }
            return Api34Impl.filterDuplicatedIds(infos);
            return Api34Impl.filterDuplicatedIds(availableRoutes);
        } else {
            return infos;
            return availableRoutes;
        }
    }

@@ -610,7 +563,7 @@ public abstract class InfoMediaManager extends MediaManager {
        }

        if (mediaDevice != null
                && getRoutingSessionInfo().getSelectedRoutes().contains(route.getId())) {
                && getActiveRoutingSession().getSelectedRoutes().contains(route.getId())) {
            mediaDevice.setState(STATE_SELECTED);
            if (mCurrentConnectedDevice == null) {
                mCurrentConnectedDevice = mediaDevice;
+5 −33
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.S
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -124,7 +125,11 @@ public class InfoMediaManagerTest {

    @Test
    public void stopScan_startFirst_callsUnregister() {
        RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
        mInfoMediaManager.mRouterManager = mRouterManager;
        // Since test is running in Robolectric, return a fake session to avoid NPE.
        when(mRouterManager.getRoutingSessions(anyString())).thenReturn(List.of(sessionInfo));

        mInfoMediaManager.startScan();
        mInfoMediaManager.stopScan();

@@ -677,17 +682,6 @@ public class InfoMediaManagerTest {
        verify(info).getVolumeMax();
    }

    @Test
    public void getSessionVolumeMax_routeSessionInfoIsNull_returnNotFound() {
        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
        final RoutingSessionInfo info = null;
        routingSessionInfos.add(info);

        mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);

        assertThat(mInfoMediaManager.getSessionVolumeMax()).isEqualTo(-1);
    }

    @Test
    public void getSessionVolume_containPackageName_returnMaxVolume() {
        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
@@ -702,17 +696,6 @@ public class InfoMediaManagerTest {
        verify(info).getVolume();
    }

    @Test
    public void getSessionVolume_routeSessionInfoIsNull_returnNotFound() {
        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
        final RoutingSessionInfo info = null;
        routingSessionInfos.add(info);

        mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);

        assertThat(mInfoMediaManager.getSessionVolume()).isEqualTo(-1);
    }

    @Test
    public void getRemoteSessions_returnsRemoteSessions() {
        final List<RoutingSessionInfo> infos = new ArrayList<>();
@@ -734,17 +717,6 @@ public class InfoMediaManagerTest {
        assertThat(mInfoMediaManager.releaseSession()).isTrue();
    }

    @Test
    public void getSessionName_routeSessionInfoIsNull_returnNull() {
        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
        final RoutingSessionInfo info = null;
        routingSessionInfos.add(info);

        mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);

        assertThat(mInfoMediaManager.getSessionName()).isNull();
    }

    @Test
    public void getSessionName_containPackageName_returnName() {
        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
+9 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.media.dialog;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -47,6 +48,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.broadcast.BroadcastSender;
@@ -126,6 +128,13 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
                mNotifCollection, mDialogTransitionAnimator,
                mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager,
                mKeyguardManager, mFlags, mUserTracker);

        // Using a fake package will cause routing operations to fail, so we intercept
        // scanning-related operations.
        mMediaOutputController.mLocalMediaManager = mock(LocalMediaManager.class);
        doNothing().when(mMediaOutputController.mLocalMediaManager).startScan();
        doNothing().when(mMediaOutputController.mLocalMediaManager).stopScan();

        mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender,
                mMediaOutputController);
        mMediaOutputBaseDialogImpl.onCreate(new Bundle());