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