Home | History | Annotate | Download | only in bluetooth
      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 PANU =
     60             ParcelUuid.fromString("00001115-0000-1000-8000-00805F9B34FB");
     61     public static final ParcelUuid NAP =
     62             ParcelUuid.fromString("00001116-0000-1000-8000-00805F9B34FB");
     63     public static final ParcelUuid BNEP =
     64             ParcelUuid.fromString("0000000f-0000-1000-8000-00805F9B34FB");
     65     public static final ParcelUuid PBAP_PSE =
     66             ParcelUuid.fromString("0000112f-0000-1000-8000-00805F9B34FB");
     67 
     68     public static final ParcelUuid[] RESERVED_UUIDS = {
     69         AudioSink, AudioSource, AdvAudioDist, HSP, Handsfree, AvrcpController, AvrcpTarget,
     70         ObexObjectPush, PANU, NAP};
     71 
     72     public static boolean isAudioSource(ParcelUuid uuid) {
     73         return uuid.equals(AudioSource);
     74     }
     75 
     76     public static boolean isAudioSink(ParcelUuid uuid) {
     77         return uuid.equals(AudioSink);
     78     }
     79 
     80     public static boolean isAdvAudioDist(ParcelUuid uuid) {
     81         return uuid.equals(AdvAudioDist);
     82     }
     83 
     84     public static boolean isHandsfree(ParcelUuid uuid) {
     85         return uuid.equals(Handsfree);
     86     }
     87 
     88     public static boolean isHeadset(ParcelUuid uuid) {
     89         return uuid.equals(HSP);
     90     }
     91 
     92     public static boolean isAvrcpController(ParcelUuid uuid) {
     93         return uuid.equals(AvrcpController);
     94     }
     95 
     96     public static boolean isAvrcpTarget(ParcelUuid uuid) {
     97         return uuid.equals(AvrcpTarget);
     98     }
     99 
    100     public static boolean isInputDevice(ParcelUuid uuid) {
    101         return uuid.equals(Hid);
    102     }
    103 
    104     public static boolean isPanu(ParcelUuid uuid) {
    105         return uuid.equals(PANU);
    106     }
    107 
    108     public static boolean isNap(ParcelUuid uuid) {
    109         return uuid.equals(NAP);
    110     }
    111 
    112     public static boolean isBnep(ParcelUuid uuid) {
    113         return uuid.equals(BNEP);
    114     }
    115     /**
    116      * Returns true if ParcelUuid is present in uuidArray
    117      *
    118      * @param uuidArray - Array of ParcelUuids
    119      * @param uuid
    120      */
    121     public static boolean isUuidPresent(ParcelUuid[] uuidArray, ParcelUuid uuid) {
    122         if ((uuidArray == null || uuidArray.length == 0) && uuid == null)
    123             return true;
    124 
    125         if (uuidArray == null)
    126             return false;
    127 
    128         for (ParcelUuid element: uuidArray) {
    129             if (element.equals(uuid)) return true;
    130         }
    131         return false;
    132     }
    133 
    134     /**
    135      * Returns true if there any common ParcelUuids in uuidA and uuidB.
    136      *
    137      * @param uuidA - List of ParcelUuids
    138      * @param uuidB - List of ParcelUuids
    139      *
    140      */
    141     public static boolean containsAnyUuid(ParcelUuid[] uuidA, ParcelUuid[] uuidB) {
    142         if (uuidA == null && uuidB == null) return true;
    143 
    144         if (uuidA == null) {
    145             return uuidB.length == 0 ? true : false;
    146         }
    147 
    148         if (uuidB == null) {
    149             return uuidA.length == 0 ? true : false;
    150         }
    151 
    152         HashSet<ParcelUuid> uuidSet = new HashSet<ParcelUuid> (Arrays.asList(uuidA));
    153         for (ParcelUuid uuid: uuidB) {
    154             if (uuidSet.contains(uuid)) return true;
    155         }
    156         return false;
    157     }
    158 
    159     /**
    160      * Returns true if all the ParcelUuids in ParcelUuidB are present in
    161      * ParcelUuidA
    162      *
    163      * @param uuidA - Array of ParcelUuidsA
    164      * @param uuidB - Array of ParcelUuidsB
    165      *
    166      */
    167     public static boolean containsAllUuids(ParcelUuid[] uuidA, ParcelUuid[] uuidB) {
    168         if (uuidA == null && uuidB == null) return true;
    169 
    170         if (uuidA == null) {
    171             return uuidB.length == 0 ? true : false;
    172         }
    173 
    174         if (uuidB == null) return true;
    175 
    176         HashSet<ParcelUuid> uuidSet = new HashSet<ParcelUuid> (Arrays.asList(uuidA));
    177         for (ParcelUuid uuid: uuidB) {
    178             if (!uuidSet.contains(uuid)) return false;
    179         }
    180         return true;
    181     }
    182 
    183     /**
    184      * Extract the Service Identifier or the actual uuid from the Parcel Uuid.
    185      * For example, if 0000110B-0000-1000-8000-00805F9B34FB is the parcel Uuid,
    186      * this function will return 110B
    187      * @param parcelUuid
    188      * @return the service identifier.
    189      */
    190     public static int getServiceIdentifierFromParcelUuid(ParcelUuid parcelUuid) {
    191         UUID uuid = parcelUuid.getUuid();
    192         long value = (uuid.getMostSignificantBits() & 0x0000FFFF00000000L) >>> 32;
    193         return (int)value;
    194     }
    195 }
    196