AdapterState.java revision d570893c5ec3bc9fd1860aa0355c550d3a51f8dd
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.content.Context;
9ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.content.Intent;
10ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.os.Message;
11ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport android.util.Log;
12ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
13ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.internal.util.State;
14ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshimport com.android.internal.util.StateMachine;
15ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
16ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/**
17ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * This state machine handles Bluetooth Adapter State.
18ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * States:
19ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh *      {@link OnState} : Bluetooth is on at this state
20ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh *      {@link OffState}: Bluetooth is off at this state. This is the initial
21ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh *      state.
22ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh *      {@link PendingCommandState} : An enable / disable operation is pending.
23ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * TODO(BT): Add per process on state.
24ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */
25ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
26ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshfinal class AdapterState extends StateMachine {
27ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final boolean DBG = true;
28ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final String TAG = "BluetoothAdapterState";
29ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
30ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int USER_TURN_ON = 1;
31ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int USER_TURN_OFF = 2;
32ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int AIRPLANE_MODE_ON = 3;
33ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int AIRPLANE_MODE_OFF = 4;
34ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int ENABLED_READY = 5;
35ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int DISABLED = 6;
36ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int ALL_DEVICES_DISCONNECTED = 7;
37ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    static final int ENABLE_TIMEOUT = 8;
38ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
39ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final int DISCONNECT_TIMEOUT = 3000;
40ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private static final int ENABLE_TIMEOUT_DELAY = 6000; // 6 secs
41ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
42ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private final AdapterService mAdapterService;
43ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private final Context mContext;
44ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private final AdapterProperties mAdapterProperties;
45ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
46ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private PendingCommandState mPendingCommandState = new PendingCommandState();
47ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private OnState mOnState = new OnState();
48ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private OffState mOffState = new OffState();
49ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
50ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    public AdapterState(AdapterService service, Context context,
51ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            AdapterProperties adapterProperties) {
52ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        super("BluetoothAdapterState:");
53ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        addState(mOnState);
54ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        addState(mOffState);
55ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        addState(mPendingCommandState);
56ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        setInitialState(mOffState);
57ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterService = service;
58ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mContext = context;
59ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterProperties = adapterProperties;
60ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
61ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
62ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private class OffState 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            switch(msg.what) {
71ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_ON:
72fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                   int persist = msg.arg1;
73fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                   if (persist == 1) mAdapterService.persistBluetoothSetting(true);
74ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   sendIntent(BluetoothAdapter.STATE_TURNING_ON);
75ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   boolean ret = mAdapterService.enableNative();
76ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   if (!ret) {
77ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       Log.e(TAG, "Error while turning Bluetooth On");
78ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       sendIntent(BluetoothAdapter.STATE_OFF);
79ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   } else {
80ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       sendMessageDelayed(ENABLE_TIMEOUT, ENABLE_TIMEOUT_DELAY);
81ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       transitionTo(mPendingCommandState);
82ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   }
83ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
840708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M               case AIRPLANE_MODE_OFF:
850708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M               {
860708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                   if(mAdapterService.getBluetoothPersistedSetting()) {
870708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                        Log.i(TAG, "OffState : Turning BT on after Airplane"+
880708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                            " Mode OFF state");
890708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                        sendIntent(BluetoothAdapter.STATE_TURNING_ON);
900708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                        ret = mAdapterService.enableNative();
910708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                        if (!ret) {
920708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                            Log.e(TAG, "Error while turning Bluetooth On");
930708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                            sendIntent(BluetoothAdapter.STATE_OFF);
940708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                        } else {
950708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                            sendMessageDelayed(ENABLE_TIMEOUT,
960708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                                ENABLE_TIMEOUT_DELAY);
970708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                            transitionTo(mPendingCommandState);
980708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                        }
990708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                   }
1000708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M                   break;
1010708fe3087b690439dd9745b2cf1a96f29f570b0Syed Ibrahim M               }
102ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_OFF:
103ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case AIRPLANE_MODE_ON:
104ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   //ignore
105ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
106ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               default:
107ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   Log.e(TAG, "Received unhandled state: " + msg.what);
108ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   return false;
109ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
110ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return true;
111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
113ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
114ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private class OnState extends State {
115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void enter() {
117ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            infoLog("Entering On State");
118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
121ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public boolean processMessage(Message msg) {
122ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch(msg.what) {
123ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_OFF:
124fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                   int persist = msg.arg1;
125fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                   if (persist == 1) {
126fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                           mAdapterService.persistBluetoothSetting(false);
127fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                   }
128fba70fe2abecf70b9f9f7ee09a21cbfc6cb73998Jaikumar Ganesh                   //Fall Through
129ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case AIRPLANE_MODE_ON:
130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   sendIntent(BluetoothAdapter.STATE_TURNING_OFF);
131d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy                   // Invoke onBluetoothDisable which shall trigger a
132d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy                   // setScanMode to SCAN_MODE_NONE
133d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy                   mAdapterProperties.onBluetoothDisable();
134ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   if (mAdapterProperties.getConnectionState() !=
135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                           BluetoothAdapter.STATE_DISCONNECTED) {
136ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       sendMessageDelayed(ALL_DEVICES_DISCONNECTED,
137ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                   DISCONNECT_TIMEOUT);
138ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       break;
139ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   }
140ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   //Fall Through
141ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case ALL_DEVICES_DISCONNECTED:
142ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   boolean ret = mAdapterService.disableNative();
143ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   if (!ret) {
144ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       Log.e(TAG, "Error while turning Bluetooth Off");
145ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       sendIntent(BluetoothAdapter.STATE_ON);
146ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   } else {
147ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                       transitionTo(mPendingCommandState);
148ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   }
149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
150ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_ON:
151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case AIRPLANE_MODE_OFF:
152ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   //ignore
153ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
154ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               default:
155ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   Log.e(TAG, "Received unhandled state: " + msg.what);
156ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   return false;
157ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
158ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return true;
159ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
160ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
161ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private class PendingCommandState extends State {
163ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
164ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void enter() {
165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            infoLog("Entering PendingCommandState State");
166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public boolean processMessage(Message msg) {
170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch (msg.what) {
171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case USER_TURN_ON:
172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case USER_TURN_OFF:
173ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case AIRPLANE_MODE_ON:
174ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case AIRPLANE_MODE_OFF:
175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    deferMessage(msg);
176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case ENABLED_READY:
178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    removeMessages(ENABLE_TIMEOUT);
17944abcd2791995793a5de09906b0ce6ed51bb6080Jaikumar Ganesh                    mAdapterProperties.onBluetoothReady();
180ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    sendIntent(BluetoothAdapter.STATE_ON);
181ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    transitionTo(mOnState);
182ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case DISABLED:
184ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    sendIntent(BluetoothAdapter.STATE_OFF);
185ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    transitionTo(mOffState);
186ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case ENABLE_TIMEOUT:
188ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    errorLog("Error enabling Bluetooth");
189ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    sendIntent(BluetoothAdapter.STATE_OFF);
190ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    transitionTo(mOffState);
191ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
192ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                default:
193ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    Log.e(TAG, "Received unhandled event:" + msg.what);
194ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    return false;
195ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
196ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return true;
197ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
198ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
199ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
200ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
201ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void sendIntent(int newState) {
202ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int oldState = mAdapterProperties.getState();
203ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
204ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, oldState);
205ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
206ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
207ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterProperties.setState(newState);
208ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
209ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mContext.sendBroadcast(intent, AdapterService.BLUETOOTH_PERM);
210ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        infoLog("Bluetooth State Change Intent: " + oldState + " -> " + newState);
211ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
212ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
213ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void stateChangeCallback(int status) {
214ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (status == AbstractionLayer.BT_STATE_OFF) {
215ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            sendMessage(DISABLED);
216ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else if (status == AbstractionLayer.BT_STATE_ON) {
217ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh            // We should have got the property change for adapter and remote devices.
218ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh            sendMessage(ENABLED_READY);
219ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else {
220ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            errorLog("Incorrect status in stateChangeCallback");
221ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
222ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
223ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
224ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void infoLog(String msg) {
225ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (DBG) Log.i(TAG, msg);
226ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
227ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
228ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void errorLog(String msg) {
229ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Log.e(TAG, msg);
230ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
231ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
232