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