RemoteDevices.java revision 2c0df0560ad5ae3fd6022b17b17a6a70143e216a
1ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/*
22c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta * Copyright (C) 2012-2014 The Android Open Source Project
3ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *
4ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Licensed under the Apache License, Version 2.0 (the "License");
5ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * you may not use this file except in compliance with the License.
6ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * You may obtain a copy of the License at
7ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *
8ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *      http://www.apache.org/licenses/LICENSE-2.0
9ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *
10ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Unless required by applicable law or agreed to in writing, software
11ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * distributed under the License is distributed on an "AS IS" BASIS,
12ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * See the License for the specific language governing permissions and
14ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * limitations under the License.
15ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */
16ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
17ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshpackage com.android.bluetooth.btservice;
18ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
19ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter;
20ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothClass;
21ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothDevice;
222c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Guptaimport android.bluetooth.BluetoothMasInstance;
23ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.content.Context;
24ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.content.Intent;
25ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.os.Handler;
26ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.os.Message;
27ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.os.ParcelUuid;
28ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.util.Log;
29ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
30ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.bluetooth.Utils;
31ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.bluetooth.btservice.RemoteDevices.DeviceProperties;
32ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
337aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelliimport java.util.concurrent.atomic.AtomicInteger;
34ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport java.util.ArrayList;
357aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelliimport java.util.Arrays;
36ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport java.util.HashMap;
37ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport java.util.LinkedList;
38ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
39ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
40ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshfinal class RemoteDevices {
41fd1da115cbf09b7dd9bca3c7d3a4fb816a835dc5Matthew Xie    private static final boolean DBG = false;
42ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final String TAG = "BluetoothRemoteDevices";
43ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
4474ae04c73312403e89db0f8e9bd9601d403b4783fredc
45ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static BluetoothAdapter mAdapter;
46ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static AdapterService mAdapterService;
47ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static ArrayList<BluetoothDevice> mSdpTracker;
482c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    private static ArrayList<BluetoothDevice> mSdpMasTracker;
49ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
50ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private Object mObject = new Object();
51ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
52ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final int UUID_INTENT_DELAY = 6000;
53ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final int MESSAGE_UUID_INTENT = 1;
54ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
552c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    private static final int MAS_INSTANCE_INTENT_DELAY = 6000;
562c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    private static final int MESSAGE_MAS_INSTANCE_INTENT = 2;
572c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
58ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private HashMap<BluetoothDevice, DeviceProperties> mDevices;
59ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
6074ae04c73312403e89db0f8e9bd9601d403b4783fredc    RemoteDevices(AdapterService service) {
61ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapter = BluetoothAdapter.getDefaultAdapter();
62ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterService = service;
63ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mSdpTracker = new ArrayList<BluetoothDevice>();
642c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mSdpMasTracker = new ArrayList<BluetoothDevice>();
65ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mDevices = new HashMap<BluetoothDevice, DeviceProperties>();
66ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
67ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
68ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
6974ae04c73312403e89db0f8e9bd9601d403b4783fredc    void cleanup() {
7015d36984a79d6e35c659edb0efdf929f0b526bd5Fred        if (mSdpTracker !=null)
7115d36984a79d6e35c659edb0efdf929f0b526bd5Fred            mSdpTracker.clear();
7215d36984a79d6e35c659edb0efdf929f0b526bd5Fred
732c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (mSdpMasTracker != null)
742c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            mSdpMasTracker.clear();
752c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
7615d36984a79d6e35c659edb0efdf929f0b526bd5Fred        if (mDevices != null)
7715d36984a79d6e35c659edb0efdf929f0b526bd5Fred            mDevices.clear();
786654f5c903de510a70f9e72cd5ad7837b615d93ffredc    }
796654f5c903de510a70f9e72cd5ad7837b615d93ffredc
80ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    public Object Clone() throws CloneNotSupportedException {
81ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        throw new CloneNotSupportedException();
82ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
83ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
84ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    DeviceProperties getDeviceProperties(BluetoothDevice device) {
85ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        synchronized (mDevices) {
86ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return mDevices.get(device);
87ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
88ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
89ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
90ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    BluetoothDevice getDevice(byte[] address) {
91ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        for (BluetoothDevice dev : mDevices.keySet()) {
92ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            if (dev.getAddress().equals(Utils.getAddressStringFromByte(address))) {
93ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return dev;
94ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
96ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return null;
97ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
98ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
99ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    DeviceProperties addDeviceProperties(byte[] address) {
100ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        synchronized (mDevices) {
101ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            DeviceProperties prop = new DeviceProperties();
102ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            BluetoothDevice device =
103ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    mAdapter.getRemoteDevice(Utils.getAddressStringFromByte(address));
10474a598e0a8d50343227e3f96bbe56c6be1c240f9Ganesh Ganapathi Batta            prop.mAddress = address;
105ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            mDevices.put(device, prop);
106ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return prop;
107ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
108ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
109ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
110ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    class DeviceProperties {
111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private String mName;
112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private byte[] mAddress;
113ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private int mBluetoothClass;
114ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private short mRssi;
115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private ParcelUuid[] mUuids;
116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private int mDeviceType;
117ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private String mAlias;
118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private int mBondState;
119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties() {
121ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            mBondState = BluetoothDevice.BOND_NONE;
122ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
123ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
124ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
125ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mName
126ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
127ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        String getName() {
128ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
129ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mName;
130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
131ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
132ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
134ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mClass
135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
136ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int getBluetoothClass() {
137ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
138ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mBluetoothClass;
139ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
140ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
141ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
142ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
143ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mUuids
144ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
145ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        ParcelUuid[] getUuids() {
146ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
147ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mUuids;
148ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
150ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
152ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mAddress
153ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
154ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        byte[] getAddress() {
155ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
156ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mAddress;
157ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
158ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
159ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
160ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
161ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return mRssi
162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
163ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        short getRssi() {
164ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mRssi;
166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return mDeviceType
171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int getDeviceType() {
173ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
174ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mDeviceType;
175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
179ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mAlias
180ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
181ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        String getAlias() {
182ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mAlias;
184ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
185ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
186ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
188ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @param mAlias the mAlias to set
189ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
190ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        void setAlias(String mAlias) {
191ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
192ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                mAdapterService.setDevicePropertyNative(mAddress,
193ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    AbstractionLayer.BT_PROPERTY_REMOTE_FRIENDLY_NAME, mAlias.getBytes());
194ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
195ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
196ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
197ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
198ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @param mBondState the mBondState to set
199ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
200ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        void setBondState(int mBondState) {
201ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
202ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                this.mBondState = mBondState;
203d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                if (mBondState == BluetoothDevice.BOND_NONE)
204d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                {
205d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    /* Clearing the Uuids local copy when the device is unpaired. If not cleared,
206d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    cachedBluetoothDevice issued a connect using the local cached copy of uuids,
207d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    without waiting for the ACTION_UUID intent.
208d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    This was resulting in multiple calls to connect().*/
209d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    mUuids = null;
210d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                }
211ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
212ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
213ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
214ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
215ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mBondState
216ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
217ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int getBondState() {
218ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
219ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mBondState;
220ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
221ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
2227aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli    }
223ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
224ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void sendUuidIntent(BluetoothDevice device) {
225ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties prop = getDeviceProperties(device);
226ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothDevice.ACTION_UUID);
227ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
228c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        intent.putExtra(BluetoothDevice.EXTRA_UUID, prop == null? null: prop.mUuids);
22934409f35db6e9ca74f727e3fe92141388ae5b069Ganesh Ganapathi Batta        mAdapterService.initProfilePriorities(device, prop.mUuids);
23074ae04c73312403e89db0f8e9bd9601d403b4783fredc        mAdapterService.sendBroadcast(intent, AdapterService.BLUETOOTH_ADMIN_PERM);
231c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc
232c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        //Remove the outstanding UUID request
233c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        mSdpTracker.remove(device);
234ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
235ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
2362c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    private void sendMasInstanceIntent(BluetoothDevice device,
2372c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            ArrayList<BluetoothMasInstance> instances) {
2382c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        Intent intent = new Intent(BluetoothDevice.ACTION_MAS_INSTANCE);
2392c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
2402c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
2412c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (instances != null)  intent.putExtra(BluetoothDevice.EXTRA_MAS_INSTANCE, instances);
2422c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mAdapterService.sendBroadcast(intent, AdapterService.BLUETOOTH_ADMIN_PERM);
2432c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
2442c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        //Remove the outstanding UUID request
2452c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mSdpMasTracker.remove(device);
2462c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    }
2472c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
2486de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera    private void sendDisplayPinIntent(byte[] address, int pin) {
2496de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
2506de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, getDevice(address));
2516de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        intent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, pin);
2526de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
2536de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera                    BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN);
254cc4730be1fcf272355368ca4a2c464d71d3f432dMatthew Xie        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
255810c49b2cfece1c48ced464d6bd2509ec4cac7a3Matthew Xie        mAdapterService.sendOrderedBroadcast(intent, mAdapterService.BLUETOOTH_ADMIN_PERM);
2566de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera    }
2576de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera
258ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void devicePropertyChangedCallback(byte[] address, int[] types, byte[][] values) {
259ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent;
260ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        byte[] val;
261ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int type;
262ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        BluetoothDevice bdDevice = getDevice(address);
263ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties device;
264ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (bdDevice == null) {
265ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            device = addDeviceProperties(address);
266ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            bdDevice = getDevice(address);
267ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else {
268ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            device = getDeviceProperties(bdDevice);
269ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
270ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
271ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        for (int j = 0; j < types.length; j++) {
272ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            type = types[j];
273ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            val = values[j];
274caa3723eaa20e57aac086d54a41106108503debczzy            if(val.length <= 0)
275caa3723eaa20e57aac086d54a41106108503debczzy                errorLog("devicePropertyChangedCallback: bdDevice: " + bdDevice + ", value is empty for type: " + type);
276caa3723eaa20e57aac086d54a41106108503debczzy            else {
277caa3723eaa20e57aac086d54a41106108503debczzy                synchronized(mObject) {
278caa3723eaa20e57aac086d54a41106108503debczzy                    switch (type) {
279caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_BDNAME:
280caa3723eaa20e57aac086d54a41106108503debczzy                            device.mName = new String(val);
281caa3723eaa20e57aac086d54a41106108503debczzy                            intent = new Intent(BluetoothDevice.ACTION_NAME_CHANGED);
282caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, bdDevice);
283caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_NAME, device.mName);
284caa3723eaa20e57aac086d54a41106108503debczzy                            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
285caa3723eaa20e57aac086d54a41106108503debczzy                            mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
286caa3723eaa20e57aac086d54a41106108503debczzy                            debugLog("Remote Device name is: " + device.mName);
287caa3723eaa20e57aac086d54a41106108503debczzy                            break;
288caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_REMOTE_FRIENDLY_NAME:
289caa3723eaa20e57aac086d54a41106108503debczzy                            if (device.mAlias != null) {
290caa3723eaa20e57aac086d54a41106108503debczzy                                System.arraycopy(val, 0, device.mAlias, 0, val.length);
291caa3723eaa20e57aac086d54a41106108503debczzy                            }
2920322ae1f5e8ea55c391145e7925cb5962a97c11fGanesh Ganapathi Batta                            else {
2930322ae1f5e8ea55c391145e7925cb5962a97c11fGanesh Ganapathi Batta                                device.mAlias = new String(val);
2940322ae1f5e8ea55c391145e7925cb5962a97c11fGanesh Ganapathi Batta                            }
295caa3723eaa20e57aac086d54a41106108503debczzy                            break;
296caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_BDADDR:
297caa3723eaa20e57aac086d54a41106108503debczzy                            device.mAddress = val;
298caa3723eaa20e57aac086d54a41106108503debczzy                            debugLog("Remote Address is:" + Utils.getAddressStringFromByte(val));
299caa3723eaa20e57aac086d54a41106108503debczzy                            break;
300caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE:
301caa3723eaa20e57aac086d54a41106108503debczzy                            device.mBluetoothClass =  Utils.byteArrayToInt(val);
302caa3723eaa20e57aac086d54a41106108503debczzy                            intent = new Intent(BluetoothDevice.ACTION_CLASS_CHANGED);
303caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, bdDevice);
304caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_CLASS,
305caa3723eaa20e57aac086d54a41106108503debczzy                                    new BluetoothClass(device.mBluetoothClass));
306caa3723eaa20e57aac086d54a41106108503debczzy                            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
307caa3723eaa20e57aac086d54a41106108503debczzy                            mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
308caa3723eaa20e57aac086d54a41106108503debczzy                            debugLog("Remote class is:" + device.mBluetoothClass);
309caa3723eaa20e57aac086d54a41106108503debczzy                            break;
310caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_UUIDS:
311caa3723eaa20e57aac086d54a41106108503debczzy                            int numUuids = val.length/AbstractionLayer.BT_UUID_SIZE;
312caa3723eaa20e57aac086d54a41106108503debczzy                            device.mUuids = Utils.byteArrayToUuid(val);
313caa3723eaa20e57aac086d54a41106108503debczzy                            sendUuidIntent(bdDevice);
314caa3723eaa20e57aac086d54a41106108503debczzy                            break;
315caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_TYPE_OF_DEVICE:
316d235269f06e99d76a0f63c8fe9e224e0f951f799Matthew Xie                            // The device type from hal layer, defined in bluetooth.h,
317d235269f06e99d76a0f63c8fe9e224e0f951f799Matthew Xie                            // matches the type defined in BluetoothDevice.java
318caa3723eaa20e57aac086d54a41106108503debczzy                            device.mDeviceType = Utils.byteArrayToInt(val);
319caa3723eaa20e57aac086d54a41106108503debczzy                            break;
320caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_REMOTE_RSSI:
3213cedf3d57aff20e1876a5b450f41b05e975cb8e0Matthew Xie                            // RSSI from hal is in one byte
3223cedf3d57aff20e1876a5b450f41b05e975cb8e0Matthew Xie                            device.mRssi = val[0];
323caa3723eaa20e57aac086d54a41106108503debczzy                            break;
324caa3723eaa20e57aac086d54a41106108503debczzy                    }
325ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                }
326ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
327ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
328ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
329ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
330ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void deviceFoundCallback(byte[] address) {
331ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        // The device properties are already registered - we can send the intent
332ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        // now
333ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        BluetoothDevice device = getDevice(address);
334ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        debugLog("deviceFoundCallback: Remote Address is:" + device);
335ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties deviceProp = getDeviceProperties(device);
336ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (deviceProp == null) {
337ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            errorLog("Device Properties is null for Device:" + device);
338ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return;
339ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
340ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
341ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothDevice.ACTION_FOUND);
342ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
343ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_CLASS,
344ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                new BluetoothClass(Integer.valueOf(deviceProp.mBluetoothClass)));
345ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_RSSI, deviceProp.mRssi);
346ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_NAME, deviceProp.mName);
347ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
34874ae04c73312403e89db0f8e9bd9601d403b4783fredc        mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
349ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
350ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
351ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void pinRequestCallback(byte[] address, byte[] name, int cod) {
352ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        //TODO(BT): Get wakelock and update name and cod
3531444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh        BluetoothDevice bdDevice = getDevice(address);
3541444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh        if (bdDevice == null) {
3551444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh            addDeviceProperties(address);
3561444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh        }
3576de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        BluetoothClass btClass = bdDevice.getBluetoothClass();
3586de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        int btDeviceClass = btClass.getDeviceClass();
3596de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        if (btDeviceClass == BluetoothClass.Device.PERIPHERAL_KEYBOARD ||
3606de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            btDeviceClass == BluetoothClass.Device.PERIPHERAL_KEYBOARD_POINTING) {
3616de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            // Its a keyboard. Follow the HID spec recommendation of creating the
3626de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            // passkey and displaying it to the user. If the keyboard doesn't follow
3636de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            // the spec recommendation, check if the keyboard has a fixed PIN zero
3646de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            // and pair.
3656de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            //TODO: Add sFixedPinZerosAutoPairKeyboard() and maintain list of devices that have fixed pin
3666de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            /*if (mAdapterService.isFixedPinZerosAutoPairKeyboard(address)) {
3676de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera                               mAdapterService.setPin(address, BluetoothDevice.convertPinToBytes("0000"));
3686de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera                               return;
3696de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera                     }*/
3706de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            // Generate a variable PIN. This is not truly random but good enough.
3716de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            int pin = (int) Math.floor(Math.random() * 1000000);
3726de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            sendDisplayPinIntent(address, pin);
3736de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera            return;
3746de8229571ce56dcb0010c63cbef65e01ecd5c2aPriti Aghera        }
375ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        infoLog("pinRequestCallback: " + address + " name:" + name + " cod:" +
376ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                cod);
377ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
378ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, getDevice(address));
379ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
380ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                BluetoothDevice.PAIRING_VARIANT_PIN);
381cc4730be1fcf272355368ca4a2c464d71d3f432dMatthew Xie        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
382810c49b2cfece1c48ced464d6bd2509ec4cac7a3Matthew Xie        mAdapterService.sendOrderedBroadcast(intent, mAdapterService.BLUETOOTH_ADMIN_PERM);
383ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
384ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
385ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
386ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void sspRequestCallback(byte[] address, byte[] name, int cod, int pairingVariant,
387ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            int passkey) {
388ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        //TODO(BT): Get wakelock and update name and cod
3891444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh        BluetoothDevice bdDevice = getDevice(address);
3901444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh        if (bdDevice == null) {
3911444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh            addDeviceProperties(address);
3921444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh        }
3931444b5b09d07b1ad5ec2ce89b4267484be25e8bfJaikumar Ganesh
394ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        infoLog("sspRequestCallback: " + address + " name: " + name + " cod: " +
395ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                cod + " pairingVariant " + pairingVariant + " passkey: " + passkey);
396ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int variant;
397ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        boolean displayPasskey = false;
398ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (pairingVariant == AbstractionLayer.BT_SSP_VARIANT_PASSKEY_CONFIRMATION) {
399ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            variant = BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION;
400ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            displayPasskey = true;
401ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else if (pairingVariant == AbstractionLayer.BT_SSP_VARIANT_CONSENT) {
402b01cf4299897d227c7dbcbe4981b63a1ffe4ffcaSreenidhi T            variant = BluetoothDevice.PAIRING_VARIANT_CONSENT;
403ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else if (pairingVariant == AbstractionLayer.BT_SSP_VARIANT_PASSKEY_ENTRY) {
404ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            variant = BluetoothDevice.PAIRING_VARIANT_PASSKEY;
405b7e70fcf8923b9452074b2b4ee685da424cc7d93Kausik Sinnaswamy        } else if (pairingVariant == AbstractionLayer.BT_SSP_VARIANT_PASSKEY_NOTIFICATION) {
406581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh            variant = BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY;
407c3cbf72f596c2af659905e06e85a5ac1241610a8Edward Jee            displayPasskey = true;
408ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else {
409ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            errorLog("SSP Pairing variant not present");
410ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return;
411ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
412ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        BluetoothDevice device = getDevice(address);
413ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (device == null) {
414ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh           warnLog("Device is not known for:" + Utils.getAddressStringFromByte(address));
415ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh           addDeviceProperties(address);
416ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh           device = getDevice(address);
417ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
418ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
419ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
420ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (displayPasskey) {
421ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            intent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, passkey);
422ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
423ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, variant);
424cc4730be1fcf272355368ca4a2c464d71d3f432dMatthew Xie        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
425810c49b2cfece1c48ced464d6bd2509ec4cac7a3Matthew Xie        mAdapterService.sendOrderedBroadcast(intent, mAdapterService.BLUETOOTH_ADMIN_PERM);
426ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
427ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
42801a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    void aclStateChangeCallback(int status, byte[] address, int newState) {
42901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        BluetoothDevice device = getDevice(address);
43001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy
43101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        if (device == null) {
43201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            errorLog("aclStateChangeCallback: Device is NULL");
43301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            return;
43401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        }
43501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy
4367aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli        DeviceProperties prop = getDeviceProperties(device);
4377aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli        if (prop == null) {
4387aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli            errorLog("aclStateChangeCallback reported unknown device " + Arrays.toString(address));
4397aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli        }
44001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        Intent intent = null;
44101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        if (newState == AbstractionLayer.BT_ACL_STATE_CONNECTED) {
44201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            intent = new Intent(BluetoothDevice.ACTION_ACL_CONNECTED);
44301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            debugLog("aclStateChangeCallback: State:Connected to Device:" + device);
44401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        } else {
44501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            intent = new Intent(BluetoothDevice.ACTION_ACL_DISCONNECTED);
44601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            debugLog("aclStateChangeCallback: State:DisConnected to Device:" + device);
44701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        }
44801a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
44901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
45074ae04c73312403e89db0f8e9bd9601d403b4783fredc        mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
45101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    }
452ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
4532c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    void deviceMasInstancesFoundCallback(int status, byte[] address, String[] name, int[] scn,
4542c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            int[] id, int[] msgtype) {
4552c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        BluetoothDevice device = getDevice(address);
4562c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4572c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (device == null) {
4582c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            errorLog("deviceMasInstancesFoundCallback: Device is NULL");
4592c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            return;
4602c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        }
4612c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4622c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        debugLog("deviceMasInstancesFoundCallback: found " + name.length + " instances");
4632c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4642c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        ArrayList<BluetoothMasInstance> instances = new ArrayList<BluetoothMasInstance>();
4652c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4662c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        for (int i = 0; i < name.length; i++) {
4672c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            BluetoothMasInstance inst = new BluetoothMasInstance(id[i], name[i],
4682c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                    scn[i], msgtype[i]);
4692c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4702c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            debugLog(inst.toString());
4712c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4722c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            instances.add(inst);
4732c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        }
4742c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4752c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        sendMasInstanceIntent(device, instances);
4762c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    }
4772c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
478c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    void fetchUuids(BluetoothDevice device) {
479ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (mSdpTracker.contains(device)) return;
480ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mSdpTracker.add(device);
481ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
482ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Message message = mHandler.obtainMessage(MESSAGE_UUID_INTENT);
483ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        message.obj = device;
484ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mHandler.sendMessageDelayed(message, UUID_INTENT_DELAY);
485ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
486c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        //mAdapterService.getDevicePropertyNative(Utils.getBytesFromAddress(device.getAddress()), AbstractionLayer.BT_PROPERTY_UUIDS);
487c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        mAdapterService.getRemoteServicesNative(Utils.getBytesFromAddress(device.getAddress()));
488ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
489ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
4902c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    void fetchMasInstances(BluetoothDevice device) {
4912c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (mSdpMasTracker.contains(device)) return;
4922c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mSdpMasTracker.add(device);
4932c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4942c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        Message message = mHandler.obtainMessage(MESSAGE_MAS_INSTANCE_INTENT);
4952c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        message.obj = device;
4962c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mHandler.sendMessageDelayed(message, MAS_INSTANCE_INTENT_DELAY);
4972c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4982c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mAdapterService.getRemoteMasInstancesNative(Utils.getBytesFromAddress(device.getAddress()));
4992c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    }
5002c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
501ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private final Handler mHandler = new Handler() {
502ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
503ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void handleMessage(Message msg) {
504ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch (msg.what) {
505ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            case MESSAGE_UUID_INTENT:
506ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                BluetoothDevice device = (BluetoothDevice)msg.obj;
507ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                if (device != null) {
508ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    sendUuidIntent(device);
509ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                }
510ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                break;
5112c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            case MESSAGE_MAS_INSTANCE_INTENT:
5122c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                BluetoothDevice dev = (BluetoothDevice)msg.obj;
5132c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                if (dev != null) {
5142c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                    sendMasInstanceIntent(dev, null);
5152c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                }
5162c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                break;
517ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
518ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
519ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    };
520ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
521ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void errorLog(String msg) {
522ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Log.e(TAG, msg);
523ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
524ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
525ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void debugLog(String msg) {
5266458cffaca286611e898c75ad86e2d98c89008b6Matthew Xie        if (DBG) Log.d(TAG, msg);
527ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
528ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
529ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void infoLog(String msg) {
530ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (DBG) Log.i(TAG, msg);
531ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
532ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
533ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void warnLog(String msg) {
534ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Log.w(TAG, msg);
535ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
53674ae04c73312403e89db0f8e9bd9601d403b4783fredc
537ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
538