diff options
author | Takeshi Aimi <takeshi.aimi@sonymobile.com> | 2012-07-11 17:13:38 +0900 |
---|---|---|
committer | Jeff Tinker <jtinker@google.com> | 2013-08-23 18:02:40 -0700 |
commit | 6fd97b7d93c5eeaefb2695786b35d1672c88b0cf (patch) | |
tree | 1b8f627cf799f0b9eeb9dcb6bbd1e09c031d7716 /drm/jni/android_drm_DrmManagerClient.cpp | |
parent | b8d3a3de675a42b0eed6117eca509c42903d7ee3 (diff) |
Enhancement for OnInfo callback on DRM Framework
In DRM framework, plugins can transmit DrmInfoEvent to Java layer.
Although DrmInfoEvent has several entries, current implementation
can only convey integer and String. This change enables plugins
uto propagate a hashmap to Java layer. The hashmap can have
one or more Strings and one byte array as value.
Changes are made by Sony Corporation.
bug: 10459159
Change-Id: I5f2bfb43b676863ef4d220fd4ef1e48777e92752
(cherry picked from commit 84a5b5cab40711e20ba70c5ed4dfeab6b558b53b)
Diffstat (limited to 'drm/jni/android_drm_DrmManagerClient.cpp')
-rw-r--r-- | drm/jni/android_drm_DrmManagerClient.cpp | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp index baddf6226018..7fce3d050fc4 100644 --- a/drm/jni/android_drm_DrmManagerClient.cpp +++ b/drm/jni/android_drm_DrmManagerClient.cpp @@ -169,11 +169,49 @@ void JNIOnInfoListener::onInfo(const DrmInfoEvent& event) { JNIEnv *env = AndroidRuntime::getJNIEnv(); jstring message = env->NewStringUTF(event.getMessage().string()); ALOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().string()); - - env->CallStaticVoidMethod( - mClass, - env->GetStaticMethodID(mClass, "notify", "(Ljava/lang/Object;IILjava/lang/String;)V"), - mObject, uniqueId, type, message); + const DrmBuffer& drmBuffer = event.getData(); + if (event.getCount() > 0 || drmBuffer.length > 0) { + jclass hashMapClazz = env->FindClass("java/util/HashMap"); + jmethodID hashMapInitId = env->GetMethodID(hashMapClazz, "<init>", "()V"); + jmethodID hashMapPutId = env->GetMethodID(hashMapClazz, "put", + "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + jobject hashMapObject = env->NewObject(hashMapClazz, hashMapInitId); + env->DeleteLocalRef(hashMapClazz); + + if (0 < drmBuffer.length) { + jfieldID fid = env->GetStaticFieldID( + mClass, "EXTENDED_INFO_DATA", "Ljava/lang/String;"); + jstring key = (jstring) env->GetStaticObjectField(mClass, fid); + + jbyteArray valueByte = env->NewByteArray(drmBuffer.length); + env->SetByteArrayRegion(valueByte, 0, drmBuffer.length, (jbyte*) drmBuffer.data); + env->CallObjectMethod(hashMapObject, hashMapPutId, key, valueByte); + env->DeleteLocalRef(valueByte); + env->DeleteLocalRef(key); + } + DrmInfoEvent::KeyIterator keyIt = event.keyIterator(); + while (keyIt.hasNext()) { + String8 mapKey = keyIt.next(); + jstring key = env->NewStringUTF(mapKey.string()); + jstring value = env->NewStringUTF(event.get(mapKey).string()); + env->CallObjectMethod(hashMapObject, hashMapPutId, key, value); + env->DeleteLocalRef(value); + env->DeleteLocalRef(key); + } + env->CallStaticVoidMethod( + mClass, + env->GetStaticMethodID(mClass, "notify", + "(Ljava/lang/Object;IILjava/lang/String;Ljava/util/HashMap;)V"), + mObject, uniqueId, type, message, hashMapObject); + env->DeleteLocalRef(hashMapObject); + } else { + env->CallStaticVoidMethod( + mClass, + env->GetStaticMethodID(mClass, "notify", + "(Ljava/lang/Object;IILjava/lang/String;)V"), + mObject, uniqueId, type, message); + } + env->DeleteLocalRef(message); } static Mutex sLock; |