blob: ff13ffae3b8f0196ea10ec246c10a8a7697ce719 [file] [log] [blame]
// Copyright 2021 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/autofill_assistant/starter_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "chrome/android/features/autofill_assistant/jni_headers_public/Starter_jni.h"
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#include "chrome/common/channel_info.h"
#include "components/autofill_assistant/browser/script_parameters.h"
#include "components/autofill_assistant/browser/website_login_manager_impl.h"
#include "components/version_info/channel.h"
#include "url/gurl.h"
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
namespace autofill_assistant {
static jlong JNI_Starter_FromWebContents(
JNIEnv* env,
const JavaParamRef<jobject>& jcaller,
const JavaParamRef<jobject>& jweb_contents) {
auto* web_contents = content::WebContents::FromJavaWebContents(jweb_contents);
CHECK(web_contents);
StarterAndroid::CreateForWebContents(web_contents);
auto* tab_helper_android = StarterAndroid::FromWebContents(web_contents);
return reinterpret_cast<intptr_t>(tab_helper_android);
}
StarterAndroid::StarterAndroid(content::WebContents* web_contents)
: web_contents_(web_contents),
website_login_manager_(std::make_unique<WebsiteLoginManagerImpl>(
ChromePasswordManagerClient::FromWebContents(web_contents),
web_contents)) {}
StarterAndroid::~StarterAndroid() = default;
void StarterAndroid::Attach(JNIEnv* env, const JavaParamRef<jobject>& jcaller) {
Detach(env, jcaller);
java_object_ = base::android::ScopedJavaGlobalRef<jobject>(jcaller);
starter_ = std::make_unique<Starter>(web_contents_, this);
}
void StarterAndroid::Detach(JNIEnv* env, const JavaParamRef<jobject>& jcaller) {
java_object_ = nullptr;
starter_.reset();
}
WebsiteLoginManager* StarterAndroid::GetWebsiteLoginManager() const {
return website_login_manager_.get();
}
version_info::Channel StarterAndroid::GetChannel() const {
return chrome::GetChannel();
}
bool StarterAndroid::GetFeatureModuleInstalled() const {
return Java_Starter_getFeatureModuleInstalled(
base::android::AttachCurrentThread());
}
void StarterAndroid::InstallFeatureModule(
bool show_ui,
base::OnceCallback<void(Metrics::FeatureModuleInstallation result)>
callback) {
DCHECK(java_object_);
feature_module_installation_finished_callback_ = std::move(callback);
Java_Starter_installFeatureModule(base::android::AttachCurrentThread(),
java_object_, show_ui);
}
void StarterAndroid::OnFeatureModuleInstalled(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jint result) {
DCHECK(feature_module_installation_finished_callback_);
std::move(feature_module_installation_finished_callback_)
.Run(static_cast<Metrics::FeatureModuleInstallation>(result));
}
void StarterAndroid::OnInteractabilityChanged(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jboolean is_interactable) {
if (!is_interactable || !starter_) {
return;
}
// The tab has become interactable again. Users may have adjusted their
// settings, so we need to notify the starter.
starter_->OnSettingsChanged(GetProactiveHelpSettingEnabled(),
GetMakeSearchesAndBrowsingBetterEnabled());
}
bool StarterAndroid::GetIsFirstTimeUser() const {
return Java_Starter_getIsFirstTimeUser(base::android::AttachCurrentThread());
}
void StarterAndroid::SetIsFirstTimeUser(bool first_time_user) {
Java_Starter_setIsFirstTimeUser(base::android::AttachCurrentThread(),
first_time_user);
}
bool StarterAndroid::GetOnboardingAccepted() const {
return Java_Starter_getOnboardingAccepted(
base::android::AttachCurrentThread());
}
void StarterAndroid::SetOnboardingAccepted(bool accepted) {
Java_Starter_setOnboardingAccepted(base::android::AttachCurrentThread(),
accepted);
}
void StarterAndroid::ShowOnboarding(
bool use_dialog_onboarding,
const TriggerContext& trigger_context,
base::OnceCallback<void(bool shown, OnboardingResult result)> callback) {
DCHECK(java_object_);
if (onboarding_finished_callback_) {
DCHECK(false) << "onboarding requested while already being shown";
std::move(callback).Run(false, OnboardingResult::DISMISSED);
return;
}
onboarding_finished_callback_ = std::move(callback);
std::vector<std::string> keys;
std::vector<std::string> values;
for (const auto& param : trigger_context.GetScriptParameters().ToProto()) {
keys.emplace_back(param.name());
values.emplace_back(param.value());
}
JNIEnv* env = base::android::AttachCurrentThread();
Java_Starter_showOnboarding(env, java_object_, use_dialog_onboarding,
base::android::ConvertUTF8ToJavaString(
env, trigger_context.GetInitialUrl()),
base::android::ConvertUTF8ToJavaString(
env, trigger_context.GetExperimentIds()),
base::android::ToJavaArrayOfStrings(env, keys),
base::android::ToJavaArrayOfStrings(env, values));
}
void StarterAndroid::OnOnboardingFinished(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jboolean shown,
jint result) {
DCHECK(onboarding_finished_callback_);
std::move(onboarding_finished_callback_)
.Run(shown, static_cast<OnboardingResult>(result));
}
bool StarterAndroid::GetProactiveHelpSettingEnabled() const {
return Java_Starter_getProactiveHelpSettingEnabled(
base::android::AttachCurrentThread());
}
void StarterAndroid::SetProactiveHelpSettingEnabled(bool enabled) {
Java_Starter_setProactiveHelpSettingEnabled(
base::android::AttachCurrentThread(), enabled);
}
bool StarterAndroid::GetMakeSearchesAndBrowsingBetterEnabled() const {
return Java_Starter_getMakeSearchesAndBrowsingBetterSettingEnabled(
base::android::AttachCurrentThread());
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(StarterAndroid)
} // namespace autofill_assistant