BondStateMachine.java revision 986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5
1ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/* 2ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * Copyright (C) 2012 Google Inc. 3ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 4ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 5ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshpackage com.android.bluetooth.btservice; 6ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 7ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter; 8ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.bluetooth.BluetoothDevice; 9ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.content.Context; 10ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.content.Intent; 11ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.os.Message; 12ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.util.Log; 13ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 14ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.bluetooth.Utils; 15ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.bluetooth.btservice.RemoteDevices.DeviceProperties; 16ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.internal.util.State; 17ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.internal.util.StateMachine; 18ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 19ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport java.util.ArrayList; 20ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 21ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/** 22ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * This state machine handles Bluetooth Adapter State. 23ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * States: 24ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * {@link StableState} : No device is in bonding / unbonding state. 25ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * {@link PendingCommandState} : Some device is in bonding / unbonding state. 26ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * TODO(BT) This class can be removed and this logic moved to the stack. 27ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 28ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 29ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshfinal class BondStateMachine extends StateMachine { 30ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private static final boolean DBG = true; 31ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private static final String TAG = "BluetoothBondStateMachine"; 32ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 33ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh static final int CREATE_BOND = 1; 34ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh static final int CANCEL_BOND = 2; 35ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh static final int REMOVE_BOND = 3; 36ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh static final int BONDING_STATE_CHANGE = 4; 37ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 38986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan static final int BOND_STATE_NONE = 0; 39986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan static final int BOND_STATE_BONDING = 1; 40986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan static final int BOND_STATE_BONDED = 2; 41986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan 42ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private final AdapterService mAdapterService; 43ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private final Context mContext; 44ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private final AdapterProperties mAdapterProperties; 45ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private final RemoteDevices mRemoteDevices; 46ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 47ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private PendingCommandState mPendingCommandState = new PendingCommandState(); 48ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private StableState mStableState = new StableState(); 49ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 50ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh public BondStateMachine(AdapterService service, Context context, 51ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh AdapterProperties prop) { 52ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh super("BondStateMachine:"); 53ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addState(mStableState); 54ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addState(mPendingCommandState); 55ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh setInitialState(mStableState); 56ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mAdapterService = service; 57ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mAdapterProperties = prop; 58ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mContext = context; 59ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mRemoteDevices = RemoteDevices.getInstance(service, context); 60ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 61ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 62ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private class StableState extends State { 63ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh @Override 64ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh public void enter() { 65ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("Entering Off State"); 66ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 67ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 68ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh @Override 69ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh public boolean processMessage(Message msg) { 70ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh BluetoothDevice dev = (BluetoothDevice)msg.obj; 71ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh switch(msg.what) { 72ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case CREATE_BOND: 73ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh createBond(dev, true); 74ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 75ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case REMOVE_BOND: 76ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh removeBond(dev, true); 77ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 78ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BONDING_STATE_CHANGE: 79986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan int newState = msg.arg1; 80986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan /* if incoming pairing, transition to pending state */ 81986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan if (newState == BluetoothDevice.BOND_BONDING) 82986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan { 83986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan sendIntent(dev, newState); 84986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan transitionTo(mPendingCommandState); 85986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan } 86986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan else 87986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan { 88986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan Log.e(TAG, "In stable state, received invalid newState: " + newState); 89986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan } 90986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan break; 91986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan 92986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan case CANCEL_BOND: 93ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh default: 94ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.e(TAG, "Received unhandled state: " + msg.what); 95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return false; 96ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 97ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 98ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 99ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 100ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 101ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 102ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private class PendingCommandState extends State { 103ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private final ArrayList<BluetoothDevice> mDevices = 104ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh new ArrayList<BluetoothDevice>(); 105ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 106ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh @Override 107ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh public void enter() { 108ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("Entering PendingCommandState State"); 109ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh BluetoothDevice dev = (BluetoothDevice)getCurrentMessage().obj; 110ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh @Override 113ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh public boolean processMessage(Message msg) { 114ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh BluetoothDevice dev = (BluetoothDevice)msg.obj; 115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh boolean result; 116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (mDevices.contains(dev) && 117ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh msg.what != CANCEL_BOND && msg.what != BONDING_STATE_CHANGE) { 118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh deferMessage(msg); 119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 121ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 122ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh switch (msg.what) { 123ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case CREATE_BOND: 124ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = createBond(dev, false); 125ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 126ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case REMOVE_BOND: 127ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = removeBond(dev, false); 128ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 129ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case CANCEL_BOND: 130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = cancelBond(dev); 131ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 132ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh case BONDING_STATE_CHANGE: 133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int newState = msg.arg1; 134ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sendIntent(dev, newState); 135986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan 136986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan if (newState == BluetoothDevice.BOND_BONDING) 137986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan { 138986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan result = true; 139986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan } 140986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan else 141986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan { 142986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan /* this is either none/bonded, remove and transition */ 143986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan result = !mDevices.remove(dev); 144986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan if (mDevices.isEmpty()) { 145986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan transitionTo(mStableState); 146986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan } 147ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 148986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan 149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh break; 150ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh default: 151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.e(TAG, "Received unhandled event:" + msg.what); 152ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return false; 153ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 154ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (result) mDevices.add(dev); 155ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 156ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 157ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 158ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 159ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 160ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private boolean cancelBond(BluetoothDevice dev) { 161ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (dev.getBondState() == BluetoothDevice.BOND_BONDING) { 162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh byte[] addr = Utils.getBytesFromAddress(dev.getAddress()); 163ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!mAdapterService.cancelBondNative(addr)) { 164ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.e(TAG, "Unexpected error while cancelling bond:"); 165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else { 166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return false; 170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private boolean removeBond(BluetoothDevice dev, boolean transition) { 173ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (dev.getBondState() == BluetoothDevice.BOND_BONDED) { 174ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh byte[] addr = Utils.getBytesFromAddress(dev.getAddress()); 175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!mAdapterService.removeBondNative(addr)) { 176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.e(TAG, "Unexpected error while removing bond:"); 177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else { 178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (transition) transitionTo(mPendingCommandState); 179ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 180ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 181ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 182ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return false; 184ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 185ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 186ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private boolean createBond(BluetoothDevice dev, boolean transition) { 187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (dev.getBondState() == BluetoothDevice.BOND_NONE) { 188ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("Bond address is:" + dev); 189ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh byte[] addr = Utils.getBytesFromAddress(dev.getAddress()); 190ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!mAdapterService.createBondNative(addr)) { 191ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sendIntent(dev, BluetoothDevice.BOND_NONE); 192986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan return false; 193ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else if (transition) { 194ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh transitionTo(mPendingCommandState); 195ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 196ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 197ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 198ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return false; 199ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 200ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 201ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private void sendIntent(BluetoothDevice device, int newState) { 202ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh DeviceProperties devProp = mRemoteDevices.getDeviceProperties(device); 203ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int oldState = devProp.getBondState(); 204ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (oldState == newState) return; 205ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 206ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh devProp.setBondState(newState); 207ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 208ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Intent intent = new Intent(BluetoothDevice.ACTION_BOND_STATE_CHANGED); 209ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); 210ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.putExtra(BluetoothDevice.EXTRA_BOND_STATE, newState); 211ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh intent.putExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, oldState); 212ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh mContext.sendBroadcast(intent, AdapterService.BLUETOOTH_PERM); 213ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("Bond State Change Intent:" + device + " OldState: " + oldState 214ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh + " NewState: " + newState); 215ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 216ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 217ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh void bondStateChangeCallback(int status, byte[] address, int newState) { 218ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh BluetoothDevice device = mRemoteDevices.getDevice(address); 219ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 220ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (device == null) { 221ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh errorLog("No record of the device:" + device); 222ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 223ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 224ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 225ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh infoLog("bondStateChangeCallback: Status: " + status + " Address: " + device 226ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh + " newState: " + newState); 227ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 228ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Message msg = obtainMessage(BONDING_STATE_CHANGE); 229ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh msg.obj = device; 230ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 231986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan if (newState == BOND_STATE_BONDED) 232986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan msg.arg1 = BluetoothDevice.BOND_BONDED; 233986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan else if (newState == BOND_STATE_BONDING) 234986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan msg.arg1 = BluetoothDevice.BOND_BONDING; 235986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan else 236986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan msg.arg1 = BluetoothDevice.BOND_NONE; 237986b5b03a378385bfea6c5cc6b6c1d7f0424e0a5Ravi Nagarajan 238ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sendMessage(msg); 239ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 240ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 241ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private void infoLog(String msg) { 242ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.i(TAG, msg); 243ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 244ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 245ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh private void errorLog(String msg) { 246ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh Log.e(TAG, msg); 247ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 248ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 249