AdapterState.java revision 57a3923845c46742ed4f03d49dbdbb6c774ccf90
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;
3131ba132491053bc86d419a7d51fc04af3299c076fredc    static final int STARTED=2;
3231ba132491053bc86d419a7d51fc04af3299c076fredc    static final int ENABLED_READY = 3;
33ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
3431ba132491053bc86d419a7d51fc04af3299c076fredc    static final int USER_TURN_OFF = 20;
3531ba132491053bc86d419a7d51fc04af3299c076fredc    static final int BEGIN_DISABLE = 21;
3631ba132491053bc86d419a7d51fc04af3299c076fredc    static final int ALL_DEVICES_DISCONNECTED = 22;
3774ae04c73312403e89db0f8e9bd9601d403b4783fredc
3831ba132491053bc86d419a7d51fc04af3299c076fredc    static final int DISABLED = 24;
3931ba132491053bc86d419a7d51fc04af3299c076fredc    static final int STOPPED=25;
40ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
4131ba132491053bc86d419a7d51fc04af3299c076fredc    static final int START_TIMEOUT = 100;
4231ba132491053bc86d419a7d51fc04af3299c076fredc    static final int ENABLE_TIMEOUT = 101;
4331ba132491053bc86d419a7d51fc04af3299c076fredc    static final int DISABLE_TIMEOUT = 103;
4431ba132491053bc86d419a7d51fc04af3299c076fredc    static final int STOP_TIMEOUT = 104;
4557a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie    static final int SET_SCAN_MODE_TIMEOUT = 105;
4631ba132491053bc86d419a7d51fc04af3299c076fredc
4731ba132491053bc86d419a7d51fc04af3299c076fredc    static final int USER_TURN_OFF_DELAY_MS=500;
4831ba132491053bc86d419a7d51fc04af3299c076fredc
4931ba132491053bc86d419a7d51fc04af3299c076fredc    //TODO: tune me
5031ba132491053bc86d419a7d51fc04af3299c076fredc    private static final int ENABLE_TIMEOUT_DELAY = 8000;
5131ba132491053bc86d419a7d51fc04af3299c076fredc    private static final int DISABLE_TIMEOUT_DELAY = 8000;
5231ba132491053bc86d419a7d51fc04af3299c076fredc    private static final int START_TIMEOUT_DELAY = 5000;
5331ba132491053bc86d419a7d51fc04af3299c076fredc    private static final int STOP_TIMEOUT_DELAY = 5000;
5431ba132491053bc86d419a7d51fc04af3299c076fredc    private static final int PROPERTY_OP_DELAY =2000;
556654f5c903de510a70f9e72cd5ad7837b615d93ffredc    private AdapterService mAdapterService;
566654f5c903de510a70f9e72cd5ad7837b615d93ffredc    private AdapterProperties mAdapterProperties;
57ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private PendingCommandState mPendingCommandState = new PendingCommandState();
58ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private OnState mOnState = new OnState();
59ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private OffState mOffState = new OffState();
60ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
6131ba132491053bc86d419a7d51fc04af3299c076fredc    public boolean isTurningOn() {
6231ba132491053bc86d419a7d51fc04af3299c076fredc        boolean isTurningOn=  mPendingCommandState.isTurningOn();
6374ae04c73312403e89db0f8e9bd9601d403b4783fredc        if (DBG) Log.d(TAG,"isTurningOn()=" + isTurningOn);
6431ba132491053bc86d419a7d51fc04af3299c076fredc        return isTurningOn;
65b5cc776c9353a203cdde97e62b25f05d9633d14cfredc    }
6631ba132491053bc86d419a7d51fc04af3299c076fredc
6731ba132491053bc86d419a7d51fc04af3299c076fredc    public boolean isTurningOff() {
6831ba132491053bc86d419a7d51fc04af3299c076fredc        boolean isTurningOff= mPendingCommandState.isTurningOff();
6974ae04c73312403e89db0f8e9bd9601d403b4783fredc        if (DBG) Log.d(TAG,"isTurningOff()=" + isTurningOff);
7031ba132491053bc86d419a7d51fc04af3299c076fredc        return isTurningOff;
7131ba132491053bc86d419a7d51fc04af3299c076fredc    }
7231ba132491053bc86d419a7d51fc04af3299c076fredc
7374ae04c73312403e89db0f8e9bd9601d403b4783fredc    public AdapterState(AdapterService service,AdapterProperties adapterProperties) {
74ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        super("BluetoothAdapterState:");
75ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        addState(mOnState);
76ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        addState(mOffState);
77ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        addState(mPendingCommandState);
78ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterService = service;
79ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterProperties = adapterProperties;
806654f5c903de510a70f9e72cd5ad7837b615d93ffredc        setInitialState(mOffState);
816654f5c903de510a70f9e72cd5ad7837b615d93ffredc    }
826654f5c903de510a70f9e72cd5ad7837b615d93ffredc
836654f5c903de510a70f9e72cd5ad7837b615d93ffredc    public void cleanup() {
843fafe61ef25c1899fdc817c52163aec16c31055cRavi Nagarajan        if(mAdapterProperties != null)
853fafe61ef25c1899fdc817c52163aec16c31055cRavi Nagarajan            mAdapterProperties = null;
863fafe61ef25c1899fdc817c52163aec16c31055cRavi Nagarajan        if(mAdapterService != null)
873fafe61ef25c1899fdc817c52163aec16c31055cRavi Nagarajan            mAdapterService = null;
88ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
89ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
90ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private class OffState extends State {
91ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
92ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void enter() {
9331ba132491053bc86d419a7d51fc04af3299c076fredc            infoLog("Entering OffState");
94ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
96ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
97ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public boolean processMessage(Message msg) {
984603dc081506452854023a1c6eacdfca468e0dc4Matthew Xie            /* TODO(BT) if (msg.what == SM_QUIT_CMD) {
99b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                Log.d(TAG, "Received quit request...");
100b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                return false;
1014603dc081506452854023a1c6eacdfca468e0dc4Matthew Xie                } */
102b5cc776c9353a203cdde97e62b25f05d9633d14cfredc
103ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch(msg.what) {
104ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_ON:
10557a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                   if (DBG) Log.d(TAG,"CURRENT_STATE=OFF, MESSAGE = USER_TURN_ON");
1064852c5686229f1014e9851f4e9a3a19547581b45fredc                   notifyAdapterStateChange(BluetoothAdapter.STATE_TURNING_ON);
10731ba132491053bc86d419a7d51fc04af3299c076fredc                   mPendingCommandState.setTurningOn(true);
10831ba132491053bc86d419a7d51fc04af3299c076fredc                   transitionTo(mPendingCommandState);
10931ba132491053bc86d419a7d51fc04af3299c076fredc                   sendMessageDelayed(START_TIMEOUT, START_TIMEOUT_DELAY);
11031ba132491053bc86d419a7d51fc04af3299c076fredc                   mAdapterService.processStart();
111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_OFF:
11357a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                   if (DBG) Log.d(TAG,"CURRENT_STATE=OFF, MESSAGE = USER_TURN_OFF");
11457a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                   //TODO: Handle case of service started and stopped without enable
115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               default:
11731ba132491053bc86d419a7d51fc04af3299c076fredc                   if (DBG) Log.d(TAG,"ERROR: UNEXPECTED MESSAGE: CURRENT_STATE=OFF, MESSAGE = " + msg.what );
118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   return false;
119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return true;
121ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
122ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
123ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
124ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private class OnState extends State {
125ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
126ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void enter() {
127ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            infoLog("Entering On State");
128ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
129ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
131ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public boolean processMessage(Message msg) {
132ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch(msg.what) {
133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_OFF:
13457a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                   if (DBG) Log.d(TAG,"CURRENT_STATE=ON, MESSAGE = USER_TURN_OFF");
1354852c5686229f1014e9851f4e9a3a19547581b45fredc                   notifyAdapterStateChange(BluetoothAdapter.STATE_TURNING_OFF);
13631ba132491053bc86d419a7d51fc04af3299c076fredc                   mPendingCommandState.setTurningOff(true);
13731ba132491053bc86d419a7d51fc04af3299c076fredc                   transitionTo(mPendingCommandState);
13831ba132491053bc86d419a7d51fc04af3299c076fredc
139d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy                   // Invoke onBluetoothDisable which shall trigger a
140d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy                   // setScanMode to SCAN_MODE_NONE
14157a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                   Message m = obtainMessage(SET_SCAN_MODE_TIMEOUT);
14231ba132491053bc86d419a7d51fc04af3299c076fredc                   sendMessageDelayed(m, PROPERTY_OP_DELAY);
143d570893c5ec3bc9fd1860aa0355c550d3a51f8ddKausik Sinnaswamy                   mAdapterProperties.onBluetoothDisable();
144ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
14531ba132491053bc86d419a7d51fc04af3299c076fredc
146ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               case USER_TURN_ON:
14757a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                   if (DBG) Log.d(TAG,"CURRENT_STATE=ON, MESSAGE = USER_TURN_ON");
14831ba132491053bc86d419a7d51fc04af3299c076fredc                   Log.i(TAG,"Bluetooth already ON, ignoring USER_TURN_ON");
149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   break;
150ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh               default:
15131ba132491053bc86d419a7d51fc04af3299c076fredc                   if (DBG) Log.d(TAG,"ERROR: UNEXPECTED MESSAGE: CURRENT_STATE=ON, MESSAGE = " + msg.what );
152ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                   return false;
153ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
154ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return true;
155ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
156ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
157ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
158ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private class PendingCommandState extends State {
15931ba132491053bc86d419a7d51fc04af3299c076fredc        private boolean mIsTurningOn;
16031ba132491053bc86d419a7d51fc04af3299c076fredc        private boolean mIsTurningOff;
16131ba132491053bc86d419a7d51fc04af3299c076fredc
162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public void enter() {
16331ba132491053bc86d419a7d51fc04af3299c076fredc            infoLog("Entering PendingCommandState State: isTurningOn()=" + isTurningOn() + ", isTurningOff()=" + isTurningOff());
16431ba132491053bc86d419a7d51fc04af3299c076fredc        }
16531ba132491053bc86d419a7d51fc04af3299c076fredc
16631ba132491053bc86d419a7d51fc04af3299c076fredc        public void setTurningOn(boolean isTurningOn) {
16731ba132491053bc86d419a7d51fc04af3299c076fredc            mIsTurningOn = isTurningOn;
16831ba132491053bc86d419a7d51fc04af3299c076fredc        }
16931ba132491053bc86d419a7d51fc04af3299c076fredc
17031ba132491053bc86d419a7d51fc04af3299c076fredc        public boolean isTurningOn() {
17131ba132491053bc86d419a7d51fc04af3299c076fredc            return mIsTurningOn;
17231ba132491053bc86d419a7d51fc04af3299c076fredc        }
17331ba132491053bc86d419a7d51fc04af3299c076fredc
17431ba132491053bc86d419a7d51fc04af3299c076fredc        public void setTurningOff(boolean isTurningOff) {
17531ba132491053bc86d419a7d51fc04af3299c076fredc            mIsTurningOff = isTurningOff;
17631ba132491053bc86d419a7d51fc04af3299c076fredc        }
17731ba132491053bc86d419a7d51fc04af3299c076fredc
17831ba132491053bc86d419a7d51fc04af3299c076fredc        public boolean isTurningOff() {
17931ba132491053bc86d419a7d51fc04af3299c076fredc            return mIsTurningOff;
18031ba132491053bc86d419a7d51fc04af3299c076fredc        }
18131ba132491053bc86d419a7d51fc04af3299c076fredc
182ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        @Override
183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        public boolean processMessage(Message msg) {
18431ba132491053bc86d419a7d51fc04af3299c076fredc            boolean isTurningOn= isTurningOn();
18531ba132491053bc86d419a7d51fc04af3299c076fredc            boolean isTurningOff = isTurningOff();
186ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            switch (msg.what) {
187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case USER_TURN_ON:
18857a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = USER_TURN_ON"
18931ba132491053bc86d419a7d51fc04af3299c076fredc                            + ", isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
19031ba132491053bc86d419a7d51fc04af3299c076fredc                    if (isTurningOn) {
19131ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.i(TAG,"CURRENT_STATE=PENDING: Alreadying turning on bluetooth... Ignoring USER_TURN_ON...");
19231ba132491053bc86d419a7d51fc04af3299c076fredc                    } else {
19331ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.i(TAG,"CURRENT_STATE=PENDING: Deferring request USER_TURN_ON");
19431ba132491053bc86d419a7d51fc04af3299c076fredc                        deferMessage(msg);
19531ba132491053bc86d419a7d51fc04af3299c076fredc                    }
19631ba132491053bc86d419a7d51fc04af3299c076fredc                    break;
197ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case USER_TURN_OFF:
19857a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = USER_TURN_ON"
19931ba132491053bc86d419a7d51fc04af3299c076fredc                            + ", isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
20031ba132491053bc86d419a7d51fc04af3299c076fredc                    if (isTurningOff) {
20131ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.i(TAG,"CURRENT_STATE=PENDING: Alreadying turning off bluetooth... Ignoring USER_TURN_OFF...");
20231ba132491053bc86d419a7d51fc04af3299c076fredc                    } else {
20331ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.i(TAG,"CURRENT_STATE=PENDING: Deferring request USER_TURN_OFF");
20431ba132491053bc86d419a7d51fc04af3299c076fredc                        deferMessage(msg);
20531ba132491053bc86d419a7d51fc04af3299c076fredc                    }
206ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
20731ba132491053bc86d419a7d51fc04af3299c076fredc                case STARTED:   {
20831ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = STARTED, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
20931ba132491053bc86d419a7d51fc04af3299c076fredc                    //Remove start timeout
21031ba132491053bc86d419a7d51fc04af3299c076fredc                    removeMessages(START_TIMEOUT);
21131ba132491053bc86d419a7d51fc04af3299c076fredc
21231ba132491053bc86d419a7d51fc04af3299c076fredc                    //Enable
21331ba132491053bc86d419a7d51fc04af3299c076fredc                    boolean ret = mAdapterService.enableNative();
21431ba132491053bc86d419a7d51fc04af3299c076fredc                    if (!ret) {
21531ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.e(TAG, "Error while turning Bluetooth On");
2164852c5686229f1014e9851f4e9a3a19547581b45fredc                        notifyAdapterStateChange(BluetoothAdapter.STATE_OFF);
21731ba132491053bc86d419a7d51fc04af3299c076fredc                        transitionTo(mOffState);
21831ba132491053bc86d419a7d51fc04af3299c076fredc                    } else {
21931ba132491053bc86d419a7d51fc04af3299c076fredc                        sendMessageDelayed(ENABLE_TIMEOUT, ENABLE_TIMEOUT_DELAY);
22031ba132491053bc86d419a7d51fc04af3299c076fredc                    }
22131ba132491053bc86d419a7d51fc04af3299c076fredc                }
22231ba132491053bc86d419a7d51fc04af3299c076fredc                    break;
22331ba132491053bc86d419a7d51fc04af3299c076fredc
224ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case ENABLED_READY:
22531ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = ENABLE_READY, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
226ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    removeMessages(ENABLE_TIMEOUT);
227b5cc776c9353a203cdde97e62b25f05d9633d14cfredc                    mAdapterProperties.onBluetoothReady();
22831ba132491053bc86d419a7d51fc04af3299c076fredc                    mPendingCommandState.setTurningOn(false);
22931ba132491053bc86d419a7d51fc04af3299c076fredc                    transitionTo(mOnState);
2304852c5686229f1014e9851f4e9a3a19547581b45fredc                    notifyAdapterStateChange(BluetoothAdapter.STATE_ON);
23131ba132491053bc86d419a7d51fc04af3299c076fredc                    break;
23231ba132491053bc86d419a7d51fc04af3299c076fredc
23357a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                case SET_SCAN_MODE_TIMEOUT:
23457a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                     Log.w(TAG,"Timeout will setting scan mode..Continuing with disable...");
23557a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                     //Fall through
23631ba132491053bc86d419a7d51fc04af3299c076fredc                case BEGIN_DISABLE: {
23731ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = BEGIN_DISABLE" + isTurningOn + ", isTurningOff=" + isTurningOff);
23857a3923845c46742ed4f03d49dbdbb6c774ccf90Matthew Xie                    removeMessages(SET_SCAN_MODE_TIMEOUT);
23931ba132491053bc86d419a7d51fc04af3299c076fredc                    sendMessageDelayed(DISABLE_TIMEOUT, DISABLE_TIMEOUT_DELAY);
24031ba132491053bc86d419a7d51fc04af3299c076fredc                    boolean ret = mAdapterService.disableNative();
24131ba132491053bc86d419a7d51fc04af3299c076fredc                    if (!ret) {
24231ba132491053bc86d419a7d51fc04af3299c076fredc                        removeMessages(DISABLE_TIMEOUT);
24331ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.e(TAG, "Error while turning Bluetooth Off");
24431ba132491053bc86d419a7d51fc04af3299c076fredc                        //FIXME: what about post enable services
24531ba132491053bc86d419a7d51fc04af3299c076fredc                        mPendingCommandState.setTurningOff(false);
2464852c5686229f1014e9851f4e9a3a19547581b45fredc                        notifyAdapterStateChange(BluetoothAdapter.STATE_ON);
24731ba132491053bc86d419a7d51fc04af3299c076fredc                    }
24831ba132491053bc86d419a7d51fc04af3299c076fredc                }
249ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
250ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case DISABLED:
25131ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = DISABLED, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
25231ba132491053bc86d419a7d51fc04af3299c076fredc                    removeMessages(DISABLE_TIMEOUT);
25331ba132491053bc86d419a7d51fc04af3299c076fredc                    sendMessageDelayed(STOP_TIMEOUT, STOP_TIMEOUT_DELAY);
25431ba132491053bc86d419a7d51fc04af3299c076fredc                    if (mAdapterService.stopProfileServices()) {
25531ba132491053bc86d419a7d51fc04af3299c076fredc                        Log.d(TAG,"Stopping profile services that were post enabled");
25631ba132491053bc86d419a7d51fc04af3299c076fredc                        break;
25731ba132491053bc86d419a7d51fc04af3299c076fredc                    }
25874ae04c73312403e89db0f8e9bd9601d403b4783fredc                    //Fall through if no services or services already stopped
25931ba132491053bc86d419a7d51fc04af3299c076fredc                case STOPPED:
26031ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = STOPPED, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
26131ba132491053bc86d419a7d51fc04af3299c076fredc                    removeMessages(STOP_TIMEOUT);
26231ba132491053bc86d419a7d51fc04af3299c076fredc                    setTurningOff(false);
26331ba132491053bc86d419a7d51fc04af3299c076fredc                    transitionTo(mOffState);
2644852c5686229f1014e9851f4e9a3a19547581b45fredc                    notifyAdapterStateChange(BluetoothAdapter.STATE_OFF);
26531ba132491053bc86d419a7d51fc04af3299c076fredc                    break;
26631ba132491053bc86d419a7d51fc04af3299c076fredc                case START_TIMEOUT:
26731ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = START_TIMEOUT, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
26831ba132491053bc86d419a7d51fc04af3299c076fredc                    errorLog("Error enabling Bluetooth");
26931ba132491053bc86d419a7d51fc04af3299c076fredc                    mPendingCommandState.setTurningOn(false);
270ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    transitionTo(mOffState);
2714852c5686229f1014e9851f4e9a3a19547581b45fredc                    notifyAdapterStateChange(BluetoothAdapter.STATE_OFF);
272ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
273ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                case ENABLE_TIMEOUT:
27431ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = ENABLE_TIMEOUT, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
275ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    errorLog("Error enabling Bluetooth");
27631ba132491053bc86d419a7d51fc04af3299c076fredc                    mPendingCommandState.setTurningOn(false);
277ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    transitionTo(mOffState);
2784852c5686229f1014e9851f4e9a3a19547581b45fredc                    notifyAdapterStateChange(BluetoothAdapter.STATE_OFF);
27931ba132491053bc86d419a7d51fc04af3299c076fredc                    break;
28031ba132491053bc86d419a7d51fc04af3299c076fredc                case STOP_TIMEOUT:
28131ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = STOP_TIMEOUT, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
28231ba132491053bc86d419a7d51fc04af3299c076fredc                    errorLog("Error stopping Bluetooth profiles");
28331ba132491053bc86d419a7d51fc04af3299c076fredc                    mPendingCommandState.setTurningOff(false);
28431ba132491053bc86d419a7d51fc04af3299c076fredc                    transitionTo(mOffState);
28531ba132491053bc86d419a7d51fc04af3299c076fredc                    break;
28631ba132491053bc86d419a7d51fc04af3299c076fredc                case DISABLE_TIMEOUT:
28731ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = DISABLE_TIMEOUT, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
28831ba132491053bc86d419a7d51fc04af3299c076fredc                    errorLog("Error disabling Bluetooth");
28931ba132491053bc86d419a7d51fc04af3299c076fredc                    mPendingCommandState.setTurningOff(false);
29031ba132491053bc86d419a7d51fc04af3299c076fredc                    transitionTo(mOnState);
291ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    break;
292ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                default:
29331ba132491053bc86d419a7d51fc04af3299c076fredc                    if (DBG) Log.d(TAG,"ERROR: UNEXPECTED MESSAGE: CURRENT_STATE=PENDING, MESSAGE = " + msg.what );
294ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                    return false;
295ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
296ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return true;
297ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
298ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
299ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
300ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
3014852c5686229f1014e9851f4e9a3a19547581b45fredc    private void notifyAdapterStateChange(int newState) {
302ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int oldState = mAdapterProperties.getState();
303ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        mAdapterProperties.setState(newState);
3044852c5686229f1014e9851f4e9a3a19547581b45fredc        infoLog("Bluetooth adapter state changed: " + oldState + "-> " + newState);
3054852c5686229f1014e9851f4e9a3a19547581b45fredc        mAdapterService.updateAdapterState(oldState, newState);
306ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
307ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
308ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    void stateChangeCallback(int status) {
309ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (status == AbstractionLayer.BT_STATE_OFF) {
310ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            sendMessage(DISABLED);
311ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else if (status == AbstractionLayer.BT_STATE_ON) {
312ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh            // We should have got the property change for adapter and remote devices.
313ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh            sendMessage(ENABLED_READY);
314ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else {
315ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            errorLog("Incorrect status in stateChangeCallback");
316ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
317ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
318ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
319ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void infoLog(String msg) {
320ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (DBG) Log.i(TAG, msg);
321ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
322ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
323ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    private void errorLog(String msg) {
324ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        Log.e(TAG, msg);
325ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
326ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
327