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 17 package android.bluetooth; 18 19 import java.util.UUID; 20 21 /** 22 * Represents a Bluetooth GATT Descriptor 23 * 24 * <p> GATT Descriptors contain additional information and attributes of a GATT 25 * characteristic, {@link BluetoothGattCharacteristic}. They can be used to describe 26 * the characteristic's features or to control certain behaviours of the characteristic. 27 */ 28 public class BluetoothGattDescriptor { 29 30 /** 31 * Value used to enable notification for a client configuration descriptor 32 */ 33 public static final byte[] ENABLE_NOTIFICATION_VALUE = {0x01, 0x00}; 34 35 /** 36 * Value used to enable indication for a client configuration descriptor 37 */ 38 public static final byte[] ENABLE_INDICATION_VALUE = {0x02, 0x00}; 39 40 /** 41 * Value used to disable notifications or indicatinos 42 */ 43 public static final byte[] DISABLE_NOTIFICATION_VALUE = {0x00, 0x00}; 44 45 /** 46 * Descriptor read permission 47 */ 48 public static final int PERMISSION_READ = 0x01; 49 50 /** 51 * Descriptor permission: Allow encrypted read operations 52 */ 53 public static final int PERMISSION_READ_ENCRYPTED = 0x02; 54 55 /** 56 * Descriptor permission: Allow reading with man-in-the-middle protection 57 */ 58 public static final int PERMISSION_READ_ENCRYPTED_MITM = 0x04; 59 60 /** 61 * Descriptor write permission 62 */ 63 public static final int PERMISSION_WRITE = 0x10; 64 65 /** 66 * Descriptor permission: Allow encrypted writes 67 */ 68 public static final int PERMISSION_WRITE_ENCRYPTED = 0x20; 69 70 /** 71 * Descriptor permission: Allow encrypted writes with man-in-the-middle 72 * protection 73 */ 74 public static final int PERMISSION_WRITE_ENCRYPTED_MITM = 0x40; 75 76 /** 77 * Descriptor permission: Allow signed write operations 78 */ 79 public static final int PERMISSION_WRITE_SIGNED = 0x80; 80 81 /** 82 * Descriptor permission: Allow signed write operations with 83 * man-in-the-middle protection 84 */ 85 public static final int PERMISSION_WRITE_SIGNED_MITM = 0x100; 86 87 /** 88 * The UUID of this descriptor. 89 * @hide 90 */ 91 protected UUID mUuid; 92 93 /** 94 * Instance ID for this descriptor. 95 * @hide 96 */ 97 protected int mInstance; 98 99 /** 100 * Permissions for this descriptor 101 * @hide 102 */ 103 protected int mPermissions; 104 105 /** 106 * Back-reference to the characteristic this descriptor belongs to. 107 * @hide 108 */ 109 protected BluetoothGattCharacteristic mCharacteristic; 110 111 /** 112 * The value for this descriptor. 113 * @hide 114 */ 115 protected byte[] mValue; 116 117 /** 118 * Create a new BluetoothGattDescriptor. 119 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 120 * 121 * @param uuid The UUID for this descriptor 122 * @param permissions Permissions for this descriptor 123 */ BluetoothGattDescriptor(UUID uuid, int permissions)124 public BluetoothGattDescriptor(UUID uuid, int permissions) { 125 initDescriptor(null, uuid, 0, permissions); 126 } 127 128 /** 129 * Create a new BluetoothGattDescriptor. 130 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 131 * 132 * @param characteristic The characteristic this descriptor belongs to 133 * @param uuid The UUID for this descriptor 134 * @param permissions Permissions for this descriptor 135 */ BluetoothGattDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid, int instance, int permissions)136 /*package*/ BluetoothGattDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid, 137 int instance, int permissions) { 138 initDescriptor(characteristic, uuid, instance, permissions); 139 } 140 initDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid, int instance, int permissions)141 private void initDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid, 142 int instance, int permissions) { 143 mCharacteristic = characteristic; 144 mUuid = uuid; 145 mInstance = instance; 146 mPermissions = permissions; 147 } 148 149 /** 150 * Returns the characteristic this descriptor belongs to. 151 * @return The characteristic. 152 */ getCharacteristic()153 public BluetoothGattCharacteristic getCharacteristic() { 154 return mCharacteristic; 155 } 156 157 /** 158 * Set the back-reference to the associated characteristic 159 * @hide 160 */ setCharacteristic(BluetoothGattCharacteristic characteristic)161 /*package*/ void setCharacteristic(BluetoothGattCharacteristic characteristic) { 162 mCharacteristic = characteristic; 163 } 164 165 /** 166 * Returns the UUID of this descriptor. 167 * 168 * @return UUID of this descriptor 169 */ getUuid()170 public UUID getUuid() { 171 return mUuid; 172 } 173 174 /** 175 * Returns the instance ID for this descriptor. 176 * 177 * <p>If a remote device offers multiple descriptors with the same UUID, 178 * the instance ID is used to distuinguish between descriptors. 179 * 180 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 181 * 182 * @return Instance ID of this descriptor 183 * @hide 184 */ getInstanceId()185 public int getInstanceId() { 186 return mInstance; 187 } 188 189 /** 190 * Returns the permissions for this descriptor. 191 * 192 * @return Permissions of this descriptor 193 */ getPermissions()194 public int getPermissions() { 195 return mPermissions; 196 } 197 198 /** 199 * Returns the stored value for this descriptor 200 * 201 * <p>This function returns the stored value for this descriptor as 202 * retrieved by calling {@link BluetoothGatt#readDescriptor}. The cached 203 * value of the descriptor is updated as a result of a descriptor read 204 * operation. 205 * 206 * @return Cached value of the descriptor 207 */ getValue()208 public byte[] getValue() { 209 return mValue; 210 } 211 212 /** 213 * Updates the locally stored value of this descriptor. 214 * 215 * <p>This function modifies the locally stored cached value of this 216 * descriptor. To send the value to the remote device, call 217 * {@link BluetoothGatt#writeDescriptor} to send the value to the 218 * remote device. 219 * 220 * @param value New value for this descriptor 221 * @return true if the locally stored value has been set, false if the 222 * requested value could not be stored locally. 223 */ setValue(byte[] value)224 public boolean setValue(byte[] value) { 225 mValue = value; 226 return true; 227 } 228 } 229