/*
 * Copyright 2014, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "ActivityRecognitionHardware"

#include <jni.h>
#include <JNIHelp.h>

#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>

#include "activity_recognition.h"


// keep base connection data from the HAL
static activity_recognition_module_t* sModule = NULL;
static activity_recognition_device_t* sDevice = NULL;

static jobject sCallbacksObject = NULL;
static jmethodID sOnActivityChanged = NULL;


static void check_and_clear_exceptions(JNIEnv* env, const char* method_name) {
    if (!env->ExceptionCheck()) {
        return;
    }

    ALOGE("An exception was thrown by '%s'.", method_name);
    LOGE_EX(env);
    env->ExceptionClear();
}

static jint attach_thread(JNIEnv** env) {
    JavaVM* java_vm = android::AndroidRuntime::getJavaVM();
    assert(java_vm != NULL);

    JavaVMAttachArgs args = {
        JNI_VERSION_1_6,
        "ActivityRecognition HAL callback.",
        NULL /* group */
    };

    jint result = java_vm->AttachCurrentThread(env, &args);
    if (result != JNI_OK) {
        ALOGE("Attach to callback thread failed: %d", result);
    }

    return result;
}

static jint detach_thread() {
    JavaVM* java_vm = android::AndroidRuntime::getJavaVM();
    assert(java_vm != NULL);

    jint result = java_vm->DetachCurrentThread();
    if (result != JNI_OK) {
        ALOGE("Detach of callback thread failed: %d", result);
    }

    return result;
}


/**
 * Handle activity recognition events from HAL.
 */
static void activity_callback(
        const activity_recognition_callback_procs_t* procs,
        const activity_event_t* events,
        int count) {
    if (sOnActivityChanged == NULL) {
        ALOGE("Dropping activity_callback because onActivityChanged handler is null.");
        return;
    }

    if (events == NULL || count <= 0) {
        ALOGE("Invalid activity_callback. Count: %d, Events: %p", count, events);
        return;
    }

    JNIEnv* env = NULL;
    int result = attach_thread(&env);
    if (result != JNI_OK) {
        ALOGE("Unable to attach thread with JNI.");
        return;
    }

    jclass event_class =
            env->FindClass("android/hardware/location/ActivityRecognitionHardware$Event");
    jmethodID event_ctor = env->GetMethodID(event_class, "<init>", "()V");
    jfieldID activity_field = env->GetFieldID(event_class, "activity", "I");
    jfieldID type_field = env->GetFieldID(event_class, "type", "I");
    jfieldID timestamp_field = env->GetFieldID(event_class, "timestamp", "J");

    jobjectArray events_array = env->NewObjectArray(count, event_class, NULL);
    for (int i = 0; i < count; ++i) {
        const activity_event_t* event = &events[i];
        jobject event_object = env->NewObject(event_class, event_ctor);
        env->SetIntField(event_object, activity_field, event->activity);
        env->SetIntField(event_object, type_field, event->event_type);
        env->SetLongField(event_object, timestamp_field, event->timestamp);
        env->SetObjectArrayElement(events_array, i, event_object);
        env->DeleteLocalRef(event_object);
    }

    env->CallVoidMethod(sCallbacksObject, sOnActivityChanged, events_array);
    check_and_clear_exceptions(env, __FUNCTION__);

    // TODO: ideally we'd let the HAL register the callback thread only once
    detach_thread();
}

activity_recognition_callback_procs_t sCallbacks {
    activity_callback,
};

/**
 * Initializes the ActivityRecognitionHardware class from the native side.
 */
static void class_init(JNIEnv* env, jclass clazz) {
    // open the hardware module
    int error = hw_get_module(
            ACTIVITY_RECOGNITION_HARDWARE_MODULE_ID,
            (const hw_module_t**) &sModule);
    if (error != 0) {
        ALOGE("Error hw_get_module: %d", error);
        return;
    }

    error = activity_recognition_open(&sModule->common, &sDevice);
    if (error != 0) {
        ALOGE("Error opening device: %d", error);
        return;
    }

    // get references to the Java provided methods
    sOnActivityChanged = env->GetMethodID(
            clazz,
            "onActivityChanged",
            "([Landroid/hardware/location/ActivityRecognitionHardware$Event;)V");
    if (sOnActivityChanged == NULL) {
        ALOGE("Error obtaining ActivityChanged callback.");
        return;
    }

    // register callbacks
    sDevice->register_activity_callback(sDevice, &sCallbacks);
}

