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

Commit 491b9fcc authored by hughchen's avatar hughchen
Browse files

Use device type of MediaRoute2Info to classify MediaDevice

- This CL use device type of MediaRoute2Info to classify
  MediaDevice(e.g: BluetoothMediaDevice, InfoMediaDevice,
  PhoneMediaDevice).
- Move connect()/disconnect() methood to MediaDevice.java
- Add test case

Bug: 148765806
Test: make -j42 RunSettingsLibRoboTests
Change-Id: I9fa22d36cebea1f55fd3a5e389aca4e6abaa1797
parent df7b8381
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
@@ -235,14 +236,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) {
@@ -266,17 +270,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)) {
@@ -300,7 +296,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