1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.bluetooth; 17 18 import java.util.ArrayList; 19 import java.util.List; 20 import java.util.UUID; 21 22 /** 23 * Represents a Bluetooth GATT Service 24 * 25 * <p> Gatt Service contains a collection of {@link BluetoothGattCharacteristic}, 26 * as well as referenced services. 27 */ 28 public class BluetoothGattService { 29 30 /** 31 * Primary service 32 */ 33 public static final int SERVICE_TYPE_PRIMARY = 0; 34 35 /** 36 * Secondary service (included by primary services) 37 */ 38 public static final int SERVICE_TYPE_SECONDARY = 1; 39 40 41 /** 42 * The remote device his service is associated with. 43 * This applies to client applications only. 44 * @hide 45 */ 46 protected BluetoothDevice mDevice; 47 48 /** 49 * The UUID of this service. 50 * @hide 51 */ 52 protected UUID mUuid; 53 54 /** 55 * Instance ID for this service. 56 * @hide 57 */ 58 protected int mInstanceId; 59 60 /** 61 * Handle counter override (for conformance testing). 62 * @hide 63 */ 64 protected int mHandles = 0; 65 66 /** 67 * Service type (Primary/Secondary). 68 * @hide 69 */ 70 protected int mServiceType; 71 72 /** 73 * List of characteristics included in this service. 74 */ 75 protected List<BluetoothGattCharacteristic> mCharacteristics; 76 77 /** 78 * List of included services for this service. 79 */ 80 protected List<BluetoothGattService> mIncludedServices; 81 82 /** 83 * Whether the service uuid should be advertised. 84 */ 85 private boolean mAdvertisePreferred; 86 87 /** 88 * Create a new BluetoothGattService. 89 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 90 * 91 * @param uuid The UUID for this service 92 * @param serviceType The type of this service, 93 * {@link BluetoothGattService#SERVICE_TYPE_PRIMARY} or 94 * {@link BluetoothGattService#SERVICE_TYPE_SECONDARY} 95 */ 96 public BluetoothGattService(UUID uuid, int serviceType) { 97 mDevice = null; 98 mUuid = uuid; 99 mInstanceId = 0; 100 mServiceType = serviceType; 101 mCharacteristics = new ArrayList<BluetoothGattCharacteristic>(); 102 mIncludedServices = new ArrayList<BluetoothGattService>(); 103 } 104 105 /** 106 * Create a new BluetoothGattService 107 * @hide 108 */ 109 /*package*/ BluetoothGattService(BluetoothDevice device, UUID uuid, 110 int instanceId, int serviceType) { 111 mDevice = device; 112 mUuid = uuid; 113 mInstanceId = instanceId; 114 mServiceType = serviceType; 115 mCharacteristics = new ArrayList<BluetoothGattCharacteristic>(); 116 mIncludedServices = new ArrayList<BluetoothGattService>(); 117 } 118 119 /** 120 * Returns the device associated with this service. 121 * @hide 122 */ 123 /*package*/ BluetoothDevice getDevice() { 124 return mDevice; 125 } 126 127 /** 128 * Add an included service to this service. 129 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 130 * 131 * @param service The service to be added 132 * @return true, if the included service was added to the service 133 */ 134 public boolean addService(BluetoothGattService service) { 135 mIncludedServices.add(service); 136 return true; 137 } 138 139 /** 140 * Add a characteristic to this service. 141 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 142 * 143 * @param characteristic The characteristics to be added 144 * @return true, if the characteristic was added to the service 145 */ 146 public boolean addCharacteristic(BluetoothGattCharacteristic characteristic) { 147 mCharacteristics.add(characteristic); 148 characteristic.setService(this); 149 return true; 150 } 151 152 /** 153 * Get characteristic by UUID and instanceId. 154 * @hide 155 */ 156 /*package*/ BluetoothGattCharacteristic getCharacteristic(UUID uuid, int instanceId) { 157 for(BluetoothGattCharacteristic characteristic : mCharacteristics) { 158 if (uuid.equals(characteristic.getUuid()) 159 && characteristic.getInstanceId() == instanceId) 160 return characteristic; 161 } 162 return null; 163 } 164 165 /** 166 * Force the instance ID. 167 * This is needed for conformance testing only. 168 * @hide 169 */ 170 public void setInstanceId(int instanceId) { 171 mInstanceId = instanceId; 172 } 173 174 /** 175 * Get the handle count override (conformance testing. 176 * @hide 177 */ 178 /*package*/ int getHandles() { 179 return mHandles; 180 } 181 182 /** 183 * Force the number of handles to reserve for this service. 184 * This is needed for conformance testing only. 185 * @hide 186 */ 187 public void setHandles(int handles) { 188 mHandles = handles; 189 } 190 191 /** 192 * Add an included service to the internal map. 193 * @hide 194 */ 195 /*package*/ void addIncludedService(BluetoothGattService includedService) { 196 mIncludedServices.add(includedService); 197 } 198 199 /** 200 * Returns the UUID of this service 201 * 202 * @return UUID of this service 203 */ 204 public UUID getUuid() { 205 return mUuid; 206 } 207 208 /** 209 * Returns the instance ID for this service 210 * 211 * <p>If a remote device offers multiple services with the same UUID 212 * (ex. multiple battery services for different batteries), the instance 213 * ID is used to distuinguish services. 214 * 215 * @return Instance ID of this service 216 */ 217 public int getInstanceId() { 218 return mInstanceId; 219 } 220 221 /** 222 * Get the type of this service (primary/secondary) 223 */ 224 public int getType() { 225 return mServiceType; 226 } 227 228 /** 229 * Get the list of included GATT services for this service. 230 * 231 * @return List of included services or empty list if no included services 232 * were discovered. 233 */ 234 public List<BluetoothGattService> getIncludedServices() { 235 return mIncludedServices; 236 } 237 238 /** 239 * Returns a list of characteristics included in this service. 240 * 241 * @return Characteristics included in this service 242 */ 243 public List<BluetoothGattCharacteristic> getCharacteristics() { 244 return mCharacteristics; 245 } 246 247 /** 248 * Returns a characteristic with a given UUID out of the list of 249 * characteristics offered by this service. 250 * 251 * <p>This is a convenience function to allow access to a given characteristic 252 * without enumerating over the list returned by {@link #getCharacteristics} 253 * manually. 254 * 255 * <p>If a remote service offers multiple characteristics with the same 256 * UUID, the first instance of a characteristic with the given UUID 257 * is returned. 258 * 259 * @return GATT characteristic object or null if no characteristic with the 260 * given UUID was found. 261 */ 262 public BluetoothGattCharacteristic getCharacteristic(UUID uuid) { 263 for(BluetoothGattCharacteristic characteristic : mCharacteristics) { 264 if (uuid.equals(characteristic.getUuid())) 265 return characteristic; 266 } 267 return null; 268 } 269 270 /** 271 * Returns whether the uuid of the service should be advertised. 272 * @hide 273 */ 274 public boolean isAdvertisePreferred() { 275 return mAdvertisePreferred; 276 } 277 278 /** 279 * Set whether the service uuid should be advertised. 280 * @hide 281 */ 282 public void setAdvertisePreferred(boolean advertisePreferred) { 283 this.mAdvertisePreferred = advertisePreferred; 284 } 285 } 286