summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author RoboErik <epastern@google.com> 2014-09-29 20:48:10 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2014-09-29 20:48:11 +0000
commit9eef5bf8d1a69879ada3176c839676dc82b14daf (patch)
tree6e1db8b47ce4fcc404afbb11e30b7ab4f918baf4
parent052c4c4b7a18c6c5e7bf688a647ed142167deddb (diff)
parentdf382cada180033e5bbde82998b73ef19e541ed2 (diff)
Merge "Be more paranoid about threading in MediaSessionRecord" into lmp-dev
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java38
1 files changed, 29 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 509792704edd..d9730aa63424 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -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();
}
- mPlaybackState = state;
+ synchronized (mLock) {
+ mPlaybackState = state;
+ }
mService.onSessionPlaystateChange(MediaSessionRecord.this, oldState, newState);
mHandler.post(MessageHandler.MSG_UPDATE_PLAYBACK_STATE);
}
@Override
public void setQueue(ParceledListSlice queue) {
- mQueue = 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,7 +1132,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public MediaMetadata getMetadata() {
- return mMetadata;
+ synchronized (mLock) {
+ return mMetadata;
+ }
}
@Override
@@ -1128,7 +1144,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public ParceledListSlice getQueue() {
- return mQueue;
+ synchronized (mLock) {
+ return mQueue;
+ }
}
@Override
@@ -1138,7 +1156,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public Bundle getExtras() {
- return mExtras;
+ synchronized (mLock) {
+ return mExtras;
+ }
}
@Override