Snap for 10453563 from 9a8c9d0ff34e53839ac23c093bef63f05df5cf4a to mainline-conscrypt-release Change-Id: I058b1cd4c8f8a602fc140e472333b2e5592e080d
diff --git a/apex/framework/Android.bp b/apex/framework/Android.bp index e93e713..80595f4 100644 --- a/apex/framework/Android.bp +++ b/apex/framework/Android.bp
@@ -61,6 +61,7 @@ filegroup { name: "updatable-media-srcs", + defaults: ["framework-sources-module-defaults"], srcs: [ "java/android/media/MediaFrameworkInitializer.java", ":media-aidl-srcs", @@ -69,7 +70,6 @@ ":mediasession2-java-srcs", ":mediatranscoding-srcs", ], - visibility: ["//frameworks/base"], } filegroup { @@ -142,8 +142,6 @@ ], jarjar_rules: "jarjar_rules.txt", - plugins: ["java_api_finder"], - apex_available: [ "com.android.media", "test_com.android.media", @@ -152,6 +150,9 @@ strict_updatability_linting: true, }, min_sdk_version: "29", + permitted_packages: [ + "android.media", + ], } cc_library_shared { @@ -177,3 +178,21 @@ ], min_sdk_version: "29", } + +java_api_contribution { + name: "framework-media-public-stubs", + api_surface: "public", + api_file: "api/current.txt", + visibility: [ + "//build/orchestrator/apis", + ], +} + +java_api_contribution { + name: "framework-media-module-lib-stubs", + api_surface: "module-lib", + api_file: "api/module-lib-current.txt", + visibility: [ + "//build/orchestrator/apis", + ], +}
diff --git a/apex/framework/TEST_MAPPING b/apex/framework/TEST_MAPPING index 3d21914..2b4ae51 100644 --- a/apex/framework/TEST_MAPPING +++ b/apex/framework/TEST_MAPPING
@@ -5,6 +5,9 @@ }, { "name": "CtsMediaParserHostTestCases" + }, + { + "name": "media_e2e_tests" } ] }
diff --git a/apex/framework/api/system-current.txt b/apex/framework/api/system-current.txt index 6eea769..5554c91 100644 --- a/apex/framework/api/system-current.txt +++ b/apex/framework/api/system-current.txt
@@ -27,13 +27,14 @@ public static final class MediaTranscodingManager.TranscodingSession { method public boolean addClientUid(int); method public void cancel(); + method public void clearOnProgressUpdateListener(); method @NonNull public java.util.List<java.lang.Integer> getClientUids(); method public int getErrorCode(); method @IntRange(from=0, to=100) public int getProgress(); method public int getResult(); method public int getSessionId(); method public int getStatus(); - method public void setOnProgressUpdateListener(@NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodingManager.TranscodingSession.OnProgressUpdateListener); + method public void setOnProgressUpdateListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaTranscodingManager.TranscodingSession.OnProgressUpdateListener); field public static final int ERROR_DROPPED_BY_SERVICE = 1; // 0x1 field public static final int ERROR_NONE = 0; // 0x0 field public static final int ERROR_SERVICE_DIED = 2; // 0x2
diff --git a/apex/framework/jarjar_rules.txt b/apex/framework/jarjar_rules.txt index 91489dc..1bd5b36 100644 --- a/apex/framework/jarjar_rules.txt +++ b/apex/framework/jarjar_rules.txt
@@ -1,2 +1,4 @@ rule com.android.modules.** android.media.internal.@1 rule com.google.android.exoplayer2.** android.media.internal.exo.@1 +rule com.google.common.** android.media.internal.guava_common.@1 +rule com.google.thirdparty.** android.media.internal.guava_thirdparty.@1
diff --git a/apex/framework/java/android/media/MediaParser.java b/apex/framework/java/android/media/MediaParser.java index b6f85c7..7daebd0 100644 --- a/apex/framework/java/android/media/MediaParser.java +++ b/apex/framework/java/android/media/MediaParser.java
@@ -62,8 +62,8 @@ import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.TimestampAdjuster; -import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.ColorInfo; +import com.google.common.base.Ascii; import java.io.EOFException; import java.io.IOException; @@ -978,7 +978,7 @@ @ParserName public static List<String> getParserNames(@NonNull MediaFormat mediaFormat) { String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME); - mimeType = mimeType == null ? null : Util.toLowerInvariant(mimeType.trim()); + mimeType = mimeType == null ? null : Ascii.toLowerCase(mimeType); if (TextUtils.isEmpty(mimeType)) { // No MIME type provided. Return all. return Collections.unmodifiableList( @@ -1420,7 +1420,7 @@ int flags = 0; TimestampAdjuster timestampAdjuster = null; if (mIgnoreTimestampOffset) { - timestampAdjuster = new TimestampAdjuster(TimestampAdjuster.DO_NOT_OFFSET); + timestampAdjuster = new TimestampAdjuster(TimestampAdjuster.MODE_NO_OFFSET); } switch (parserName) { case PARSER_NAME_MATROSKA:
diff --git a/apex/framework/java/android/media/MediaTranscodingManager.java b/apex/framework/java/android/media/MediaTranscodingManager.java index aff3204..5a5ead5 100644 --- a/apex/framework/java/android/media/MediaTranscodingManager.java +++ b/apex/framework/java/android/media/MediaTranscodingManager.java
@@ -190,16 +190,8 @@ return; } - // Updates the session progress. + // Update session progress and notify clients. session.updateProgress(newProgress); - - // Notifies client the progress update. - if (session.mProgressUpdateExecutor != null - && session.mProgressUpdateListener != null) { - session.mProgressUpdateExecutor.execute( - () -> session.mProgressUpdateListener.onProgressUpdate(session, - newProgress)); - } } } @@ -1395,7 +1387,7 @@ */ public void setOnProgressUpdateListener( @NonNull @CallbackExecutor Executor executor, - @Nullable OnProgressUpdateListener listener) { + @NonNull OnProgressUpdateListener listener) { synchronized (mLock) { Objects.requireNonNull(executor, "listenerExecutor must not be null"); Objects.requireNonNull(listener, "listener must not be null"); @@ -1404,6 +1396,14 @@ } } + /** Removes the progress listener if any. */ + public void clearOnProgressUpdateListener() { + synchronized (mLock) { + mProgressUpdateExecutor = null; + mProgressUpdateListener = null; + } + } + private void updateStatusAndResult(@Status int sessionStatus, @Result int sessionResult, @TranscodingSessionErrorCode int errorCode) { synchronized (mLock) { @@ -1655,6 +1655,11 @@ private void updateProgress(int newProgress) { synchronized (mLock) { mProgress = newProgress; + if (mProgressUpdateExecutor != null && mProgressUpdateListener != null) { + final OnProgressUpdateListener listener = mProgressUpdateListener; + mProgressUpdateExecutor.execute( + () -> listener.onProgressUpdate(this, newProgress)); + } } }
diff --git a/apex/service/java/com/android/server/media/MediaCommunicationService.java b/apex/service/java/com/android/server/media/MediaCommunicationService.java index 4223fa6..b88e586 100644 --- a/apex/service/java/com/android/server/media/MediaCommunicationService.java +++ b/apex/service/java/com/android/server/media/MediaCommunicationService.java
@@ -25,6 +25,7 @@ import android.app.NotificationManager; import android.content.Context; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.PackageInfoFlags; import android.media.IMediaCommunicationService; import android.media.IMediaCommunicationServiceCallback; import android.media.MediaController2; @@ -358,7 +359,11 @@ public boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid) { final int uid = Binder.getCallingUid(); - final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier(); + final UserHandle callingUser = UserHandle.getUserHandleForUid(uid); + if (controllerUid < 0 + || getPackageUidForUser(controllerPackageName, callingUser) != controllerUid) { + return false; + } final long token = Binder.clearCallingIdentity(); try { // Don't perform check between controllerPackageName and controllerUid. @@ -371,7 +376,7 @@ // but it doesn't tell which package has created the MediaController, so useless. return hasMediaControlPermission(controllerPid, controllerUid) || hasEnabledNotificationListener( - userId, controllerPackageName, controllerUid); + callingUser.getIdentifier(), controllerPackageName, controllerUid); } finally { Binder.restoreCallingIdentity(token); } @@ -500,6 +505,22 @@ + " with user id: " + userId + "; Need to run as either the calling user id (" + callingUserId + "), or with " + INTERACT_ACROSS_USERS_FULL + " permission"); } + + /** + * Return the UID associated with the given package name and user, or -1 if no such package + * is available to the caller. + */ + private int getPackageUidForUser(@NonNull String packageName, @NonNull UserHandle user) { + final PackageManager packageManager = mContext.getUser().equals(user) + ? mContext.getPackageManager() + : mContext.createContextAsUser(user, 0 /* flags */).getPackageManager(); + try { + return packageManager.getPackageUid(packageName, 0 /* flags */); + } catch (PackageManager.NameNotFoundException e) { + // package is not available to the caller + } + return -1; + } } final class CallbackRecord implements IBinder.DeathRecipient {