blob: ab2c836567c25d4b89bd986566b01c25c2dfad5d [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/ui/android/passwords/onboarding_dialog_view.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/string16.h"
#include "chrome/android/chrome_jni_headers/OnboardingDialogBridge_jni.h"
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/password_manager/core/browser/password_form_manager_for_ui.h"
#include "components/password_manager/core/browser/password_manager_metrics_util.h"
#include "components/password_manager/core/browser/password_manager_onboarding.h"
#include "components/password_manager/core/common/password_manager_features.h"
#include "components/password_manager/core/common/password_manager_pref_names.h"
#include "components/prefs/pref_service.h"
#include "ui/android/window_android.h"
#include "ui/base/l10n/l10n_util.h"
namespace {
// Story centered on your password being available on multiple devices.
constexpr char kStoryB[] = "access";
// Story centered on password safety and leak detection.
constexpr char kStoryC[] = "safety";
// Retrieve the title and explanation strings that will be used for the
// dialog from the |story| parameter of the |kPasswordManagerOnboardingAndroid|
// feature, which will be provided when running experiments.
// The first story is run if the parameter isn't provided.
std::pair<base::string16, base::string16> GetOnboardingTitleAndDetails() {
std::string story = base::GetFieldTrialParamValueByFeature(
password_manager::features::kPasswordManagerOnboardingAndroid, "story");
// By default the story centered on not having to remember your password is
// shown.
base::string16 onboarding_title =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_TITLE_A);
base::string16 onboarding_details =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_DETAILS_A);
if (story == kStoryB) {
onboarding_title =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_TITLE_B);
onboarding_details =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_DETAILS_B);
} else if (story == kStoryC) {
onboarding_title =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_TITLE_C);
onboarding_details =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_DETAILS_C);
}
return {onboarding_title, onboarding_details};
}
} // namespace
OnboardingDialogView::OnboardingDialogView(
ChromePasswordManagerClient* client,
std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save)
: form_to_save_(std::move(form_to_save)), client_(client) {}
OnboardingDialogView::~OnboardingDialogView() {
Java_OnboardingDialogBridge_destroy(base::android::AttachCurrentThread(),
java_object_);
}
void OnboardingDialogView::Show() {
JNIEnv* env = base::android::AttachCurrentThread();
ui::WindowAndroid* window_android =
client_->web_contents()->GetTopLevelNativeWindow();
java_object_.Reset(Java_OnboardingDialogBridge_create(
env, window_android->GetJavaObject(), reinterpret_cast<intptr_t>(this)));
base::string16 onboarding_title, onboarding_details;
std::tie(onboarding_title, onboarding_details) =
GetOnboardingTitleAndDetails();
Java_OnboardingDialogBridge_showDialog(
env, java_object_,
base::android::ConvertUTF16ToJavaString(env, onboarding_title),
base::android::ConvertUTF16ToJavaString(env, onboarding_details));
client_->GetPrefs()->SetInteger(
password_manager::prefs::kPasswordManagerOnboardingState,
static_cast<int>(password_manager::OnboardingState::kShown));
}
void OnboardingDialogView::OnboardingAccepted(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
client_->OnOnboardingSuccessful(std::move(form_to_save_));
delete this;
}
void OnboardingDialogView::OnboardingRejected(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
delete this;
}
void OnboardingDialogView::OnboardingAborted(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
delete this;
}