From a13857321fcad0694ce207226be8a46a2e4980a0 Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Fri, 7 Dec 2018 14:36:14 +0900 Subject: [PATCH] AML: Remove unbundling MediaMetadata in MediaSessionRecord In order to record a log when MediaMetadata is unparceled in the system process, MediaMetadata calls Bundle#setDefusable when it is initialized. In order to avoid unnecessarily making Bundle#setDefusable a public API, this CL removes the unparceling instance in MediaSessionRecord by extracting the necessary information inside MediaSession and sending them to MediaSessionRecord separately. Bug: 119789387 Test: Build Change-Id: I7d44fd05250a291bd8d64850cc3c6f47236f9f62 --- .../java/android/media/session/ISession.aidl | 2 +- .../android/media/session/MediaSession.java | 14 ++++++++-- .../server/media/MediaSessionRecord.java | 28 ++++++++----------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index bd0019f0f1d84..bfc05fa4e3a41 100644 --- a/media/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl @@ -39,7 +39,7 @@ interface ISession { void destroy(); // These commands are for the TransportPerformer - void setMetadata(in MediaMetadata metadata); + void setMetadata(in MediaMetadata metadata, long duration, String metadataDescription); void setPlaybackState(in PlaybackState state); void setQueue(in ParceledListSlice queue); void setQueueTitle(CharSequence title); diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index d43cd309d1575..8962bb7fb4c45 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -30,6 +30,7 @@ import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; +import android.media.session.MediaSessionManager.RemoteUserInfo; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -40,7 +41,6 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.UserHandle; -import android.media.session.MediaSessionManager.RemoteUserInfo; import android.service.media.MediaBrowserService; import android.text.TextUtils; import android.util.Log; @@ -434,11 +434,21 @@ public final class MediaSession { * @see android.media.MediaMetadata.Builder#putBitmap */ public void setMetadata(@Nullable MediaMetadata metadata) { + long duration = -1; + int fields = 0; + MediaDescription description = null; if (metadata != null) { metadata = (new MediaMetadata.Builder(metadata, mMaxBitmapSize)).build(); + if (metadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) { + duration = metadata.getLong(MediaMetadata.METADATA_KEY_DURATION); + } + fields = metadata.size(); + description = metadata.getDescription(); } + String metadataDescription = "size=" + fields + ", description=" + description; + try { - mBinder.setMetadata(metadata); + mBinder.setMetadata(metadata, duration, metadataDescription); } catch (RemoteException e) { Log.wtf(TAG, "Dead object in setPlaybackState.", e); } diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index c938f5eec94d7..c1f3468627cb7 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -20,10 +20,10 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.ParceledListSlice; +import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManagerInternal; import android.media.AudioSystem; -import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; @@ -36,7 +36,6 @@ import android.media.session.MediaController.PlaybackInfo; import android.media.session.MediaSession; import android.media.session.ParcelableVolumeInfo; import android.media.session.PlaybackState; -import android.media.AudioAttributes; import android.net.Uri; import android.os.Binder; import android.os.Bundle; @@ -94,8 +93,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private PendingIntent mLaunchIntent; // TransportPerformer fields - private Bundle mExtras; + // Note: Avoid unparceling the bundle inside MediaMetadata since unparceling in system process + // may result in throwing an exception. private MediaMetadata mMetadata; private PlaybackState mPlaybackState; private ParceledListSlice mQueue; @@ -117,6 +117,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private boolean mIsActive = false; private boolean mDestroyed = false; + private long mDuration; + private String mMetadataDescription; + public MediaSessionRecord(int ownerPid, int ownerUid, int userId, String ownerPackageName, ISessionCallback cb, String tag, MediaSessionService service, Looper handlerLooper) { mOwnerPid = ownerPid; @@ -451,7 +454,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { pw.println(indent + "audioAttrs=" + mAudioAttrs); pw.println(indent + "volumeType=" + mVolumeType + ", controlType=" + mVolumeControlType + ", max=" + mMaxVolume + ", current=" + mCurrentVolume); - pw.println(indent + "metadata:" + getShortMetadataString()); + pw.println(indent + "metadata: " + mMetadataDescription); pw.println(indent + "queueTitle=" + mQueueTitle + ", size=" + (mQueue == null ? 0 : mQueue.getList().size())); } @@ -494,13 +497,6 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { }); } - private String getShortMetadataString() { - int fields = mMetadata == null ? 0 : mMetadata.size(); - MediaDescription description = mMetadata == null ? null : mMetadata - .getDescription(); - return "size=" + fields + ", description=" + description; - } - private void logCallbackException( String msg, ISessionControllerCallbackHolder holder, Exception e) { Log.v(TAG, msg + ", this=" + this + ", callback package=" + holder.mPackageName @@ -670,12 +666,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private PlaybackState getStateWithUpdatedPosition() { PlaybackState state; - long duration = -1; + long duration; synchronized (mLock) { state = mPlaybackState; - if (mMetadata != null && mMetadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) { - duration = mMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION); - } + duration = mDuration; } PlaybackState result = null; if (state != null) { @@ -793,7 +787,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public void setMetadata(MediaMetadata metadata) { + public void setMetadata(MediaMetadata metadata, long duration, String metadataDescription) { synchronized (mLock) { MediaMetadata temp = metadata == null ? null : new MediaMetadata.Builder(metadata) .build(); @@ -804,6 +798,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { temp.size(); } mMetadata = temp; + mDuration = duration; + mMetadataDescription = metadataDescription; } mHandler.post(MessageHandler.MSG_UPDATE_METADATA); }