blob: 39f71a09530ffb6490c7651706262e8ecc115755 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/vr/arcore_device/arcore_java_utils.h"
#include "base/android/jni_string.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/android/vr/arcore_device/arcore_device.h"
#include "chrome/browser/android/vr/arcore_device/arcore_shim.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "jni/ArCoreJavaUtils_jni.h"
using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;
namespace vr {
ArCoreJavaUtils::ArCoreJavaUtils(device::ArCoreDevice* arcore_device)
: arcore_device_(arcore_device) {
DCHECK(arcore_device_);
JNIEnv* env = AttachCurrentThread();
if (!env)
return;
ScopedJavaLocalRef<jobject> j_arcore_java_utils =
Java_ArCoreJavaUtils_create(env, (jlong)this);
if (j_arcore_java_utils.is_null())
return;
j_arcore_java_utils_.Reset(j_arcore_java_utils);
}
ArCoreJavaUtils::~ArCoreJavaUtils() {
JNIEnv* env = AttachCurrentThread();
Java_ArCoreJavaUtils_onNativeDestroy(env, j_arcore_java_utils_);
}
void ArCoreJavaUtils::OnRequestInstallSupportedArCoreCanceled(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
// TODO(crbug.com/893348): don't reach back into arcore device like this.
arcore_device_->OnRequestInstallSupportedArCoreCanceled();
}
bool ArCoreJavaUtils::ShouldRequestInstallArModule() {
return Java_ArCoreJavaUtils_shouldRequestInstallArModule(
AttachCurrentThread(), j_arcore_java_utils_);
}
void ArCoreJavaUtils::RequestInstallArModule() {
Java_ArCoreJavaUtils_requestInstallArModule(AttachCurrentThread(),
j_arcore_java_utils_);
}
bool ArCoreJavaUtils::ShouldRequestInstallSupportedArCore() {
JNIEnv* env = AttachCurrentThread();
return Java_ArCoreJavaUtils_shouldRequestInstallSupportedArCore(
env, j_arcore_java_utils_);
}
void ArCoreJavaUtils::RequestInstallSupportedArCore(int render_process_id,
int render_frame_id) {
DCHECK(ShouldRequestInstallSupportedArCore());
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
DCHECK(render_frame_host);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents);
TabAndroid* tab_android = TabAndroid::FromWebContents(web_contents);
DCHECK(tab_android);
base::android::ScopedJavaLocalRef<jobject> j_tab_android =
tab_android->GetJavaObject();
DCHECK(!j_tab_android.is_null());
JNIEnv* env = AttachCurrentThread();
Java_ArCoreJavaUtils_requestInstallSupportedArCore(env, j_arcore_java_utils_,
j_tab_android);
}
void ArCoreJavaUtils::OnRequestInstallArModuleResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success) {
// TODO(crbug.com/893348): don't reach back into arcore device like this.
arcore_device_->OnRequestInstallArModuleResult(success);
}
bool ArCoreJavaUtils::EnsureLoaded() {
JNIEnv* env = AttachCurrentThread();
if (!Java_ArCoreJavaUtils_shouldLoadArCoreSdk(env))
return false;
// TODO(crbug.com/884780): Allow loading the ARCore shim by name instead of by
// absolute path.
ScopedJavaLocalRef<jstring> java_path =
Java_ArCoreJavaUtils_getArCoreShimLibraryPath(env);
return LoadArCoreSdk(base::android::ConvertJavaStringToUTF8(env, java_path));
}
ScopedJavaLocalRef<jobject> ArCoreJavaUtils::GetApplicationContext() {
JNIEnv* env = AttachCurrentThread();
return Java_ArCoreJavaUtils_getApplicationContext(env);
}
} // namespace vr