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

Commit 68c14c30 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

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



Change-Id: Ic88474005b8b8c5d8a91de93136039bb052a1fda
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 0a0c10a5 9da5d290
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(