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

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

Merge "Use device type of MediaRoute2Info to classify MediaDevice"

parents e5f4f030 491b9fcc
Loading
Loading
Loading
Loading
+0 −15
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.util.Log;
import android.util.Pair;

import com.android.settingslib.R;
@@ -68,20 +67,6 @@ public class BluetoothMediaDevice extends MediaDevice {
        return MediaDeviceUtils.getId(mCachedDevice);
    }

    @Override
    public boolean connect() {
        //TODO(b/117129183): add callback to notify LocalMediaManager connection state.
        final boolean isConnected = mCachedDevice.setActive();
        setConnectedRecord();
        Log.d(TAG, "connect() device : " + getName() + ", is selected : " + isConnected);
        return isConnected;
    }

    @Override
    public void disconnect() {
        //TODO(b/117129183): disconnected last select device
    }

    /**
     * Get current CachedBluetoothDevice
     */
+0 −13
Original line number Diff line number Diff line
@@ -62,13 +62,6 @@ public class InfoMediaDevice extends MediaDevice {
        return MediaDeviceUtils.getId(mRouteInfo);
    }

    @Override
    public boolean connect() {
        setConnectedRecord();
        mRouterManager.selectRoute(mPackageName, mRouteInfo);
        return true;
    }

    @Override
    public void requestSetVolume(int volume) {
        mRouterManager.requestSetVolume(mRouteInfo, volume);
@@ -109,12 +102,6 @@ public class InfoMediaDevice extends MediaDevice {
        return mContext.getResources().getString(R.string.unknown);
    }

    @Override
    public void disconnect() {
        //TODO(b/144535188): disconnected last select device
    }

    @Override
    public boolean isConnected() {
        return true;
    }
+55 −10
Original line number Diff line number Diff line
@@ -15,14 +15,23 @@
 */
package com.android.settingslib.media;

import static android.media.MediaRoute2Info.DEVICE_TYPE_BLUETOOTH;
import static android.media.MediaRoute2Info.DEVICE_TYPE_REMOTE_TV;
import static android.media.MediaRoute2Info.DEVICE_TYPE_UNKNOWN;

import android.app.Notification;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.media.RoutingSessionInfo;
import android.text.TextUtils;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;

import java.util.List;
import java.util.concurrent.Executor;
@@ -45,11 +54,14 @@ public class InfoMediaManager extends MediaManager {
    String mPackageName;

    private MediaDevice mCurrentConnectedDevice;
    private LocalBluetoothManager mBluetoothManager;

    public InfoMediaManager(Context context, String packageName, Notification notification) {
    public InfoMediaManager(Context context, String packageName, Notification notification,
            LocalBluetoothManager localBluetoothManager) {
        super(context, notification);

        mRouterManager = MediaRouter2Manager.getInstance(context);
        mBluetoothManager = localBluetoothManager;
        if (!TextUtils.isEmpty(packageName)) {
            mPackageName = packageName;
        }
@@ -95,20 +107,53 @@ public class InfoMediaManager extends MediaManager {

    private void buildAllRoutes() {
        for (MediaRoute2Info route : mRouterManager.getAllRoutes()) {
            final MediaDevice device = new InfoMediaDevice(mContext, mRouterManager, route,
                    mPackageName);
            mMediaDevices.add(device);
            addMediaDevice(route);
        }
    }

    private void buildAvailableRoutes() {
        for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
            final MediaDevice device = new InfoMediaDevice(mContext, mRouterManager, route,
                    mPackageName);
            if (TextUtils.equals(route.getClientPackageName(), mPackageName)) {
                mCurrentConnectedDevice = device;
            addMediaDevice(route);
        }
    }
            mMediaDevices.add(device);

    private void addMediaDevice(MediaRoute2Info route) {
        final int deviceType = route.getDeviceType();
        MediaDevice mediaDevice = null;
        switch (deviceType) {
            case DEVICE_TYPE_UNKNOWN:
                //TODO(b/148765806): use correct device type once api is ready.
                final String defaultRoute = "DEFAULT_ROUTE";
                if (TextUtils.equals(defaultRoute, route.getOriginalId())) {
                    mediaDevice =
                            new PhoneMediaDevice(mContext, mRouterManager, route, mPackageName);
                } else {
                    mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route,
                            mPackageName);
                    if (!TextUtils.isEmpty(mPackageName)
                            && TextUtils.equals(route.getClientPackageName(), mPackageName)) {
                        mCurrentConnectedDevice = mediaDevice;
                    }
                }
                break;
            case DEVICE_TYPE_REMOTE_TV:
                break;
            case DEVICE_TYPE_BLUETOOTH:
                final BluetoothDevice device =
                        BluetoothAdapter.getDefaultAdapter().getRemoteDevice(route.getOriginalId());
                final CachedBluetoothDevice cachedDevice =
                        mBluetoothManager.getCachedDeviceManager().findDevice(device);
                mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice, mRouterManager,
                        route, mPackageName);
                break;
            default:
                Log.w(TAG, "addMediaDevice() unknown device type : " + deviceType);
                break;

        }

        if (mediaDevice != null) {
            mMediaDevices.add(mediaDevice);
        }
    }

+6 −11
Original line number Diff line number Diff line
@@ -97,7 +97,8 @@ public class LocalMediaManager implements BluetoothCallback {
            return;
        }

        mInfoMediaManager = new InfoMediaManager(context, packageName, notification);
        mInfoMediaManager =
                new InfoMediaManager(context, packageName, notification, mLocalBluetoothManager);
    }

    @VisibleForTesting
@@ -251,14 +252,17 @@ public class LocalMediaManager implements BluetoothCallback {
    }

    private MediaDevice updateCurrentConnectedDevice() {
        MediaDevice phoneMediaDevice = null;
        for (MediaDevice device : mMediaDevices) {
            if (device instanceof  BluetoothMediaDevice) {
                if (isConnected(((BluetoothMediaDevice) device).getCachedDevice())) {
                    return device;
                }
            } else if (device instanceof PhoneMediaDevice) {
                phoneMediaDevice = device;
            }
        }
        return mMediaDevices.contains(mPhoneDevice) ? mPhoneDevice : null;
        return mMediaDevices.contains(phoneMediaDevice) ? phoneMediaDevice : null;
    }

    private boolean isConnected(CachedBluetoothDevice device) {
@@ -282,17 +286,9 @@ public class LocalMediaManager implements BluetoothCallback {
            final MediaDevice infoMediaDevice = mInfoMediaManager.getCurrentConnectedDevice();
            mCurrentConnectedDevice = infoMediaDevice != null
                    ? infoMediaDevice : updateCurrentConnectedDevice();
            updatePhoneMediaDeviceSummary();
            dispatchDeviceListUpdate();
        }

        private void updatePhoneMediaDeviceSummary() {
            if (mPhoneDevice != null) {
                ((PhoneMediaDevice) mPhoneDevice)
                        .updateSummary(mCurrentConnectedDevice == mPhoneDevice);
            }
        }

        @Override
        public void onDeviceRemoved(MediaDevice device) {
            if (mMediaDevices.contains(device)) {
@@ -316,7 +312,6 @@ public class LocalMediaManager implements BluetoothCallback {
                return;
            }
            mCurrentConnectedDevice = connectDevice;
            updatePhoneMediaDeviceSummary();
            dispatchDeviceAttributesChanged();
        }

+22 −13
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.text.TextUtils;

import androidx.annotation.IntDef;

import com.android.internal.annotations.VisibleForTesting;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@@ -42,10 +44,12 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
        int TYPE_BLUETOOTH_DEVICE = 3;
    }

    @VisibleForTesting
    int mType;

    private int mConnectedRecord;

    protected final Context mContext;
    protected final int mType;
    protected final MediaRoute2Info mRouteInfo;
    protected final MediaRouter2Manager mRouterManager;
    protected final String mPackageName;
@@ -92,24 +96,12 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
     */
    public abstract String getId();

    /**
     * Transfer MediaDevice for media
     *
     * @return result of transfer media
     */
    public abstract boolean connect();

    void setConnectedRecord() {
        mConnectedRecord++;
        ConnectionRecordManager.getInstance().setConnectionRecord(mContext, getId(),
                mConnectedRecord);
    }

    /**
     * Stop transfer MediaDevice
     */
    public abstract void disconnect();

    /**
     * According the MediaDevice type to check whether we are connected to this MediaDevice.
     *
@@ -170,6 +162,23 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
        return mType;
    }

    /**
     * Transfer MediaDevice for media
     *
     * @return result of transfer media
     */
    public boolean connect() {
        setConnectedRecord();
        mRouterManager.selectRoute(mPackageName, mRouteInfo);
        return true;
    }

    /**
     * Stop transfer MediaDevice
     */
    public void disconnect() {
    }

    /**
     * Rules:
     * 1. If there is one of the connected devices identified as a carkit, this carkit will
Loading