// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// 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.

#include "starboard/android/shared/jni_env_ext.h"

#include <android/native_activity.h>
#include <jni.h>

#include <algorithm>
#include <string>

#include "starboard/thread.h"

namespace {

SbThreadLocalKey g_tls_key = kSbThreadLocalKeyInvalid;
JavaVM* g_vm = NULL;
jobject g_application_class_loader = NULL;
jobject g_starboard_bridge = NULL;

void Destroy(void* value) {
  // OnThreadShutdown() must be called on each thread before it is destroyed.
  SB_DCHECK(value == NULL);
}

}  // namespace

namespace starboard {
namespace android {
namespace shared {

// Warning: use __android_log_write for logging in this file.

// static
void JniEnvExt::Initialize(JniEnvExt* env, jobject starboard_bridge) {
  SB_DCHECK(g_tls_key == kSbThreadLocalKeyInvalid);
  g_tls_key = SbThreadCreateLocalKey(Destroy);

  SB_DCHECK(g_vm == NULL);
  env->GetJavaVM(&g_vm);

  SB_DCHECK(g_application_class_loader == NULL);
  g_application_class_loader =
      env->ConvertLocalRefToGlobalRef(env->CallObjectMethodOrAbort(
          env->GetObjectClass(starboard_bridge), "getClassLoader",
          "()Ljava/lang/ClassLoader;"));

  SB_DCHECK(g_starboard_bridge == NULL);
  g_starboard_bridge = env->NewGlobalRef(starboard_bridge);
}

// static
void JniEnvExt::OnThreadShutdown() {
  // We must call DetachCurrentThread() before exiting, if we have ever
  // previously called AttachCurrentThread() on it.
  //   http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html
  if (SbThreadGetLocalValue(g_tls_key)) {
    g_vm->DetachCurrentThread();
    SbThreadSetLocalValue(g_tls_key, NULL);
  }
}

JniEnvExt* JniEnvExt::Get() {
  JNIEnv* env;
  if (JNI_OK != g_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6)) {
    // Tell the JVM our thread name so it doesn't change it.
    char thread_name[16];
    SbThreadGetName(thread_name, sizeof(thread_name));
    JavaVMAttachArgs args{JNI_VERSION_1_6, thread_name, NULL};
    g_vm->AttachCurrentThread(&env, &args);
    // We don't use the value, but any non-NULL means we have to detach.
    SbThreadSetLocalValue(g_tls_key, env);
  }
  // The downcast is safe since we only add methods, not fields.
  return static_cast<JniEnvExt*>(env);
}

jobject JniEnvExt::GetStarboardBridge() {
  return g_starboard_bridge;
}

jclass JniEnvExt::FindClassExtOrAbort(const char* name) {
  // Convert the JNI FindClass name with slashes to the "binary name" with dots
  // for ClassLoader.loadClass().
  ::std::string dot_name = name;
  ::std::replace(dot_name.begin(), dot_name.end(), '/', '.');
  jstring jname = NewStringUTF(dot_name.c_str());
  AbortOnException();
  jobject clazz_obj =
      CallObjectMethodOrAbort(g_application_class_loader, "loadClass",
                              "(Ljava/lang/String;)Ljava/lang/Class;", jname);
  DeleteLocalRef(jname);
  return static_cast<jclass>(clazz_obj);
}

}  // namespace shared
}  // namespace android
}  // namespace starboard
