/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <android/log.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include "webrtc/video_engine/test/auto_test/android/jni/org_webrtc_vieautotest_vie_autotest.h"

#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_android.h"

#define WEBRTC_LOG_TAG "*WEBRTCN*"

// VideoEngine data struct
typedef struct
{
    JavaVM* jvm;
} VideoEngineData;

// Global variables
JavaVM* webrtcGlobalVM;

// Global variables visible in this file
static VideoEngineData vieData;

// "Local" functions (i.e. not Java accessible)
#define WEBRTC_TRACE_MAX_MESSAGE_SIZE 1024

static bool GetSubAPIs(VideoEngineData& vieData);
static bool ReleaseSubAPIs(VideoEngineData& vieData);

//
// General functions
//

// JNI_OnLoad
jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) {
  if (!vm) {
    __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
                        "JNI_OnLoad did not receive a valid VM pointer");
    return -1;
  }

  JNIEnv* env;
  if (JNI_OK != vm->GetEnv(reinterpret_cast<void**> (&env),
                           JNI_VERSION_1_4)) {
    __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
                        "JNI_OnLoad could not get JNI env");
    return -1;
  }

  // Init ViE data
  vieData.jvm = vm;

  return JNI_VERSION_1_4;
}

// Class:     org_webrtc_vieautotest_ViEAutotest
// Method:    RunTest
// Signature: (IILandroid/opengl/GLSurfaceView;Landroid/opengl/GLSurfaceView;)I
JNIEXPORT jint JNICALL
Java_org_webrtc_vieautotest_ViEAutotest_RunTest__IILandroid_opengl_GLSurfaceView_2Landroid_opengl_GLSurfaceView_2(
    JNIEnv* env,
    jobject context,
    jint testType,
    jint subtestType,
    jobject glView1,
    jobject glView2)
{
  int numErrors = -1;
  numErrors = ViEAutoTestAndroid::RunAutotest(testType, subtestType, glView1,
                                              glView2, vieData.jvm, env,
                                              context);
  return numErrors;
}

// Class:     org_webrtc_vieautotest_ViEAutotest
// Method:    RunTest
// Signature: (IILandroid/view/SurfaceView;Landroid/view/SurfaceView;)I
JNIEXPORT jint JNICALL
Java_org_webrtc_vieautotest_ViEAutotest_RunTest__IILandroid_view_SurfaceView_2Landroid_view_SurfaceView_2(
    JNIEnv* env,
    jobject context,
    jint testType,
    jint subtestType,
    jobject surfaceHolder1,
    jobject surfaceHolder2)
{
  int numErrors = -1;
  numErrors = ViEAutoTestAndroid::RunAutotest(testType, subtestType,
                                              surfaceHolder1, surfaceHolder2,
                                              vieData.jvm, env, context);
  return numErrors;
}

//
//local function
//

bool GetSubAPIs(VideoEngineData& vieData) {
  bool retVal = true;
  //vieData.base = ViEBase::GetInterface(vieData.vie);
  //if (vieData.base == NULL)
  {
    __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
                        "Could not get Base API");
    retVal = false;
  }
  return retVal;
}

bool ReleaseSubAPIs(VideoEngineData& vieData) {
  bool releaseOk = true;
  //if (vieData.base)
  {
    //if (vieData.base->Release() != 0)
    if (false) {
      __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
                          "Release base sub-API failed");
      releaseOk = false;
    }
    else {
      //vieData.base = NULL;
    }
  }

  return releaseOk;
}
