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

Commit df382cad authored by RoboErik's avatar RoboErik
Browse files

Be more paranoid about threading in MediaSessionRecord

This makes copies of objects with bundles before posting to another
thread and is more aggressive about locking before making assignments
of mutable objects.

bug:17692568
Change-Id: I28e8229718b862c485e870fd2ca06a3a18a7c454
parent 485f2095
Loading
Loading
Loading
Loading
+29 −9
Original line number Diff line number Diff line
@@ -615,7 +615,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
    }

    private PlaybackState getStateWithUpdatedPosition() {
        PlaybackState state = mPlaybackState;
        PlaybackState state;
        synchronized (mLock) {
            state = mPlaybackState;
        }
        long duration = -1;
        if (mMetadata != null && mMetadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
            duration = mMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
@@ -674,7 +677,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {

        @Override
        public void sendEvent(String event, Bundle data) {
            mHandler.post(MessageHandler.MSG_SEND_EVENT, event, data);
            mHandler.post(MessageHandler.MSG_SEND_EVENT, event,
                    data == null ? null : new Bundle(data));
        }

        @Override
@@ -712,7 +716,11 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {

        @Override
        public void setMetadata(MediaMetadata metadata) {
            mMetadata = metadata;
            // Make a copy of the metadata as the underlying bundle may be
            // modified on this thread.
            synchronized (mLock) {
                mMetadata = metadata == null ? null : new MediaMetadata.Builder(metadata).build();
            }
            mHandler.post(MessageHandler.MSG_UPDATE_METADATA);
        }

@@ -723,14 +731,18 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
            if (MediaSession.isActiveState(oldState) && newState == PlaybackState.STATE_PAUSED) {
                mLastActiveTime = SystemClock.elapsedRealtime();
            }
            synchronized (mLock) {
                mPlaybackState = state;
            }
            mService.onSessionPlaystateChange(MediaSessionRecord.this, oldState, newState);
            mHandler.post(MessageHandler.MSG_UPDATE_PLAYBACK_STATE);
        }

        @Override
        public void setQueue(ParceledListSlice queue) {
            synchronized (mLock) {
                mQueue = queue;
            }
            mHandler.post(MessageHandler.MSG_UPDATE_QUEUE);
        }

@@ -742,7 +754,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {

        @Override
        public void setExtras(Bundle extras) {
            mExtras = extras;
            synchronized (mLock) {
                mExtras = extras == null ? null : new Bundle(extras);
            }
            mHandler.post(MessageHandler.MSG_UPDATE_EXTRAS);
        }

@@ -1118,8 +1132,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {

        @Override
        public MediaMetadata getMetadata() {
            synchronized (mLock) {
                return mMetadata;
            }
        }

        @Override
        public PlaybackState getPlaybackState() {
@@ -1128,8 +1144,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {

        @Override
        public ParceledListSlice getQueue() {
            synchronized (mLock) {
                return mQueue;
            }
        }

        @Override
        public CharSequence getQueueTitle() {
@@ -1138,8 +1156,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {

        @Override
        public Bundle getExtras() {
            synchronized (mLock) {
                return mExtras;
            }
        }

        @Override
        public int getRatingType() {