Merge "Open /dev/urandom in O_CLOEXEC mode" am: e6550d3e98 am: 694bef43fc am: 9726373802

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/net/voip/+/1675808

Change-Id: Ia9a9fff1a6c73d09fa81af569a0a0becd3abd6d7
diff --git a/src/java/android/net/rtp/AudioGroup.java b/src/java/android/net/rtp/AudioGroup.java
index fd5992f..c186125 100644
--- a/src/java/android/net/rtp/AudioGroup.java
+++ b/src/java/android/net/rtp/AudioGroup.java
@@ -16,10 +16,12 @@
 
 package android.net.rtp;
 
+import static android.media.permission.PermissionUtil.myIdentity;
+
 import android.annotation.NonNull;
-import android.app.ActivityThread;
 import android.content.Context;
 import android.media.AudioManager;
+import android.media.permission.Identity;
 
 import java.util.HashMap;
 import java.util.Locale;
@@ -117,7 +119,7 @@
 
     /**
      * Creates an empty AudioGroup.
-     * @param context Context used to get package name
+     * @param context Context the group belongs to
      */
     public AudioGroup(@NonNull Context context) {
         mContext = context;
@@ -167,11 +169,11 @@
                 AudioCodec codec = stream.getCodec();
                 String codecSpec = String.format(Locale.US, "%d %s %s", codec.type,
                         codec.rtpmap, codec.fmtp);
+
                 long id = nativeAdd(stream.getMode(), stream.getSocket(),
                         stream.getRemoteAddress().getHostAddress(),
                         stream.getRemotePort(), codecSpec, stream.getDtmfType(),
-                        mContext != null ? mContext.getOpPackageName()
-                                : ActivityThread.currentOpPackageName());
+                        myIdentity(mContext));
                 mStreams.put(stream, id);
             } catch (NullPointerException e) {
                 throw new IllegalStateException(e);
@@ -180,7 +182,7 @@
     }
 
     private native long nativeAdd(int mode, int socket, String remoteAddress,
-            int remotePort, String codecSpec, int dtmfType, String opPackageName);
+            int remotePort, String codecSpec, int dtmfType, Identity identity);
 
     // Package-private method used by AudioStream.join().
     synchronized void remove(AudioStream stream) {
diff --git a/src/jni/rtp/Android.bp b/src/jni/rtp/Android.bp
index a1497f9..3469960 100644
--- a/src/jni/rtp/Android.bp
+++ b/src/jni/rtp/Android.bp
@@ -43,6 +43,7 @@
         "libnativehelper",
         "libstagefright_amrnb_common",
         "libutils",
+        "media_permission-aidl-cpp",
     ],
     static_libs: [
         "libgsm",
diff --git a/src/jni/rtp/AudioGroup.cpp b/src/jni/rtp/AudioGroup.cpp
index 9efd11a..644b414 100644
--- a/src/jni/rtp/AudioGroup.cpp
+++ b/src/jni/rtp/AudioGroup.cpp
@@ -57,8 +57,17 @@
 
 using namespace android;
 
+using media::permission::Identity;
+
 int gRandom = -1;
 
+static struct {
+    jfieldID  fieldUid;            // Identity.uid
+    jfieldID  fieldPid;            // Identity.pid
+    jfieldID  fieldPackageName;    // Identity.packageName
+    jfieldID  fieldAttributionTag; // Identity.attributionTag
+} javaIdentityFields;
+
 // We use a circular array to implement jitter buffer. The simplest way is doing
 // a modulo operation on the index while accessing the array. However modulo can
 // be expensive on some platforms, such as ARM. Thus we round up the size of the
@@ -480,7 +489,7 @@
 class AudioGroup
 {
 public:
-    explicit AudioGroup(const String16 &opPackageName);
+    explicit AudioGroup(const Identity &identity);
     ~AudioGroup();
     bool set(int sampleRate, int sampleCount);
 
@@ -505,7 +514,7 @@
     int mEventQueue;
     volatile int mDtmfEvent;
 
-    String16 mOpPackageName;
+    Identity mIdentity;
 
     int mMode;
     int mSampleRate;
@@ -554,9 +563,9 @@
     sp<DeviceThread> mDeviceThread;
 };
 
-AudioGroup::AudioGroup(const String16 &opPackageName)
+AudioGroup::AudioGroup(const Identity &identity)
 {
-    mOpPackageName = opPackageName;
+    mIdentity = identity;
     mMode = ON_HOLD;
     mChain = NULL;
     mEventQueue = -1;
@@ -818,7 +827,7 @@
 
     // Initialize AudioTrack and AudioRecord.
     sp<AudioTrack> track = new AudioTrack();
-    sp<AudioRecord> record = new AudioRecord(mGroup->mOpPackageName);
+    sp<AudioRecord> record = new AudioRecord(mGroup->mIdentity);
     // Set caller name so it can be logged in destructor.
     // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_RTP
     track->setCallerName("rtp");
@@ -851,7 +860,7 @@
     sp<AudioEffect> aec;
     if (mode == ECHO_SUPPRESSION) {
         if (mGroup->platformHasAec()) {
-            aec = new AudioEffect(mGroup->mOpPackageName);
+            aec = new AudioEffect(mGroup->mIdentity);
             aec->set(FX_IID_AEC,
                      NULL,
                      0,
@@ -953,7 +962,7 @@
 
 jlong add(JNIEnv *env, jobject thiz, jint mode,
     jint socket, jstring jRemoteAddress, jint remotePort,
-    jstring jCodecSpec, jint dtmfType, jstring opPackageNameStr)
+    jstring jCodecSpec, jint dtmfType, jobject jIdentity)
 {
     AudioCodec *codec = NULL;
     AudioStream *stream = NULL;
@@ -981,7 +990,25 @@
         return 0;
     }
 
-    ScopedUtfChars opPackageName(env, opPackageNameStr);
+    Identity identity;
+    identity.uid = env->GetIntField(jIdentity, javaIdentityFields.fieldUid);
+    identity.pid = env->GetIntField(jIdentity, javaIdentityFields.fieldPid);
+    jstring packageNameStr = static_cast<jstring>(
+            env->GetObjectField(jIdentity, javaIdentityFields.fieldPackageName));
+    if (packageNameStr == NULL) {
+        identity.packageName = std::nullopt;
+    } else {
+        identity.packageName = std::optional<std::string>(
+                std::string(ScopedUtfChars(env, packageNameStr).c_str()));
+    }
+    jstring attributionTagStr = static_cast<jstring>(
+            env->GetObjectField(jIdentity, javaIdentityFields.fieldAttributionTag));
+    if (attributionTagStr == NULL) {
+        identity.attributionTag = std::nullopt;
+    } else {
+        identity.attributionTag = std::optional<std::string>(
+                std::string(ScopedUtfChars(env, attributionTagStr).c_str()));
+    }
 
     // Create audio codec.
     int codecType = -1;
@@ -1012,7 +1039,7 @@
     group = (AudioGroup *)env->GetLongField(thiz, gNative);
     if (!group) {
         int mode = env->GetIntField(thiz, gMode);
-        group = new AudioGroup(String16(opPackageName.c_str()));
+        group = new AudioGroup(identity);
         if (!group->set(8000, 256) || !group->setMode(mode)) {
             jniThrowException(env, "java/lang/IllegalStateException",
                 "cannot initialize audio group");
@@ -1068,7 +1095,7 @@
 }
 
 JNINativeMethod gMethods[] = {
-    {"nativeAdd", "(IILjava/lang/String;ILjava/lang/String;ILjava/lang/String;)J", (void *)add},
+    {"nativeAdd", "(IILjava/lang/String;ILjava/lang/String;ILandroid/media/permission/Identity;)J", (void *)add},
     {"nativeRemove", "(J)V", (void *)remove},
     {"nativeSetMode", "(I)V", (void *)setMode},
     {"nativeSendDtmf", "(I)V", (void *)sendDtmf},
@@ -1092,5 +1119,17 @@
         ALOGE("JNI registration failed");
         return -1;
     }
+
+    // Get the Identity class and fields
+    jclass identityClass = env->FindClass("android/media/permission/Identity");
+    javaIdentityFields.fieldUid =
+            env->GetFieldID(identityClass, "uid", "I");
+    javaIdentityFields.fieldPid =
+            env->GetFieldID(identityClass, "pid", "I");
+    javaIdentityFields.fieldPackageName =
+            env->GetFieldID(identityClass, "packageName", "Ljava/lang/String;");
+    javaIdentityFields.fieldAttributionTag =
+            env->GetFieldID(identityClass, "attributionTag", "Ljava/lang/String;");
+
     return 0;
 }