/**
 * Initializes and connect the callbacks handlers in the HAL.
 */
static void initialize(JNIEnv* env, jobject obj) {
    if (sCallbacksObject == NULL) {
        sCallbacksObject = env->NewGlobalRef(obj);
    } else {
        ALOGD("Callbacks Object was already initialized.");
    }

    if (sDevice != NULL) {
        sDevice->register_activity_callback(sDevice, &sCallbacks);
    } else {
        ALOGD("ActivityRecognition device not found during initialization.");
    }
}

/**
 * De-initializes the ActivityRecognitionHardware from the native side.
 */
static void release(JNIEnv* env, jobject obj) {
    if (sDevice == NULL) {
        return;
    }

    int error = activity_recognition_close(sDevice);
    if (error != 0) {
        ALOGE("Error closing device: %d", error);
        return;
    }
}

/**
 * Returns true if ActivityRecognition HAL is supported, false otherwise.
 */
static jboolean is_supported(JNIEnv* env, jclass clazz) {
    if (sModule != NULL && sDevice != NULL ) {
        return JNI_TRUE;
    }
    return JNI_FALSE;
}

/**
 * Gets an array representing the supported activities.
 */
static jobjectArray get_supported_activities(JNIEnv* env, jobject obj) {
    if (sModule == NULL) {
        return NULL;
    }

    char const* const* list = NULL;
    int list_size = sModule->get_supported_activities_list(sModule, &list);
    if (list_size <= 0 || list == NULL) {
        return NULL;
    }

    jclass string_class = env->FindClass("java/lang/String");
    if (string_class == NULL) {
        ALOGE("Unable to find String class for supported activities.");
        return NULL;
    }

    jobjectArray string_array = env->NewObjectArray(list_size, string_class, NULL);
    if (string_array == NULL) {
        ALOGE("Unable to create string array for supported activities.");
        return NULL;
    }

    for (int i = 0; i < list_size; ++i) {
        const char* string_ptr = const_cast<const char*>(list[i]);
        jstring string = env->NewStringUTF(string_ptr);
        env->SetObjectArrayElement(string_array, i, string);
    }

    return string_array;
}

/**
 * Enables a given activity event to be actively monitored.
 */
static int enable_activity_event(
        JNIEnv* env,
        jobject obj,
        jint activity_handle,
        jint event_type,
        jlong report_latency_ns) {
    return sDevice->enable_activity_event(
            sDevice,
            (uint32_t) activity_handle,
            (uint32_t) event_type,
            report_latency_ns);
}

/**
 * Disables a given activity event from being actively monitored.
 */
static int disable_activity_event(
        JNIEnv* env,
        jobject obj,
        jint activity_handle,
        jint event_type) {
    return sDevice->disable_activity_event(
            sDevice,
            (uint32_t) activity_handle,
            (uint32_t) event_type);
}

/**
 * Request flush for al batch buffers.
 */
static int flush(JNIEnv* env, jobject obj) {
    return sDevice->flush(sDevice);
}


static JNINativeMethod sMethods[] = {
    // {"name", "signature", (void*) functionPointer },
    { "nativeClassInit", "()V", (void*) class_init },
    { "nativeInitialize", "()V", (void*) initialize },
    { "nativeRelease", "()V", (void*) release },
    { "nativeIsSupported", "()Z", (void*) is_supported },
    { "nativeGetSupportedActivities", "()[Ljava/lang/String;", (void*) get_supported_activities },
    { "nativeEnableActivityEvent", "(IIJ)I", (void*) enable_activity_event },
    { "nativeDisableActivityEvent", "(II)I", (void*) disable_activity_event },
    { "nativeFlush", "()I", (void*) flush },
};

/**
 * Registration method invoked in JNI load.
 */
int register_android_hardware_location_ActivityRecognitionHardware(JNIEnv* env) {
    return jniRegisterNativeMethods(
            env,
            "android/hardware/location/ActivityRecognitionHardware",
            sMethods,
            NELEM(sMethods));
}
