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

Commit b9404880 authored by Sumit Deshmukh's avatar Sumit Deshmukh Committed by Bruno Martins
Browse files

DeviceGroup: Framework changes for Group Device operations.

This change contains below implementations
- BluetoothDeviceGroup profile proxy object implementation.
- GroupClientProfile as LocalBluetoothProfile.
- Group Callbacks to be given to registered application.

CRs-Fixed: 2826578
Change-Id: I0a8186e800e9d2701319db1adc97bdcf0441cc12
parent 32c9c2b8
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -3065,6 +3065,9 @@ public final class BluetoothAdapter {
        } else if (profile == BluetoothProfile.LE_AUDIO) {
            BluetoothLeAudio leAudio = new BluetoothLeAudio(context, listener, this);
            return true;
        } else if (profile == BluetoothProfile.GROUP_CLIENT) {
            BluetoothDeviceGroup groupClient = new BluetoothDeviceGroup(context, listener);
            return true;
        } else {
            return false;
        }
@@ -3157,6 +3160,10 @@ public final class BluetoothAdapter {
            case BluetoothProfile.LE_AUDIO:
                BluetoothLeAudio leAudio = (BluetoothLeAudio) proxy;
                leAudio.close();
            case BluetoothProfile.GROUP_CLIENT:
                BluetoothDeviceGroup groupClient = (BluetoothDeviceGroup) proxy;
                groupClient.close();
                break;
        }
    }

+812 −0

File added.

Preview size limit exceeded, changes collapsed.

+132 −0
Original line number Diff line number Diff line
/******************************************************************************
 *  Copyright (c) 2020, The Linux Foundation. All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are
 *  met:
 *      * Redistributions of source code must retain the above copyright
 *        notice, this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials provided
 *        with the distribution.
 *      * Neither the name of The Linux Foundation nor the names of its
 *        contributors may be used to endorse or promote products derived
 *        from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 *  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/

package android.bluetooth;

import java.util.UUID;
import java.util.List;
/**
 * This abstract class is used to implement {@link BluetoothDeviceGroup} callbacks.
 * @hide
 */
public abstract class BluetoothGroupCallback {
    /**
     * This Callback gives connection state changed with specific group device.
     *
     * @param state Connection state of the {@link BluetoothProfile} group device.
     * @param device Remote device for which connection state has changed.
     */
    public void onConnectionStateChanged (int state, BluetoothDevice device) {
    }

    /**
     * This callback is given when application is registered for Group operation
     * callbacks. This callback is given after {@link BluetoothDeviceGroup#registerGroupClientApp}
     * is called.
     *
     * @param status Status of the group client app registration.
     * @param appId Identifier of the application for group operations.
     */
    public void onGroupClientAppRegistered(int status, int appId) {
    }

    /**
     * This callback is triggered when a new device group has been identified
     * from one of the connected device. After this callback is received, application
     * can choose to trigger discovery of device group using API
     * {@link BluetoothDeviceGroup#startGroupDiscovery}
     *
     * @param groupId   Identifier of the Device Group.
     * @param device  Remote device with which Device Group is found.
     * @param uuid    UUID of the primary Service for this Device Group Service.
     */
    public void onNewGroupFound (int groupId,  BluetoothDevice device, UUID uuid) {
    }

    /**
     * This Callback is triggered when device group discovery is either started/stopped.
     *
     * @param groupId   Identifier of the device group.
     * @param status    Device Group Discovery status.
	 *                  {@link BluetoothDeviceGroup#GROUP_DISCOVERY_STARTED}
     *                  or  {@link BluetoothDeviceGroup#GROUP_DISCOVERY_STOPPED}.
     * @param reason    Reason for change in the discovery status.
     */
    public void onGroupDiscoveryStatusChanged (int groupId, int status, int reason) {
    }

    /**
     * This callback is triggered when new group device has been found after group
     * discovery has been started. This callback is given on discovery of every
     * new group device.
     *
     * @param groupId  Identifier of the device group.
     * @param device  {@link BluetoothDevice} instance of discovered group device.
     */
    public void onGroupDeviceFound (int groupId, BluetoothDevice device) {
    }

    /**
     * This callback is triggered after exclusive access status of the group
     * or subgroup has been changed after the request from application.
     *
     * @param groupId   Identifier of the device group.
     * @param value     Changed value of the exclusive access.
     * @param status    Status associated with the exclusive access.
     * @param devices   List of devices for which exclusive access has been changed.
     */
    public void onExclusiveAccessChanged (int groupId, int value, int status,
            List<BluetoothDevice> devices) {
    }

    /**
     * This callback gives access status of requested group/subgroup once
     * it is fetched.
     *
     * @param groupId       Identifier of the device group.
     * @param accessStatus  Value of the Exclusive Access.
     */
    public void onExclusiveAccessStatusFetched (int groupId, int accessStatus) {
    }

    /**
     * This callback is given to application when exclusive access is available
     * for the device of a given group for which was denied earlier.
     * <p> Exclusive Access is considered available when group device sends notification
     * for access changed to BluetoothDeviceGroup#ACCESS_RELEASED. This callback is
     * given to the application which has requested the access earlier and the request
     * had failed as one of the group device had DENIED the access.
     *
     * @param groupId  Identifier of the device group.
     * @param device  {@link BluetoothDevice} which has exclusive access available.
     */
    public void onExclusiveAccessAvailable (int groupId, BluetoothDevice device) {
    }

}
 No newline at end of file
