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