1 /* 2 * Copyright (C) 2009 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 android.os.ParcelUuid; 20 21 import java.util.Arrays; 22 import java.util.HashSet; 23 import java.util.UUID; 24 25 /** 26 * Static helper methods and constants to decode the ParcelUuid of remote devices. 27 * @hide 28 */ 29 public final class BluetoothUuid { 30 31 /* See Bluetooth Assigned Numbers document - SDP section, to get the values of UUIDs 32 * for the various services. 33 * 34 * The following 128 bit values are calculated as: 35 * uuid * 2^96 + BASE_UUID 36 */ 37 public static final ParcelUuid AudioSink = 38 ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); 39 public static final ParcelUuid AudioSource = 40 ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB"); 41 public static final ParcelUuid AdvAudioDist = 42 ParcelUuid.fromString("0000110D-0000-1000-8000-00805F9B34FB"); 43 public static final ParcelUuid HSP = 44 ParcelUuid.fromString("00001108-0000-1000-8000-00805F9B34FB"); 45 public static final ParcelUuid HSP_AG = 46 ParcelUuid.fromString("00001112-0000-1000-8000-00805F9B34FB"); 47 public static final ParcelUuid Handsfree = 48 ParcelUuid.fromString("0000111E-0000-1000-8000-00805F9B34FB"); 49 public static final ParcelUuid Handsfree_AG = 50 ParcelUuid.fromString("0000111F-0000-1000-8000-00805F9B34FB"); 51 public static final ParcelUuid AvrcpController = 52 ParcelUuid.fromString("0000110E-0000-1000-8000-00805F9B34FB"); 53 public static final ParcelUuid AvrcpTarget = 54 ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"); 55 public static final ParcelUuid ObexObjectPush = 56 ParcelUuid.fromString("00001105-0000-1000-8000-00805f9b34fb"); 57 public static final ParcelUuid Hid = 58 ParcelUuid.fromString("00001124-0000-1000-8000-00805f9b34fb"); 59 public static final ParcelUuid Hogp = 60 ParcelUuid.fromString("00001812-0000-1000-8000-00805f9b34fb"); 61 public static final ParcelUuid PANU = 62 ParcelUuid.fromString("00001115-0000-1000-8000-00805F9B34FB"); 63 public static final ParcelUuid NAP = 64 ParcelUuid.fromString("00001116-0000-1000-8000-00805F9B34FB"); 65 public static final ParcelUuid BNEP = 66 ParcelUuid.fromString("0000000f-0000-1000-8000-00805F9B34FB"); 67 public static final ParcelUuid PBAP_PSE = 68 ParcelUuid.fromString("0000112f-0000-1000-8000-00805F9B34FB"); 69 public static final ParcelUuid MAP = 70 ParcelUuid.fromString("00001134-0000-1000-8000-00805F9B34FB"); 71 public static final ParcelUuid MNS = 72 ParcelUuid.fromString("00001133-0000-1000-8000-00805F9B34FB"); 73 public static final ParcelUuid MAS = 74 ParcelUuid.fromString("00001132-0000-1000-8000-00805F9B34FB"); 75 76 public static final ParcelUuid BASE_UUID = 77 ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB"); 78 79 80 public static final ParcelUuid[] RESERVED_UUIDS = { 81 AudioSink, AudioSource, AdvAudioDist, HSP, Handsfree, AvrcpController, AvrcpTarget, 82 ObexObjectPush, PANU, NAP, MAP, MNS, MAS}; 83 84 public static boolean isAudioSource(ParcelUuid uuid) { 85 return uuid.equals(AudioSource); 86 } 87 88 public static boolean isAudioSink(ParcelUuid uuid) { 89 return uuid.equals(AudioSink); 90 } 91 92 public static boolean isAdvAudioDist(ParcelUuid uuid) { 93 return uuid.equals(AdvAudioDist); 94 } 95 96 public static boolean isHandsfree(ParcelUuid uuid) { 97 return uuid.equals(Handsfree); 98 } 99 100 public static boolean isHeadset(ParcelUuid uuid) { 101 return uuid.equals(HSP); 102 } 103 104 public static boolean isAvrcpController(ParcelUuid uuid) { 105 return uuid.equals(AvrcpController); 106 } 107 108 public static boolean isAvrcpTarget(ParcelUuid uuid) { 109 return uuid.equals(AvrcpTarget); 110 } 111 112 public static boolean isInputDevice(ParcelUuid uuid) { 113 return uuid.equals(Hid); 114 } 115 116 public static boolean isPanu(ParcelUuid uuid) { 117 return uuid.equals(PANU); 118 } 119 120 public static boolean isNap(ParcelUuid uuid) { 121 return uuid.equals(NAP); 122 } 123 124 public static boolean isBnep(ParcelUuid uuid) { 125 return uuid.equals(BNEP); 126 } 127 public static boolean isMap(ParcelUuid uuid) { 128 return uuid.equals(MAP); 129 } 130 public static boolean isMns(ParcelUuid uuid) { 131 return uuid.equals(MNS); 132 } 133 public static boolean isMas(ParcelUuid uuid) { 134 return uuid.equals(MAS); 135 } 136 137 /** 138 * Returns true if ParcelUuid is present in uuidArray 139 * 140 * @param uuidArray - Array of ParcelUuids 141 * @param uuid 142 */ 143 public static boolean isUuidPresent(ParcelUuid[] uuidArray, ParcelUuid uuid) { 144 if ((uuidArray == null || uuidArray.length == 0) && uuid == null) 145 return true; 146 147 if (uuidArray == null) 148 return false; 149 150 for (ParcelUuid element: uuidArray) { 151 if (element.equals(uuid)) return true; 152 } 153 return false; 154 } 155 156 /** 157 * Returns true if there any common ParcelUuids in uuidA and uuidB. 158 * 159 * @param uuidA - List of ParcelUuids 160 * @param uuidB - List of ParcelUuids 161 * 162 */ 163 public static boolean containsAnyUuid(ParcelUuid[] uuidA, ParcelUuid[] uuidB) { 164 if (uuidA == null && uuidB == null) return true; 165 166 if (uuidA == null) { 167 return uuidB.length == 0 ? true : false; 168 } 169 170 if (uuidB == null) { 171 return uuidA.length == 0 ? true : false; 172 } 173 174 HashSet<ParcelUuid> uuidSet = new HashSet<ParcelUuid> (Arrays.asList(uuidA)); 175 for (ParcelUuid uuid: uuidB) { 176 if (uuidSet.contains(uuid)) return true; 177 } 178 return false; 179 } 180 181 /** 182 * Returns true if all the ParcelUuids in ParcelUuidB are present in 183 * ParcelUuidA 184 * 185 * @param uuidA - Array of ParcelUuidsA 186 * @param uuidB - Array of ParcelUuidsB 187 * 188 */ 189 public static boolean containsAllUuids(ParcelUuid[] uuidA, ParcelUuid[] uuidB) { 190 if (uuidA == null && uuidB == null) return true; 191 192 if (uuidA == null) { 193 return uuidB.length == 0 ? true : false; 194 } 195 196 if (uuidB == null) return true; 197 198 HashSet<ParcelUuid> uuidSet = new HashSet<ParcelUuid> (Arrays.asList(uuidA)); 199 for (ParcelUuid uuid: uuidB) { 200 if (!uuidSet.contains(uuid)) return false; 201 } 202 return true; 203 } 204 205 /** 206 * Extract the Service Identifier or the actual uuid from the Parcel Uuid. 207 * For example, if 0000110B-0000-1000-8000-00805F9B34FB is the parcel Uuid, 208 * this function will return 110B 209 * @param parcelUuid 210 * @return the service identifier. 211 */ 212 public static int getServiceIdentifierFromParcelUuid(ParcelUuid parcelUuid) { 213 UUID uuid = parcelUuid.getUuid(); 214 long value = (uuid.getMostSignificantBits() & 0x0000FFFF00000000L) >>> 32; 215 return (int)value; 216 } 217 218 /** 219 * Check whether the given parcelUuid can be converted to 16 bit bluetooth uuid. 220 * @param parcelUuid 221 * @return true if the parcelUuid can be converted to 16 bit uuid, false otherwise. 222 */ 223 public static boolean isShortUuid(ParcelUuid parcelUuid) { 224 UUID uuid = parcelUuid.getUuid(); 225 if (uuid.getLeastSignificantBits() != BASE_UUID.getUuid().getLeastSignificantBits()) { 226 return false; 227 } 228 return ((uuid.getMostSignificantBits() & 0xFFFF0000FFFFFFFFL) == 0x1000L); 229 } 230 } 231