BluetoothDevice.java revision cf44059813539bf7f36dabd278cef93ba3122c56
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Copyright (C) 2009 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.bluetooth; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.content.Context; 20bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.IBinder; 21bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.Parcel; 22bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.Parcelable; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 24bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.ServiceManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.io.IOException; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.UnsupportedEncodingException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 31bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Represents a remote Bluetooth device. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Use {@link BluetoothAdapter#getRemoteDevice} to create a {@link 3445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * BluetoothDevice}. 3545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * 3645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>This class is really just a thin wrapper for a Bluetooth hardware 3745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * address. Objects of this class are immutable. Operations on this class 3845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * are performed on the remote Bluetooth hardware address, using the 3945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * {@link BluetoothAdapter} that was used to create this {@link 4045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * BluetoothDevice}. 4145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * 4245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * TODO: unhide more of this class 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 44bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellypublic final class BluetoothDevice implements Parcelable { 45bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private static final String TAG = "BluetoothDevice"; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** We do not have a link key for the remote device, and are therefore not 4845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * bonded 4945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide*/ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BOND_NOT_BONDED = 0; 5145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** We have a link key for the remote device, and are probably bonded. 5245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BOND_BONDED = 1; 5445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** We are currently attempting bonding 5545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BOND_BONDING = 2; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin /** Ask device picker to show all kinds of BT devices. 59a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin * @hide */ 60a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin public static final int DEVICE_PICKER_FILTER_TYPE_ALL = 0; 61a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin /** Ask device picker to show BT devices that support AUDIO profiles. 62a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin * @hide */ 63a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin public static final int DEVICE_PICKER_FILTER_TYPE_AUDIO = 1; 64a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin /** Ask device picker to show BT devices that support Object Transfer. 65a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin * @hide */ 66a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin public static final int DEVICE_PICKER_FILTER_TYPE_TRANSFER = 2; 67a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //TODO: Unify these result codes in BluetoothResult or BluetoothError 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** A bond attempt failed because pins did not match, or remote device did 7045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * not respond to pin request in time 7145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_FAILED = 1; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** A bond attempt failed because the other side explicilty rejected 7445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * bonding 7545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_REJECTED = 2; 7745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** A bond attempt failed because we canceled the bonding process 7845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_CANCELED = 3; 8045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** A bond attempt failed because we could not contact the remote device 8145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_REMOTE_DEVICE_DOWN = 4; 8345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** A bond attempt failed because a discovery is in progress 8445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_DISCOVERY_IN_PROGRESS = 5; 8645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** An existing bond was explicitly revoked 8745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_REMOVED = 6; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly //TODO: Remove duplicates between here and BluetoothAdapter 9145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** The user will be prompted to enter a pin 9245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 93b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_PIN = 0; 9445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** The user will be prompted to enter a passkey 9545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 96b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_PASSKEY = 1; 9745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** The user will be prompted to confirm the passkey displayed on the screen 9845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 99b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_CONFIRMATION = 2; 100b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 101bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private static final int ADDRESS_LENGTH = 17; 102b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 103bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private static IBluetooth sService; /* Guarenteed constant after first object constructed */ 104bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 105bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private final String mAddress; 106d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 108bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Create a new BluetoothDevice 109bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Bluetooth MAC address must be upper case, such as "00:11:22:33:AA:BB", 110bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * and is validated in this constructor. 111bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param address valid Bluetooth MAC address 112bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws RuntimeException Bluetooth is not available on this platform 113bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IllegalArgumentException address is invalid 114bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @hide 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 116bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /*package*/ BluetoothDevice(String address) { 117bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly synchronized (BluetoothDevice.class) { 118bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (sService == null) { 119bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly IBinder b = ServiceManager.getService(Context.BLUETOOTH_SERVICE); 120bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (b == null) { 121bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly throw new RuntimeException("Bluetooth service not available"); 122bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 123bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly sService = IBluetooth.Stub.asInterface(b); 124bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 125bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 126bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 127bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (!checkBluetoothAddress(address)) { 128bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly throw new IllegalArgumentException(address + " is not a valid Bluetooth address"); 129bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 130bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 131bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly mAddress = address; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 134bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 135bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean equals(Object o) { 136bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (o instanceof BluetoothDevice) { 137bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress.equals(((BluetoothDevice)o).getAddress()); 138bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 142bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 143bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int hashCode() { 144bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress.hashCode(); 145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 14745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** 14845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Returns a string representation of this BluetoothDevice. 14945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Currently this is the Bluetooth hardware address, for example 15045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * "00:11:22:AA:BB:CC". However, you should always use {@link #getAddress} 15145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * if you explicitly require the Bluetooth hardware address in case the 15245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * {@link #toString} representation changes in the future. 15345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return string representation of this BluetoothDevice 15445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly */ 155bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 156bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public String toString() { 157bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 161bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int describeContents() { 162bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return 0; 163bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 164bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 16545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 166bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public static final Parcelable.Creator<BluetoothDevice> CREATOR = 167bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly new Parcelable.Creator<BluetoothDevice>() { 168bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothDevice createFromParcel(Parcel in) { 169bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothDevice(in.readString()); 170bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 171bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothDevice[] newArray(int size) { 172bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothDevice[size]; 173bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 174bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly }; 175bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 17645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 177bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public void writeToParcel(Parcel out, int flags) { 178bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly out.writeString(mAddress); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** 18245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Returns the hardware address of this BluetoothDevice. 18345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p> For example, "00:11:22:AA:BB:CC". 18445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return Bluetooth hardware address as string 18545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getAddress() { 187bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Get the friendly Bluetooth name of the remote device. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>The local adapter will automatically retrieve remote names when 19445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * performing a device scan, and will cache them. This method just returns 19545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * the name for this device from the cache. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Bluetooth name, or null if there was a problem. 19845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getName() { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 202bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteName(mAddress); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a bonding with a remote bluetooth device. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is an asynchronous call. The result of this bonding attempt can be 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * observed through BluetoothIntent.BOND_STATE_CHANGED_ACTION intents. 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address the remote device Bluetooth address. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return false If there was an immediate problem creating the bonding, 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true otherwise. 21645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 218bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean createBond() { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 220bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.createBond(mAddress); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cancel an in-progress bonding request started with createBond. 22745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 229bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean cancelBondProcess() { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 231bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.cancelBondProcess(mAddress); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 237bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Removes the remote device and the pairing information associated 238bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * with it. 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 240bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return true if the device was disconnected, false otherwise and on 241bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * error. 24245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 244bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean removeBond() { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 246bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.removeBond(mAddress); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 248bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return false; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the bonding state of a remote device. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Result is one of: 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothError.* 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BOND_* 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Bluetooth hardware address of the remote device to check. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Result code 26045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 262bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getBondState() { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 264bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getBondState(mAddress); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BluetoothError.ERROR_IPC; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue /** 270efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * Get trust state of a remote device. 271efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @hide 272efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue */ 273efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue public boolean getTrustState() { 274efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue try { 275efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return sService.getTrustState(mAddress); 276efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } catch (RemoteException e) { 277efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue Log.e(TAG, "", e); 278efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 279efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return false; 280efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 281efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue 282efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue /** 283efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * Set trust state for a remote device. 284efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @param value the trust state value (true or false) 285efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @hide 286efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue */ 287efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue public boolean setTrust(boolean value) { 288efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue try { 289efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return sService.setTrust(mAddress, value); 290efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } catch (RemoteException e) { 291efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue Log.e(TAG, "", e); 292efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 293efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return false; 294efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 295efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue 29645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 297bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getBluetoothClass() { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 299bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteClass(mAddress); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 301d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh return BluetoothError.ERROR_IPC; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 305bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public String[] getUuids() { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 307bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteUuids(mAddress); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 311d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 31245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 313bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getServiceChannel(String uuid) { 314d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh try { 315bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteServiceChannel(mAddress, uuid); 316d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 317d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh return BluetoothError.ERROR_IPC; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 321bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPin(byte[] pin) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 323bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.setPin(mAddress, pin); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 327b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 32845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 329bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPasskey(int passkey) { 330b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh try { 331bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.setPasskey(mAddress, passkey); 332b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 333b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh return false; 334b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } 335b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 33645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 337bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPairingConfirmation(boolean confirm) { 338b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh try { 339bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.setPairingConfirmation(mAddress, confirm); 340b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 341b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh return false; 342b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } 343b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 34445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 345bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean cancelPairingUserInput() { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 347bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.cancelPairingUserInput(mAddress); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Create an RFCOMM {@link BluetoothSocket} ready to start a secure 35445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * outgoing connection to this remote device. 35545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>The remote device will be authenticated and communication on this 35645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * socket will be encrypted. 35745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Use {@link BluetoothSocket#connect} to intiate the outgoing 35845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * connection. 35945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Valid RFCOMM channels are in range 1 to 30. 360cf44059813539bf7f36dabd278cef93ba3122c56Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 36145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @param channel RFCOMM channel to connect to 36245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 363bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException on error, for example Bluetooth not available, or 36445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * insufficient permissions 365bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 36645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly public BluetoothSocket createRfcommSocket(int channel) throws IOException { 36745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, channel); 368bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 369bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 370bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 371bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Construct an insecure RFCOMM socket ready to start an outgoing 372bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * connection. 373bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Call #connect on the returned #BluetoothSocket to begin the connection. 374bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * The remote device will not be authenticated and communication on this 375bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * socket will not be encrypted. 376bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param port remote port 377bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return An RFCOMM BluetoothSocket 378bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException On error, for example Bluetooth not available, or 379bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * insufficient permissions. 38045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 381bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 382bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothSocket createInsecureRfcommSocket(int port) throws IOException { 383bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, port); 384bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 385bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 386bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 387bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Construct a SCO socket ready to start an outgoing connection. 388bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Call #connect on the returned #BluetoothSocket to begin the connection. 389bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return a SCO BluetoothSocket 390bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException on error, for example Bluetooth not available, or 391bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * insufficient permissions. 39245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 393bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 394bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothSocket createScoSocket() throws IOException { 395bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1); 396bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 397bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 398bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that a pin is valid and convert to byte array. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth pin's are 1 to 16 bytes of UTF8 characters. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pin pin as java String 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the pin code as a UTF8 byte array, or null if it is an invalid 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth pin. 40545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static byte[] convertPinToBytes(String pin) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pin == null) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] pinBytes; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pinBytes = pin.getBytes("UTF8"); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (UnsupportedEncodingException uee) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "UTF8 not supported?!?"); // this should not happen 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pinBytes.length <= 0 || pinBytes.length > 16) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pinBytes; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** Sanity check a bluetooth address, such as "00:43:A8:23:10:F0" 42545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide */ 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean checkBluetoothAddress(String address) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (address == null || address.length() != ADDRESS_LENGTH) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < ADDRESS_LENGTH; i++) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = address.charAt(i); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (i % 3) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Character.digit(c, 16) != -1) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; // hex character, OK 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == ':') { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; // OK 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 449