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
803a91ac3eefe23a22aa0abc1a89ac253a2b0dbae9Nick Kralevich    @Override
813a91ac3eefe23a22aa0abc1a89ac253a2b0dbae9Nick Kralevich    public Object clone() throws CloneNotSupportedException {
82ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        throw new CloneNotSupportedException();
83ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
84ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
85ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    DeviceProperties getDeviceProperties(BluetoothDevice device) {
86ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        synchronized (mDevices) {
87ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return mDevices.get(device);
88ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
89ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
90ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
91ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    BluetoothDevice getDevice(byte[] address) {
92ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        for (BluetoothDevice dev : mDevices.keySet()) {
93ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            if (dev.getAddress().equals(Utils.getAddressStringFromByte(address))) {
94ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return dev;
95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
96ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
97ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return null;
98ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
99ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
100ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    DeviceProperties addDeviceProperties(byte[] address) {
101ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        synchronized (mDevices) {
102ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            DeviceProperties prop = new DeviceProperties();
103ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            BluetoothDevice device =
104ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    mAdapter.getRemoteDevice(Utils.getAddressStringFromByte(address));
10574a598e0a8d50343227e3f96bbe56c6be1c240f9Ganesh Ganapathi Batta            prop.mAddress = address;
106ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            mDevices.put(device, prop);
107ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return prop;
108ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
109ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
110ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    class DeviceProperties {
112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private String mName;
113ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private byte[] mAddress;
114ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private int mBluetoothClass;
115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private short mRssi;
116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private ParcelUuid[] mUuids;
117ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private int mDeviceType;
118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private String mAlias;
119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        private int mBondState;
120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
121ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties() {
122ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            mBondState = BluetoothDevice.BOND_NONE;
123ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
124ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
125ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
126ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mName
127ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
128ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        String getName() {
129ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mName;
131ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
132ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
134ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mClass
136ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
137ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int getBluetoothClass() {
138ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
139ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mBluetoothClass;
140ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
141ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
142ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
143ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
144ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mUuids
145ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
146ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        ParcelUuid[] getUuids() {
147ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
148ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mUuids;
149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
150ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
152ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
153ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mAddress
154ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
155ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        byte[] getAddress() {
156ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
157ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mAddress;
158ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
159ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
160ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
161ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return mRssi
163ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
164ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        short getRssi() {
165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mRssi;
167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return mDeviceType
172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
173ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int getDeviceType() {
174ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mDeviceType;
176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
179ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
180ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mAlias
181ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
182ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        String getAlias() {
183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
184ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mAlias;
185ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
186ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
188ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
189ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @param mAlias the mAlias to set
190ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
191ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        void setAlias(String mAlias) {
192ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
19374277677d2a51d7c8ff60a778889f71e69763c21Matthew Xie                this.mAlias = mAlias;
194ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                mAdapterService.setDevicePropertyNative(mAddress,
195ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    AbstractionLayer.BT_PROPERTY_REMOTE_FRIENDLY_NAME, mAlias.getBytes());
196ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
197ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
198ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
199ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
200ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @param mBondState the mBondState to set
201ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
202ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        void setBondState(int mBondState) {
203ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
204ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                this.mBondState = mBondState;
205d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                if (mBondState == BluetoothDevice.BOND_NONE)
206d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                {
207d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    /* Clearing the Uuids local copy when the device is unpaired. If not cleared,
208d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    cachedBluetoothDevice issued a connect using the local cached copy of uuids,
209d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    without waiting for the ACTION_UUID intent.
210d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    This was resulting in multiple calls to connect().*/
211d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                    mUuids = null;
212d807ba48ed4418c1a60549abe1c3a98ced8c428dSreenidhi T                }
213ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
214ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
215ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
216ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        /**
217ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         * @return the mBondState
218ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh         */
219ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int getBondState() {
220ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            synchronized (mObject) {
221ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return mBondState;
222ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
223ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
2247aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli    }
225ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
226ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void sendUuidIntent(BluetoothDevice device) {
227ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties prop = getDeviceProperties(device);
228ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothDevice.ACTION_UUID);
229ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
230c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        intent.putExtra(BluetoothDevice.EXTRA_UUID, prop == null? null: prop.mUuids);
23134409f35db6e9ca74f727e3fe92141388ae5b069Ganesh Ganapathi Batta        mAdapterService.initProfilePriorities(device, prop.mUuids);
23274ae04c73312403e89db0f8e9bd9601d403b4783fredc        mAdapterService.sendBroadcast(intent, AdapterService.BLUETOOTH_ADMIN_PERM);
233c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc
234c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        //Remove the outstanding UUID request
235c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        mSdpTracker.remove(device);
236ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
237ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
23811b41d8123241ba8e693e21c4db308bacff23f57Mudumba Ananth
2392c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    private void sendMasInstanceIntent(BluetoothDevice device,
2402c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            ArrayList<BluetoothMasInstance> instances) {
2412c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        Intent intent = new Intent(BluetoothDevice.ACTION_MAS_INSTANCE);
2422c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
2432c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
2442c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (instances != null)  intent.putExtra(BluetoothDevice.EXTRA_MAS_INSTANCE, instances);
2452c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mAdapterService.sendBroadcast(intent, AdapterService.BLUETOOTH_ADMIN_PERM);
2462c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
2472c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        //Remove the outstanding UUID request
2482c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mSdpMasTracker.remove(device);
2492c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    }
250ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void devicePropertyChangedCallback(byte[] address, int[] types, byte[][] values) {
251ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent;
252ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        byte[] val;
253ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int type;
254ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        BluetoothDevice bdDevice = getDevice(address);
255ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties device;
256ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (bdDevice == null) {
257ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            device = addDeviceProperties(address);
258ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            bdDevice = getDevice(address);
259ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else {
260ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            device = getDeviceProperties(bdDevice);
261ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
262ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
263ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        for (int j = 0; j < types.length; j++) {
264ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            type = types[j];
265ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            val = values[j];
266caa3723eaa20e57aac086d54a41106108503debczzy            if(val.length <= 0)
267caa3723eaa20e57aac086d54a41106108503debczzy                errorLog("devicePropertyChangedCallback: bdDevice: " + bdDevice + ", value is empty for type: " + type);
268caa3723eaa20e57aac086d54a41106108503debczzy            else {
269caa3723eaa20e57aac086d54a41106108503debczzy                synchronized(mObject) {
270caa3723eaa20e57aac086d54a41106108503debczzy                    switch (type) {
271caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_BDNAME:
272caa3723eaa20e57aac086d54a41106108503debczzy                            device.mName = new String(val);
273caa3723eaa20e57aac086d54a41106108503debczzy                            intent = new Intent(BluetoothDevice.ACTION_NAME_CHANGED);
274caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, bdDevice);
275caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_NAME, device.mName);
276caa3723eaa20e57aac086d54a41106108503debczzy                            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
277caa3723eaa20e57aac086d54a41106108503debczzy                            mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
278caa3723eaa20e57aac086d54a41106108503debczzy                            debugLog("Remote Device name is: " + device.mName);
279caa3723eaa20e57aac086d54a41106108503debczzy                            break;
280caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_REMOTE_FRIENDLY_NAME:
281caa3723eaa20e57aac086d54a41106108503debczzy                            if (device.mAlias != null) {
282caa3723eaa20e57aac086d54a41106108503debczzy                                System.arraycopy(val, 0, device.mAlias, 0, val.length);
283caa3723eaa20e57aac086d54a41106108503debczzy                            }
2840322ae1f5e8ea55c391145e7925cb5962a97c11fGanesh Ganapathi Batta                            else {
2850322ae1f5e8ea55c391145e7925cb5962a97c11fGanesh Ganapathi Batta                                device.mAlias = new String(val);
2860322ae1f5e8ea55c391145e7925cb5962a97c11fGanesh Ganapathi Batta                            }
287caa3723eaa20e57aac086d54a41106108503debczzy                            break;
288caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_BDADDR:
289caa3723eaa20e57aac086d54a41106108503debczzy                            device.mAddress = val;
290caa3723eaa20e57aac086d54a41106108503debczzy                            debugLog("Remote Address is:" + Utils.getAddressStringFromByte(val));
291caa3723eaa20e57aac086d54a41106108503debczzy                            break;
292caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE:
293caa3723eaa20e57aac086d54a41106108503debczzy                            device.mBluetoothClass =  Utils.byteArrayToInt(val);
294caa3723eaa20e57aac086d54a41106108503debczzy                            intent = new Intent(BluetoothDevice.ACTION_CLASS_CHANGED);
295caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, bdDevice);
296caa3723eaa20e57aac086d54a41106108503debczzy                            intent.putExtra(BluetoothDevice.EXTRA_CLASS,
297caa3723eaa20e57aac086d54a41106108503debczzy                                    new BluetoothClass(device.mBluetoothClass));
298caa3723eaa20e57aac086d54a41106108503debczzy                            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
299caa3723eaa20e57aac086d54a41106108503debczzy                            mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
300caa3723eaa20e57aac086d54a41106108503debczzy                            debugLog("Remote class is:" + device.mBluetoothClass);
301caa3723eaa20e57aac086d54a41106108503debczzy                            break;
302caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_UUIDS:
303caa3723eaa20e57aac086d54a41106108503debczzy                            int numUuids = val.length/AbstractionLayer.BT_UUID_SIZE;
304caa3723eaa20e57aac086d54a41106108503debczzy                            device.mUuids = Utils.byteArrayToUuid(val);
305caa3723eaa20e57aac086d54a41106108503debczzy                            sendUuidIntent(bdDevice);
306caa3723eaa20e57aac086d54a41106108503debczzy                            break;
307caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_TYPE_OF_DEVICE:
308d235269f06e99d76a0f63c8fe9e224e0f951f799Matthew Xie                            // The device type from hal layer, defined in bluetooth.h,
309d235269f06e99d76a0f63c8fe9e224e0f951f799Matthew Xie                            // matches the type defined in BluetoothDevice.java
310caa3723eaa20e57aac086d54a41106108503debczzy                            device.mDeviceType = Utils.byteArrayToInt(val);
311caa3723eaa20e57aac086d54a41106108503debczzy                            break;
312caa3723eaa20e57aac086d54a41106108503debczzy                        case AbstractionLayer.BT_PROPERTY_REMOTE_RSSI:
3133cedf3d57aff20e1876a5b450f41b05e975cb8e0Matthew Xie                            // RSSI from hal is in one byte
3143cedf3d57aff20e1876a5b450f41b05e975cb8e0Matthew Xie                            device.mRssi = val[0];
315caa3723eaa20e57aac086d54a41106108503debczzy                            break;
316caa3723eaa20e57aac086d54a41106108503debczzy                    }
317ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                }
318ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
319ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
320ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
321ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
322ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void deviceFoundCallback(byte[] address) {
323ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        // The device properties are already registered - we can send the intent
324ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        // now
325ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        BluetoothDevice device = getDevice(address);
326ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        debugLog("deviceFoundCallback: Remote Address is:" + device);
327ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        DeviceProperties deviceProp = getDeviceProperties(device);
328ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (deviceProp == null) {
329ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            errorLog("Device Properties is null for Device:" + device);
330ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return;
331ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
332ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
333ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothDevice.ACTION_FOUND);
334ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
335ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_CLASS,
336ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                new BluetoothClass(Integer.valueOf(deviceProp.mBluetoothClass)));
337ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_RSSI, deviceProp.mRssi);
338ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothDevice.EXTRA_NAME, deviceProp.mName);
339ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
34074ae04c73312403e89db0f8e9bd9601d403b4783fredc        mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
341ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
342ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
34301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    void aclStateChangeCallback(int status, byte[] address, int newState) {
34401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        BluetoothDevice device = getDevice(address);
34501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy
34601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        if (device == null) {
34701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            errorLog("aclStateChangeCallback: Device is NULL");
34801a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            return;
34901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        }
35001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy
3517aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli        DeviceProperties prop = getDeviceProperties(device);
3527aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli        if (prop == null) {
3537aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli            errorLog("aclStateChangeCallback reported unknown device " + Arrays.toString(address));
3547aa3a71e508e4f95a0a74f41ab8389979809191bJay Civelli        }
35501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        Intent intent = null;
35601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        if (newState == AbstractionLayer.BT_ACL_STATE_CONNECTED) {
35701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            intent = new Intent(BluetoothDevice.ACTION_ACL_CONNECTED);
35801a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            debugLog("aclStateChangeCallback: State:Connected to Device:" + device);
35901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        } else {
36001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            intent = new Intent(BluetoothDevice.ACTION_ACL_DISCONNECTED);
36101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy            debugLog("aclStateChangeCallback: State:DisConnected to Device:" + device);
36201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        }
36301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
36401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
36574ae04c73312403e89db0f8e9bd9601d403b4783fredc        mAdapterService.sendBroadcast(intent, mAdapterService.BLUETOOTH_PERM);
36601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    }
367ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
3682c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    void deviceMasInstancesFoundCallback(int status, byte[] address, String[] name, int[] scn,
3692c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            int[] id, int[] msgtype) {
3702c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        BluetoothDevice device = getDevice(address);
3712c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3722c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (device == null) {
3732c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            errorLog("deviceMasInstancesFoundCallback: Device is NULL");
3742c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            return;
3752c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        }
3762c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3772c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        debugLog("deviceMasInstancesFoundCallback: found " + name.length + " instances");
3782c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3792c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        ArrayList<BluetoothMasInstance> instances = new ArrayList<BluetoothMasInstance>();
3802c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3812c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        for (int i = 0; i < name.length; i++) {
3822c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            BluetoothMasInstance inst = new BluetoothMasInstance(id[i], name[i],
3832c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                    scn[i], msgtype[i]);
3842c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3852c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            debugLog(inst.toString());
3862c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3872c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            instances.add(inst);
3882c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        }
3892c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
3902c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        sendMasInstanceIntent(device, instances);
3912c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    }
3922c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
393c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    void fetchUuids(BluetoothDevice device) {
394ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (mSdpTracker.contains(device)) return;
395ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mSdpTracker.add(device);
396ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
397ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Message message = mHandler.obtainMessage(MESSAGE_UUID_INTENT);
398ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        message.obj = device;
399ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mHandler.sendMessageDelayed(message, UUID_INTENT_DELAY);
400ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
401c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        //mAdapterService.getDevicePropertyNative(Utils.getBytesFromAddress(device.getAddress()), AbstractionLayer.BT_PROPERTY_UUIDS);
402c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        mAdapterService.getRemoteServicesNative(Utils.getBytesFromAddress(device.getAddress()));
403ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
404ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
4052c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    void fetchMasInstances(BluetoothDevice device) {
4062c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        if (mSdpMasTracker.contains(device)) return;
4072c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mSdpMasTracker.add(device);
4082c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4092c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        Message message = mHandler.obtainMessage(MESSAGE_MAS_INSTANCE_INTENT);
4102c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        message.obj = device;
4112c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mHandler.sendMessageDelayed(message, MAS_INSTANCE_INTENT_DELAY);
4122c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
4132c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta        mAdapterService.getRemoteMasInstancesNative(Utils.getBytesFromAddress(device.getAddress()));
4142c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta    }
4152c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
416ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private final Handler mHandler = new Handler() {
417ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
418ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void handleMessage(Message msg) {
419ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch (msg.what) {
420ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            case MESSAGE_UUID_INTENT:
421ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                BluetoothDevice device = (BluetoothDevice)msg.obj;
422ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                if (device != null) {
423ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    sendUuidIntent(device);
424ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                }
425ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                break;
4262c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta            case MESSAGE_MAS_INSTANCE_INTENT:
4272c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                BluetoothDevice dev = (BluetoothDevice)msg.obj;
4282c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                if (dev != null) {
4292c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                    sendMasInstanceIntent(dev, null);
4302c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                }
4312c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta                break;
432ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
433ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
434ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    };
435ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
436ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void errorLog(String msg) {
437ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Log.e(TAG, msg);
438ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
439ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
440ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void debugLog(String msg) {
4416458cffaca286611e898c75ad86e2d98c89008b6Matthew Xie        if (DBG) Log.d(TAG, msg);
442ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
443ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
444ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void infoLog(String msg) {
445ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (DBG) Log.i(TAG, msg);
446ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
447ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
448ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void warnLog(String msg) {
449ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Log.w(TAG, msg);
450ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
45174ae04c73312403e89db0f8e9bd9601d403b4783fredc
452ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
453