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