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

Commit 9dd477c0 authored by Sungsoo Lim's avatar Sungsoo Lim Committed by Android (Google) Code Review
Browse files

Merge "Refactor BluetoothRouteProvider"

parents cce9df2a cfa7abc1
Loading
Loading
Loading
Loading
+47 −51
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaRoute2Info;
import android.text.TextUtils;
import android.util.Slog;
import android.util.SparseBooleanArray;

@@ -49,6 +48,8 @@ class BluetoothRouteProvider {
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    final Map<String, BluetoothRouteInfo> mBluetoothRoutes = new HashMap<>();
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    BluetoothRouteInfo mSelectedRoute = null;
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    BluetoothA2dp mA2dpProfile;
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    BluetoothHearingAid mHearingAidProfile;
@@ -62,8 +63,6 @@ class BluetoothRouteProvider {
    private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver();
    private final BluetoothProfileListener mProfileListener = new BluetoothProfileListener();

    private BluetoothDevice mActiveDevice = null;

    static synchronized BluetoothRouteProvider getInstance(@NonNull Context context,
            @NonNull BluetoothRoutesUpdatedListener listener) {
        Objects.requireNonNull(context);
@@ -108,27 +107,21 @@ class BluetoothRouteProvider {
    }

    /**
     * Clears the active device for all known profiles.
     * Transfers to a given bluetooth route.
     * The dedicated BT device with the route would be activated.
     *
     * @param routeId the id of the Bluetooth device. {@code null} denotes to clear the use of
     *               BT routes.
     */
    public void clearActiveDevices() {
        BluetoothA2dp a2dpProfile = mA2dpProfile;
        BluetoothHearingAid hearingAidProfile = mHearingAidProfile;
        if (a2dpProfile != null) {
            a2dpProfile.setActiveDevice(null);
        }
        if (hearingAidProfile != null) {
            hearingAidProfile.setActiveDevice(null);
        }
    public void transferTo(@Nullable String routeId) {
        if (routeId == null) {
            clearActiveDevices();
            return;
        }

    /**
     * Sets the active device.
     * @param deviceId the id of the Bluetooth device
     */
    public void setActiveDevice(@NonNull String deviceId) {
        BluetoothRouteInfo btRouteInfo = mBluetoothRoutes.get(deviceId);
        BluetoothRouteInfo btRouteInfo = mBluetoothRoutes.get(routeId);
        if (btRouteInfo == null) {
            Slog.w(TAG, "setActiveDevice: unknown device id=" + deviceId);
            Slog.w(TAG, "setActiveDevice: unknown route id=" + routeId);
            return;
        }
        BluetoothA2dp a2dpProfile = mA2dpProfile;
@@ -144,6 +137,20 @@ class BluetoothRouteProvider {
        }
    }

    /**
     * Clears the active device for all known profiles.
     */
    private void clearActiveDevices() {
        BluetoothA2dp a2dpProfile = mA2dpProfile;
        BluetoothHearingAid hearingAidProfile = mHearingAidProfile;
        if (a2dpProfile != null) {
            a2dpProfile.setActiveDevice(null);
        }
        if (hearingAidProfile != null) {
            hearingAidProfile.setActiveDevice(null);
        }
    }

    private void addEventReceiver(String action, BluetoothEventReceiver eventReceiver) {
        mEventReceiverMap.put(action, eventReceiver);
        mIntentFilter.addAction(action);
@@ -159,7 +166,8 @@ class BluetoothRouteProvider {
        }
    }

    @NonNull List<MediaRoute2Info> getBluetoothRoutes() {
    @NonNull
    List<MediaRoute2Info> getAllBluetoothRoutes() {
        ArrayList<MediaRoute2Info> routes = new ArrayList<>();
        for (BluetoothRouteInfo btRoute : mBluetoothRoutes.values()) {
            routes.add(btRoute.route);
@@ -167,17 +175,14 @@ class BluetoothRouteProvider {
        return routes;
    }

    @Nullable String getActiveDeviceAddress() {
        BluetoothDevice device = mActiveDevice;
        if (device == null) {
            return null;
        }
        return device.getAddress();
    @Nullable
    String getSelectedRouteId() {
        return mSelectedRoute == null ? null : mSelectedRoute.route.getId();
    }

    private void notifyBluetoothRoutesUpdated() {
        if (mListener != null) {
            mListener.onBluetoothRoutesUpdated(getBluetoothRoutes());
            mListener.onBluetoothRoutesUpdated(getAllBluetoothRoutes());
        }
    }

@@ -198,15 +203,10 @@ class BluetoothRouteProvider {
        return newBtRoute;
    }

    private void setRouteConnectionStateForDevice(BluetoothDevice device,
    private void setRouteConnectionState(@NonNull BluetoothRouteInfo btRoute,
            @MediaRoute2Info.ConnectionState int state) {
        if (device == null) {
            Slog.w(TAG, "setRouteConnectionStateForDevice: device shouldn't be null");
            return;
        }
        BluetoothRouteInfo btRoute = mBluetoothRoutes.get(device.getAddress());
        if (btRoute == null) {
            Slog.w(TAG, "setRouteConnectionStateForDevice: route shouldn't be null");
            Slog.w(TAG, "setRouteConnectionState: route shouldn't be null");
            return;
        }
        if (btRoute.route.getConnectionState() == state) {
@@ -260,8 +260,8 @@ class BluetoothRouteProvider {
                    mBluetoothRoutes.put(device.getAddress(), btRoute);
                }
                if (activeDevices.contains(device)) {
                    mActiveDevice = device;
                    setRouteConnectionStateForDevice(device,
                    mSelectedRoute = btRoute;
                    setRouteConnectionState(mSelectedRoute,
                            MediaRoute2Info.CONNECTION_STATE_CONNECTED);
                }

@@ -344,20 +344,18 @@ class BluetoothRouteProvider {
        public void onReceive(Context context, Intent intent, BluetoothDevice device) {
            switch (intent.getAction()) {
                case BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED:
                    String prevActiveDeviceAddress =
                            (mActiveDevice == null) ? null : mActiveDevice.getAddress();
                    String curActiveDeviceAddress =
                            (device == null) ? null : device.getAddress();
                    if (!TextUtils.equals(prevActiveDeviceAddress, curActiveDeviceAddress)) {
                        if (mActiveDevice != null) {
                            setRouteConnectionStateForDevice(mActiveDevice,
                    if (mSelectedRoute == null
                            || !mSelectedRoute.btDevice.equals(device)) {
                        if (mSelectedRoute != null) {
                            setRouteConnectionState(mSelectedRoute,
                                    MediaRoute2Info.CONNECTION_STATE_DISCONNECTED);
                        }
                        if (device != null) {
                            setRouteConnectionStateForDevice(device,
                        mSelectedRoute = (device == null) ? null
                                : mBluetoothRoutes.get(device.getAddress());
                        if (mSelectedRoute != null) {
                            setRouteConnectionState(mSelectedRoute,
                                    MediaRoute2Info.CONNECTION_STATE_CONNECTED);
                        }
                        mActiveDevice = device;
                        notifyBluetoothRoutesUpdated();
                    }
                    break;
@@ -386,10 +384,8 @@ class BluetoothRouteProvider {
                    btRoute.connectedProfiles.delete(profile);
                    if (btRoute.connectedProfiles.size() == 0) {
                        mBluetoothRoutes.remove(device.getAddress());
                        if (mActiveDevice != null
                                && TextUtils.equals(mActiveDevice.getAddress(),
                                device.getAddress())) {
                            mActiveDevice = null;
                        if (mSelectedRoute != null && mSelectedRoute.btDevice.equals(device)) {
                            mSelectedRoute = null;
                        }
                        notifyBluetoothRoutesUpdated();
                    }
+5 −5
Original line number Diff line number Diff line
@@ -145,9 +145,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
    @Override
    public void transferToRoute(String sessionId, String routeId) {
        if (TextUtils.equals(routeId, mDefaultRoute.getId())) {
            mBtRouteProvider.clearActiveDevices();
            mBtRouteProvider.transferTo(null);
        } else {
            mBtRouteProvider.setActiveDevice(routeId);
            mBtRouteProvider.transferTo(routeId);
        }
    }

@@ -196,7 +196,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
    }

    private void initializeSessionInfo() {
        mBluetoothRoutes = mBtRouteProvider.getBluetoothRoutes();
        mBluetoothRoutes = mBtRouteProvider.getAllBluetoothRoutes();

        MediaRoute2ProviderInfo.Builder builder = new MediaRoute2ProviderInfo.Builder();
        builder.addRoute(mDefaultRoute);
@@ -251,7 +251,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
        RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
                SYSTEM_SESSION_ID, "" /* clientPackageName */)
                .setSystemSession(true);
        String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress();
        String activeBtDeviceAddress = mBtRouteProvider.getSelectedRouteId();
        mSelectedRouteId = TextUtils.isEmpty(activeBtDeviceAddress) ? mDefaultRoute.getId()
                : activeBtDeviceAddress;
        builder.addSelectedRoute(mSelectedRouteId);
@@ -311,7 +311,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
                    AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0);

            if (newVolume != oldVolume) {
                String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress();
                String activeBtDeviceAddress = mBtRouteProvider.getSelectedRouteId();
                if (!TextUtils.isEmpty(activeBtDeviceAddress)) {
                    for (int i = mBluetoothRoutes.size() - 1; i >= 0; i--) {
                        MediaRoute2Info route = mBluetoothRoutes.get(i);