android_media_MediaMetricsJNI.cpp revision 0e0fee1e3a04023c9ec122d3bd7da54e9565c3e7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2017, The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood#include <android_runtime/AndroidRuntime.h>
18bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#include <jni.h>
19bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#include <JNIHelp.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21a90c54c90e1cb668cd74f218370f868763bbd009Wei Wang#include "android_media_MediaMetricsJNI.h"
229748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi#include <media/MediaAnalyticsItem.h>
239748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi
249748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// place the attributes into a java Bundle object
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// decide whether this is appropriately scoped here.
29b4d5a72691846bce5779cc3db056f09a5031d7ccMathias Agopian// if we do it somewhere else, we have to figure a "give me all the attrs"
30bb94f3107ea567ddf67bed4617c3bcbd602538dfElliott Hughes// access to the inside of MediaAnalyticsItem
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject MediaMetricsJNI::writeMetricsToBundle(JNIEnv* env, MediaAnalyticsItem *item, jobject mybundle) {
32bd9a08d318f94a3d0b2f8f9d7b16b10736d80c5cJason parks
33bd9a08d318f94a3d0b2f8f9d7b16b10736d80c5cJason parks    jclass clazzBundle = env->FindClass("android/os/Bundle");
34b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian    if (clazzBundle==NULL) {
35ac31a3b8b09aba1c5ebc73f0cf65cac2210aa6b7Mathias Agopian        ALOGD("can't find android/os/Bundle");
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sometimes the caller provides one for us to fill
39a90c54c90e1cb668cd74f218370f868763bbd009Wei Wang    if (mybundle == NULL) {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // create the bundle
41b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park        jmethodID constructID = env->GetMethodID(clazzBundle, "<init>", "()V");
42b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park        mybundle = env->NewObject(clazzBundle, constructID);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mybundle == NULL) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
480b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown    // grab methods that we can invoke
498335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian    jmethodID setIntID = env->GetMethodID(clazzBundle, "putInt", "(Ljava/lang/String;I)V");
508335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian    jmethodID setLongID = env->GetMethodID(clazzBundle, "putLong", "(Ljava/lang/String;J)V");
51000479f9e325b4e426a67033abd92d47da412725Mathias Agopian    jmethodID setDoubleID = env->GetMethodID(clazzBundle, "putDouble", "(Ljava/lang/String;D)V");
52cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe    jmethodID setStringID = env->GetMethodID(clazzBundle, "putString", "(Ljava/lang/String;Ljava/lang/String;)V");
53cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe
54cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe    // env, class, method, {parms}
55eece0dda56ae29fff6e9003df97594f6ac50b6e2Derek Sollenberger    //env->CallVoidMethod(env, mybundle, setIntID, jstr, jint);
568898c16987831db47542a92151ed7209e22268aaMatt Sarett
57eece0dda56ae29fff6e9003df97594f6ac50b6e2Derek Sollenberger    // iterate through my attributes
58cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe    // -- get name, get type, get value
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -- insert appropriately into the bundle
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i = 0 ; i < item->mPropCount; i++ ) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	    MediaAnalyticsItem::Prop *prop = &item->mProps[i];
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // build the key parameter from prop->mName
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jstring keyName = env->NewStringUTF(prop->mName);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // invoke the appropriate method to insert
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (prop->mType) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MediaAnalyticsItem::kTypeInt32:
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    env->CallVoidMethod(mybundle, setIntID,
689748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                                        keyName, (jint) prop->u.int32Value);
699748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                    break;
709748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                case MediaAnalyticsItem::kTypeInt64:
71b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park                    env->CallVoidMethod(mybundle, setLongID,
72b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park                                        keyName, (jlong) prop->u.int64Value);
73b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park                    break;
749748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                case MediaAnalyticsItem::kTypeDouble:
759748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                    env->CallVoidMethod(mybundle, setDoubleID,
769748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                                        keyName, (jdouble) prop->u.doubleValue);
770e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi                    break;
780e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi                case MediaAnalyticsItem::kTypeCString:
799748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                    env->CallVoidMethod(mybundle, setStringID, keyName,
809748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                                        env->NewStringUTF(prop->u.CStringValue));
819748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                    break;
829748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi                default:
839071db1d370573bad80f127898e34066f56c4e64Damien Bargiacchi                        ALOGE("to_String bad item type: %d for %s",
849676281c4f0b34707e34cf9d2f5a866f1979c405Damien Bargiacchi                              prop->mType, prop->mName);
859676281c4f0b34707e34cf9d2f5a866f1979c405Damien Bargiacchi                        break;
860e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi            }
870e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi    }
880e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi
890e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi    return mybundle;
900e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi}
910e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi
920e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi};  // namespace android
939748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi
94afd31e08299008fdc5c2813f21b2573f29dc53dfNarayan Kamath