Merge "Ensure metadata bundles are unparceled before making them available" into lmp-dev

This commit is contained in:
RoboErik
2014-10-08 22:30:04 +00:00
committed by Android (Google) Code Review

View File

@@ -625,13 +625,13 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
private PlaybackState getStateWithUpdatedPosition() { private PlaybackState getStateWithUpdatedPosition() {
PlaybackState state; PlaybackState state;
long duration = -1;
synchronized (mLock) { synchronized (mLock) {
state = mPlaybackState; state = mPlaybackState;
}
long duration = -1;
if (mMetadata != null && mMetadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) { if (mMetadata != null && mMetadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
duration = mMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION); duration = mMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
} }
}
PlaybackState result = null; PlaybackState result = null;
if (state != null) { if (state != null) {
if (state.getState() == PlaybackState.STATE_PLAYING if (state.getState() == PlaybackState.STATE_PLAYING
@@ -725,10 +725,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override @Override
public void setMetadata(MediaMetadata metadata) { public void setMetadata(MediaMetadata metadata) {
// Make a copy of the metadata as the underlying bundle may be
// modified on this thread.
synchronized (mLock) { synchronized (mLock) {
mMetadata = metadata == null ? null : new MediaMetadata.Builder(metadata).build(); MediaMetadata temp = metadata == null ? null : new MediaMetadata.Builder(metadata)
.build();
// This is to guarantee that the underlying bundle is unparceled
// before we set it to prevent concurrent reads from throwing an
// exception
temp.size();
mMetadata = temp;
} }
mHandler.post(MessageHandler.MSG_UPDATE_METADATA); mHandler.post(MessageHandler.MSG_UPDATE_METADATA);
} }