/****************************************************************************** * 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; import java.util.concurrent.CopyOnWriteArrayList; /** * 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 CopyOnWriteArrayList mGroupDevices = new CopyOnWriteArrayList(); /** 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 groupDevices, ParcelUuid includingSrvcUUID, boolean exclusiveAccessSupport) { mGroupId = groupId; mSize = size; mGroupDevices.addAll(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 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 CREATOR = new Parcelable.Creator() { public DeviceGroup createFromParcel(Parcel in) { return new DeviceGroup(in); } public DeviceGroup[] newArray(int size) { return new DeviceGroup[size]; } }; }