Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0c8d81e authored by Pavlin Radoslavov's avatar Pavlin Radoslavov
Browse files

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 fa848ca0)
parent c8b38456
Loading
Loading
Loading
Loading
+22 −3
Original line number Original line Diff line number Diff line
@@ -267,14 +267,22 @@ final class A2dpStateMachine extends StateMachine {
        @Override
        @Override
        public void enter() {
        public void enter() {
            log("Enter Disconnected: " + getCurrentMessage().what);
            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
        @Override
        public boolean processMessage(Message message) {
        public boolean processMessage(Message message) {
            log("Disconnected process message: " + message.what);
            log("Disconnected process message: " + message.what);
            if (mCurrentDevice != null || mTargetDevice != null  || mIncomingDevice != null) {
            if (mCurrentDevice != null || mTargetDevice != null  || mIncomingDevice != null) {
                loge("ERROR: current, target, or mIncomingDevice not null in Disconnected");
                loge("ERROR: not null state in Disconnected: current = " + mCurrentDevice
                return NOT_HANDLED;
                        + " target = " + mTargetDevice + " incoming = " + mIncomingDevice);
                mCurrentDevice = null;
                mTargetDevice = null;
                mIncomingDevice = null;
            }
            }


            boolean retValue = HANDLED;
            boolean retValue = HANDLED;
@@ -374,6 +382,10 @@ final class A2dpStateMachine extends StateMachine {
        @Override
        @Override
        public void enter() {
        public void enter() {
            log("Enter Pending: " + getCurrentMessage().what);
            log("Enter Pending: " + getCurrentMessage().what);
            if (mTargetDevice != null && mIncomingDevice != null) {
                loge("ERROR: enter() inconsistent state in Pending: current = " + mCurrentDevice
                        + " target = " + mTargetDevice + " incoming = " + mIncomingDevice);
            }
        }
        }


        @Override
        @Override
@@ -580,6 +592,11 @@ final class A2dpStateMachine extends StateMachine {
            removeDeferredMessages(CONNECT);
            removeDeferredMessages(CONNECT);


            log("Enter Connected: " + getCurrentMessage().what);
            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
            // Upon connected, the audio starts out as stopped
            broadcastAudioState(mCurrentDevice, BluetoothA2dp.STATE_NOT_PLAYING,
            broadcastAudioState(mCurrentDevice, BluetoothA2dp.STATE_NOT_PLAYING,
                                BluetoothA2dp.STATE_PLAYING);
                                BluetoothA2dp.STATE_PLAYING);
@@ -629,8 +646,10 @@ final class A2dpStateMachine extends StateMachine {
                                       BluetoothProfile.STATE_DISCONNECTED);
                                       BluetoothProfile.STATE_DISCONNECTED);
                        break;
                        break;
                    }
                    }
                    synchronized (A2dpStateMachine.this) {
                        transitionTo(mPending);
                        transitionTo(mPending);
                    }
                    }
                }
                    break;
                    break;
                case STACK_EVENT:
                case STACK_EVENT:
                    StackEvent event = (StackEvent) message.obj;
                    StackEvent event = (StackEvent) message.obj;