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

Commit b16c4f7d authored by Jaikumar Ganesh's avatar Jaikumar Ganesh
Browse files

Add API to get Active Sinks.

Allow incoming connections only when there are no active sinks.

Dr No: Eastham
Bug: 2133530
parent 084c6654
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -199,6 +199,22 @@ public final class BluetoothA2dp {
        }
    }

    /** Check if any A2DP sink is in Non Disconnected state
     * i.e playing, connected, connecting, disconnecting.
     * @return a unmodifiable set of connected A2DP sinks, or null on error.
     * @hide
     */
    public Set<BluetoothDevice> getNonDisconnectedSinks() {
        if (DBG) log("getNonDisconnectedSinks()");
        try {
            return Collections.unmodifiableSet(
                    new HashSet<BluetoothDevice>(Arrays.asList(mService.getNonDisconnectedSinks())));
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
            return null;
        }
    }

    /** Get the state of an A2DP sink
     *  @param device Remote BT device.
     *  @return State code, one of STATE_
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ interface IBluetoothA2dp {
    boolean suspendSink(in BluetoothDevice device);
    boolean resumeSink(in BluetoothDevice device);
    BluetoothDevice[] getConnectedSinks();  // change to Set<> once AIDL supports
    BluetoothDevice[] getNonDisconnectedSinks();  // change to Set<> once AIDL supports
    int getSinkState(in BluetoothDevice device);
    boolean setSinkPriority(in BluetoothDevice device, int priority);
    int getSinkPriority(in BluetoothDevice device);
+10 −0
Original line number Diff line number Diff line
@@ -376,6 +376,16 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
        return sinks.toArray(new BluetoothDevice[sinks.size()]);
    }

    public synchronized BluetoothDevice[] getNonDisconnectedSinks() {
        mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
        Set<BluetoothDevice> sinks = lookupSinksMatchingStates(
                new int[] {BluetoothA2dp.STATE_CONNECTED,
                           BluetoothA2dp.STATE_PLAYING,
                           BluetoothA2dp.STATE_CONNECTING,
                           BluetoothA2dp.STATE_DISCONNECTING});
        return sinks.toArray(new BluetoothDevice[sinks.size()]);
    }

    public synchronized int getSinkState(BluetoothDevice device) {
        mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
        Integer state = mAudioDevices.get(device);
+4 −2
Original line number Diff line number Diff line
@@ -546,12 +546,14 @@ class BluetoothEventLoop {

        boolean authorized = false;
        ParcelUuid uuid = ParcelUuid.fromString(deviceUuid);
        BluetoothA2dp a2dp = new BluetoothA2dp(mContext);

        // Bluez sends the UUID of the local service being accessed, _not_ the
        // remote service
        if (mBluetoothService.isEnabled() &&
                (BluetoothUuid.isAudioSource(uuid) || BluetoothUuid.isAvrcpTarget(uuid)
                        || BluetoothUuid.isAdvAudioDist(uuid))) {
            BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
                        || BluetoothUuid.isAdvAudioDist(uuid)) &&
                        (a2dp.getNonDisconnectedSinks().size() == 0)) {
            BluetoothDevice device = mAdapter.getRemoteDevice(address);
            authorized = a2dp.getSinkPriority(device) > BluetoothA2dp.PRIORITY_OFF;
            if (authorized) {