Merge "Add SIP app op - voip" into mnc-dev
diff --git a/src/java/android/net/rtp/AudioGroup.java b/src/java/android/net/rtp/AudioGroup.java
index 30a664c..da74bd6 100644
--- a/src/java/android/net/rtp/AudioGroup.java
+++ b/src/java/android/net/rtp/AudioGroup.java
@@ -16,6 +16,8 @@
 
 package android.net.rtp;
 
+import android.app.ActivityThread;
+import android.app.Application;
 import android.media.AudioManager;
 
 import java.util.HashMap;
@@ -151,7 +153,8 @@
                         codec.rtpmap, codec.fmtp);
                 long id = nativeAdd(stream.getMode(), stream.getSocket(),
                         stream.getRemoteAddress().getHostAddress(),
-                        stream.getRemotePort(), codecSpec, stream.getDtmfType());
+                        stream.getRemotePort(), codecSpec, stream.getDtmfType(),
+                        getMyOpPackageName());
                 mStreams.put(stream, id);
             } catch (NullPointerException e) {
                 throw new IllegalStateException(e);
@@ -160,7 +163,7 @@
     }
 
     private native long nativeAdd(int mode, int socket, String remoteAddress,
-            int remotePort, String codecSpec, int dtmfType);
+            int remotePort, String codecSpec, int dtmfType, String opPackageName);
 
     // Package-private method used by AudioStream.join().
     synchronized void remove(AudioStream stream) {
@@ -203,4 +206,15 @@
         nativeRemove(0L);
         super.finalize();
     }
+
+    private static String getMyOpPackageName() {
+        ActivityThread activityThread = ActivityThread.currentActivityThread();
+        if (activityThread != null) {
+            Application application = activityThread.getApplication();
+            if (application != null) {
+                return application.getOpPackageName();
+            }
+        }
+        throw new IllegalStateException("Cannot create AudioRecord outside of an app");
+    }
 }
diff --git a/src/jni/rtp/AudioGroup.cpp b/src/jni/rtp/AudioGroup.cpp
index 5dce123..713f0f8 100644
--- a/src/jni/rtp/AudioGroup.cpp
+++ b/src/jni/rtp/AudioGroup.cpp
@@ -45,6 +45,8 @@
 #include <audio_effects/effect_aec.h>
 #include <system/audio.h>
 
+#include <ScopedUtfChars.h>
+
 #include "jni.h"
 #include "JNIHelp.h"
 
@@ -471,7 +473,7 @@
 class AudioGroup
 {
 public:
-    AudioGroup();
+    AudioGroup(const String16 &opPackageName);
     ~AudioGroup();
     bool set(int sampleRate, int sampleCount);
 
@@ -496,6 +498,8 @@
     int mEventQueue;
     volatile int mDtmfEvent;
 
+    String16 mOpPackageName;
+
     int mMode;
     int mSampleRate;
     int mSampleCount;
@@ -543,8 +547,9 @@
     sp<DeviceThread> mDeviceThread;
 };
 
-AudioGroup::AudioGroup()
+AudioGroup::AudioGroup(const String16 &opPackageName)
 {
+    mOpPackageName = opPackageName;
     mMode = ON_HOLD;
     mChain = NULL;
     mEventQueue = -1;
@@ -806,7 +811,7 @@
 
     // Initialize AudioTrack and AudioRecord.
     sp<AudioTrack> track = new AudioTrack();
-    sp<AudioRecord> record = new AudioRecord();
+    sp<AudioRecord> record = new AudioRecord(mGroup->mOpPackageName);
     if (track->set(AUDIO_STREAM_VOICE_CALL, sampleRate, AUDIO_FORMAT_PCM_16_BIT,
                 AUDIO_CHANNEL_OUT_MONO, output, AUDIO_OUTPUT_FLAG_NONE, NULL /*callback_t*/,
                 NULL /*user*/, 0 /*notificationFrames*/, 0 /*sharedBuffer*/,
@@ -836,6 +841,7 @@
     if (mode == ECHO_SUPPRESSION) {
         if (mGroup->platformHasAec()) {
             aec = new AudioEffect(FX_IID_AEC,
+                                    mGroup->mOpPackageName,
                                     NULL,
                                     0,
                                     0,
@@ -938,7 +944,7 @@
 
 jlong add(JNIEnv *env, jobject thiz, jint mode,
     jint socket, jstring jRemoteAddress, jint remotePort,
-    jstring jCodecSpec, jint dtmfType)
+    jstring jCodecSpec, jint dtmfType, jstring opPackageNameStr)
 {
     AudioCodec *codec = NULL;
     AudioStream *stream = NULL;
@@ -966,6 +972,8 @@
         return 0;
     }
 
+    ScopedUtfChars opPackageName(env, opPackageNameStr);
+
     // Create audio codec.
     int codecType = -1;
     char codecName[16];
@@ -995,7 +1003,7 @@
     group = (AudioGroup *)env->GetLongField(thiz, gNative);
     if (!group) {
         int mode = env->GetIntField(thiz, gMode);
-        group = new AudioGroup;
+        group = new AudioGroup(String16(opPackageName.c_str()));
         if (!group->set(8000, 256) || !group->setMode(mode)) {
             jniThrowException(env, "java/lang/IllegalStateException",
                 "cannot initialize audio group");
@@ -1051,7 +1059,7 @@
 }
 
 JNINativeMethod gMethods[] = {
-    {"nativeAdd", "(IILjava/lang/String;ILjava/lang/String;I)J", (void *)add},
+    {"nativeAdd", "(IILjava/lang/String;ILjava/lang/String;I;LJava/lang/String;)J", (void *)add},
     {"nativeRemove", "(J)V", (void *)remove},
     {"nativeSetMode", "(I)V", (void *)setMode},
     {"nativeSendDtmf", "(I)V", (void *)sendDtmf},