Commit b85f8c14 authored by Suman Nelson Kancherla's avatar Suman Nelson Kancherla Committed by Commit Bot

Reland "Moved ArCore's module install to ArConsentDialog."

This is a reland of 29f357a0

Fixed crash caused by holding ScopedJavaLocalRef to ArConsentDialog
when it ought to be a ScopedJavaGlobalRef. Also, ArCoreInstallUtils
reference was uninitialized. While at it, removed all the declared
but not defined (nor used) methods in ArCoreDevice.

> Moved ArCore's module install to ArConsentDialog.
>
> This is a no-op. All that is done is to separate DFM and ArCore install
> into a separate class and call the install API from consent dialog instead
> of from ArCoreDevice.
>
> Bug: 907591
> Change-Id: I742db94cf896a4955d4de1938d7323d19a04664e
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1694401
> Reviewed-by: Michael Thiessen <mthiesse@chromium.org>
> Reviewed-by: Tibor Goldschwendt <tiborg@chromium.org>
> Reviewed-by: Piotr Bialecki <bialpio@chromium.org>
> Commit-Queue: Suman Kancherla <sumankancherla@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#676543}

Bug: 907591, 983512
Change-Id: I78f3229765f918a1ad574671c75bf471e023c641
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1700618Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Reviewed-by: default avatarTibor Goldschwendt <tiborg@chromium.org>
Commit-Queue: Suman Kancherla <sumankancherla@chromium.org>
Cr-Commit-Position: refs/heads/master@{#678332}
parent b990c23e
...@@ -73,7 +73,7 @@ public class ArConsentDialog implements ModalDialogProperties.Controller { ...@@ -73,7 +73,7 @@ public class ArConsentDialog implements ModalDialogProperties.Controller {
.with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true) .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true)
.build(); .build();
mModalDialogManager = activity.getModalDialogManager(); mModalDialogManager = activity.getModalDialogManager();
mModalDialogManager.showDialog(model, ModalDialogManager.ModalDialogType.APP); mModalDialogManager.showDialog(model, ModalDialogManager.ModalDialogType.TAB);
} }
@Override @Override
...@@ -142,6 +142,6 @@ public class ArConsentDialog implements ModalDialogProperties.Controller { ...@@ -142,6 +142,6 @@ public class ArConsentDialog implements ModalDialogProperties.Controller {
@NativeMethods @NativeMethods
/* package */ interface Natives { /* package */ interface Natives {
void onUserConsentResult(long nativeArcoreConsentPrompt, boolean allowed); void onUserConsentResult(long nativeArCoreConsentPrompt, boolean allowed);
} }
} }
...@@ -57,6 +57,11 @@ public class ArCoreInstallUtils implements ModuleInstallUi.FailureUiListener { ...@@ -57,6 +57,11 @@ public class ArCoreInstallUtils implements ModuleInstallUi.FailureUiListener {
return sArCoreInstance; return sArCoreInstance;
} }
@CalledByNative
private static ArCoreInstallUtils create(long nativeArCoreInstallUtils) {
return new ArCoreInstallUtils(nativeArCoreInstallUtils);
}
private ArCoreInstallUtils(long nativeArCoreInstallUtils) { private ArCoreInstallUtils(long nativeArCoreInstallUtils) {
mNativeArCoreInstallUtils = nativeArCoreInstallUtils; mNativeArCoreInstallUtils = nativeArCoreInstallUtils;
// Need to be called before trying to access the AR module. // Need to be called before trying to access the AR module.
......
...@@ -19,11 +19,11 @@ public class ArDelegateImpl implements ArDelegate { ...@@ -19,11 +19,11 @@ public class ArDelegateImpl implements ArDelegate {
@Override @Override
public void init() { public void init() {
ArCoreJavaUtils.installArCoreDeviceProviderFactory(); ArCoreInstallUtils.installArCoreDeviceProviderFactory();
} }
@Override @Override
public void registerOnResumeActivity(Activity activity) { public void registerOnResumeActivity(Activity activity) {
ArCoreJavaUtils.onResumeActivityWithNative(activity); ArCoreInstallUtils.onResumeActivityWithNative(activity);
} }
} }
...@@ -47,6 +47,7 @@ chrome_test_java_sources += tab_management_test_java_sources ...@@ -47,6 +47,7 @@ chrome_test_java_sources += tab_management_test_java_sources
if (enable_arcore) { if (enable_arcore) {
chrome_java_sources += [ chrome_java_sources += [
"java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java",
"java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java", "java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java",
"java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java", "java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java",
"java/src/org/chromium/chrome/browser/vr/ArCoreShim.java", "java/src/org/chromium/chrome/browser/vr/ArCoreShim.java",
......
...@@ -83,9 +83,9 @@ static_library("vr_android") { ...@@ -83,9 +83,9 @@ static_library("vr_android") {
"arcore_device/arcore_gl_thread.h", "arcore_device/arcore_gl_thread.h",
"arcore_device/arcore_impl.cc", "arcore_device/arcore_impl.cc",
"arcore_device/arcore_impl.h", "arcore_device/arcore_impl.h",
"arcore_device/arcore_install_utils.h",
"arcore_device/arcore_java_utils.cc", "arcore_device/arcore_java_utils.cc",
"arcore_device/arcore_java_utils.h", "arcore_device/arcore_java_utils.h",
"arcore_device/arcore_session_utils.h",
"arcore_device/arcore_shim.cc", "arcore_device/arcore_shim.cc",
"arcore_device/arcore_shim.h", "arcore_device/arcore_shim.h",
"arcore_device/type_converters.cc", "arcore_device/type_converters.cc",
...@@ -222,6 +222,7 @@ android_library("ar_java") { ...@@ -222,6 +222,7 @@ android_library("ar_java") {
if (enable_arcore) { if (enable_arcore) {
generate_jni("ar_jni_headers") { generate_jni("ar_jni_headers") {
sources = [ sources = [
"//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java",
"//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java", "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java",
] ]
} }
......
...@@ -4,13 +4,17 @@ ...@@ -4,13 +4,17 @@
#include "chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h" #include "chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h"
#include <memory>
#include <utility> #include <utility>
#include "base/bind.h" #include "base/bind.h"
#include "chrome/android/features/vr/jni_headers/ArConsentDialog_jni.h" #include "chrome/android/features/vr/jni_headers/ArConsentDialog_jni.h"
#include "chrome/browser/android/tab_android.h" #include "chrome/browser/android/tab_android.h"
#include "chrome/browser/android/vr/ar_jni_headers/ArCoreInstallUtils_jni.h"
#include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "device/vr/android/arcore/arcore_device_provider_factory.h"
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef; using base::android::ScopedJavaLocalRef;
...@@ -19,7 +23,21 @@ namespace vr { ...@@ -19,7 +23,21 @@ namespace vr {
namespace { namespace {
ArcoreConsentPrompt* g_instance = nullptr; class ArCoreDeviceProviderFactoryImpl
: public device::ArCoreDeviceProviderFactory {
public:
ArCoreDeviceProviderFactoryImpl() = default;
~ArCoreDeviceProviderFactoryImpl() override = default;
std::unique_ptr<device::VRDeviceProvider> CreateDeviceProvider() override;
private:
DISALLOW_COPY_AND_ASSIGN(ArCoreDeviceProviderFactoryImpl);
};
std::unique_ptr<device::VRDeviceProvider>
ArCoreDeviceProviderFactoryImpl::CreateDeviceProvider() {
return std::make_unique<device::ArCoreDeviceProvider>();
}
base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer( base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer(
int render_process_id, int render_process_id,
...@@ -44,42 +62,171 @@ base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer( ...@@ -44,42 +62,171 @@ base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer(
} // namespace } // namespace
ArcoreConsentPrompt::ArcoreConsentPrompt() = default; ArCoreConsentPrompt::ArCoreConsentPrompt() : weak_ptr_factory_(this) {}
ArCoreConsentPrompt::~ArCoreConsentPrompt() = default;
void ArCoreConsentPrompt::OnUserConsentResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_caller,
jboolean is_granted) {
jdelegate_.Reset();
if (!on_user_consent_callback_)
return;
if (!is_granted) {
CallDeferredUserConsentCallback(false);
return;
}
java_install_utils_ =
Java_ArCoreInstallUtils_create(env, reinterpret_cast<jlong>(this));
ArcoreConsentPrompt::~ArcoreConsentPrompt() = default; if (java_install_utils_.is_null()) {
CallDeferredUserConsentCallback(false);
return;
}
RequestArModule();
}
void ArcoreConsentPrompt::GetUserPermission( // static
void ArCoreConsentPrompt::ShowConsentPrompt(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
base::OnceCallback<void(bool)> response_callback) { base::OnceCallback<void(bool)> response_callback) {
on_user_consent_callback_ = std::move(response_callback); on_user_consent_callback_ = std::move(response_callback);
render_process_id_ = render_process_id;
render_frame_id_ = render_frame_id;
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> jdelegate = Java_ArConsentDialog_showDialog( jdelegate_ = Java_ArConsentDialog_showDialog(
env, reinterpret_cast<jlong>(this), env, reinterpret_cast<jlong>(this),
GetTabFromRenderer(render_process_id, render_frame_id)); GetTabFromRenderer(render_process_id_, render_frame_id_));
if (jdelegate.is_null()) { if (jdelegate_.is_null()) {
std::move(on_user_consent_callback_).Run(false); std::move(on_user_consent_callback_).Run(false);
} }
} }
void ArcoreConsentPrompt::OnUserConsentResult( bool ArCoreConsentPrompt::CanRequestInstallArModule() {
return Java_ArCoreInstallUtils_canRequestInstallArModule(
AttachCurrentThread(), java_install_utils_);
}
bool ArCoreConsentPrompt::ShouldRequestInstallArModule() {
return Java_ArCoreInstallUtils_shouldRequestInstallArModule(
AttachCurrentThread(), java_install_utils_);
}
void ArCoreConsentPrompt::RequestInstallArModule() {
Java_ArCoreInstallUtils_requestInstallArModule(
AttachCurrentThread(), java_install_utils_,
GetTabFromRenderer(render_process_id_, render_frame_id_));
}
bool ArCoreConsentPrompt::ShouldRequestInstallSupportedArCore() {
JNIEnv* env = AttachCurrentThread();
return Java_ArCoreInstallUtils_shouldRequestInstallSupportedArCore(
env, java_install_utils_);
}
void ArCoreConsentPrompt::RequestInstallSupportedArCore() {
DCHECK(ShouldRequestInstallSupportedArCore());
JNIEnv* env = AttachCurrentThread();
Java_ArCoreInstallUtils_requestInstallSupportedArCore(
env, java_install_utils_,
GetTabFromRenderer(render_process_id_, render_frame_id_));
}
void ArCoreConsentPrompt::OnRequestInstallArModuleResult(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_caller, const base::android::JavaParamRef<jobject>& obj,
jboolean is_granted) { bool success) {
DCHECK(on_user_consent_callback_); DVLOG(1) << __func__;
std::move(on_user_consent_callback_).Run(is_granted); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (on_request_ar_module_result_callback_) {
std::move(on_request_ar_module_result_callback_).Run(success);
}
} }
// static void ArCoreConsentPrompt::OnRequestInstallSupportedArCoreResult(
void ArcoreConsentPrompt::ShowConsentPrompt( JNIEnv* env,
int render_process_id, const base::android::JavaParamRef<jobject>& obj,
int render_frame_id, bool success) {
base::OnceCallback<void(bool)> response_callback) { DVLOG(1) << __func__;
if (!g_instance) DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
g_instance = new ArcoreConsentPrompt(); DCHECK(on_request_arcore_install_or_update_result_callback_);
g_instance->GetUserPermission(render_process_id, render_frame_id,
std::move(response_callback)); std::move(on_request_arcore_install_or_update_result_callback_).Run(success);
}
void ArCoreConsentPrompt::RequestArModule() {
DVLOG(1) << __func__;
if (ShouldRequestInstallArModule()) {
if (!CanRequestInstallArModule()) {
OnRequestArModuleResult(false);
return;
}
on_request_ar_module_result_callback_ = base::BindOnce(
&ArCoreConsentPrompt::OnRequestArModuleResult, GetWeakPtr());
RequestInstallArModule();
return;
}
OnRequestArModuleResult(true);
}
void ArCoreConsentPrompt::OnRequestArModuleResult(bool success) {
DVLOG(3) << __func__ << ": success=" << success;
if (!success) {
CallDeferredUserConsentCallback(false);
return;
}
RequestArCoreInstallOrUpdate();
}
void ArCoreConsentPrompt::RequestArCoreInstallOrUpdate() {
DVLOG(1) << __func__;
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!on_request_arcore_install_or_update_result_callback_);
if (ShouldRequestInstallSupportedArCore()) {
// ARCore is not installed or requires an update. Store the callback to be
// processed later once installation/update is complete or got cancelled.
on_request_arcore_install_or_update_result_callback_ = base::BindOnce(
&ArCoreConsentPrompt::OnRequestArCoreInstallOrUpdateResult,
GetWeakPtr());
RequestInstallSupportedArCore();
return;
}
OnRequestArCoreInstallOrUpdateResult(true);
}
void ArCoreConsentPrompt::OnRequestArCoreInstallOrUpdateResult(bool success) {
DVLOG(1) << __func__;
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
CallDeferredUserConsentCallback(success);
}
void ArCoreConsentPrompt::CallDeferredUserConsentCallback(
bool is_permission_granted) {
if (on_user_consent_callback_)
std::move(on_user_consent_callback_).Run(is_permission_granted);
}
static void JNI_ArCoreInstallUtils_InstallArCoreDeviceProviderFactory(
JNIEnv* env) {
device::ArCoreDeviceProviderFactory::Install(
std::make_unique<ArCoreDeviceProviderFactoryImpl>());
} }
} // namespace vr } // namespace vr
...@@ -7,33 +7,74 @@ ...@@ -7,33 +7,74 @@
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h" #include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "chrome/browser/vr/service/arcore_consent_prompt_interface.h" #include "chrome/browser/vr/service/arcore_consent_prompt_interface.h"
#include "chrome/browser/vr/vr_export.h" #include "chrome/browser/vr/vr_export.h"
namespace vr { namespace vr {
class VR_EXPORT ArcoreConsentPrompt : public ArcoreConsentPromptInterface { class VR_EXPORT ArCoreConsentPrompt : public ArCoreConsentPromptInterface {
public: public:
ArCoreConsentPrompt();
~ArCoreConsentPrompt();
// ArCoreConsentPromptInterface:
void ShowConsentPrompt( void ShowConsentPrompt(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
base::OnceCallback<void(bool)> response_callback) override; base::OnceCallback<void(bool)> response_callback) override;
ArcoreConsentPrompt(); // Called from Java end.
~ArcoreConsentPrompt();
// device::VrDevicePermissionProvider:
void GetUserPermission(int render_process_id,
int render_frame_id,
base::OnceCallback<void(bool)> response_callback);
void OnUserConsentResult(JNIEnv* env, void OnUserConsentResult(JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_caller, const base::android::JavaParamRef<jobject>& j_caller,
jboolean is_granted); jboolean is_granted);
void OnRequestInstallArModuleResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success);
void OnRequestInstallSupportedArCoreResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success);
private: private:
// Returns true if AR module installation is supported, false otherwise.
bool CanRequestInstallArModule();
// Returns true if AR module is not installed, false otherwise.
bool ShouldRequestInstallArModule();
void RequestInstallArModule();
bool ShouldRequestInstallSupportedArCore();
void RequestInstallSupportedArCore();
void RequestArModule();
void OnRequestArModuleResult(bool success);
void RequestArCoreInstallOrUpdate();
void OnRequestArCoreInstallOrUpdateResult(bool success);
void CallDeferredUserConsentCallback(bool is_permission_granted);
base::WeakPtr<ArCoreConsentPrompt> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
base::OnceCallback<void(bool)> on_user_consent_callback_; base::OnceCallback<void(bool)> on_user_consent_callback_;
base::OnceCallback<void(bool)> on_request_ar_module_result_callback_;
base::OnceCallback<void(bool)>
on_request_arcore_install_or_update_result_callback_;
base::android::ScopedJavaGlobalRef<jobject> jdelegate_;
int render_process_id_;
int render_frame_id_;
base::android::ScopedJavaGlobalRef<jobject> java_install_utils_;
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<ArCoreConsentPrompt> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ArCoreConsentPrompt);
}; };
} // namespace vr } // namespace vr
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
#include "chrome/browser/android/vr/arcore_device/arcore_gl.h" #include "chrome/browser/android/vr/arcore_device/arcore_gl.h"
#include "chrome/browser/android/vr/arcore_device/arcore_gl_thread.h" #include "chrome/browser/android/vr/arcore_device/arcore_gl_thread.h"
#include "chrome/browser/android/vr/arcore_device/arcore_impl.h" #include "chrome/browser/android/vr/arcore_device/arcore_impl.h"
#include "chrome/browser/android/vr/arcore_device/arcore_install_utils.h"
#include "chrome/browser/android/vr/arcore_device/arcore_java_utils.h" #include "chrome/browser/android/vr/arcore_device/arcore_java_utils.h"
#include "chrome/browser/android/vr/arcore_device/arcore_session_utils.h"
#include "chrome/browser/android/vr/mailbox_to_surface_bridge.h" #include "chrome/browser/android/vr/mailbox_to_surface_bridge.h"
#include "chrome/browser/permissions/permission_manager.h" #include "chrome/browser/permissions/permission_manager.h"
#include "chrome/browser/permissions/permission_result.h" #include "chrome/browser/permissions/permission_result.h"
...@@ -74,13 +74,13 @@ ArCoreDevice::ArCoreDevice( ...@@ -74,13 +74,13 @@ ArCoreDevice::ArCoreDevice(
std::unique_ptr<ArCoreFactory> arcore_factory, std::unique_ptr<ArCoreFactory> arcore_factory,
std::unique_ptr<ArImageTransportFactory> ar_image_transport_factory, std::unique_ptr<ArImageTransportFactory> ar_image_transport_factory,
std::unique_ptr<vr::MailboxToSurfaceBridge> mailbox_to_surface_bridge, std::unique_ptr<vr::MailboxToSurfaceBridge> mailbox_to_surface_bridge,
std::unique_ptr<vr::ArCoreInstallUtils> arcore_install_utils) std::unique_ptr<vr::ArCoreSessionUtils> arcore_session_utils)
: VRDeviceBase(mojom::XRDeviceId::ARCORE_DEVICE_ID), : VRDeviceBase(mojom::XRDeviceId::ARCORE_DEVICE_ID),
main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
arcore_factory_(std::move(arcore_factory)), arcore_factory_(std::move(arcore_factory)),
ar_image_transport_factory_(std::move(ar_image_transport_factory)), ar_image_transport_factory_(std::move(ar_image_transport_factory)),
mailbox_bridge_(std::move(mailbox_to_surface_bridge)), mailbox_bridge_(std::move(mailbox_to_surface_bridge)),
arcore_install_utils_(std::move(arcore_install_utils)), arcore_session_utils_(std::move(arcore_session_utils)),
session_state_(std::make_unique<ArCoreDevice::SessionState>()), session_state_(std::make_unique<ArCoreDevice::SessionState>()),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
// Ensure display_info_ is set to avoid crash in CallDeferredSessionCallback // Ensure display_info_ is set to avoid crash in CallDeferredSessionCallback
...@@ -97,25 +97,16 @@ ArCoreDevice::ArCoreDevice( ...@@ -97,25 +97,16 @@ ArCoreDevice::ArCoreDevice(
} }
ArCoreDevice::ArCoreDevice() ArCoreDevice::ArCoreDevice()
: ArCoreDevice( : ArCoreDevice(std::make_unique<ArCoreImplFactory>(),
std::make_unique<ArCoreImplFactory>(),
std::make_unique<ArImageTransportFactory>(), std::make_unique<ArImageTransportFactory>(),
std::make_unique<vr::MailboxToSurfaceBridge>(), std::make_unique<vr::MailboxToSurfaceBridge>(),
std::make_unique<vr::ArCoreJavaUtils>( std::make_unique<vr::ArCoreJavaUtils>()) {}
base::BindRepeating(
&ArCoreDevice::OnRequestInstallArModuleResult,
base::Unretained(this)), // unretained is fine for callbacks
// since ArCoreDevice owns the
// ArCoreJavaUtils instance
base::BindRepeating(
&ArCoreDevice::OnRequestInstallSupportedArCoreResult,
base::Unretained(this)))) {}
ArCoreDevice::~ArCoreDevice() { ArCoreDevice::~ArCoreDevice() {
CallDeferredRequestSessionCallback(/*success=*/false); CallDeferredRequestSessionCallback(/*success=*/false);
// The GL thread must be terminated since it uses our members. For example, // The GL thread must be terminated since it uses our members. For example,
// there might still be a posted Initialize() call in flight that uses // there might still be a posted Initialize() call in flight that uses
// arcore_install_utils_ and arcore_factory_. Ensure that the thread is // arcore_session_utils_ and arcore_factory_. Ensure that the thread is
// stopped before other members get destructed. Don't call Stop() here, // stopped before other members get destructed. Don't call Stop() here,
// destruction calls Stop() and doing so twice is illegal (null pointer // destruction calls Stop() and doing so twice is illegal (null pointer
// dereference). // dereference).
...@@ -190,15 +181,6 @@ void ArCoreDevice::RequestSession( ...@@ -190,15 +181,6 @@ void ArCoreDevice::RequestSession(
void ArCoreDevice::RequestSessionAfterInitialization(int render_process_id, void ArCoreDevice::RequestSessionAfterInitialization(int render_process_id,
int render_frame_id) { int render_frame_id) {
session_state_->start_immersive_activity_callback_ =
base::BindOnce(&ArCoreDevice::RequestArSessionConsent, GetWeakPtr(),
render_process_id, render_frame_id);
RequestArModule(render_process_id, render_frame_id);
}
void ArCoreDevice::RequestArSessionConsent(int render_process_id,
int render_frame_id) {
auto ready_callback = auto ready_callback =
base::BindRepeating(&ArCoreDevice::OnDrawingSurfaceReady, GetWeakPtr()); base::BindRepeating(&ArCoreDevice::OnDrawingSurfaceReady, GetWeakPtr());
auto touch_callback = auto touch_callback =
...@@ -206,7 +188,7 @@ void ArCoreDevice::RequestArSessionConsent(int render_process_id, ...@@ -206,7 +188,7 @@ void ArCoreDevice::RequestArSessionConsent(int render_process_id,
auto destroyed_callback = auto destroyed_callback =
base::BindOnce(&ArCoreDevice::OnDrawingSurfaceDestroyed, GetWeakPtr()); base::BindOnce(&ArCoreDevice::OnDrawingSurfaceDestroyed, GetWeakPtr());
arcore_install_utils_->RequestArSession( arcore_session_utils_->RequestArSession(
render_process_id, render_frame_id, std::move(ready_callback), render_process_id, render_frame_id, std::move(ready_callback),
std::move(touch_callback), std::move(destroyed_callback)); std::move(touch_callback), std::move(destroyed_callback));
} }
...@@ -250,7 +232,7 @@ void ArCoreDevice::OnSessionEnded() { ...@@ -250,7 +232,7 @@ void ArCoreDevice::OnSessionEnded() {
DVLOG(1) << __func__; DVLOG(1) << __func__;
// This may be a no-op in case it's destroyed already. // This may be a no-op in case it's destroyed already.
arcore_install_utils_->DestroyDrawingSurface(); arcore_session_utils_->DestroyDrawingSurface();
// The GL thread had initialized its context with a drawing_widget based on // The GL thread had initialized its context with a drawing_widget based on
// the ArImmersiveOverlay's Surface, and the one it has is no longer valid. // the ArImmersiveOverlay's Surface, and the one it has is no longer valid.
...@@ -276,88 +258,6 @@ void ArCoreDevice::OnSessionEnded() { ...@@ -276,88 +258,6 @@ void ArCoreDevice::OnSessionEnded() {
mailbox_bridge_ = nullptr; mailbox_bridge_ = nullptr;
} }
void ArCoreDevice::RequestArModule(int render_process_id, int render_frame_id) {
DVLOG(1) << __func__;
if (arcore_install_utils_->ShouldRequestInstallArModule()) {
if (!arcore_install_utils_->CanRequestInstallArModule()) {
OnRequestArModuleResult(render_process_id, render_frame_id, false);
return;
}
on_request_ar_module_result_callback_ =
base::BindOnce(&ArCoreDevice::OnRequestArModuleResult, GetWeakPtr(),
render_process_id, render_frame_id);
arcore_install_utils_->RequestInstallArModule(render_process_id,
render_frame_id);
return;
}
OnRequestArModuleResult(render_process_id, render_frame_id, true);
}
void ArCoreDevice::OnRequestArModuleResult(int render_process_id,
int render_frame_id,
bool success) {
DVLOG(3) << __func__ << ": success=" << success;
if (!success) {
CallDeferredRequestSessionCallback(/*success=*/false);
return;
}
RequestArCoreInstallOrUpdate(render_process_id, render_frame_id);
}
void ArCoreDevice::RequestArCoreInstallOrUpdate(int render_process_id,
int render_frame_id) {
DVLOG(1) << __func__;
DCHECK(IsOnMainThread());
DCHECK(!on_request_arcore_install_or_update_result_callback_);
if (arcore_install_utils_->ShouldRequestInstallSupportedArCore()) {
// ARCore is not installed or requires an update. Store the callback to be
// processed later once installation/update is complete or got cancelled.
on_request_arcore_install_or_update_result_callback_ = base::BindOnce(
&ArCoreDevice::OnRequestArCoreInstallOrUpdateResult, GetWeakPtr());
arcore_install_utils_->RequestInstallSupportedArCore(render_process_id,
render_frame_id);
return;
}
OnRequestArCoreInstallOrUpdateResult(true);
}
void ArCoreDevice::OnRequestArCoreInstallOrUpdateResult(bool success) {
DVLOG(1) << __func__;
DCHECK(IsOnMainThread());
if (!success) {
CallDeferredRequestSessionCallback(/*success=*/false);
return;
}
DCHECK(session_state_->start_immersive_activity_callback_);
std::move(session_state_->start_immersive_activity_callback_).Run();
}
void ArCoreDevice::OnRequestInstallArModuleResult(bool success) {
DVLOG(1) << __func__;
DCHECK(IsOnMainThread());
if (on_request_ar_module_result_callback_) {
std::move(on_request_ar_module_result_callback_).Run(success);
}
}
void ArCoreDevice::OnRequestInstallSupportedArCoreResult(bool success) {
DVLOG(1) << __func__;
DCHECK(IsOnMainThread());
DCHECK(on_request_arcore_install_or_update_result_callback_);
std::move(on_request_arcore_install_or_update_result_callback_).Run(success);
}
void ArCoreDevice::CallDeferredRequestSessionCallback(bool success) { void ArCoreDevice::CallDeferredRequestSessionCallback(bool success) {
DVLOG(1) << __func__ << " success=" << success; DVLOG(1) << __func__ << " success=" << success;
DCHECK(IsOnMainThread()); DCHECK(IsOnMainThread());
...@@ -430,7 +330,7 @@ void ArCoreDevice::RequestArCoreGlInitialization( ...@@ -430,7 +330,7 @@ void ArCoreDevice::RequestArCoreGlInitialization(
DCHECK(IsOnMainThread()); DCHECK(IsOnMainThread());
DCHECK(session_state_->is_arcore_gl_thread_initialized_); DCHECK(session_state_->is_arcore_gl_thread_initialized_);
if (!arcore_install_utils_->EnsureLoaded()) { if (!arcore_session_utils_->EnsureLoaded()) {
DLOG(ERROR) << "ARCore was not loaded properly."; DLOG(ERROR) << "ARCore was not loaded properly.";
OnArCoreGlInitializationComplete(false); OnArCoreGlInitializationComplete(false);
return; return;
...@@ -445,7 +345,7 @@ void ArCoreDevice::RequestArCoreGlInitialization( ...@@ -445,7 +345,7 @@ void ArCoreDevice::RequestArCoreGlInitialization(
PostTaskToGlThread(base::BindOnce( PostTaskToGlThread(base::BindOnce(
&ArCoreGl::Initialize, &ArCoreGl::Initialize,
session_state_->arcore_gl_thread_->GetArCoreGl()->GetWeakPtr(), session_state_->arcore_gl_thread_->GetArCoreGl()->GetWeakPtr(),
arcore_install_utils_.get(), arcore_factory_.get(), drawing_widget, arcore_session_utils_.get(), arcore_factory_.get(), drawing_widget,
frame_size, rotation, frame_size, rotation,
CreateMainThreadCallback(base::BindOnce( CreateMainThreadCallback(base::BindOnce(
&ArCoreDevice::OnArCoreGlInitializationComplete, GetWeakPtr())))); &ArCoreDevice::OnArCoreGlInitializationComplete, GetWeakPtr()))));
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
namespace vr { namespace vr {
class MailboxToSurfaceBridge; class MailboxToSurfaceBridge;
class ArCoreInstallUtils; class ArCoreSessionUtils;
} // namespace vr } // namespace vr
namespace device { namespace device {
...@@ -37,7 +37,7 @@ class ArCoreDevice : public VRDeviceBase { ...@@ -37,7 +37,7 @@ class ArCoreDevice : public VRDeviceBase {
std::unique_ptr<ArCoreFactory> arcore_factory, std::unique_ptr<ArCoreFactory> arcore_factory,
std::unique_ptr<ArImageTransportFactory> ar_image_transport_factory, std::unique_ptr<ArImageTransportFactory> ar_image_transport_factory,
std::unique_ptr<vr::MailboxToSurfaceBridge> mailbox_to_surface_bridge, std::unique_ptr<vr::MailboxToSurfaceBridge> mailbox_to_surface_bridge,
std::unique_ptr<vr::ArCoreInstallUtils> arcore_install_utils); std::unique_ptr<vr::ArCoreSessionUtils> arcore_session_utils);
ArCoreDevice(); ArCoreDevice();
~ArCoreDevice() override; ~ArCoreDevice() override;
...@@ -51,9 +51,6 @@ class ArCoreDevice : public VRDeviceBase { ...@@ -51,9 +51,6 @@ class ArCoreDevice : public VRDeviceBase {
} }
private: private:
void OnRequestInstallArModuleResult(bool success);
void OnRequestInstallSupportedArCoreResult(bool success);
// VRDeviceBase implementation // VRDeviceBase implementation
void OnMailboxBridgeReady(); void OnMailboxBridgeReady();
void OnArCoreGlThreadInitialized(); void OnArCoreGlThreadInitialized();
...@@ -88,21 +85,11 @@ class ArCoreDevice : public VRDeviceBase { ...@@ -88,21 +85,11 @@ class ArCoreDevice : public VRDeviceBase {
void RequestSessionAfterInitialization(int render_process_id, void RequestSessionAfterInitialization(int render_process_id,
int render_frame_id); int render_frame_id);
void RequestArModule(int render_process_id, int render_frame_id);
void OnRequestArModuleResult(int render_process_id,
int render_frame_id,
bool success);
void RequestArCoreInstallOrUpdate(int render_process_id, int render_frame_id);
void OnRequestArCoreInstallOrUpdateResult(bool success);
void CallDeferredRequestSessionCallback(bool success); void CallDeferredRequestSessionCallback(bool success);
void OnRequestAndroidCameraPermissionResult(
base::OnceCallback<void(bool)> callback,
bool was_android_camera_permission_granted);
void RequestArCoreGlInitialization(gfx::AcceleratedWidget window, void RequestArCoreGlInitialization(gfx::AcceleratedWidget window,
int rotation, int rotation,
const gfx::Size& size); const gfx::Size& size);
void OnArCoreGlInitializationComplete(bool success); void OnArCoreGlInitializationComplete(bool success);
void RequestArSessionConsent(int render_process_id, int render_frame_id);
void OnCreateSessionCallback( void OnCreateSessionCallback(
mojom::XRRuntime::RequestSessionCallback deferred_callback, mojom::XRRuntime::RequestSessionCallback deferred_callback,
...@@ -115,7 +102,7 @@ class ArCoreDevice : public VRDeviceBase { ...@@ -115,7 +102,7 @@ class ArCoreDevice : public VRDeviceBase {
std::unique_ptr<ArCoreFactory> arcore_factory_; std::unique_ptr<ArCoreFactory> arcore_factory_;
std::unique_ptr<ArImageTransportFactory> ar_image_transport_factory_; std::unique_ptr<ArImageTransportFactory> ar_image_transport_factory_;
std::unique_ptr<vr::MailboxToSurfaceBridge> mailbox_bridge_; std::unique_ptr<vr::MailboxToSurfaceBridge> mailbox_bridge_;
std::unique_ptr<vr::ArCoreInstallUtils> arcore_install_utils_; std::unique_ptr<vr::ArCoreSessionUtils> arcore_session_utils_;
// Encapsulates data with session lifetime. // Encapsulates data with session lifetime.
struct SessionState { struct SessionState {
......
...@@ -11,9 +11,8 @@ ...@@ -11,9 +11,8 @@
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "chrome/browser/android/vr/arcore_device/ar_image_transport.h" #include "chrome/browser/android/vr/arcore_device/ar_image_transport.h"
#include "chrome/browser/android/vr/arcore_device/arcore_device.h"
#include "chrome/browser/android/vr/arcore_device/arcore_gl.h" #include "chrome/browser/android/vr/arcore_device/arcore_gl.h"
#include "chrome/browser/android/vr/arcore_device/arcore_install_utils.h" #include "chrome/browser/android/vr/arcore_device/arcore_session_utils.h"
#include "chrome/browser/android/vr/arcore_device/fake_arcore.h" #include "chrome/browser/android/vr/arcore_device/fake_arcore.h"
#include "chrome/browser/android/vr/mailbox_to_surface_bridge.h" #include "chrome/browser/android/vr/mailbox_to_surface_bridge.h"
#include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/public/mojom/vr_service.mojom.h"
...@@ -82,18 +81,10 @@ class StubMailboxToSurfaceBridge : public vr::MailboxToSurfaceBridge { ...@@ -82,18 +81,10 @@ class StubMailboxToSurfaceBridge : public vr::MailboxToSurfaceBridge {
base::OnceClosure callback_; base::OnceClosure callback_;
}; };
class StubArCoreInstallUtils : public vr::ArCoreInstallUtils { class StubArCoreSessionUtils : public vr::ArCoreSessionUtils {
public: public:
StubArCoreInstallUtils() = default; StubArCoreSessionUtils() = default;
bool CanRequestInstallArModule() override { return false; }
bool ShouldRequestInstallArModule() override { return false; }
void RequestInstallArModule(int render_process_id,
int render_frame_id) override {}
bool ShouldRequestInstallSupportedArCore() override { return false; }
void RequestInstallSupportedArCore(int render_process_id,
int render_frame_id) override {}
void RequestArSession( void RequestArSession(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
...@@ -148,7 +139,7 @@ class ArCoreDeviceTest : public testing::Test { ...@@ -148,7 +139,7 @@ class ArCoreDeviceTest : public testing::Test {
} }
StubMailboxToSurfaceBridge* bridge; StubMailboxToSurfaceBridge* bridge;
StubArCoreInstallUtils* install_utils; StubArCoreSessionUtils* session_utils;
mojom::XRFrameDataProviderPtr frame_provider; mojom::XRFrameDataProviderPtr frame_provider;
mojom::XREnvironmentIntegrationProviderAssociatedPtr environment_provider; mojom::XREnvironmentIntegrationProviderAssociatedPtr environment_provider;
std::unique_ptr<base::RunLoop> run_loop; std::unique_ptr<base::RunLoop> run_loop;
...@@ -159,13 +150,13 @@ class ArCoreDeviceTest : public testing::Test { ...@@ -159,13 +150,13 @@ class ArCoreDeviceTest : public testing::Test {
std::unique_ptr<StubMailboxToSurfaceBridge> bridge_ptr = std::unique_ptr<StubMailboxToSurfaceBridge> bridge_ptr =
std::make_unique<StubMailboxToSurfaceBridge>(); std::make_unique<StubMailboxToSurfaceBridge>();
bridge = bridge_ptr.get(); bridge = bridge_ptr.get();
std::unique_ptr<StubArCoreInstallUtils> install_utils_ptr = std::unique_ptr<StubArCoreSessionUtils> session_utils_ptr =
std::make_unique<StubArCoreInstallUtils>(); std::make_unique<StubArCoreSessionUtils>();
install_utils = install_utils_ptr.get(); session_utils = session_utils_ptr.get();
device_ = std::make_unique<ArCoreDevice>( device_ = std::make_unique<ArCoreDevice>(
std::make_unique<FakeArCoreFactory>(), std::make_unique<FakeArCoreFactory>(),
std::make_unique<StubArImageTransportFactory>(), std::move(bridge_ptr), std::make_unique<StubArImageTransportFactory>(), std::move(bridge_ptr),
std::move(install_utils_ptr)); std::move(session_utils_ptr));
} }
void CreateSession() { void CreateSession() {
...@@ -245,7 +236,7 @@ TEST_F(ArCoreDeviceTest, RequestHitTest) { ...@@ -245,7 +236,7 @@ TEST_F(ArCoreDeviceTest, RequestHitTest) {
base::BindOnce(callback, &hit_results)); base::BindOnce(callback, &hit_results));
// Have to get frame data to trigger the hit-test calculation. // Have to get frame data to trigger the hit-test calculation.
GetFrameData(); GetFrameData();
EXPECT_TRUE(hit_results.size() > 0); EXPECT_FALSE(hit_results.empty());
} }
} // namespace device } // namespace device
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "base/trace_event/traced_value.h" #include "base/trace_event/traced_value.h"
#include "chrome/browser/android/vr/arcore_device/ar_image_transport.h" #include "chrome/browser/android/vr/arcore_device/ar_image_transport.h"
#include "chrome/browser/android/vr/arcore_device/arcore_impl.h" #include "chrome/browser/android/vr/arcore_device/arcore_impl.h"
#include "chrome/browser/android/vr/arcore_device/arcore_install_utils.h" #include "chrome/browser/android/vr/arcore_device/arcore_session_utils.h"
#include "chrome/browser/android/vr/web_xr_presentation_state.h" #include "chrome/browser/android/vr/web_xr_presentation_state.h"
#include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/public/mojom/vr_service.mojom.h"
#include "gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.h" #include "gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.h"
...@@ -119,7 +119,7 @@ ArCoreGl::~ArCoreGl() { ...@@ -119,7 +119,7 @@ ArCoreGl::~ArCoreGl() {
CloseBindingsIfOpen(); CloseBindingsIfOpen();
} }
void ArCoreGl::Initialize(vr::ArCoreInstallUtils* install_utils, void ArCoreGl::Initialize(vr::ArCoreSessionUtils* session_utils,
ArCoreFactory* arcore_factory, ArCoreFactory* arcore_factory,
gfx::AcceleratedWidget drawing_widget, gfx::AcceleratedWidget drawing_widget,
const gfx::Size& frame_size, const gfx::Size& frame_size,
...@@ -141,7 +141,7 @@ void ArCoreGl::Initialize(vr::ArCoreInstallUtils* install_utils, ...@@ -141,7 +141,7 @@ void ArCoreGl::Initialize(vr::ArCoreInstallUtils* install_utils,
// Get the activity context. // Get the activity context.
base::android::ScopedJavaLocalRef<jobject> application_context = base::android::ScopedJavaLocalRef<jobject> application_context =
install_utils->GetApplicationContext(); session_utils->GetApplicationContext();
if (!application_context.obj()) { if (!application_context.obj()) {
DLOG(ERROR) << "Unable to retrieve the Java context/activity!"; DLOG(ERROR) << "Unable to retrieve the Java context/activity!";
std::move(callback).Run(false); std::move(callback).Run(false);
......
...@@ -36,7 +36,7 @@ class GLSurface; ...@@ -36,7 +36,7 @@ class GLSurface;
} // namespace gl } // namespace gl
namespace vr { namespace vr {
class ArCoreInstallUtils; class ArCoreSessionUtils;
class WebXrPresentationState; class WebXrPresentationState;
} // namespace vr } // namespace vr
...@@ -63,7 +63,7 @@ class ArCoreGl : public mojom::XRFrameDataProvider, ...@@ -63,7 +63,7 @@ class ArCoreGl : public mojom::XRFrameDataProvider,
explicit ArCoreGl(std::unique_ptr<ArImageTransport> ar_image_transport); explicit ArCoreGl(std::unique_ptr<ArImageTransport> ar_image_transport);
~ArCoreGl() override; ~ArCoreGl() override;
void Initialize(vr::ArCoreInstallUtils* install_utils, void Initialize(vr::ArCoreSessionUtils* session_utils,
ArCoreFactory* arcore_factory, ArCoreFactory* arcore_factory,
gfx::AcceleratedWidget drawing_widget, gfx::AcceleratedWidget drawing_widget,
const gfx::Size& frame_size, const gfx::Size& frame_size,
......
...@@ -10,11 +10,9 @@ ...@@ -10,11 +10,9 @@
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "chrome/browser/android/tab_android.h" #include "chrome/browser/android/tab_android.h"
#include "chrome/browser/android/vr/ar_jni_headers/ArCoreJavaUtils_jni.h" #include "chrome/browser/android/vr/ar_jni_headers/ArCoreJavaUtils_jni.h"
#include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h"
#include "chrome/browser/android/vr/arcore_device/arcore_shim.h" #include "chrome/browser/android/vr/arcore_device/arcore_shim.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "device/vr/android/arcore/arcore_device_provider_factory.h"
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef; using base::android::ScopedJavaLocalRef;
...@@ -23,29 +21,9 @@ namespace vr { ...@@ -23,29 +21,9 @@ namespace vr {
namespace { namespace {
class ArCoreDeviceProviderFactoryImpl
: public device::ArCoreDeviceProviderFactory {
public:
ArCoreDeviceProviderFactoryImpl() = default;
~ArCoreDeviceProviderFactoryImpl() override = default;
std::unique_ptr<device::VRDeviceProvider> CreateDeviceProvider() override;
private:
DISALLOW_COPY_AND_ASSIGN(ArCoreDeviceProviderFactoryImpl);
};
std::unique_ptr<device::VRDeviceProvider>
ArCoreDeviceProviderFactoryImpl::CreateDeviceProvider() {
return std::make_unique<device::ArCoreDeviceProvider>();
}
} // namespace } // namespace
ArCoreJavaUtils::ArCoreJavaUtils( ArCoreJavaUtils::ArCoreJavaUtils() {
base::RepeatingCallback<void(bool)> ar_module_installation_callback,
base::RepeatingCallback<void(bool)> ar_core_installation_callback)
: ar_module_installation_callback_(ar_module_installation_callback),
ar_core_installation_callback_(ar_core_installation_callback) {
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
if (!env) if (!env)
return; return;
...@@ -61,46 +39,6 @@ ArCoreJavaUtils::~ArCoreJavaUtils() { ...@@ -61,46 +39,6 @@ ArCoreJavaUtils::~ArCoreJavaUtils() {
Java_ArCoreJavaUtils_onNativeDestroy(env, j_arcore_java_utils_); Java_ArCoreJavaUtils_onNativeDestroy(env, j_arcore_java_utils_);
} }
void ArCoreJavaUtils::OnRequestInstallSupportedArCoreResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success) {
ar_core_installation_callback_.Run(success);
}
bool ArCoreJavaUtils::CanRequestInstallArModule() {
return Java_ArCoreJavaUtils_canRequestInstallArModule(AttachCurrentThread(),
j_arcore_java_utils_);
}
bool ArCoreJavaUtils::ShouldRequestInstallArModule() {
return Java_ArCoreJavaUtils_shouldRequestInstallArModule(
AttachCurrentThread(), j_arcore_java_utils_);
}
void ArCoreJavaUtils::RequestInstallArModule(int render_process_id,
int render_frame_id) {
Java_ArCoreJavaUtils_requestInstallArModule(
AttachCurrentThread(), j_arcore_java_utils_,
getTabFromRenderer(render_process_id, render_frame_id));
}
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());
JNIEnv* env = AttachCurrentThread();
Java_ArCoreJavaUtils_requestInstallSupportedArCore(
env, j_arcore_java_utils_,
getTabFromRenderer(render_process_id, render_frame_id));
}
void ArCoreJavaUtils::RequestArSession( void ArCoreJavaUtils::RequestArSession(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
...@@ -161,13 +99,6 @@ void ArCoreJavaUtils::OnDrawingSurfaceDestroyed( ...@@ -161,13 +99,6 @@ void ArCoreJavaUtils::OnDrawingSurfaceDestroyed(
} }
} }
void ArCoreJavaUtils::OnRequestInstallArModuleResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success) {
ar_module_installation_callback_.Run(success);
}
bool ArCoreJavaUtils::EnsureLoaded() { bool ArCoreJavaUtils::EnsureLoaded() {
DCHECK(vr::IsArCoreSupported()); DCHECK(vr::IsArCoreSupported());
...@@ -206,10 +137,4 @@ base::android::ScopedJavaLocalRef<jobject> ArCoreJavaUtils::getTabFromRenderer( ...@@ -206,10 +137,4 @@ base::android::ScopedJavaLocalRef<jobject> ArCoreJavaUtils::getTabFromRenderer(
return j_tab_android; return j_tab_android;
} }
static void JNI_ArCoreJavaUtils_InstallArCoreDeviceProviderFactory(
JNIEnv* env) {
device::ArCoreDeviceProviderFactory::Install(
std::make_unique<ArCoreDeviceProviderFactoryImpl>());
}
} // namespace vr } // namespace vr
...@@ -11,39 +11,26 @@ ...@@ -11,39 +11,26 @@
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "chrome/browser/android/vr/arcore_device/arcore_install_utils.h" #include "chrome/browser/android/vr/arcore_device/arcore_session_utils.h"
namespace vr { namespace vr {
class ArCoreJavaUtils : public ArCoreInstallUtils { class ArCoreJavaUtils : public ArCoreSessionUtils {
public: public:
explicit ArCoreJavaUtils( ArCoreJavaUtils();
base::RepeatingCallback<void(bool)> ar_module_installation_callback,
base::RepeatingCallback<void(bool)> ar_core_installation_callback);
~ArCoreJavaUtils() override; ~ArCoreJavaUtils() override;
bool ShouldRequestInstallArModule() override;
bool CanRequestInstallArModule() override; // ArCoreSessionUtils:
void RequestInstallArModule(int render_process_id,
int render_frame_id) override;
bool ShouldRequestInstallSupportedArCore() override;
void RequestInstallSupportedArCore(int render_process_id,
int render_frame_id) override;
void RequestArSession(int render_process_id, void RequestArSession(int render_process_id,
int render_frame_id, int render_frame_id,
SurfaceReadyCallback ready_callback, SurfaceReadyCallback ready_callback,
SurfaceTouchCallback touch_callback, SurfaceTouchCallback touch_callback,
SurfaceDestroyedCallback destroyed_callback) override; SurfaceDestroyedCallback destroyed_callback) override;
void DestroyDrawingSurface() override; void DestroyDrawingSurface() override;
bool EnsureLoaded() override;
base::android::ScopedJavaLocalRef<jobject> GetApplicationContext() override;
// Methods called from the Java side. // Methods called from the Java side.
void OnRequestInstallArModuleResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success);
void OnRequestInstallSupportedArCoreResult(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool success);
void OnDrawingSurfaceReady( void OnDrawingSurfaceReady(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
...@@ -60,17 +47,11 @@ class ArCoreJavaUtils : public ArCoreInstallUtils { ...@@ -60,17 +47,11 @@ class ArCoreJavaUtils : public ArCoreInstallUtils {
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
bool EnsureLoaded() override;
base::android::ScopedJavaLocalRef<jobject> GetApplicationContext() override;
private: private:
base::android::ScopedJavaLocalRef<jobject> getTabFromRenderer( base::android::ScopedJavaLocalRef<jobject> getTabFromRenderer(
int render_process_id, int render_process_id,
int render_frame_id); int render_frame_id);
base::RepeatingCallback<void(bool)> ar_module_installation_callback_;
base::RepeatingCallback<void(bool)> ar_core_installation_callback_;
base::android::ScopedJavaGlobalRef<jobject> j_arcore_java_utils_; base::android::ScopedJavaGlobalRef<jobject> j_arcore_java_utils_;
SurfaceReadyCallback surface_ready_callback_; SurfaceReadyCallback surface_ready_callback_;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_INSTALL_UTILS_H_ #ifndef CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_SESSION_UTILS_H_
#define CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_INSTALL_UTILS_H_ #define CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_SESSION_UTILS_H_
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
...@@ -30,18 +30,9 @@ using SurfaceTouchCallback = ...@@ -30,18 +30,9 @@ using SurfaceTouchCallback =
base::RepeatingCallback<void(bool touching, const gfx::PointF& location)>; base::RepeatingCallback<void(bool touching, const gfx::PointF& location)>;
using SurfaceDestroyedCallback = base::OnceClosure; using SurfaceDestroyedCallback = base::OnceClosure;
class ArCoreInstallUtils { class ArCoreSessionUtils {
public: public:
virtual ~ArCoreInstallUtils() = default; virtual ~ArCoreSessionUtils() = default;
// Returns true if AR module installation is supported, false otherwise.
virtual bool CanRequestInstallArModule() = 0;
// Returns true if AR module is not installed, false otherwise.
virtual bool ShouldRequestInstallArModule() = 0;
virtual void RequestInstallArModule(int render_process_id,
int render_frame_id) = 0;
virtual bool ShouldRequestInstallSupportedArCore() = 0;
virtual void RequestInstallSupportedArCore(int render_process_id,
int render_frame_id) = 0;
virtual bool EnsureLoaded() = 0; virtual bool EnsureLoaded() = 0;
virtual base::android::ScopedJavaLocalRef<jobject> virtual base::android::ScopedJavaLocalRef<jobject>
GetApplicationContext() = 0; GetApplicationContext() = 0;
...@@ -56,4 +47,4 @@ class ArCoreInstallUtils { ...@@ -56,4 +47,4 @@ class ArCoreInstallUtils {
} // namespace vr } // namespace vr
#endif // CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_INSTALL_UTILS_H_ #endif // CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_SESSION_UTILS_H_
...@@ -88,7 +88,7 @@ std::unique_ptr<VrModuleProvider> VrModuleProviderFactory::CreateModuleProvider( ...@@ -88,7 +88,7 @@ std::unique_ptr<VrModuleProvider> VrModuleProviderFactory::CreateModuleProvider(
static void JNI_VrModuleProvider_Init(JNIEnv* env) { static void JNI_VrModuleProvider_Init(JNIEnv* env) {
GvrConsentHelper::SetInstance(std::make_unique<vr::GvrConsentHelperImpl>()); GvrConsentHelper::SetInstance(std::make_unique<vr::GvrConsentHelperImpl>());
#if BUILDFLAG(ENABLE_ARCORE) #if BUILDFLAG(ENABLE_ARCORE)
ArcoreConsentPromptInterface::SetInstance(new ArcoreConsentPrompt()); ArCoreConsentPromptInterface::SetInstance(new ArCoreConsentPrompt());
#endif #endif
} }
......
...@@ -7,17 +7,17 @@ ...@@ -7,17 +7,17 @@
namespace vr { namespace vr {
namespace { namespace {
ArcoreConsentPromptInterface* g_arcore_consent_prompt = nullptr; ArCoreConsentPromptInterface* g_arcore_consent_prompt = nullptr;
} }
// static // static
void ArcoreConsentPromptInterface::SetInstance( void ArCoreConsentPromptInterface::SetInstance(
ArcoreConsentPromptInterface* instance) { ArCoreConsentPromptInterface* instance) {
g_arcore_consent_prompt = instance; g_arcore_consent_prompt = instance;
} }
// static // static
ArcoreConsentPromptInterface* ArcoreConsentPromptInterface::GetInstance() { ArCoreConsentPromptInterface* ArCoreConsentPromptInterface::GetInstance() {
return g_arcore_consent_prompt; return g_arcore_consent_prompt;
} }
......
...@@ -12,10 +12,10 @@ namespace vr { ...@@ -12,10 +12,10 @@ namespace vr {
// TODO(crbug.com/968233): Unify consent flow. // TODO(crbug.com/968233): Unify consent flow.
// This class solves layering problem until the above bug gets fixed. // This class solves layering problem until the above bug gets fixed.
class VR_EXPORT ArcoreConsentPromptInterface { class VR_EXPORT ArCoreConsentPromptInterface {
public: public:
static void SetInstance(ArcoreConsentPromptInterface*); static void SetInstance(ArCoreConsentPromptInterface*);
static ArcoreConsentPromptInterface* GetInstance(); static ArCoreConsentPromptInterface* GetInstance();
virtual void ShowConsentPrompt( virtual void ShowConsentPrompt(
int render_process_id, int render_process_id,
......
...@@ -205,12 +205,14 @@ void XRDeviceImpl::RequestSession( ...@@ -205,12 +205,14 @@ void XRDeviceImpl::RequestSession(
#if BUILDFLAG(ENABLE_ARCORE) #if BUILDFLAG(ENABLE_ARCORE)
if (!render_frame_host_) { if (!render_frame_host_) {
// Reject promise. // Reject promise.
std::move(callback).Run(nullptr); std::move(callback).Run(
device::mojom::RequestSessionResult::NewFailureReason(
device::mojom::RequestSessionError::INVALID_CLIENT));
} else { } else {
if (IsXrDeviceConsentPromptDisabledForTesting()) { if (IsXrDeviceConsentPromptDisabledForTesting()) {
DoRequestSession(std::move(options), std::move(callback)); DoRequestSession(std::move(options), std::move(callback));
} else { } else {
ArcoreConsentPromptInterface::GetInstance()->ShowConsentPrompt( ArCoreConsentPromptInterface::GetInstance()->ShowConsentPrompt(
render_frame_host_->GetProcess()->GetID(), render_frame_host_->GetProcess()->GetID(),
render_frame_host_->GetRoutingID(), render_frame_host_->GetRoutingID(),
base::BindOnce(&XRDeviceImpl::OnConsentResult, base::BindOnce(&XRDeviceImpl::OnConsentResult,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment