diff options
author | Matthew Xie <mattx@google.com> | 2012-05-07 14:38:42 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-07 14:38:42 -0700 |
commit | ac8a61b6d47e737794b2aaeaf629d87e493413b8 (patch) | |
tree | f0ba9d15788666ae01568d574429554cb4c09fe6 /core | |
parent | 06e8d6647db54aa76dda92a5a785737e66d262de (diff) | |
parent | b12d6bc3a561e7a8ce136126474c75bd71ae2f81 (diff) | |
download | frameworks_base-ac8a61b6d47e737794b2aaeaf629d87e493413b8.zip frameworks_base-ac8a61b6d47e737794b2aaeaf629d87e493413b8.tar.gz frameworks_base-ac8a61b6d47e737794b2aaeaf629d87e493413b8.tar.bz2 |
Merge "When turning off, broadcast STATE_OFF in the last HotOff state" into jb-dev
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/server/BluetoothAdapterStateMachine.java | 58 | ||||
-rwxr-xr-x | core/java/android/server/BluetoothService.java | 12 |
2 files changed, 53 insertions, 17 deletions
diff --git a/core/java/android/server/BluetoothAdapterStateMachine.java b/core/java/android/server/BluetoothAdapterStateMachine.java index f543de9..2a994b2 100644 --- a/core/java/android/server/BluetoothAdapterStateMachine.java +++ b/core/java/android/server/BluetoothAdapterStateMachine.java @@ -39,7 +39,7 @@ import java.io.PrintWriter; * (BluetootOn)<----------------------<- * | ^ -------------------->- | * | | | | - * TURN_OFF | | SCAN_MODE_CHANGED m1 | | USER_TURN_ON + * USER_TURN_OFF | | SCAN_MODE_CHANGED m1 | | USER_TURN_ON * AIRPLANE_MODE_ON | | | | * V | | | * (Switching) (PerProcessState) @@ -121,8 +121,10 @@ final class BluetoothAdapterStateMachine extends StateMachine { private static final int DEVICES_DISCONNECT_TIMEOUT = 103; // Prepare Bluetooth timeout happens private static final int PREPARE_BLUETOOTH_TIMEOUT = 104; - // Bluetooth Powerdown timeout happens - private static final int POWER_DOWN_TIMEOUT = 105; + // Bluetooth turn off wait timeout happens + private static final int TURN_OFF_TIMEOUT = 105; + // Bluetooth device power off wait timeout happens + private static final int POWER_DOWN_TIMEOUT = 106; private Context mContext; private BluetoothService mBluetoothService; @@ -137,13 +139,17 @@ final class BluetoothAdapterStateMachine extends StateMachine { // this is the BluetoothAdapter state that reported externally private int mPublicState; + // When turning off, broadcast STATE_OFF in the last HotOff state + // This is because we do HotOff -> PowerOff -> HotOff for USER_TURN_OFF + private boolean mDelayBroadcastStateOff; // timeout value waiting for all the devices to be disconnected private static final int DEVICES_DISCONNECT_TIMEOUT_TIME = 3000; private static final int PREPARE_BLUETOOTH_TIMEOUT_TIME = 10000; - private static final int POWER_DOWN_TIMEOUT_TIME = 5000; + private static final int TURN_OFF_TIMEOUT_TIME = 5000; + private static final int POWER_DOWN_TIMEOUT_TIME = 20; BluetoothAdapterStateMachine(Context context, BluetoothService bluetoothService, BluetoothAdapter bluetoothAdapter) { @@ -168,6 +174,7 @@ final class BluetoothAdapterStateMachine extends StateMachine { setInitialState(mPowerOff); mPublicState = BluetoothAdapter.STATE_OFF; + mDelayBroadcastStateOff = false; } /** @@ -315,6 +322,10 @@ final class BluetoothAdapterStateMachine extends StateMachine { case SERVICE_RECORD_LOADED: removeMessages(PREPARE_BLUETOOTH_TIMEOUT); transitionTo(mHotOff); + if (mDelayBroadcastStateOff) { + broadcastState(BluetoothAdapter.STATE_OFF); + mDelayBroadcastStateOff = false; + } break; case PREPARE_BLUETOOTH_TIMEOUT: Log.e(TAG, "Bluetooth adapter SDP failed to load"); @@ -373,8 +384,17 @@ final class BluetoothAdapterStateMachine extends StateMachine { case AIRPLANE_MODE_ON: case TURN_COLD: shutoffBluetooth(); + // we cannot go to power off state yet, we need wait for the Bluetooth + // device power off. Unfortunately the stack does not give a event back + // so we wait a little bit here + sendMessageDelayed(POWER_DOWN_TIMEOUT, + POWER_DOWN_TIMEOUT_TIME); + break; + case POWER_DOWN_TIMEOUT: transitionTo(mPowerOff); - broadcastState(BluetoothAdapter.STATE_OFF); + if (!mDelayBroadcastStateOff) { + broadcastState(BluetoothAdapter.STATE_OFF); + } break; case AIRPLANE_MODE_OFF: if (getBluetoothPersistedSetting()) { @@ -402,6 +422,9 @@ final class BluetoothAdapterStateMachine extends StateMachine { recoverStateMachine(TURN_HOT, null); } break; + case TURN_HOT: + deferMessage(message); + break; default: return NOT_HANDLED; } @@ -436,15 +459,17 @@ final class BluetoothAdapterStateMachine extends StateMachine { } break; case POWER_STATE_CHANGED: - removeMessages(POWER_DOWN_TIMEOUT); + removeMessages(TURN_OFF_TIMEOUT); if (!((Boolean) message.obj)) { if (mPublicState == BluetoothAdapter.STATE_TURNING_OFF) { transitionTo(mHotOff); - finishSwitchingOff(); + mBluetoothService.finishDisable(); + mBluetoothService.cleanupAfterFinishDisable(); deferMessage(obtainMessage(TURN_COLD)); if (mContext.getResources().getBoolean (com.android.internal.R.bool.config_bluetooth_adapter_quick_switch)) { deferMessage(obtainMessage(TURN_HOT)); + mDelayBroadcastStateOff = true; } } } else { @@ -461,7 +486,7 @@ final class BluetoothAdapterStateMachine extends StateMachine { case ALL_DEVICES_DISCONNECTED: removeMessages(DEVICES_DISCONNECT_TIMEOUT); mBluetoothService.switchConnectable(false); - sendMessageDelayed(POWER_DOWN_TIMEOUT, POWER_DOWN_TIMEOUT_TIME); + sendMessageDelayed(TURN_OFF_TIMEOUT, TURN_OFF_TIMEOUT_TIME); break; case DEVICES_DISCONNECT_TIMEOUT: sendMessage(ALL_DEVICES_DISCONNECTED); @@ -473,7 +498,7 @@ final class BluetoothAdapterStateMachine extends StateMachine { deferMessage(obtainMessage(TURN_HOT)); } break; - case POWER_DOWN_TIMEOUT: + case TURN_OFF_TIMEOUT: transitionTo(mHotOff); finishSwitchingOff(); // reset the hardware for error recovery @@ -536,7 +561,7 @@ final class BluetoothAdapterStateMachine extends StateMachine { DEVICES_DISCONNECT_TIMEOUT_TIME); } else { mBluetoothService.switchConnectable(false); - sendMessageDelayed(POWER_DOWN_TIMEOUT, POWER_DOWN_TIMEOUT_TIME); + sendMessageDelayed(TURN_OFF_TIMEOUT, TURN_OFF_TIMEOUT_TIME); } // we turn all the way to PowerOff with AIRPLANE_MODE_ON @@ -610,13 +635,12 @@ final class BluetoothAdapterStateMachine extends StateMachine { } break; case POWER_STATE_CHANGED: - removeMessages(POWER_DOWN_TIMEOUT); + removeMessages(TURN_OFF_TIMEOUT); if (!((Boolean) message.obj)) { transitionTo(mHotOff); - deferMessage(obtainMessage(TURN_COLD)); - if (mContext.getResources().getBoolean + if (!mContext.getResources().getBoolean (com.android.internal.R.bool.config_bluetooth_adapter_quick_switch)) { - deferMessage(obtainMessage(TURN_HOT)); + deferMessage(obtainMessage(TURN_COLD)); } } else { if (!isTurningOn) { @@ -629,7 +653,7 @@ final class BluetoothAdapterStateMachine extends StateMachine { } } break; - case POWER_DOWN_TIMEOUT: + case TURN_OFF_TIMEOUT: transitionTo(mHotOff); Log.e(TAG, "Power-down timed out, resetting..."); deferMessage(obtainMessage(TURN_COLD)); @@ -676,12 +700,12 @@ final class BluetoothAdapterStateMachine extends StateMachine { perProcessCallback(false, (IBluetoothStateChangeCallback)message.obj); if (mBluetoothService.isApplicationStateChangeTrackerEmpty()) { mBluetoothService.switchConnectable(false); - sendMessageDelayed(POWER_DOWN_TIMEOUT, POWER_DOWN_TIMEOUT_TIME); + sendMessageDelayed(TURN_OFF_TIMEOUT, TURN_OFF_TIMEOUT_TIME); } break; case AIRPLANE_MODE_ON: mBluetoothService.switchConnectable(false); - sendMessageDelayed(POWER_DOWN_TIMEOUT, POWER_DOWN_TIMEOUT_TIME); + sendMessageDelayed(TURN_OFF_TIMEOUT, TURN_OFF_TIMEOUT_TIME); allProcessesCallback(false); // we turn all the way to PowerOff with AIRPLANE_MODE_ON deferMessage(obtainMessage(AIRPLANE_MODE_ON)); diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java index a420734..3cf207f 100755 --- a/core/java/android/server/BluetoothService.java +++ b/core/java/android/server/BluetoothService.java @@ -526,6 +526,12 @@ public class BluetoothService extends IBluetooth.Stub { return false; } switchConnectable(false); + + // Bluetooth stack needs a small delay here before adding + // SDP records, otherwise dbus stalls for over 30 seconds 1 out of 50 runs + try { + Thread.sleep(20); + } catch (InterruptedException e) {} updateSdpRecords(); return true; } @@ -593,6 +599,12 @@ public class BluetoothService extends IBluetooth.Stub { // Add SDP records for profiles maintained by Android userspace addReservedSdpRecords(uuids); + // Bluetooth stack need some a small delay here before adding more + // SDP records, otherwise dbus stalls for over 30 seconds 1 out of 50 runs + try { + Thread.sleep(20); + } catch (InterruptedException e) {} + if (R.getBoolean(com.android.internal.R.bool.config_bluetooth_default_profiles)) { // Enable profiles maintained by Bluez userspace. setBluetoothTetheringNative(true, BluetoothPanProfileHandler.NAP_ROLE, |