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

Commit 3d40c8b4 authored by Kyle Zhang's avatar Kyle Zhang Committed by Automerger Merge Worker
Browse files

Merge "Fix method not found for NotProvisionedException hidden api" into main...

Merge "Fix method not found for NotProvisionedException hidden api" into main am: 296af97b am: aad7c274 am: 9da5d290 am: 68c14c30

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2770659



Change-Id: I73a594b3f9d3ff323e29d40e59c4252667ade360
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents d856c251 68c14c30
Loading
Loading
Loading
Loading
+37 −11
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@
#include <mediadrm/IDrmMetricsConsumer.h>
#include <mediadrm/IDrm.h>
#include <utils/Vector.h>
#include <map>
#include <string>

using ::android::os::PersistableBundle;
namespace drm = ::android::hardware::drm;
@@ -193,6 +195,11 @@ struct LogMessageFields {
    jclass classId;
};

struct DrmExceptionFields {
    jmethodID init;
    jclass classId;
};

struct fields_t {
    jfieldID context;
    jmethodID post_event;
@@ -215,6 +222,7 @@ struct fields_t {
    jclass parcelCreatorClassId;
    KeyStatusFields keyStatus;
    LogMessageFields logMessage;
    std::map<std::string, DrmExceptionFields> exceptionCtors;
};

static fields_t gFields;
@@ -245,18 +253,32 @@ jobject hidlLogMessagesToJavaList(JNIEnv *env, const Vector<drm::V1_4::LogMessag
    return arrayList;
}

int drmThrowException(JNIEnv* env, const char *className, const DrmStatus &err, const char *msg) {
void resolveDrmExceptionCtor(JNIEnv *env, const char *className) {
    jclass clazz;
    jmethodID init;
    FIND_CLASS(clazz, className);
    GET_METHOD_ID(init, clazz, "<init>", "(Ljava/lang/String;III)V");
    gFields.exceptionCtors[std::string(className)] = {
        .init = init,
        .classId = static_cast<jclass>(env->NewGlobalRef(clazz))
        };
}

void drmThrowException(JNIEnv* env, const char *className, const DrmStatus &err, const char *msg) {
    using namespace android::jnihelp;

    if (gFields.exceptionCtors.count(std::string(className)) == 0) {
        jniThrowException(env, className, msg);
    } else {
        jstring _detailMessage = CreateExceptionMsg(env, msg);
    int _status = ThrowException(env, className, "(Ljava/lang/String;III)V",
                                 _detailMessage,
                                 err.getCdmErr(),
                                 err.getOemErr(),
                                 err.getContext());
        jobject exception = env->NewObject(gFields.exceptionCtors[std::string(className)].classId,
            gFields.exceptionCtors[std::string(className)].init, _detailMessage,
            err.getCdmErr(), err.getOemErr(), err.getContext());
        env->Throw(static_cast<jthrowable>(exception));
        if (_detailMessage != NULL) {
            env->DeleteLocalRef(_detailMessage);
        }
    return _status;
    }
}
}  // namespace anonymous

@@ -952,6 +974,10 @@ static void android_media_MediaDrm_native_init(JNIEnv *env) {
    FIND_CLASS(clazz, "android/media/MediaDrm$LogMessage");
    gFields.logMessage.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
    GET_METHOD_ID(gFields.logMessage.init, clazz, "<init>", "(JILjava/lang/String;)V");

    resolveDrmExceptionCtor(env, "android/media/NotProvisionedException");
    resolveDrmExceptionCtor(env, "android/media/ResourceBusyException");
    resolveDrmExceptionCtor(env, "android/media/DeniedByServerException");
}

static void android_media_MediaDrm_native_setup(