+7 −1
Original line number Diff line number Diff line
@@ -212,13 +212,19 @@ public interface BluetoothProfile {
     */
    int LE_AUDIO = 22;

    /**
     * Group Operation Profile (Client Role)
     * @hide
     */
    public int GROUP_CLIENT = 23;

    /**
     * Max profile ID. This value should be updated whenever a new profile is added to match
     * the largest value assigned to a profile.
     *
     * @hide
     */
    int MAX_PROFILE_ID = 22;
    int MAX_PROFILE_ID = 23;

    /**
     * Default priority for devices that we try to auto-connect to and
+175 −0
Original line number Diff line number Diff line
/******************************************************************************
 *  Copyright (c) 2020, The Linux Foundation. All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are
 *  met:
 *      * Redistributions of source code must retain the above copyright
 *        notice, this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials provided
 *        with the distribution.
 *      * Neither the name of The Linux Foundation nor the names of its
 *        contributors may be used to endorse or promote products derived
 *        from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 *  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/

package android.bluetooth;

import android.os.Parcel;
import android.os.Parcelable;
import android.os.ParcelUuid;

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

/**
 * Provides Device Group details.
 *
 * {@see BluetoothDeviceGroup}
 * @hide
 *
 */

public final class DeviceGroup implements Parcelable {
    /** Identifier of the Device Group */
    private int mGroupId;
    /** Size of the Device Group. */
    private int mSize;
    /** List of all group devices {@link BluetoothDevice} */
    private List <BluetoothDevice> mGroupDevices = new ArrayList<BluetoothDevice>();
    /** Primary Service UUID which has included required Device Group service*/
    private final ParcelUuid mIncludingSrvcUUID;
    /** Suggests whether exclusive access can be taken for this device group */
    private final boolean mExclusiveAccessSupport;

    /**
     * Constructor.
     * @hide
     */
    public DeviceGroup(int groupId, int size, List<BluetoothDevice> groupDevices,
            ParcelUuid includingSrvcUUID, boolean exclusiveAccessSupport) {
        mGroupId = groupId;
        mSize = size;
        mGroupDevices = groupDevices;
        mIncludingSrvcUUID = includingSrvcUUID;
        mExclusiveAccessSupport = exclusiveAccessSupport;
    }

    public DeviceGroup(Parcel in) {
        mGroupId = in.readInt();
        mSize = in.readInt();
        in.readList(mGroupDevices, BluetoothDevice.class.getClassLoader());
        mIncludingSrvcUUID = in.readParcelable(ParcelUuid.class.getClassLoader());
        mExclusiveAccessSupport = in.readBoolean();
    }

    /**
     * Used to retrieve identifier of the Device Group.
     *
     * @return  Identifier of the Device Group.
     */
    public int getDeviceGroupId() {
        return mGroupId;
    }

    /**
     * Used to know total number group devices which are part of this Device Group.
     *
     * @return size of the Device Group
     */
    public int getDeviceGroupSize() {
        return mSize;
    }

    /**
     * Indicates total number of group devices discovered in Group Discovery procedure.
     *
     * @return total group devices discovered in the Device Group.
     */
    public int getTotalDiscoveredGroupDevices() {
        return mGroupDevices.size();
    }


    /**
     * Used to fetch group devices of the Device Group.
     *
     *@return List of group devices {@link BluetoothDevice} in the Device Group.
     */
    public List<BluetoothDevice> getDeviceGroupMembers() {
        return mGroupDevices;
    }

    /**
     * Suggests primary GATT service which has included this DeviceGroup Service
     * for this device group. If remote device is part of multiple Device Groups then
     * this uuid cant be null. If remote device is part of only one device froup
     * then this returned parameter can be null.
     *
     *@return UUID of the GATT primary Service which has included this device group.
     */
    public ParcelUuid getIncludingServiceUUID() {
        return mIncludingSrvcUUID;
    }

    /**
     * Suggests whether exclusive access is supported by this Device Group.
     *
     * @return true, if exclusive access operation is supported by this Device Group.
     * Otherwise, false.
     */
    public boolean isExclusiveAccessSupported() {
        return mExclusiveAccessSupport;
    }

    /**
     * Indicates whether all devices of this Device Group are discovered.
     *
     * @return true, if all group devices are discovered. Otherwise, false.
     */
    public boolean isGroupDiscoveredCompleted() {
      return (mSize == getTotalDiscoveredGroupDevices());
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mGroupId);
        dest.writeInt(mSize);
        dest.writeList(mGroupDevices);
        dest.writeParcelable(mIncludingSrvcUUID, 0);
        dest.writeBoolean(mExclusiveAccessSupport);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Parcelable.Creator<DeviceGroup> CREATOR =
            new Parcelable.Creator<DeviceGroup>() {
        public DeviceGroup createFromParcel(Parcel in) {
            return new DeviceGroup(in);
        }

        public DeviceGroup[] newArray(int size) {
            return new DeviceGroup[size];
        }
    };
}
Loading