1d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh/* 2d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * Copyright (C) 2009 The Android Open Source Project 3d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * 4d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License"); 5d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * you may not use this file except in compliance with the License. 6d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * You may obtain a copy of the License at 7d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * 8d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * http://www.apache.org/licenses/LICENSE-2.0 9d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * 10d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * Unless required by applicable law or agreed to in writing, software 11d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS, 12d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * See the License for the specific language governing permissions and 14d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * limitations under the License. 15d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh */ 16d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 17d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshpackage android.bluetooth; 18d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 19aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pellyimport android.os.ParcelUuid; 20aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly 21dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganeshimport java.util.Arrays; 22dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganeshimport java.util.HashSet; 23d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 24d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh/** 25dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh* Static helper methods and constants to decode the ParcelUuid of remote devices. 26d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh* @hide 27d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh*/ 28d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganeshpublic final class BluetoothUuid { 29d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 30d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh /* See Bluetooth Assigned Numbers document - SDP section, to get the values of UUIDs 31d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * for the various services. 32d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * 33d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * The following 128 bit values are calculated as: 34d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh * uuid * 2^96 + BASE_UUID 35d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh */ 36dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid AudioSink = 37dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); 38dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid AudioSource = 39dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB"); 40dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid AdvAudioDist = 41dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("0000110D-0000-1000-8000-00805F9B34FB"); 42dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid HSP = 43dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("00001108-0000-1000-8000-00805F9B34FB"); 44dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid Handsfree = 45dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("0000111E-0000-1000-8000-00805F9B34FB"); 46dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid AvrcpController = 47dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("0000110E-0000-1000-8000-00805F9B34FB"); 48dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid AvrcpTarget = 49dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"); 50dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static final ParcelUuid ObexObjectPush = 51dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh ParcelUuid.fromString("00001105-0000-1000-8000-00805f9b34fb"); 52dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 5324bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly public static final ParcelUuid[] RESERVED_UUIDS = { 5424bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly AudioSink, AudioSource, AdvAudioDist, HSP, Handsfree, AvrcpController, AvrcpTarget, 5524bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly ObexObjectPush}; 5624bb9b8af4ff691538fe9e517e8156016b0da6cdNick Pelly 57dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isAudioSource(ParcelUuid uuid) { 58d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh return uuid.equals(AudioSource); 59d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } 60d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 61dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isAudioSink(ParcelUuid uuid) { 62d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh return uuid.equals(AudioSink); 63d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } 64d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 65dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isAdvAudioDist(ParcelUuid uuid) { 66d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh return uuid.equals(AdvAudioDist); 67d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } 68d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 69dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isHandsfree(ParcelUuid uuid) { 707f74d534f39c4d1e1db8604faa117dcf127cc8b9Jaikumar Ganesh return uuid.equals(Handsfree); 71d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } 72d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 73dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isHeadset(ParcelUuid uuid) { 74ade40526c899caf9369652f9481634a6232ec022Jaikumar Ganesh return uuid.equals(HSP); 75d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } 76d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 77dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isAvrcpController(ParcelUuid uuid) { 78ade40526c899caf9369652f9481634a6232ec022Jaikumar Ganesh return uuid.equals(AvrcpController); 79ade40526c899caf9369652f9481634a6232ec022Jaikumar Ganesh } 809abcf0982edcda6d14fd8057fe0cfd2147cac477Jackson Fan 81dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isAvrcpTarget(ParcelUuid uuid) { 829abcf0982edcda6d14fd8057fe0cfd2147cac477Jackson Fan return uuid.equals(AvrcpTarget); 839abcf0982edcda6d14fd8057fe0cfd2147cac477Jackson Fan } 84dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 85dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh /** 86dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * Returns true if ParcelUuid is present in uuidArray 87dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * 88dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * @param uuidArray - Array of ParcelUuids 89dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * @param uuid 90dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh */ 91dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean isUuidPresent(ParcelUuid[] uuidArray, ParcelUuid uuid) { 9210eac971b3a6e5f34a420dd68ebfa796553ad2b9Jaikumar Ganesh if ((uuidArray == null || uuidArray.length == 0) && uuid == null) 9310eac971b3a6e5f34a420dd68ebfa796553ad2b9Jaikumar Ganesh return true; 9410eac971b3a6e5f34a420dd68ebfa796553ad2b9Jaikumar Ganesh 9510eac971b3a6e5f34a420dd68ebfa796553ad2b9Jaikumar Ganesh if (uuidArray == null) 9610eac971b3a6e5f34a420dd68ebfa796553ad2b9Jaikumar Ganesh return false; 9710eac971b3a6e5f34a420dd68ebfa796553ad2b9Jaikumar Ganesh 98dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh for (ParcelUuid element: uuidArray) { 99dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh if (element.equals(uuid)) return true; 100dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh } 101dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh return false; 102dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh } 103dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 104dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh /** 105dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * Returns true if there any common ParcelUuids in uuidA and uuidB. 106dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * 107dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * @param uuidA - List of ParcelUuids 108dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * @param uuidB - List of ParcelUuids 109dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * 110dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh */ 111dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean containsAnyUuid(ParcelUuid[] uuidA, ParcelUuid[] uuidB) { 112dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh if (uuidA == null && uuidB == null) return true; 113dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh 114dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh if (uuidA == null) { 115dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh return uuidB.length == 0 ? true : false; 116dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh } 117dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh 118dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh if (uuidB == null) { 119dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh return uuidA.length == 0 ? true : false; 120dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh } 121dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 122dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh HashSet<ParcelUuid> uuidSet = new HashSet<ParcelUuid> (Arrays.asList(uuidA)); 123dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh for (ParcelUuid uuid: uuidB) { 124dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh if (uuidSet.contains(uuid)) return true; 125dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh } 126dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh return false; 127dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh } 128dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 129dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh /** 130dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * Returns true if all the ParcelUuids in ParcelUuidB are present in 131dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * ParcelUuidA 132dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * 133dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * @param uuidA - Array of ParcelUuidsA 134dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * @param uuidB - Array of ParcelUuidsB 135dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh * 136dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh */ 137dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public static boolean containsAllUuids(ParcelUuid[] uuidA, ParcelUuid[] uuidB) { 138dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh if (uuidA == null && uuidB == null) return true; 139dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh 140dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh if (uuidA == null) { 141dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh return uuidB.length == 0 ? true : false; 142dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh } 143dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh 144dca2f0fec30e6acbdc466fd6dffb425877e7728aJaikumar Ganesh if (uuidB == null) return true; 145dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 146dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh HashSet<ParcelUuid> uuidSet = new HashSet<ParcelUuid> (Arrays.asList(uuidA)); 147dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh for (ParcelUuid uuid: uuidB) { 148dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh if (!uuidSet.contains(uuid)) return false; 149dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh } 150dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh return true; 151dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh } 152dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh 153ade40526c899caf9369652f9481634a6232ec022Jaikumar Ganesh} 154