private final CloseGuard mCloseGuard = CloseGuard.get();
+ private static final String EXTENDED_INFO_DATA = "extended_info_data";
+
static {
// Load the respective library
System.loadLibrary("drmframework_jni");
DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
if (null != instance && null != instance.mInfoHandler) {
+ DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message);
+ Message m = instance.mInfoHandler.obtainMessage(
+ InfoHandler.INFO_EVENT_TYPE, event);
+ instance.mInfoHandler.sendMessage(m);
+ }
+ }
+
+ private static void notify(
+ Object thisReference, int uniqueId, int infoType, String message,
+ HashMap<String, Object> attributes) {
+ DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
+
+ if (null != instance && null != instance.mInfoHandler) {
+ DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message, attributes);
Message m = instance.mInfoHandler.obtainMessage(
- InfoHandler.INFO_EVENT_TYPE, uniqueId, infoType, message);
+ InfoHandler.INFO_EVENT_TYPE, event);
instance.mInfoHandler.sendMessage(m);
}
}
}
public void handleMessage(Message msg) {
- DrmInfoEvent info = null;
+ DrmInfoEvent info = (DrmInfoEvent) msg.obj;
DrmErrorEvent error = null;
+ int uniqueId;
+ int eventType;
+ String message;
switch (msg.what) {
case InfoHandler.INFO_EVENT_TYPE:
- int uniqueId = msg.arg1;
- int infoType = msg.arg2;
- String message = msg.obj.toString();
+ uniqueId = info.getUniqueId();
+ eventType = info.getType();
+ message = info.getMessage();
- switch (infoType) {
+ switch (eventType) {
case DrmInfoEvent.TYPE_REMOVE_RIGHTS: {
try {
DrmUtils.removeFile(message);
} catch (IOException e) {
e.printStackTrace();
}
- info = new DrmInfoEvent(uniqueId, infoType, message);
break;
}
case DrmInfoEvent.TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT:
case DrmInfoEvent.TYPE_WAIT_FOR_RIGHTS:
case DrmInfoEvent.TYPE_ACCOUNT_ALREADY_REGISTERED:
case DrmInfoEvent.TYPE_RIGHTS_REMOVED: {
- info = new DrmInfoEvent(uniqueId, infoType, message);
break;
}
default:
- error = new DrmErrorEvent(uniqueId, infoType, message);
+ info = null;
+ error = new DrmErrorEvent(uniqueId, eventType, message);
break;
}
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;