1ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/* 2ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Copyright (C) 2012 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 1986c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.bluetooth.BluetoothA2dp; 2086c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.bluetooth.BluetoothA2dpSink; 21ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter; 22cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothAvrcpController; 23ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothDevice; 2486c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.bluetooth.BluetoothHeadset; 2586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.bluetooth.BluetoothHeadsetClient; 26cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothInputDevice; 27cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothInputHost; 28cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothMap; 29cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothMapClient; 30cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothPan; 31cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothPbap; 32cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothPbapClient; 33ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothProfile; 34cbdcb7e4fc76661793877f142f628864797cb970Jack Heimport android.bluetooth.BluetoothSap; 3586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.content.BroadcastReceiver; 3686c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.content.Context; 37ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.content.Intent; 3886c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwalimport android.content.IntentFilter; 39ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.os.ParcelUuid; 40bd704c741b8c523ad747214f6f0520ac3e2caf8fZhihai Xuimport android.os.UserHandle; 41ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.util.Log; 42ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.util.Pair; 43ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 44ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.bluetooth.Utils; 45ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.bluetooth.btservice.RemoteDevices.DeviceProperties; 46ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 472aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssenimport java.lang.System; 48ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport java.util.HashMap; 49004550da492fb000ab08b6324558c1e4cbd383d4Srinu Jellaimport java.util.concurrent.CopyOnWriteArrayList; 50ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 51ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshclass AdapterProperties { 5234e323baafb5563c3874f95847ec544faf6923f8Matthew Xie private static final boolean DBG = true; 5334e323baafb5563c3874f95847ec544faf6923f8Matthew Xie private static final boolean VDBG = false; 54ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private static final String TAG = "BluetoothAdapterProperties"; 55ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 562aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen private static final long DEFAULT_DISCOVERY_TIMEOUT_MS = 12800; 572aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen private static final int BD_ADDR_LEN = 6; // in bytes 582aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen 5996d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile String mName; 6096d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile byte[] mAddress; 6196d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile int mBluetoothClass; 6296d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile int mScanMode; 6396d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile int mDiscoverableTimeout; 6496d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile ParcelUuid[] mUuids; 65004550da492fb000ab08b6324558c1e4cbd383d4Srinu Jella private CopyOnWriteArrayList<BluetoothDevice> mBondedDevices = new CopyOnWriteArrayList<BluetoothDevice>(); 66ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 67ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private int mProfilesConnecting, mProfilesConnected, mProfilesDisconnecting; 68b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He private final HashMap<Integer, Pair<Integer, Integer>> mProfileConnectionState = 69b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He new HashMap<>(); 70ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 7196d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile int mConnectionState = BluetoothAdapter.STATE_DISCONNECTED; 7296d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov private volatile int mState = BluetoothAdapter.STATE_OFF; 73ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 74ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private AdapterService mService; 75ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private boolean mDiscovering; 762aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen private long mDiscoveryEndMs; //< Time (ms since epoch) that discovery ended or will end. 7731ba132491053bc86d419a7d51fc04af3299c076fredc private RemoteDevices mRemoteDevices; 782f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan private BluetoothAdapter mAdapter; 79c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham //TODO - all hw capabilities to be exposed as a class 80c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham private int mNumOfAdvertisementInstancesSupported; 81c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham private boolean mRpaOffloadSupported; 82c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham private int mNumOfOffloadedIrkSupported; 83c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham private int mNumOfOffloadedScanFilterSupported; 84c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham private int mOffloadedScanResultStorageBytes; 85655434047df38242c1848eee283f134cfd299fd1Satya Calloji private int mVersSupported; 86655434047df38242c1848eee283f134cfd299fd1Satya Calloji private int mTotNumOfTrackableAdv; 87ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji private boolean mIsExtendedScanSupported; 88ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji private boolean mIsDebugLogSupported; 89d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham private boolean mIsActivityAndEnergyReporting; 90551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski private boolean mIsLe2MPhySupported; 91551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski private boolean mIsLeCodedPhySupported; 92551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski private boolean mIsLeExtendedAdvertisingSupported; 93551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski private boolean mIsLePeriodicAdvertisingSupported; 941f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski private int mLeMaximumAdvertisingDataLength; 95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 96481d75623ce421158ab898bbe6980f7bfcedf686Hans MÃ¥nsson private boolean mReceiverRegistered; 9786c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal private BroadcastReceiver mReceiver = new BroadcastReceiver() { 9886c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal @Override 9986c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal public void onReceive(Context context, Intent intent) { 100cbdcb7e4fc76661793877f142f628864797cb970Jack He String action = intent.getAction(); 101d691ccc7632567fbba9557a8750943523802d860Jack He if (action == null) { 102d691ccc7632567fbba9557a8750943523802d860Jack He Log.w(TAG, "Received intent with null action"); 103d691ccc7632567fbba9557a8750943523802d860Jack He return; 104d691ccc7632567fbba9557a8750943523802d860Jack He } 105d691ccc7632567fbba9557a8750943523802d860Jack He switch (action) { 106d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED: 107d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.HEADSET, intent); 108d691ccc7632567fbba9557a8750943523802d860Jack He break; 109d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED: 110d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.A2DP, intent); 111d691ccc7632567fbba9557a8750943523802d860Jack He break; 112d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED: 113d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.HEADSET_CLIENT, intent); 114d691ccc7632567fbba9557a8750943523802d860Jack He break; 115d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED: 116d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.A2DP_SINK, intent); 117d691ccc7632567fbba9557a8750943523802d860Jack He break; 118d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothInputHost.ACTION_CONNECTION_STATE_CHANGED: 119d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.INPUT_HOST, intent); 120d691ccc7632567fbba9557a8750943523802d860Jack He break; 121d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED: 122d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.INPUT_DEVICE, intent); 123d691ccc7632567fbba9557a8750943523802d860Jack He break; 124d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothAvrcpController.ACTION_CONNECTION_STATE_CHANGED: 125d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.AVRCP_CONTROLLER, intent); 126d691ccc7632567fbba9557a8750943523802d860Jack He break; 127d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothPan.ACTION_CONNECTION_STATE_CHANGED: 128d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.PAN, intent); 129d691ccc7632567fbba9557a8750943523802d860Jack He break; 130d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothMap.ACTION_CONNECTION_STATE_CHANGED: 131d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.MAP, intent); 132d691ccc7632567fbba9557a8750943523802d860Jack He break; 133d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothMapClient.ACTION_CONNECTION_STATE_CHANGED: 134d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.MAP_CLIENT, intent); 135d691ccc7632567fbba9557a8750943523802d860Jack He break; 136d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothSap.ACTION_CONNECTION_STATE_CHANGED: 137d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.SAP, intent); 138d691ccc7632567fbba9557a8750943523802d860Jack He break; 139d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothPbapClient.ACTION_CONNECTION_STATE_CHANGED: 140d691ccc7632567fbba9557a8750943523802d860Jack He sendConnectionStateChange(BluetoothProfile.PBAP_CLIENT, intent); 141d691ccc7632567fbba9557a8750943523802d860Jack He break; 142d691ccc7632567fbba9557a8750943523802d860Jack He default: 143d691ccc7632567fbba9557a8750943523802d860Jack He Log.w(TAG, "Received unknown intent " + intent); 144d691ccc7632567fbba9557a8750943523802d860Jack He break; 14586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal } 14686c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal } 14786c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal }; 14886c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal 149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // Lock for all getters and setters. 150ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // If finer grained locking is needer, more locks 151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // can be added here. 152d691ccc7632567fbba9557a8750943523802d860Jack He private final Object mObject = new Object(); 153ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 15474ae04c73312403e89db0f8e9bd9601d403b4783fredc public AdapterProperties(AdapterService service) { 155ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mService = service; 1562f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan mAdapter = BluetoothAdapter.getDefaultAdapter(); 157ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 15831ba132491053bc86d419a7d51fc04af3299c076fredc public void init(RemoteDevices remoteDevices) { 159b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He mProfileConnectionState.clear(); 16031ba132491053bc86d419a7d51fc04af3299c076fredc mRemoteDevices = remoteDevices; 16186c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal 16286c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal IntentFilter filter = new IntentFilter(); 16386c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); 16486c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED); 16586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); 16686c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal filter.addAction(BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED); 167cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothInputHost.ACTION_CONNECTION_STATE_CHANGED); 168cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED); 169cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothAvrcpController.ACTION_CONNECTION_STATE_CHANGED); 170cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothPan.ACTION_CONNECTION_STATE_CHANGED); 171cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothMap.ACTION_CONNECTION_STATE_CHANGED); 172cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothMapClient.ACTION_CONNECTION_STATE_CHANGED); 173cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothSap.ACTION_CONNECTION_STATE_CHANGED); 174cbdcb7e4fc76661793877f142f628864797cb970Jack He filter.addAction(BluetoothPbapClient.ACTION_CONNECTION_STATE_CHANGED); 17586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal mService.registerReceiver(mReceiver, filter); 176481d75623ce421158ab898bbe6980f7bfcedf686Hans MÃ¥nsson mReceiverRegistered = true; 177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 17931ba132491053bc86d419a7d51fc04af3299c076fredc public void cleanup() { 18074ae04c73312403e89db0f8e9bd9601d403b4783fredc mRemoteDevices = null; 181b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He mProfileConnectionState.clear(); 182481d75623ce421158ab898bbe6980f7bfcedf686Hans MÃ¥nsson if (mReceiverRegistered) { 183481d75623ce421158ab898bbe6980f7bfcedf686Hans MÃ¥nsson mService.unregisterReceiver(mReceiver); 184481d75623ce421158ab898bbe6980f7bfcedf686Hans MÃ¥nsson mReceiverRegistered = false; 185481d75623ce421158ab898bbe6980f7bfcedf686Hans MÃ¥nsson } 18631ba132491053bc86d419a7d51fc04af3299c076fredc mService = null; 18796d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov mBondedDevices.clear(); 1886654f5c903de510a70f9e72cd5ad7837b615d93ffredc } 1896654f5c903de510a70f9e72cd5ad7837b615d93ffredc 1903a91ac3eefe23a22aa0abc1a89ac253a2b0dbae9Nick Kralevich @Override 1913a91ac3eefe23a22aa0abc1a89ac253a2b0dbae9Nick Kralevich public Object clone() throws CloneNotSupportedException { 192ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh throw new CloneNotSupportedException(); 193ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 194ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 195ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 196ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mName 197ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 198ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh String getName() { 19996d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mName; 200ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 201ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 202ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 203ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * Set the local adapter property - name 204ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @param name the name to set 205ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 206ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh boolean setName(String name) { 207ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 208ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return mService.setAdapterPropertyNative( 209ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh AbstractionLayer.BT_PROPERTY_BDNAME, name.getBytes()); 210ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 211ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 212ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 213ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 214ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mClass 215ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 216ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int getBluetoothClass() { 21796d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mBluetoothClass; 218ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 219ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 220ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 221ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mScanMode 222ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 223ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int getScanMode() { 22496d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mScanMode; 225ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 226ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 227ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 228ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * Set the local adapter property - scanMode 229ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * 230ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @param scanMode the ScanMode to set 231ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 232ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh boolean setScanMode(int scanMode) { 233ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 234ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return mService.setAdapterPropertyNative( 235ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh AbstractionLayer.BT_PROPERTY_ADAPTER_SCAN_MODE, Utils.intToByteArray(scanMode)); 236ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 237ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 238ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 239ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 240ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mUuids 241ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 242ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh ParcelUuid[] getUuids() { 24396d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mUuids; 244ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 245ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 246ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 247ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mAddress 248ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 249ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh byte[] getAddress() { 25096d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mAddress; 251ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 252ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 253ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 254ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @param mConnectionState the mConnectionState to set 255ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 256ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh void setConnectionState(int mConnectionState) { 25796d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov this.mConnectionState = mConnectionState; 258ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 259ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 260ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 261ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mConnectionState 262ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 263ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int getConnectionState() { 26496d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mConnectionState; 265ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 266ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 267ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 268ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @param mState the mState to set 269ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 270ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh void setState(int mState) { 27196d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov debugLog("Setting state to " + mState); 27296d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov this.mState = mState; 273ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 274ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 275ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 276ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mState 277ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 278ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int getState() { 27950f6cb42218fd50ed2532884d1212e1c9a74c7b2Zhihai Xu return mState; 280ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 281ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 282ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh /** 283c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham * @return the mNumOfAdvertisementInstancesSupported 284c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham */ 285c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham int getNumOfAdvertisementInstancesSupported() { 286c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham return mNumOfAdvertisementInstancesSupported; 287c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham } 288c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham 289c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham /** 290c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham * @return the mRpaOffloadSupported 291c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham */ 292c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham boolean isRpaOffloadSupported() { 293c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham return mRpaOffloadSupported; 294c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham } 295c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham 296c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham /** 297c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham * @return the mNumOfOffloadedIrkSupported 298c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham */ 299c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham int getNumOfOffloadedIrkSupported() { 300c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham return mNumOfOffloadedIrkSupported; 301c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham } 302c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham 303c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham /** 304c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham * @return the mNumOfOffloadedScanFilterSupported 305c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham */ 306c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham int getNumOfOffloadedScanFilterSupported() { 307c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham return mNumOfOffloadedScanFilterSupported; 308c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham } 309c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham 310c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham /** 311c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham * @return the mOffloadedScanResultStorageBytes 312c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham */ 313c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham int getOffloadedScanResultStorage() { 314c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham return mOffloadedScanResultStorageBytes; 315c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham } 316c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham 317c145fd074dac20e6c9836ee6e900538f2cc7dd54Prerepa Viswanadham /** 318d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham * @return tx/rx/idle activity and energy info 319d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham */ 320d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham boolean isActivityAndEnergyReportingSupported() { 321d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham return mIsActivityAndEnergyReporting; 322d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham } 323871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham 324871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham /** 325551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski * @return the mIsLe2MPhySupported 326551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski */ 327551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski boolean isLe2MPhySupported() { 328551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski return mIsLe2MPhySupported; 329551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski } 330551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski 331551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski /** 332551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski * @return the mIsLeCodedPhySupported 333551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski */ 334551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski boolean isLeCodedPhySupported() { 335551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski return mIsLeCodedPhySupported; 336551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski } 337551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski 338551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski /** 339551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski * @return the mIsLeExtendedAdvertisingSupported 340551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski */ 341551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski boolean isLeExtendedAdvertisingSupported() { 342551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski return mIsLeExtendedAdvertisingSupported; 343551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski } 344551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski 345551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski /** 346551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski * @return the mIsLePeriodicAdvertisingSupported 347551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski */ 348551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski boolean isLePeriodicAdvertisingSupported() { 349551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski return mIsLePeriodicAdvertisingSupported; 350551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski } 351551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski 352551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski /** 3531f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski * @return the getLeMaximumAdvertisingDataLength 3541f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski */ 3551f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski int getLeMaximumAdvertisingDataLength() { 3561f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski return mLeMaximumAdvertisingDataLength; 3571f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski } 3581f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski 3591f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski /** 360871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham * @return total number of trackable advertisements 361871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham */ 362871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham int getTotalNumOfTrackableAdvertisements() { 363871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham return mTotNumOfTrackableAdv; 364871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham } 365871ab55f8460ecc0cbff29904c312528fb7bbc63Prerepa Viswanadham 366d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham /** 367ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * @return the mBondedDevices 368ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 369ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh BluetoothDevice[] getBondedDevices() { 3702f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan BluetoothDevice[] bondedDeviceList = new BluetoothDevice[0]; 37196d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov try { 37296d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov bondedDeviceList = mBondedDevices.toArray(bondedDeviceList); 37396d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov } catch(ArrayStoreException ee) { 37496d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov errorLog("Error retrieving bonded device array"); 3752f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan } 37696d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov infoLog("getBondedDevices: length=" + bondedDeviceList.length); 37796d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return bondedDeviceList; 3782f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan } 37996d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov 380179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy // This function shall be invoked from BondStateMachine whenever the bond 381179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy // state changes. 382179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy void onBondStateChanged(BluetoothDevice device, int state) 383179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy { 384d691ccc7632567fbba9557a8750943523802d860Jack He if (device == null) { 385d691ccc7632567fbba9557a8750943523802d860Jack He Log.w(TAG, "onBondStateChanged, device is null"); 3862f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan return; 387d691ccc7632567fbba9557a8750943523802d860Jack He } 3882f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan try { 3892f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan byte[] addrByte = Utils.getByteAddress(device); 3902f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan DeviceProperties prop = mRemoteDevices.getDeviceProperties(device); 3912f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan if (prop == null) 3922f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan prop = mRemoteDevices.addDeviceProperties(addrByte); 393179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy prop.setBondState(state); 394179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy 395179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy if (state == BluetoothDevice.BOND_BONDED) { 396179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy // add if not already in list 397179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy if(!mBondedDevices.contains(device)) { 398179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy debugLog("Adding bonded device:" + device); 399179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy mBondedDevices.add(device); 400179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy } 401179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy } else if (state == BluetoothDevice.BOND_NONE) { 402179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy // remove device from list 403179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy if (mBondedDevices.remove(device)) 404179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy debugLog("Removing bonded device:" + device); 405179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy else 406179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy debugLog("Failed to remove device: " + device); 4072f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan } 4082f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan } 4092f9a79b2d545e1a8b50a0018456892a9934db99aRavi Nagarajan catch(Exception ee) { 410d691ccc7632567fbba9557a8750943523802d860Jack He Log.w(TAG, "onBondStateChanged: Exception ", ee); 411ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 412ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 413ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 414ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int getDiscoverableTimeout() { 41596d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mDiscoverableTimeout; 416ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 417ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 418ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh boolean setDiscoverableTimeout(int timeout) { 419ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 420ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return mService.setAdapterPropertyNative( 421ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh AbstractionLayer.BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT, 422ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Utils.intToByteArray(timeout)); 423ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 424ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 425ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 426ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int getProfileConnectionState(int profile) { 427ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 428ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Pair<Integer, Integer> p = mProfileConnectionState.get(profile); 429ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (p != null) return p.first; 430ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return BluetoothProfile.STATE_DISCONNECTED; 431ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 432ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 433ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 4342aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen long discoveryEndMillis() { 4352aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen return mDiscoveryEndMs; 4362aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen } 4372aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen 438ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh boolean isDiscovering() { 43996d55ca658f111f1c475ccdb8dd83f47bd70d87cPavlin Radoslavov return mDiscovering; 440ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 441ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 44286c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal private void sendConnectionStateChange(int profile, Intent connIntent) { 44386c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal BluetoothDevice device = connIntent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 44486c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal int prevState = connIntent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1); 44586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal int state = connIntent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); 446d691ccc7632567fbba9557a8750943523802d860Jack He Log.d(TAG, 447d691ccc7632567fbba9557a8750943523802d860Jack He "PROFILE_CONNECTION_STATE_CHANGE: profile=" + profile + ", device=" + device + ", " 448d691ccc7632567fbba9557a8750943523802d860Jack He + prevState + " -> " + state); 449d691ccc7632567fbba9557a8750943523802d860Jack He if (!isNormalStateTransition(prevState, state)) { 450233b9b1bedc74fbb64ff24fe85320aa56b4ae345Jack He Log.w(TAG, 451233b9b1bedc74fbb64ff24fe85320aa56b4ae345Jack He "PROFILE_CONNECTION_STATE_CHANGE: unexpected transition for profile=" + profile 452d691ccc7632567fbba9557a8750943523802d860Jack He + ", device=" + device + ", " + prevState + " -> " + state); 453d691ccc7632567fbba9557a8750943523802d860Jack He } 45486c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal sendConnectionStateChange(device, profile, state, prevState); 45586c29fe88456bdcfbd4334647b04ef81ff384a06Sanket Agarwal } 456ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh void sendConnectionStateChange(BluetoothDevice device, int profile, int state, int prevState) { 457ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!validateProfileConnectionState(state) || 458ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh !validateProfileConnectionState(prevState)) { 459ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // Previously, an invalid state was broadcast anyway, 460ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // with the invalid state converted to -1 in the intent. 461ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // Better to log an error and not send an intent with 462ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // invalid contents or set mAdapterConnectionState to -1. 463d691ccc7632567fbba9557a8750943523802d860Jack He errorLog("sendConnectionStateChange: invalid state transition " + prevState + " -> " 464d691ccc7632567fbba9557a8750943523802d860Jack He + state); 465ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 466ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 467ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 468ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 469ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh updateProfileConnectionState(profile, state, prevState); 470ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 471ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (updateCountersAndCheckForConnectionStateChange(state, prevState)) { 472d691ccc7632567fbba9557a8750943523802d860Jack He int newAdapterState = convertToAdapterState(state); 473d691ccc7632567fbba9557a8750943523802d860Jack He int prevAdapterState = convertToAdapterState(prevState); 474d691ccc7632567fbba9557a8750943523802d860Jack He setConnectionState(newAdapterState); 475ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 476ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Intent intent = new Intent(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); 477ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); 478d691ccc7632567fbba9557a8750943523802d860Jack He intent.putExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, newAdapterState); 479d691ccc7632567fbba9557a8750943523802d860Jack He intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_CONNECTION_STATE, prevAdapterState); 480ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 481d691ccc7632567fbba9557a8750943523802d860Jack He Log.d(TAG, 482d691ccc7632567fbba9557a8750943523802d860Jack He "ADAPTER_CONNECTION_STATE_CHANGE: " + device + ": " + prevAdapterState 483d691ccc7632567fbba9557a8750943523802d860Jack He + " -> " + newAdapterState); 484d691ccc7632567fbba9557a8750943523802d860Jack He if (!isNormalStateTransition(prevState, state)) { 485233b9b1bedc74fbb64ff24fe85320aa56b4ae345Jack He Log.w(TAG, 486233b9b1bedc74fbb64ff24fe85320aa56b4ae345Jack He "ADAPTER_CONNECTION_STATE_CHANGE: unexpected transition for profile=" 487d691ccc7632567fbba9557a8750943523802d860Jack He + profile + ", device=" + device + ", " + prevState + " -> " 488d691ccc7632567fbba9557a8750943523802d860Jack He + state); 489d691ccc7632567fbba9557a8750943523802d860Jack He } 490d691ccc7632567fbba9557a8750943523802d860Jack He mService.sendBroadcastAsUser(intent, UserHandle.ALL, AdapterService.BLUETOOTH_PERM); 491ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 492ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 493ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 494ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 495ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private boolean validateProfileConnectionState(int state) { 496ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return (state == BluetoothProfile.STATE_DISCONNECTED || 497ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh state == BluetoothProfile.STATE_CONNECTING || 498ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh state == BluetoothProfile.STATE_CONNECTED || 499ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh state == BluetoothProfile.STATE_DISCONNECTING); 500ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 501ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 502d691ccc7632567fbba9557a8750943523802d860Jack He private static int convertToAdapterState(int state) { 503ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh switch (state) { 504ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_DISCONNECTED: 505ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return BluetoothAdapter.STATE_DISCONNECTED; 506ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_DISCONNECTING: 507ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return BluetoothAdapter.STATE_DISCONNECTING; 508ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_CONNECTED: 509ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return BluetoothAdapter.STATE_CONNECTED; 510ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_CONNECTING: 511ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return BluetoothAdapter.STATE_CONNECTING; 512ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 513d691ccc7632567fbba9557a8750943523802d860Jack He Log.e(TAG, "convertToAdapterState, unknow state " + state); 514ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return -1; 515ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 516ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 517d691ccc7632567fbba9557a8750943523802d860Jack He private static boolean isNormalStateTransition(int prevState, int nextState) { 518d691ccc7632567fbba9557a8750943523802d860Jack He switch (prevState) { 519d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothProfile.STATE_DISCONNECTED: 520d691ccc7632567fbba9557a8750943523802d860Jack He return nextState == BluetoothProfile.STATE_CONNECTING; 521d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothProfile.STATE_CONNECTED: 522d691ccc7632567fbba9557a8750943523802d860Jack He return nextState == BluetoothProfile.STATE_DISCONNECTING; 523d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothProfile.STATE_DISCONNECTING: 524d691ccc7632567fbba9557a8750943523802d860Jack He case BluetoothProfile.STATE_CONNECTING: 525d691ccc7632567fbba9557a8750943523802d860Jack He return (nextState == BluetoothProfile.STATE_DISCONNECTED) 526d691ccc7632567fbba9557a8750943523802d860Jack He || (nextState == BluetoothProfile.STATE_CONNECTED); 527d691ccc7632567fbba9557a8750943523802d860Jack He default: 528d691ccc7632567fbba9557a8750943523802d860Jack He return false; 529d691ccc7632567fbba9557a8750943523802d860Jack He } 530d691ccc7632567fbba9557a8750943523802d860Jack He } 531d691ccc7632567fbba9557a8750943523802d860Jack He 532ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private boolean updateCountersAndCheckForConnectionStateChange(int state, int prevState) { 533ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh switch (prevState) { 534ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_CONNECTING: 535348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB if (mProfilesConnecting > 0) 536348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB mProfilesConnecting--; 537348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB else 538348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB Log.e(TAG, "mProfilesConnecting " + mProfilesConnecting); 539ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 540ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 541ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_CONNECTED: 542348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB if (mProfilesConnected > 0) 543348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB mProfilesConnected--; 544348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB else 545348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB Log.e(TAG, "mProfilesConnected " + mProfilesConnected); 546ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 547ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 548ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_DISCONNECTING: 549348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB if (mProfilesDisconnecting > 0) 550348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB mProfilesDisconnecting--; 551348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB else 552348b6390d7344299573cf230ee74160f5d53994aMallikarjuna GB Log.e(TAG, "mProfilesDisconnecting " + mProfilesDisconnecting); 553ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 554ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 555ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 556ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh switch (state) { 557ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_CONNECTING: 558ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mProfilesConnecting++; 559ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return (mProfilesConnected == 0 && mProfilesConnecting == 1); 560ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 561ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_CONNECTED: 562ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mProfilesConnected++; 563ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return (mProfilesConnected == 1); 564ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 565ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_DISCONNECTING: 566ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mProfilesDisconnecting++; 567ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return (mProfilesConnected == 0 && mProfilesDisconnecting == 1); 568ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 569ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BluetoothProfile.STATE_DISCONNECTED: 570ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return (mProfilesConnected == 0 && mProfilesConnecting == 0); 571ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 572ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh default: 573ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 574ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 575ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 576ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 577ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private void updateProfileConnectionState(int profile, int newState, int oldState) { 578ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // mProfileConnectionState is a hashmap - 579ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // <Integer, Pair<Integer, Integer>> 580ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // The key is the profile, the value is a pair. first element 581ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // is the state and the second element is the number of devices 582ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // in that state. 583ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int numDev = 1; 584ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int newHashState = newState; 585ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh boolean update = true; 586ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 587ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // The following conditions are considered in this function: 588ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // 1. If there is no record of profile and state - update 589ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // 2. If a new device's state is current hash state - increment 590ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // number of devices in the state. 591ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // 3. If a state change has happened to Connected or Connecting 592ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // (if current state is not connected), update. 593ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // 4. If numDevices is 1 and that device state is being updated, update 594ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // 5. If numDevices is > 1 and one of the devices is changing state, 595ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // decrement numDevices but maintain oldState if it is Connected or 596ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh // Connecting 597ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Pair<Integer, Integer> stateNumDev = mProfileConnectionState.get(profile); 598ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (stateNumDev != null) { 599ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int currHashState = stateNumDev.first; 600ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh numDev = stateNumDev.second; 601ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 602ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (newState == currHashState) { 603ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh numDev ++; 604ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else if (newState == BluetoothProfile.STATE_CONNECTED || 605ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (newState == BluetoothProfile.STATE_CONNECTING && 606ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh currHashState != BluetoothProfile.STATE_CONNECTED)) { 607ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh numDev = 1; 608ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else if (numDev == 1 && oldState == currHashState) { 609ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh update = true; 610ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else if (numDev > 1 && oldState == currHashState) { 611ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh numDev --; 612ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 613ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (currHashState == BluetoothProfile.STATE_CONNECTED || 614ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh currHashState == BluetoothProfile.STATE_CONNECTING) { 615ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh newHashState = currHashState; 616ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 617ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else { 618ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh update = false; 619ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 620ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 621ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 622ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (update) { 623ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mProfileConnectionState.put(profile, new Pair<Integer, Integer>(newHashState, 624ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh numDev)); 625ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 626ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 627ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 628ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh void adapterPropertyChangedCallback(int[] types, byte[][] values) { 629ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Intent intent; 630ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int type; 631ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh byte[] val; 632ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh for (int i = 0; i < types.length; i++) { 633ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh val = values[i]; 634ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh type = types[i]; 635ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("adapterPropertyChangedCallback with type:" + type + " len:" + val.length); 636ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 637ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh switch (type) { 638ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_BDNAME: 639ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mName = new String(val); 640ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent = new Intent(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED); 641ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.putExtra(BluetoothAdapter.EXTRA_LOCAL_NAME, mName); 642ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 643d691ccc7632567fbba9557a8750943523802d860Jack He mService.sendBroadcastAsUser( 644d691ccc7632567fbba9557a8750943523802d860Jack He intent, UserHandle.ALL, AdapterService.BLUETOOTH_PERM); 645ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh debugLog("Name is: " + mName); 646ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 647ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_BDADDR: 648ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mAddress = val; 6496d5da5e7ffb69614706ca030bfe194a493b24e99Stanley Tng String address = Utils.getAddressStringFromByte(mAddress); 6506d5da5e7ffb69614706ca030bfe194a493b24e99Stanley Tng debugLog("Address is:" + address); 6516d5da5e7ffb69614706ca030bfe194a493b24e99Stanley Tng intent = new Intent(BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED); 6526d5da5e7ffb69614706ca030bfe194a493b24e99Stanley Tng intent.putExtra(BluetoothAdapter.EXTRA_BLUETOOTH_ADDRESS, address); 6536d5da5e7ffb69614706ca030bfe194a493b24e99Stanley Tng intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 6546d5da5e7ffb69614706ca030bfe194a493b24e99Stanley Tng mService.sendBroadcastAsUser( 655d691ccc7632567fbba9557a8750943523802d860Jack He intent, UserHandle.ALL, AdapterService.BLUETOOTH_PERM); 656ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 657ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE: 658ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mBluetoothClass = Utils.byteArrayToInt(val, 0); 659ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh debugLog("BT Class:" + mBluetoothClass); 660ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 661ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_ADAPTER_SCAN_MODE: 662ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int mode = Utils.byteArrayToInt(val, 0); 663d691ccc7632567fbba9557a8750943523802d860Jack He mScanMode = AdapterService.convertScanModeFromHal(mode); 664ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent = new Intent(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); 665ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.putExtra(BluetoothAdapter.EXTRA_SCAN_MODE, mScanMode); 666ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 667d691ccc7632567fbba9557a8750943523802d860Jack He mService.sendBroadcast(intent, AdapterService.BLUETOOTH_PERM); 668ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh debugLog("Scan Mode:" + mScanMode); 66931ba132491053bc86d419a7d51fc04af3299c076fredc if (mBluetoothDisabling) { 67031ba132491053bc86d419a7d51fc04af3299c076fredc mBluetoothDisabling=false; 67131ba132491053bc86d419a7d51fc04af3299c076fredc mService.startBluetoothDisable(); 67231ba132491053bc86d419a7d51fc04af3299c076fredc } 673ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 674ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_UUIDS: 675ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mUuids = Utils.byteArrayToUuid(val); 676ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 677ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_ADAPTER_BONDED_DEVICES: 678ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int number = val.length/BD_ADDR_LEN; 679ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh byte[] addrByte = new byte[BD_ADDR_LEN]; 680ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh for (int j = 0; j < number; j++) { 681ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh System.arraycopy(val, j * BD_ADDR_LEN, addrByte, 0, BD_ADDR_LEN); 682179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy onBondStateChanged(mAdapter.getRemoteDevice( 683179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy Utils.getAddressStringFromByte(addrByte)), 684179fd2512d1a93bbd2a1a3803f5764cb417fe4c9Kausik Sinnaswamy BluetoothDevice.BOND_BONDED); 685ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 686ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 687ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case AbstractionLayer.BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT: 688ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mDiscoverableTimeout = Utils.byteArrayToInt(val, 0); 689ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh debugLog("Discoverable Timeout:" + mDiscoverableTimeout); 690ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 691d0f1d36e653e1b91337743b92472ba4ea97c538bGanesh Ganapathi Batta 692d0f1d36e653e1b91337743b92472ba4ea97c538bGanesh Ganapathi Batta case AbstractionLayer.BT_PROPERTY_LOCAL_LE_FEATURES: 693d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham updateFeatureSupport(val); 694d0f1d36e653e1b91337743b92472ba4ea97c538bGanesh Ganapathi Batta break; 695d0f1d36e653e1b91337743b92472ba4ea97c538bGanesh Ganapathi Batta 696ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh default: 697ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh errorLog("Property change not handled in Java land:" + type); 698ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 699ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 700ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 701ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 702ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 703d691ccc7632567fbba9557a8750943523802d860Jack He private void updateFeatureSupport(byte[] val) { 704655434047df38242c1848eee283f134cfd299fd1Satya Calloji mVersSupported = ((0xFF & ((int)val[1])) << 8) 705655434047df38242c1848eee283f134cfd299fd1Satya Calloji + (0xFF & ((int)val[0])); 706655434047df38242c1848eee283f134cfd299fd1Satya Calloji mNumOfAdvertisementInstancesSupported = (0xFF & ((int)val[3])); 707655434047df38242c1848eee283f134cfd299fd1Satya Calloji mRpaOffloadSupported = ((0xFF & ((int)val[4]))!= 0); 708655434047df38242c1848eee283f134cfd299fd1Satya Calloji mNumOfOffloadedIrkSupported = (0xFF & ((int)val[5])); 709655434047df38242c1848eee283f134cfd299fd1Satya Calloji mNumOfOffloadedScanFilterSupported = (0xFF & ((int)val[6])); 710f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham mIsActivityAndEnergyReporting = ((0xFF & ((int)val[7])) != 0); 711655434047df38242c1848eee283f134cfd299fd1Satya Calloji mOffloadedScanResultStorageBytes = ((0xFF & ((int)val[9])) << 8) 712655434047df38242c1848eee283f134cfd299fd1Satya Calloji + (0xFF & ((int)val[8])); 713655434047df38242c1848eee283f134cfd299fd1Satya Calloji mTotNumOfTrackableAdv = ((0xFF & ((int)val[11])) << 8) 714655434047df38242c1848eee283f134cfd299fd1Satya Calloji + (0xFF & ((int)val[10])); 715ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji mIsExtendedScanSupported = ((0xFF & ((int)val[12])) != 0); 716ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji mIsDebugLogSupported = ((0xFF & ((int)val[13])) != 0); 717551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski mIsLe2MPhySupported = ((0xFF & ((int) val[14])) != 0); 718551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski mIsLeCodedPhySupported = ((0xFF & ((int) val[15])) != 0); 719551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski mIsLeExtendedAdvertisingSupported = ((0xFF & ((int) val[16])) != 0); 720551de252cd8661c9f65a16211386e354e3f0d063Jakub Pawlowski mIsLePeriodicAdvertisingSupported = ((0xFF & ((int) val[17])) != 0); 7211f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski mLeMaximumAdvertisingDataLength = (0xFF & ((int)val[18])) 7221f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + ((0xFF & ((int)val[19])) << 8); 723ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji 724d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham Log.d(TAG, "BT_PROPERTY_LOCAL_LE_FEATURES: update from BT controller" 725f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham + " mNumOfAdvertisementInstancesSupported = " 726f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham + mNumOfAdvertisementInstancesSupported 727d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham + " mRpaOffloadSupported = " + mRpaOffloadSupported 728f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham + " mNumOfOffloadedIrkSupported = " 729f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham + mNumOfOffloadedIrkSupported 730d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham + " mNumOfOffloadedScanFilterSupported = " 731d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham + mNumOfOffloadedScanFilterSupported 732f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham + " mOffloadedScanResultStorageBytes= " 733f2f2e89a583d764066c4a84b3d5de5201310202bPrerepa Viswanadham + mOffloadedScanResultStorageBytes 734d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham + " mIsActivityAndEnergyReporting = " 735655434047df38242c1848eee283f134cfd299fd1Satya Calloji + mIsActivityAndEnergyReporting 736655434047df38242c1848eee283f134cfd299fd1Satya Calloji +" mVersSupported = " 737655434047df38242c1848eee283f134cfd299fd1Satya Calloji + mVersSupported 738655434047df38242c1848eee283f134cfd299fd1Satya Calloji + " mTotNumOfTrackableAdv = " 739ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji + mTotNumOfTrackableAdv 740ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji + " mIsExtendedScanSupported = " 741ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji + mIsExtendedScanSupported 742ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji + " mIsDebugLogSupported = " 743ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji + mIsDebugLogSupported 7441f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + " mIsLe2MPhySupported = " 7451f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + mIsLe2MPhySupported 7461f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + " mIsLeCodedPhySupported = " 7471f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + mIsLeCodedPhySupported 7481f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + " mIsLeExtendedAdvertisingSupported = " 7491f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + mIsLeExtendedAdvertisingSupported 7501f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + " mIsLePeriodicAdvertisingSupported = " 7511f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + mIsLePeriodicAdvertisingSupported 7521f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + " mLeMaximumAdvertisingDataLength = " 7531f205202cbab0dd9edd2654bfbc60edd77b5ab58Jakub Pawlowski + mLeMaximumAdvertisingDataLength 754ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji ); 755d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham } 756d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham 75744abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh void onBluetoothReady() { 758b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He debugLog("onBluetoothReady, state=" + getState() + ", ScanMode=" + mScanMode); 75931ba132491053bc86d419a7d51fc04af3299c076fredc 76044abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh synchronized (mObject) { 761b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He // Reset adapter and profile connection states 762b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He setConnectionState(BluetoothAdapter.STATE_DISCONNECTED); 763b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He mProfileConnectionState.clear(); 764b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He mProfilesConnected = 0; 765b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He mProfilesConnecting = 0; 766b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He mProfilesDisconnecting = 0; 767b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He // When BT is being turned on, all adapter properties will be sent in 1 768b4a3b38c404cfd0bc39ae0922d2d3e9a72b2d6bfJack He // callback. At this stage, set the scan mode. 76944abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh if (getState() == BluetoothAdapter.STATE_TURNING_ON && 77044abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh mScanMode == BluetoothAdapter.SCAN_MODE_NONE) { 77119da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala /* mDiscoverableTimeout is part of the 77219da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala adapterPropertyChangedCallback received before 77319da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala onBluetoothReady */ 77419da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala if (mDiscoverableTimeout != 0) 77519da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE); 77619da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala else /* if timeout == never (0) at startup */ 77719da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE); 77819da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala /* though not always required, this keeps NV up-to date on first-boot after flash */ 77919da573973557408b1b7398a2c3a167d8da9527dSrikanth Uppala setDiscoverableTimeout(mDiscoverableTimeout); 78044abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh } 78144abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh } 78244abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh } 78344abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh 78483557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora private boolean mBluetoothDisabling = false; 78583557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora 78683557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora void onBleDisable() { 78783557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora // Sequence BLE_ON to STATE_OFF - that is _complete_ OFF state. 78883557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora // When BT disable is invoked, set the scan_mode to NONE 78983557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora // so no incoming connections are possible 79083557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora debugLog("onBleDisable"); 79183557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora if (getState() == BluetoothAdapter.STATE_BLE_TURNING_OFF) { 79283557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora setScanMode(AbstractionLayer.BT_SCAN_MODE_NONE); 79383557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora } 79483557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora } 79531ba132491053bc86d419a7d51fc04af3299c076fredc 796d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy void onBluetoothDisable() { 79783557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora // From STATE_ON to BLE_ON 798d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy // When BT disable is invoked, set the scan_mode to NONE 799d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy // so no incoming connections are possible 80031ba132491053bc86d419a7d51fc04af3299c076fredc 80131ba132491053bc86d419a7d51fc04af3299c076fredc //Set flag to indicate we are disabling. When property change of scan mode done 80231ba132491053bc86d419a7d51fc04af3299c076fredc //continue with disable sequence 80331ba132491053bc86d419a7d51fc04af3299c076fredc debugLog("onBluetoothDisable()"); 80431ba132491053bc86d419a7d51fc04af3299c076fredc mBluetoothDisabling = true; 805d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy if (getState() == BluetoothAdapter.STATE_TURNING_OFF) { 806f6154624f5d94ee078d4208340411630e9e50bf3Nitin Arora // Turn off any Device Search/Inquiry 807f6154624f5d94ee078d4208340411630e9e50bf3Nitin Arora mService.cancelDiscovery(); 808d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy setScanMode(AbstractionLayer.BT_SCAN_MODE_NONE); 809d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy } 810d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy } 81183557a8324f0d1c2ae6ff416fbc122d7b6c64fe3Nitin Arora 812ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh void discoveryStateChangeCallback(int state) { 813ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("Callback:discoveryStateChangeCallback with state:" + state); 814ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh synchronized (mObject) { 815ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Intent intent; 816ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (state == AbstractionLayer.BT_DISCOVERY_STOPPED) { 817ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mDiscovering = false; 8182aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen mDiscoveryEndMs = System.currentTimeMillis(); 819ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent = new Intent(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 820d691ccc7632567fbba9557a8750943523802d860Jack He mService.sendBroadcast(intent, AdapterService.BLUETOOTH_PERM); 821ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else if (state == AbstractionLayer.BT_DISCOVERY_STARTED) { 822ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mDiscovering = true; 8232aad9ef373bb7c4d0415ba2869a72869d22673f4Marie Janssen mDiscoveryEndMs = System.currentTimeMillis() + DEFAULT_DISCOVERY_TIMEOUT_MS; 824ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent = new Intent(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 825d691ccc7632567fbba9557a8750943523802d860Jack He mService.sendBroadcast(intent, AdapterService.BLUETOOTH_PERM); 826ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 827ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 828ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 829ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 830d691ccc7632567fbba9557a8750943523802d860Jack He private static void infoLog(String msg) { 83120de1a6601e8aea7bbc9b9a8219cc616ffddae25Andre Eisenbach if (VDBG) Log.i(TAG, msg); 832ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 833ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 834d691ccc7632567fbba9557a8750943523802d860Jack He private static void debugLog(String msg) { 835ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (DBG) Log.d(TAG, msg); 836ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 837ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 838d691ccc7632567fbba9557a8750943523802d860Jack He private static void errorLog(String msg) { 839ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.e(TAG, msg); 840ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 841ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 842