Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa5ecdc4 authored by Svet Ganov's avatar Svet Ganov Committed by Svetoslav
Browse files

Respect the record audio app op - framework

Change-Id: I5696d2ef22738ccffaf8bd7a0ee68cbc3dea3bf1
parent 50ea9422
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,4 +20,5 @@ package android.os;
/** @hide */
interface IPermissionController {
    boolean checkPermission(String permission, int pid, int uid);
    String[] getPackagesForUid(int uid);
}
+7 −3
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@
#include <utils/Log.h>
#include <media/AudioRecord.h>

#include <ScopedUtfChars.h>

#include "android_media_AudioFormat.h"
#include "android_media_AudioErrors.h"

@@ -146,7 +148,7 @@ static sp<AudioRecord> setAudioRecord(JNIEnv* env, jobject thiz, const sp<AudioR
static jint
android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
        jobject jaa, jint sampleRateInHertz, jint channelMask, jint channelIndexMask,
        jint audioFormat, jint buffSizeInBytes, jintArray jSession)
        jint audioFormat, jint buffSizeInBytes, jintArray jSession, jstring opPackageName)
{
    //ALOGV(">> Entering android_media_AudioRecord_setup");
    //ALOGV("sampleRate=%d, audioFormat=%d, channel mask=%x, buffSizeInBytes=%d",
@@ -208,8 +210,10 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
    env->ReleasePrimitiveArrayCritical(jSession, nSession, 0);
    nSession = NULL;

    ScopedUtfChars opPackageNameStr(env, opPackageName);

    // create an uninitialized AudioRecord object
    sp<AudioRecord> lpRecorder = new AudioRecord();
    sp<AudioRecord> lpRecorder = new AudioRecord(String16(opPackageNameStr.c_str()));

    audio_attributes_t *paa = NULL;
    // read the AudioAttributes values
@@ -597,7 +601,7 @@ static JNINativeMethod gMethods[] = {
    // name,               signature,  funcPtr
    {"native_start",         "(II)I",    (void *)android_media_AudioRecord_start},
    {"native_stop",          "()V",    (void *)android_media_AudioRecord_stop},
    {"native_setup",         "(Ljava/lang/Object;Ljava/lang/Object;IIIII[I)I",
    {"native_setup",         "(Ljava/lang/Object;Ljava/lang/Object;IIIII[ILjava/lang/String;)I",
                                       (void *)android_media_AudioRecord_setup},
    {"native_finalize",      "()V",    (void *)android_media_AudioRecord_finalize},
    {"native_release",       "()V",    (void *)android_media_AudioRecord_release},
+5 −3
Original line number Diff line number Diff line
@@ -134,8 +134,10 @@ private:

// ----------------------------------------------------------------------------

static jlong nativeListen(JNIEnv* env, jobject remoteDisplayObj, jstring ifaceStr) {
static jlong nativeListen(JNIEnv* env, jobject remoteDisplayObj, jstring ifaceStr,
        jstring opPackageNameStr) {
    ScopedUtfChars iface(env, ifaceStr);
    ScopedUtfChars opPackageName(env, opPackageNameStr);

    sp<IServiceManager> sm = defaultServiceManager();
    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(
@@ -146,7 +148,7 @@ static jlong nativeListen(JNIEnv* env, jobject remoteDisplayObj, jstring ifaceSt
    }

    sp<NativeRemoteDisplayClient> client(new NativeRemoteDisplayClient(env, remoteDisplayObj));
    sp<IRemoteDisplay> display = service->listenForRemoteDisplay(
    sp<IRemoteDisplay> display = service->listenForRemoteDisplay(String16(opPackageName.c_str()),
            client, String8(iface.c_str()));
    if (display == NULL) {
        ALOGE("Media player service rejected request to listen for remote display '%s'.",
@@ -176,7 +178,7 @@ static void nativeDispose(JNIEnv* env, jobject remoteDisplayObj, jlong ptr) {
// ----------------------------------------------------------------------------

static JNINativeMethod gMethods[] = {
    {"nativeListen", "(Ljava/lang/String;)J",
    {"nativeListen", "(Ljava/lang/String;Ljava/lang/String;)J",
            (void*)nativeListen },
    {"nativeDispose", "(J)V",
            (void*)nativeDispose },
+14 −3
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import java.util.Iterator;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.app.Application;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -378,7 +380,7 @@ public class AudioRecord
        int initResult = native_setup( new WeakReference<AudioRecord>(this),
                mAudioAttributes, mSampleRate, mChannelMask, mChannelIndexMask,
                mAudioFormat, mNativeBufferSizeInBytes,
                session);
                session, getMyOpPackageName());
        if (initResult != SUCCESS) {
            loge("Error code "+initResult+" when initializing native AudioRecord object.");
            return; // with mState == STATE_UNINITIALIZED
@@ -1321,7 +1323,6 @@ public class AudioRecord
        return native_set_pos_update_period(periodInFrames);
    }


    //--------------------------------------------------------------------------
    // Explicit Routing
    //--------------------
@@ -1451,7 +1452,7 @@ public class AudioRecord
    private native final int native_setup(Object audiorecord_this,
            Object /*AudioAttributes*/ attributes,
            int sampleRate, int channelMask, int channelIndexMask, int audioFormat,
            int buffSizeInBytes, int[] sessionId);
            int buffSizeInBytes, int[] sessionId, String opPackageName);

    // TODO remove: implementation calls directly into implementation of native_release()
    private native final void native_finalize();
@@ -1500,4 +1501,14 @@ public class AudioRecord
        Log.e(TAG, msg);
    }

    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");
    }
}
+14 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.media;

import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.app.Application;
import android.hardware.Camera;
import android.os.Handler;
import android.os.Looper;
@@ -111,7 +112,7 @@ public class MediaRecorder
        /* Native setup requires a weak reference to our object.
         * It's easier to create it here than in C++.
         */
        native_setup(new WeakReference<MediaRecorder>(this), packageName);
        native_setup(new WeakReference<MediaRecorder>(this), packageName, getMyOpPackageName());
    }

    /**
@@ -1080,7 +1081,7 @@ public class MediaRecorder
    private static native final void native_init();

    private native final void native_setup(Object mediarecorder_this,
            String clientName) throws IllegalStateException;
            String clientName, String opPackageName) throws IllegalStateException;

    private native final void native_finalize();

@@ -1088,4 +1089,15 @@ public class MediaRecorder

    @Override
    protected void finalize() { native_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");
    }
}
Loading