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