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

Commit df7b8381 authored by hughchen's avatar hughchen
Browse files

Use media framework api to get bluetooth device list

This CL include following change:

- This CL before use LocalBluetoothManager to get
  bluetooth device list.
  This CL use new MediaRouter2Manager api (getAllRoutes() and
  getAvailableRoutes()) to get bluetooth device list.
- Use RoutingController() to transfer media for bluetooth
  device and phone device when they don't have package name.
- Add test case.

Also make bluetooth device can be transferred through
MediaRouter2Manager.

Bug: 148765806
Test: make -j42 RunSettingsLibRoboTests
Change-Id: I6d960b1b02740264d7ba2cc77c842c08cf61e86c
parent 06a09a93
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
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;

@@ -35,8 +37,9 @@ public class BluetoothMediaDevice extends MediaDevice {

    private CachedBluetoothDevice mCachedDevice;

    BluetoothMediaDevice(Context context, CachedBluetoothDevice device) {
        super(context, MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
    BluetoothMediaDevice(Context context, CachedBluetoothDevice device,
            MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName) {
        super(context, MediaDeviceType.TYPE_BLUETOOTH_DEVICE, routerManager, info, packageName);
        mCachedDevice = device;
        initDeviceRecord();
    }
+1 −1
Original line number Diff line number Diff line
@@ -157,7 +157,7 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall
    private void addMediaDevice(CachedBluetoothDevice cachedDevice) {
        MediaDevice mediaDevice = findMediaDevice(MediaDeviceUtils.getId(cachedDevice));
        if (mediaDevice == null) {
            mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice);
            mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice, null, null, null);
            cachedDevice.registerCallback(mDeviceAttributeChangeCallback);
            mLastAddedDevice = mediaDevice;
            mMediaDevices.add(mediaDevice);
+1 −8
Original line number Diff line number Diff line
@@ -33,16 +33,9 @@ public class InfoMediaDevice extends MediaDevice {

    private static final String TAG = "InfoMediaDevice";

    private final MediaRoute2Info mRouteInfo;
    private final MediaRouter2Manager mRouterManager;
    private final String mPackageName;

    InfoMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
            String packageName) {
        super(context, MediaDeviceType.TYPE_CAST_DEVICE);
        mRouterManager = routerManager;
        mRouteInfo = info;
        mPackageName = packageName;
        super(context, MediaDeviceType.TYPE_CAST_DEVICE, routerManager, info, packageName);
        initDeviceRecord();
    }

+23 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.app.Notification;
import android.content.Context;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.media.RoutingSessionInfo;
import android.text.TextUtils;

import com.android.internal.annotations.VisibleForTesting;
@@ -111,6 +112,23 @@ public class InfoMediaManager extends MediaManager {
        }
    }

    /**
     * Transfer MediaDevice for media without package name.
     */
    public boolean connectDeviceWithoutPackageName(MediaDevice device) {
        boolean isConnected = false;
        final List<RoutingSessionInfo> infos = mRouterManager.getActiveSessions();
        if (infos.size() > 0) {
            final RoutingSessionInfo info = infos.get(0);
            final MediaRouter2Manager.RoutingController controller =
                    mRouterManager.getControllerForSession(info);

            controller.transferToRoute(device.mRouteInfo);
            isConnected = true;
        }
        return isConnected;
    }

    class RouterManagerCallback extends MediaRouter2Manager.Callback {

        @Override
@@ -124,5 +142,10 @@ public class InfoMediaManager extends MediaManager {
                refreshDevices();
            }
        }

        @Override
        public void onRoutesChanged(List<MediaRoute2Info> routes) {
            refreshDevices();
        }
    }
}
+12 −36
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settingslib.media;
import android.app.Notification;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.IntDef;
@@ -57,7 +58,6 @@ public class LocalMediaManager implements BluetoothCallback {
    final MediaDeviceCallback mMediaDeviceCallback = new MediaDeviceCallback();

    private Context mContext;
    private BluetoothMediaManager mBluetoothMediaManager;
    private LocalBluetoothManager mLocalBluetoothManager;
    private InfoMediaManager mInfoMediaManager;
    private String mPackageName;
@@ -97,18 +97,17 @@ public class LocalMediaManager implements BluetoothCallback {
            return;
        }

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

    @VisibleForTesting
    LocalMediaManager(Context context, LocalBluetoothManager localBluetoothManager,
            BluetoothMediaManager bluetoothMediaManager, InfoMediaManager infoMediaManager) {
            InfoMediaManager infoMediaManager, String packageName) {
        mContext = context;
        mLocalBluetoothManager = localBluetoothManager;
        mBluetoothMediaManager = bluetoothMediaManager;
        mInfoMediaManager = infoMediaManager;
        mPackageName = packageName;

    }

    /**
@@ -135,7 +134,12 @@ public class LocalMediaManager implements BluetoothCallback {
            mCurrentConnectedDevice.disconnect();
        }

        final boolean isConnected = device.connect();
        boolean isConnected = false;
        if (TextUtils.isEmpty(mPackageName)) {
            isConnected = mInfoMediaManager.connectDeviceWithoutPackageName(device);
        } else {
            isConnected = device.connect();
        }
        if (isConnected) {
            mCurrentConnectedDevice = device;
        }
@@ -159,29 +163,10 @@ public class LocalMediaManager implements BluetoothCallback {
     */
    public void startScan() {
        mMediaDevices.clear();
        mBluetoothMediaManager.registerCallback(mMediaDeviceCallback);
        mBluetoothMediaManager.startScan();
        mInfoMediaManager.registerCallback(mMediaDeviceCallback);
        mInfoMediaManager.startScan();
    }

    private void addPhoneDeviceIfNecessary() {
        // add phone device to list if there have any Bluetooth device and cast device.
        if (mMediaDevices.size() > 0 && !mMediaDevices.contains(mPhoneDevice)) {
            if (mPhoneDevice == null) {
                mPhoneDevice = new PhoneMediaDevice(mContext, mLocalBluetoothManager);
            }
            mMediaDevices.add(mPhoneDevice);
        }
    }

    private void removePhoneMediaDeviceIfNecessary() {
        // if PhoneMediaDevice is the last item in the list, remove it.
        if (mMediaDevices.size() == 1 && mMediaDevices.contains(mPhoneDevice)) {
            mMediaDevices.clear();
        }
    }

    void dispatchDeviceListUpdate() {
        synchronized (mCallbacks) {
            Collections.sort(mMediaDevices, COMPARATOR);
@@ -203,8 +188,6 @@ public class LocalMediaManager implements BluetoothCallback {
     * Stop scan MediaDevice
     */
    public void stopScan() {
        mBluetoothMediaManager.unregisterCallback(mMediaDeviceCallback);
        mBluetoothMediaManager.stopScan();
        mInfoMediaManager.unregisterCallback(mMediaDeviceCallback);
        mInfoMediaManager.stopScan();
    }
@@ -272,19 +255,14 @@ public class LocalMediaManager implements BluetoothCallback {
        public void onDeviceAdded(MediaDevice device) {
            if (!mMediaDevices.contains(device)) {
                mMediaDevices.add(device);
                addPhoneDeviceIfNecessary();
                dispatchDeviceListUpdate();
            }
        }

        @Override
        public void onDeviceListAdded(List<MediaDevice> devices) {
            for (MediaDevice device : devices) {
                if (getMediaDeviceById(mMediaDevices, device.getId()) == null) {
                    mMediaDevices.add(device);
                }
            }
            addPhoneDeviceIfNecessary();
            mMediaDevices.clear();
            mMediaDevices.addAll(devices);
            final MediaDevice infoMediaDevice = mInfoMediaManager.getCurrentConnectedDevice();
            mCurrentConnectedDevice = infoMediaDevice != null
                    ? infoMediaDevice : updateCurrentConnectedDevice();
@@ -303,7 +281,6 @@ public class LocalMediaManager implements BluetoothCallback {
        public void onDeviceRemoved(MediaDevice device) {
            if (mMediaDevices.contains(device)) {
                mMediaDevices.remove(device);
                removePhoneMediaDeviceIfNecessary();
                dispatchDeviceListUpdate();
            }
        }
@@ -311,7 +288,6 @@ public class LocalMediaManager implements BluetoothCallback {
        @Override
        public void onDeviceListRemoved(List<MediaDevice> devices) {
            mMediaDevices.removeAll(devices);
            removePhoneMediaDeviceIfNecessary();
            dispatchDeviceListUpdate();
        }

Loading