diff options
author | Pavlin Radoslavov <pavlin@google.com> | 2017-05-31 17:26:45 -0700 |
---|---|---|
committer | Pavlin Radoslavov <pavlin@google.com> | 2017-06-01 09:04:28 -0700 |
commit | 469e9bc6e1aa0cd5dacf51659e32bda38ddb7ab4 (patch) | |
tree | c0559a2beed2d3d8dfa2150e51e0cfdb5e7d064b | |
parent | b4650c79c67ba13773724ef4af9a82c1bb7c808c (diff) | |
download | Bluetooth-469e9bc6e1aa0cd5dacf51659e32bda38ddb7ab4.tar.gz |
Improve internal state synchronization of the A2dpStateMachine
* Don't block entering Disconnected state
If the mCurrentDevice or mTargetDevice or mIncomingDevice
is not null, print an error message and reset the state
* Add consistency checks when entering each state: Disconnected,
Pending, Connected
* Add a missing "synchronized" statement
Bug: 62164051
Test: Manual
Change-Id: I5856a88e58b42aa55d9075aa507bfa706ea52512
(cherry picked from commit 459978de76c5d152208538f61180e4a790c6e8d9)
-rwxr-xr-x | src/com/android/bluetooth/a2dp/A2dpStateMachine.java | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/com/android/bluetooth/a2dp/A2dpStateMachine.java b/src/com/android/bluetooth/a2dp/A2dpStateMachine.java index 2a8b7c0de..888cbae26 100755 --- a/src/com/android/bluetooth/a2dp/A2dpStateMachine.java +++ b/src/com/android/bluetooth/a2dp/A2dpStateMachine.java @@ -267,14 +267,22 @@ final class A2dpStateMachine extends StateMachine { @Override public void enter() { log("Enter Disconnected: " + getCurrentMessage().what); + if (mCurrentDevice != null || mTargetDevice != null || mIncomingDevice != null) { + loge("ERROR: enter() inconsistent state in Disconnected: current = " + + mCurrentDevice + " target = " + mTargetDevice + " incoming = " + + mIncomingDevice); + } } @Override public boolean processMessage(Message message) { log("Disconnected process message: " + message.what); if (mCurrentDevice != null || mTargetDevice != null || mIncomingDevice != null) { - loge("ERROR: current, target, or mIncomingDevice not null in Disconnected"); - return NOT_HANDLED; + loge("ERROR: not null state in Disconnected: current = " + mCurrentDevice + + " target = " + mTargetDevice + " incoming = " + mIncomingDevice); + mCurrentDevice = null; + mTargetDevice = null; + mIncomingDevice = null; } boolean retValue = HANDLED; @@ -374,6 +382,10 @@ final class A2dpStateMachine extends StateMachine { @Override public void enter() { log("Enter Pending: " + getCurrentMessage().what); + if (mTargetDevice != null && mIncomingDevice != null) { + loge("ERROR: enter() inconsistent state in Pending: current = " + mCurrentDevice + + " target = " + mTargetDevice + " incoming = " + mIncomingDevice); + } } @Override @@ -580,6 +592,11 @@ final class A2dpStateMachine extends StateMachine { removeDeferredMessages(CONNECT); log("Enter Connected: " + getCurrentMessage().what); + if (mTargetDevice != null || mIncomingDevice != null) { + loge("ERROR: enter() inconsistent state in Connected: current = " + mCurrentDevice + + " target = " + mTargetDevice + " incoming = " + mIncomingDevice); + } + // Upon connected, the audio starts out as stopped broadcastAudioState(mCurrentDevice, BluetoothA2dp.STATE_NOT_PLAYING, BluetoothA2dp.STATE_PLAYING); @@ -629,7 +646,9 @@ final class A2dpStateMachine extends StateMachine { BluetoothProfile.STATE_DISCONNECTED); break; } - transitionTo(mPending); + synchronized (A2dpStateMachine.this) { + transitionTo(mPending); + } } break; case STACK_EVENT: |