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

Commit 6aa93228 authored by Iván Budnik's avatar Iván Budnik Committed by Android (Google) Code Review
Browse files

Merge "Decouple MediaRouter2Manager from MediaDevice" into main

parents 2d5a80b2 2461575c
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.media.RouteListingPreference;

import com.android.settingslib.R;
@@ -40,15 +39,21 @@ public class BluetoothMediaDevice extends MediaDevice {
    private CachedBluetoothDevice mCachedDevice;
    private final AudioManager mAudioManager;

    BluetoothMediaDevice(Context context, CachedBluetoothDevice device,
            MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName) {
        this(context, device, routerManager, info, packageName, null);
    BluetoothMediaDevice(
            Context context,
            CachedBluetoothDevice device,
            MediaRoute2Info info,
            String packageName) {
        this(context, device, info, packageName, null);
    }

    BluetoothMediaDevice(Context context, CachedBluetoothDevice device,
            MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName,
    BluetoothMediaDevice(
            Context context,
            CachedBluetoothDevice device,
            MediaRoute2Info info,
            String packageName,
            RouteListingPreference.Item item) {
        super(context, routerManager, info, packageName, item);
        super(context, info, packageName, item);
        mCachedDevice = device;
        mAudioManager = context.getSystemService(AudioManager.class);
        initDeviceRecord();
+5 −4
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.settingslib.media;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.media.RouteListingPreference;

import com.android.settingslib.R;
@@ -32,10 +31,12 @@ public class ComplexMediaDevice extends MediaDevice {

    private final String mSummary = "";

    ComplexMediaDevice(Context context, MediaRouter2Manager routerManager,
            MediaRoute2Info info, String packageName,
    ComplexMediaDevice(
            Context context,
            MediaRoute2Info info,
            String packageName,
            RouteListingPreference.Item item) {
        super(context, routerManager, info, packageName, item);
        super(context, info, packageName, item);
    }

    // MediaRoute2Info.getName was made public on API 34, but exists since API 30.
+8 −7
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.media.RouteListingPreference;

import androidx.annotation.VisibleForTesting;
@@ -43,15 +42,17 @@ public class InfoMediaDevice extends MediaDevice {

    private static final String TAG = "InfoMediaDevice";

    InfoMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
            String packageName, RouteListingPreference.Item item) {
        super(context, routerManager, info, packageName, item);
    InfoMediaDevice(
            Context context,
            MediaRoute2Info info,
            String packageName,
            RouteListingPreference.Item item) {
        super(context, info, packageName, item);
        initDeviceRecord();
    }

    InfoMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
            String packageName) {
        this(context, routerManager, info, packageName, null);
    InfoMediaDevice(Context context, MediaRoute2Info info, String packageName) {
        this(context, info, packageName, null);
    }

    @Override
+56 −27
Original line number Diff line number Diff line
@@ -123,6 +123,8 @@ public abstract class InfoMediaManager extends MediaManager {
     */
    protected abstract boolean connectDeviceWithoutPackageName(@NonNull MediaDevice device);

    protected abstract void transferToRoute(@NonNull MediaRoute2Info route);

    protected abstract void selectRoute(
            @NonNull MediaRoute2Info route, @NonNull RoutingSessionInfo info);

@@ -143,6 +145,8 @@ public abstract class InfoMediaManager extends MediaManager {

    protected abstract void setSessionVolume(@NonNull RoutingSessionInfo info, int volume);

    protected abstract void setRouteVolume(@NonNull MediaRoute2Info route, int volume);

    @Nullable
    protected abstract RouteListingPreference getRouteListingPreference();

@@ -165,23 +169,6 @@ public abstract class InfoMediaManager extends MediaManager {
    @NonNull
    protected abstract List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName);

    @NonNull
    protected abstract ComplexMediaDevice createComplexMediaDevice(
            MediaRoute2Info route, RouteListingPreference.Item routeListingPreferenceItem);

    @NonNull
    protected abstract InfoMediaDevice createInfoMediaDevice(
            MediaRoute2Info route, RouteListingPreference.Item routeListingPreferenceItem);

    @NonNull
    protected abstract PhoneMediaDevice createPhoneMediaDevice(MediaRoute2Info route,
            RouteListingPreference.Item routeListingPreferenceItem);

    @NonNull
    protected abstract BluetoothMediaDevice createBluetoothMediaDevice(
            MediaRoute2Info route, CachedBluetoothDevice cachedDevice,
            RouteListingPreference.Item routeListingPreferenceItem);

    protected final void rebuildDeviceList() {
        mMediaDevices.clear();
        mCurrentConnectedDevice = null;
@@ -211,6 +198,20 @@ public abstract class InfoMediaManager extends MediaManager {
        return mCurrentConnectedDevice;
    }

    /* package */ void connectToDevice(MediaDevice device) {
        if (device.mRouteInfo == null) {
            Log.w(TAG, "Unable to connect. RouteInfo is empty");
            return;
        }

        if (TextUtils.isEmpty(mPackageName)) {
            connectDeviceWithoutPackageName(device);
        } else {
            device.setConnectedRecord();
            transferToRoute(device.mRouteInfo);
        }
    }

    /**
     * Add a MediaDevice to let it play current media.
     *
@@ -335,7 +336,8 @@ public abstract class InfoMediaManager extends MediaManager {
        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getSelectableRoutes(info)) {
            deviceList.add(
                    createInfoMediaDevice(route, mPreferenceItemMap.get(route.getId())));
                    new InfoMediaDevice(
                            mContext, route, mPackageName, mPreferenceItemMap.get(route.getId())));
        }
        return deviceList;
    }
@@ -361,7 +363,8 @@ public abstract class InfoMediaManager extends MediaManager {
        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getDeselectableRoutes(info)) {
            deviceList.add(
                    createInfoMediaDevice(route, mPreferenceItemMap.get(route.getId())));
                    new InfoMediaDevice(
                            mContext, route, mPackageName, mPreferenceItemMap.get(route.getId())));
            Log.d(TAG, route.getName() + " is deselectable for " + mPackageName);
        }
        return deviceList;
@@ -388,11 +391,20 @@ public abstract class InfoMediaManager extends MediaManager {
        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getSelectedRoutes(info)) {
            deviceList.add(
                    createInfoMediaDevice(route, mPreferenceItemMap.get(route.getId())));
                    new InfoMediaDevice(
                            mContext, route, mPackageName, mPreferenceItemMap.get(route.getId())));
        }
        return deviceList;
    }

    /* package */ void adjustDeviceVolume(MediaDevice device, int volume) {
        if (device.mRouteInfo == null) {
            Log.w(TAG, "Unable to set volume. RouteInfo is empty");
            return;
        }
        setRouteVolume(device.mRouteInfo, volume);
    }

    void adjustSessionVolume(RoutingSessionInfo info, int volume) {
        if (info == null) {
            Log.w(TAG, "Unable to adjust session volume. RoutingSessionInfo is empty");
@@ -585,7 +597,12 @@ public abstract class InfoMediaManager extends MediaManager {
            case TYPE_REMOTE_CAR:
            case TYPE_REMOTE_SMARTWATCH:
            case TYPE_REMOTE_SMARTPHONE:
                mediaDevice = createInfoMediaDevice(route, mPreferenceItemMap.get(route.getId()));
                mediaDevice =
                        new InfoMediaDevice(
                                mContext,
                                route,
                                mPackageName,
                                mPreferenceItemMap.get(route.getId()));
                break;
            case TYPE_BUILTIN_SPEAKER:
            case TYPE_USB_DEVICE:
@@ -595,7 +612,11 @@ public abstract class InfoMediaManager extends MediaManager {
            case TYPE_HDMI:
            case TYPE_WIRED_HEADSET:
            case TYPE_WIRED_HEADPHONES:
                mediaDevice = createPhoneMediaDevice(route,
                mediaDevice =
                        new PhoneMediaDevice(
                                mContext,
                                route,
                                mPackageName,
                                mPreferenceItemMap.getOrDefault(route.getId(), null));
                break;
            case TYPE_HEARING_AID:
@@ -606,14 +627,22 @@ public abstract class InfoMediaManager extends MediaManager {
                final CachedBluetoothDevice cachedDevice =
                        mBluetoothManager.getCachedDeviceManager().findDevice(device);
                if (cachedDevice != null) {
                    mediaDevice = createBluetoothMediaDevice(route, cachedDevice,
                    mediaDevice =
                            new BluetoothMediaDevice(
                                    mContext,
                                    cachedDevice,
                                    route,
                                    mPackageName,
                                    mPreferenceItemMap.getOrDefault(route.getId(), null));
                }
                break;
            case TYPE_REMOTE_AUDIO_VIDEO_RECEIVER:
                mediaDevice =
                        createComplexMediaDevice(
                                route, mPreferenceItemMap.get(route.getId()));
                        new ComplexMediaDevice(
                                mContext,
                                route,
                                mPackageName,
                                mPreferenceItemMap.get(route.getId()));
            default:
                Log.w(TAG, "addMediaDevice() unknown device type : " + deviceType);
                break;
+14 −11
Original line number Diff line number Diff line
@@ -188,11 +188,7 @@ public class LocalMediaManager implements BluetoothCallback {
        }

        device.setState(MediaDeviceState.STATE_CONNECTING);
        if (TextUtils.isEmpty(mPackageName)) {
            mInfoMediaManager.connectDeviceWithoutPackageName(device);
        } else {
            device.connect();
        }
        mInfoMediaManager.connectToDevice(device);
        return true;
    }

@@ -375,6 +371,16 @@ public class LocalMediaManager implements BluetoothCallback {
        return mInfoMediaManager.getSelectedMediaDevices();
    }

    /**
     * Requests a volume change for a specific media device.
     *
     * This operation is different from {@link #adjustSessionVolume(String, int)}, which changes the
     * volume of the overall session.
     */
    public void adjustDeviceVolume(MediaDevice device, int volume) {
        mInfoMediaManager.adjustDeviceVolume(device, volume);
    }

    /**
     * Adjust the volume of session.
     *
@@ -559,9 +565,7 @@ public class LocalMediaManager implements BluetoothCallback {
                final CachedBluetoothDevice cachedDevice =
                        cachedDeviceManager.findDevice(device);
                if (isBondedMediaDevice(cachedDevice) && isMutingExpectedDevice(cachedDevice)) {
                    return new BluetoothMediaDevice(mContext,
                            cachedDevice,
                            null, null, mPackageName);
                    return new BluetoothMediaDevice(mContext, cachedDevice, null, mPackageName);
                }
            }
            return null;
@@ -607,9 +611,8 @@ public class LocalMediaManager implements BluetoothCallback {
            unRegisterDeviceAttributeChangeCallback();
            mDisconnectedMediaDevices.clear();
            for (CachedBluetoothDevice cachedDevice : cachedBluetoothDeviceList) {
                final MediaDevice mediaDevice = new BluetoothMediaDevice(mContext,
                        cachedDevice,
                        null, null, mPackageName);
                final MediaDevice mediaDevice =
                        new BluetoothMediaDevice(mContext, cachedDevice, null, mPackageName);
                if (!mMediaDevices.contains(mediaDevice)) {
                    cachedDevice.registerCallback(mDeviceAttributeChangeCallback);
                    mDisconnectedMediaDevices.add(mediaDevice);
Loading