blob: c620406c901c6ac9a11600660c25aa31c6b7cfbe [file] [log] [blame]
// Copyright 2019 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/gvr_consent_helper_impl.h"
#include <utility>
#include "base/android/jni_string.h"
#include "base/callback.h"
#include "base/macros.h"
#include "chrome/android/features/vr/jni_headers/VrConsentDialog_jni.h"
#include "chrome/browser/android/tab_android.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;
namespace vr {
namespace {
base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer(
int render_process_id,
int render_frame_id) {
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());
return j_tab_android;
}
} // namespace
GvrConsentHelperImpl::GvrConsentHelperImpl() {}
GvrConsentHelperImpl::~GvrConsentHelperImpl() = default;
void GvrConsentHelperImpl::PromptUserAndGetConsent(
int render_process_id,
int render_frame_id,
XrConsentPromptLevel consent_level,
OnUserConsentCallback on_user_consent_callback) {
DCHECK(!on_user_consent_callback_);
on_user_consent_callback_ = std::move(on_user_consent_callback);
render_process_id_ = render_process_id;
render_frame_id_ = render_frame_id;
consent_level_ = consent_level;
JNIEnv* env = AttachCurrentThread();
jdelegate_ = Java_VrConsentDialog_promptForUserConsent(
env, reinterpret_cast<jlong>(this),
GetTabFromRenderer(render_process_id_, render_frame_id_),
static_cast<jint>(consent_level));
if (jdelegate_.is_null()) {
std::move(on_user_consent_callback_).Run(consent_level_, false);
return;
}
}
void GvrConsentHelperImpl::OnUserConsentResult(
JNIEnv* env,
jboolean is_granted) {
jdelegate_.Reset();
if (!on_user_consent_callback_)
return;
if (!is_granted) {
std::move(on_user_consent_callback_).Run(consent_level_, false);
return;
}
// Now that we know consent was granted, check if the VRModule is installed,
// and install it if not. Treat failing to install the module the same as if
// consent were denied.
if (!module_delegate_) {
module_delegate_ = VrModuleProviderFactory::CreateModuleProvider(
render_process_id_, render_frame_id_);
}
if (!module_delegate_) {
std::move(on_user_consent_callback_).Run(consent_level_, false);
return;
}
if (!module_delegate_->ModuleInstalled()) {
module_delegate_->InstallModule(base::BindOnce(
&GvrConsentHelperImpl::OnModuleInstalled, weak_ptr_.GetWeakPtr()));
return;
}
std::move(on_user_consent_callback_).Run(consent_level_, true);
}
void GvrConsentHelperImpl::OnModuleInstalled(bool success) {
if (!success) {
std::move(on_user_consent_callback_).Run(consent_level_, false);
return;
}
std::move(on_user_consent_callback_).Run(consent_level_, true);
}
} // namespace vr