10e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick/*
20e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * Copyright 2017, The Android Open Source Project
30e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick *
40e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * Licensed under the Apache License, Version 2.0 (the "License");
50e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * you may not use this file except in compliance with the License.
60e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * You may obtain a copy of the License at
70e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick *
80e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick *     http://www.apache.org/licenses/LICENSE-2.0
90e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick *
100e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * Unless required by applicable law or agreed to in writing, software
110e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * distributed under the License is distributed on an "AS IS" BASIS,
120e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * See the License for the specific language governing permissions and
140e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick * limitations under the License.
150e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick */
160e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
170e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <android_runtime/AndroidRuntime.h>
180e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <jni.h>
1960cc6c03ff489169a6337f770ff06197ed17263cSteven Moreland#include <nativehelper/JNIHelp.h>
200e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
210e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include "android_media_MediaMetricsJNI.h"
220e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <media/MediaAnalyticsItem.h>
230e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
240e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
250e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essicknamespace android {
260e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
2710353e36018224b86ef2918d1d68107459d445cfRay Essick// place the attributes into a java PersistableBundle object
280e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essickjobject MediaMetricsJNI::writeMetricsToBundle(JNIEnv* env, MediaAnalyticsItem *item, jobject mybundle) {
290e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
3010353e36018224b86ef2918d1d68107459d445cfRay Essick    jclass clazzBundle = env->FindClass("android/os/PersistableBundle");
310e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    if (clazzBundle==NULL) {
3210353e36018224b86ef2918d1d68107459d445cfRay Essick        ALOGD("can't find android/os/PersistableBundle");
330e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        return NULL;
340e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    }
350e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // sometimes the caller provides one for us to fill
360e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    if (mybundle == NULL) {
370e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        // create the bundle
380e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        jmethodID constructID = env->GetMethodID(clazzBundle, "<init>", "()V");
390e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        mybundle = env->NewObject(clazzBundle, constructID);
400e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        if (mybundle == NULL) {
410e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick            return NULL;
420e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        }
430e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    }
440e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
450e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // grab methods that we can invoke
460e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    jmethodID setIntID = env->GetMethodID(clazzBundle, "putInt", "(Ljava/lang/String;I)V");
470e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    jmethodID setLongID = env->GetMethodID(clazzBundle, "putLong", "(Ljava/lang/String;J)V");
480e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    jmethodID setDoubleID = env->GetMethodID(clazzBundle, "putDouble", "(Ljava/lang/String;D)V");
490e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    jmethodID setStringID = env->GetMethodID(clazzBundle, "putString", "(Ljava/lang/String;Ljava/lang/String;)V");
500e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
510e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // env, class, method, {parms}
520e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    //env->CallVoidMethod(env, mybundle, setIntID, jstr, jint);
530e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
540e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // iterate through my attributes
550e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // -- get name, get type, get value
560e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // -- insert appropriately into the bundle
570e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    for (size_t i = 0 ; i < item->mPropCount; i++ ) {
5810353e36018224b86ef2918d1d68107459d445cfRay Essick            MediaAnalyticsItem::Prop *prop = &item->mProps[i];
590e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick            // build the key parameter from prop->mName
600e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick            jstring keyName = env->NewStringUTF(prop->mName);
610e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick            // invoke the appropriate method to insert
620e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick            switch (prop->mType) {
630e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                case MediaAnalyticsItem::kTypeInt32:
640e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    env->CallVoidMethod(mybundle, setIntID,
650e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                                        keyName, (jint) prop->u.int32Value);
660e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    break;
670e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                case MediaAnalyticsItem::kTypeInt64:
680e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    env->CallVoidMethod(mybundle, setLongID,
690e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                                        keyName, (jlong) prop->u.int64Value);
700e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    break;
710e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                case MediaAnalyticsItem::kTypeDouble:
720e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    env->CallVoidMethod(mybundle, setDoubleID,
730e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                                        keyName, (jdouble) prop->u.doubleValue);
740e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    break;
750e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                case MediaAnalyticsItem::kTypeCString:
760e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    env->CallVoidMethod(mybundle, setStringID, keyName,
770e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                                        env->NewStringUTF(prop->u.CStringValue));
780e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                    break;
790e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                default:
800e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                        ALOGE("to_String bad item type: %d for %s",
810e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                              prop->mType, prop->mName);
820e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick                        break;
830e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick            }
840e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    }
850e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
860e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    return mybundle;
870e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick}
880e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
890e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick};  // namespace android
900e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
91