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 {