Commit 4151b09d authored by Andrei Chulkov's avatar Andrei Chulkov Committed by Commit Bot

Add wiring between password manager onboarding triggers and UI

The wiring is done via a Bridge class on the Java side and a one View
class on the native side, which itself is more of a Controller / Bridge.
For now I don't see the need to separate the native side into multiple
classes, however that might be better and / or needed later.

Bug: 983445
Change-Id: I997161df9c2e377d85a5dccd335096cd05a2bb39
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1736362Reviewed-by: default avatarIoana Pandele <ioanap@chromium.org>
Reviewed-by: default avatarVasilii Sukhanov <vasilii@chromium.org>
Commit-Queue: Andrei Chulkov <achulkov@google.com>
Cr-Commit-Position: refs/heads/master@{#685166}
parent 433794af
...@@ -754,8 +754,8 @@ android_library("chrome_test_util_java") { ...@@ -754,8 +754,8 @@ android_library("chrome_test_util_java") {
"//net/android:net_java_test_support", "//net/android:net_java_test_support",
"//third_party/android_deps:android_support_v4_java", "//third_party/android_deps:android_support_v4_java",
"//third_party/android_media:android_media_resources", "//third_party/android_media:android_media_resources",
"//third_party/android_support_test_runner:runner_java",
"//third_party/android_sdk/androidx_browser:androidx_browser_java", "//third_party/android_sdk/androidx_browser:androidx_browser_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/espresso:espresso_all_java", "//third_party/espresso:espresso_all_java",
"//third_party/junit:junit", "//third_party/junit:junit",
] ]
...@@ -860,9 +860,9 @@ android_library("chrome_test_java") { ...@@ -860,9 +860,9 @@ android_library("chrome_test_java") {
"//third_party/android_sdk:android_test_base_java", "//third_party/android_sdk:android_test_base_java",
"//third_party/android_sdk:android_test_mock_java", "//third_party/android_sdk:android_test_mock_java",
"//third_party/android_sdk:android_test_runner_java", "//third_party/android_sdk:android_test_runner_java",
"//third_party/android_sdk/androidx_browser:androidx_browser_java",
"//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:rules_java",
"//third_party/android_support_test_runner:runner_java", "//third_party/android_support_test_runner:runner_java",
"//third_party/android_sdk/androidx_browser:androidx_browser_java",
"//third_party/blink/public:blink_headers_java", "//third_party/blink/public:blink_headers_java",
"//third_party/blink/public/mojom:android_mojo_bindings_java", "//third_party/blink/public/mojom:android_mojo_bindings_java",
"//third_party/blink/public/mojom:mojom_mhtml_load_result_java", "//third_party/blink/public/mojom:mojom_mhtml_load_result_java",
...@@ -2553,6 +2553,7 @@ generate_jni("chrome_jni_headers") { ...@@ -2553,6 +2553,7 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java", "java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java",
"java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java", "java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java",
"java/src/org/chromium/chrome/browser/password_manager/Credential.java", "java/src/org/chromium/chrome/browser/password_manager/Credential.java",
"java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogBridge.java",
"java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java", "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java",
"java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationPopupBridge.java", "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationPopupBridge.java",
"java/src/org/chromium/chrome/browser/payments/CanMakePaymentQuery.java", "java/src/org/chromium/chrome/browser/payments/CanMakePaymentQuery.java",
......
...@@ -1153,6 +1153,7 @@ chrome_java_sources = [ ...@@ -1153,6 +1153,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java", "java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java",
"java/src/org/chromium/chrome/browser/password_manager/Credential.java", "java/src/org/chromium/chrome/browser/password_manager/Credential.java",
"java/src/org/chromium/chrome/browser/password_manager/GooglePasswordManagerUIProvider.java", "java/src/org/chromium/chrome/browser/password_manager/GooglePasswordManagerUIProvider.java",
"java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogBridge.java",
"java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogCoordinator.java", "java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogCoordinator.java",
"java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogMediator.java", "java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogMediator.java",
"java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogProperties.java", "java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogProperties.java",
......
// 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.
package org.chromium.chrome.browser.password_manager;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.DialogDismissalCause;
/** JNI call glue between the native password manager onboarding class and Java objects. */
public class OnboardingDialogBridge {
private long mNativeOnboardingDialogView;
private final OnboardingDialogCoordinator mOnboardingDialog;
private OnboardingDialogBridge(WindowAndroid windowAndroid, long nativeOnboardingDialogView) {
mNativeOnboardingDialogView = nativeOnboardingDialogView;
ChromeActivity activity = (ChromeActivity) windowAndroid.getActivity().get();
mOnboardingDialog = new OnboardingDialogCoordinator(activity);
}
@CalledByNative
public static OnboardingDialogBridge create(WindowAndroid windowAndroid, long nativeDialog) {
return new OnboardingDialogBridge(windowAndroid, nativeDialog);
}
@CalledByNative
public void showDialog(String onboardingTitle, String onboardingDetails) {
mOnboardingDialog.showDialog(onboardingTitle, onboardingDetails, this::onClick);
}
@CalledByNative
private void destroy() {
mNativeOnboardingDialogView = 0;
mOnboardingDialog.dismissDialog(DialogDismissalCause.DISMISSED_BY_NATIVE);
}
private void onClick(boolean ok) {
if (mNativeOnboardingDialogView == 0) return;
if (ok) {
nativeOnboardingAccepted(mNativeOnboardingDialogView);
} else {
nativeOnboardingRejected(mNativeOnboardingDialogView);
}
}
private native void nativeOnboardingAccepted(long nativeOnboardingDialogView);
private native void nativeOnboardingRejected(long nativeOnboardingDialogView);
}
...@@ -316,6 +316,10 @@ Chromium is unable to recover your settings. ...@@ -316,6 +316,10 @@ Chromium is unable to recover your settings.
<message name="IDS_PASSWORD_GENERATION_PROMPT" desc="Autofill dropdown text describing password generation."> <message name="IDS_PASSWORD_GENERATION_PROMPT" desc="Autofill dropdown text describing password generation.">
Chromium will save this password in your Google Account. You won’t have to remember it. Chromium will save this password in your Google Account. You won’t have to remember it.
</message> </message>
<!-- Password manager onboarding strings -->
<message name="IDS_PASSWORD_MANAGER_ONBOARDING_DETAILS" desc="The explanation text that is shown below the title in the password manager onboarding dialog.">
Chromium can help you remember your passwords so you don't have to.
</message>
<message name="IDS_PASSWORD_MANAGER_TITLE_BRAND" desc="The product name used in the title of the password bubble."> <message name="IDS_PASSWORD_MANAGER_TITLE_BRAND" desc="The product name used in the title of the password bubble.">
Chromium Chromium
</message> </message>
......
...@@ -4553,6 +4553,9 @@ Keep your key file in a safe place. You will need it to create new versions of y ...@@ -4553,6 +4553,9 @@ Keep your key file in a safe place. You will need it to create new versions of y
<message name="IDS_PASSWORD_MANAGER_SIGNIN_PROMO_LABEL" desc="Promotion text for Chrome sign-in appearing in the password bubble after a password is saved."> <message name="IDS_PASSWORD_MANAGER_SIGNIN_PROMO_LABEL" desc="Promotion text for Chrome sign-in appearing in the password bubble after a password is saved.">
To get your passwords on all your devices, sign in to Chrome. To get your passwords on all your devices, sign in to Chrome.
</message> </message>
<message name="IDS_PASSWORD_MANAGER_ONBOARDING_TITLE" desc="The title shown in the password manager onboarding dialog.">
Save your passwords
</message>
<!-- Begin of Sync Promo strings for Desktop Identity Consistency. --> <!-- Begin of Sync Promo strings for Desktop Identity Consistency. -->
<message name="IDS_PASSWORD_MANAGER_DICE_PROMO_SIGNIN_MESSAGE" desc="Text of the sync promo displayed at the bottom of the save password bubble asking the user to sign in and enable sync."> <message name="IDS_PASSWORD_MANAGER_DICE_PROMO_SIGNIN_MESSAGE" desc="Text of the sync promo displayed at the bottom of the save password bubble asking the user to sign in and enable sync.">
......
...@@ -327,6 +327,10 @@ Google Chrome is unable to recover your settings. ...@@ -327,6 +327,10 @@ Google Chrome is unable to recover your settings.
<message name="IDS_PASSWORD_GENERATION_PROMPT" desc="Autofill dropdown text describing password generation."> <message name="IDS_PASSWORD_GENERATION_PROMPT" desc="Autofill dropdown text describing password generation.">
Chrome will save this password in your Google Account. You won’t have to remember it. Chrome will save this password in your Google Account. You won’t have to remember it.
</message> </message>
<!-- Password manager onboarding strings -->
<message name="IDS_PASSWORD_MANAGER_ONBOARDING_DETAILS" desc="The explanation text that is shown below the title in the password manager onboarding dialog.">
Chrome can help you remember your passwords so you don't have to.
</message>
<message name="IDS_PASSWORD_MANAGER_TITLE_BRAND" desc="The product name used in the title of the password bubble."> <message name="IDS_PASSWORD_MANAGER_TITLE_BRAND" desc="The product name used in the title of the password bubble.">
Google Chrome Google Chrome
</message> </message>
......
...@@ -111,6 +111,7 @@ ...@@ -111,6 +111,7 @@
#include "chrome/browser/password_manager/save_password_infobar_delegate_android.h" #include "chrome/browser/password_manager/save_password_infobar_delegate_android.h"
#include "chrome/browser/password_manager/touch_to_fill_controller.h" #include "chrome/browser/password_manager/touch_to_fill_controller.h"
#include "chrome/browser/password_manager/update_password_infobar_delegate_android.h" #include "chrome/browser/password_manager/update_password_infobar_delegate_android.h"
#include "chrome/browser/ui/android/passwords/onboarding_dialog_view.h"
#include "chrome/browser/ui/android/snackbars/auto_signin_prompt_controller.h" #include "chrome/browser/ui/android/snackbars/auto_signin_prompt_controller.h"
#include "components/password_manager/core/browser/credential_cache.h" #include "components/password_manager/core/browser/credential_cache.h"
#include "ui/base/ui_base_features.h" #include "ui/base/ui_base_features.h"
...@@ -334,8 +335,9 @@ bool ChromePasswordManagerClient::ShowOnboarding( ...@@ -334,8 +335,9 @@ bool ChromePasswordManagerClient::ShowOnboarding(
if (form_to_save->IsBlacklisted()) { if (form_to_save->IsBlacklisted()) {
return false; return false;
} }
// TODO(crbug.com/983445): Wire onboarding UI // This class will delete itself after the dialog is dismissed.
return PromptUserToSaveOrUpdatePassword(std::move(form_to_save), false); (new OnboardingDialogView(this, std::move(form_to_save)))->Show();
return true;
#else #else
return false; return false;
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
...@@ -869,6 +871,12 @@ void ChromePasswordManagerClient::GenerationElementLostFocus() { ...@@ -869,6 +871,12 @@ void ChromePasswordManagerClient::GenerationElementLostFocus() {
popup_controller_->GenerationElementLostFocus(); popup_controller_->GenerationElementLostFocus();
} }
void ChromePasswordManagerClient::OnOnboardingSuccessful(
std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save) {
PromptUserToSaveOrUpdatePassword(std::move(form_to_save),
/* is_password_update */ false);
}
const GURL& ChromePasswordManagerClient::GetMainFrameURL() const { const GURL& ChromePasswordManagerClient::GetMainFrameURL() const {
return web_contents()->GetVisibleURL(); return web_contents()->GetVisibleURL();
} }
......
...@@ -162,6 +162,11 @@ class ChromePasswordManagerClient ...@@ -162,6 +162,11 @@ class ChromePasswordManagerClient
void FrameWasScrolled() override; void FrameWasScrolled() override;
void GenerationElementLostFocus() override; void GenerationElementLostFocus() override;
// This is called when the onboarding experience was shown successfully,
// which means that the user should now be prompted to save their password.
void OnOnboardingSuccessful(
std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save);
#if BUILDFLAG(FULL_SAFE_BROWSING) #if BUILDFLAG(FULL_SAFE_BROWSING)
void CheckSafeBrowsingReputation(const GURL& form_action, void CheckSafeBrowsingReputation(const GURL& form_action,
const GURL& frame_url) override; const GURL& frame_url) override;
......
...@@ -723,6 +723,8 @@ jumbo_split_static_library("ui") { ...@@ -723,6 +723,8 @@ jumbo_split_static_library("ui") {
"android/page_info/page_info_controller_android.h", "android/page_info/page_info_controller_android.h",
"android/passwords/manual_filling_view_android.cc", "android/passwords/manual_filling_view_android.cc",
"android/passwords/manual_filling_view_android.h", "android/passwords/manual_filling_view_android.h",
"android/passwords/onboarding_dialog_view.cc",
"android/passwords/onboarding_dialog_view.h",
"android/passwords/password_generation_dialog_view_android.cc", "android/passwords/password_generation_dialog_view_android.cc",
"android/passwords/password_generation_dialog_view_android.h", "android/passwords/password_generation_dialog_view_android.h",
"android/passwords/password_generation_editing_popup_view_android.cc", "android/passwords/password_generation_editing_popup_view_android.cc",
......
// 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/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_onboarding.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"
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<long>(this)));
base::string16 onboarding_title =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_TITLE);
base::string16 onboarding_details =
l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ONBOARDING_DETAILS);
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;
}
// 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.
#ifndef CHROME_BROWSER_UI_ANDROID_PASSWORDS_ONBOARDING_DIALOG_VIEW_H_
#define CHROME_BROWSER_UI_ANDROID_PASSWORDS_ONBOARDING_DIALOG_VIEW_H_
#include <jni.h>
#include "base/android/scoped_java_ref.h"
class ChromePasswordManagerClient;
namespace password_manager {
class PasswordFormManagerForUI;
} // namespace password_manager
// The class connecting the native code to the UI for the password manager
// onboarding experience. This class will delete itself once the dialog is
// dismissed in any way (e.g. via button click, back press, tab being destroyed,
// etc.).
class OnboardingDialogView {
public:
explicit OnboardingDialogView(
ChromePasswordManagerClient* client,
std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save);
~OnboardingDialogView();
// Called to show the onboarding dialog.
// Sets the |kPasswordManagerOnboardingState| pref to |kShown|.
void Show();
// Called from Java via JNI. Prompts user to save their password.
void OnboardingAccepted(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Called from Java via JNI.
void OnboardingRejected(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
private:
// The corresponding java object.
base::android::ScopedJavaGlobalRef<jobject> java_object_;
// Form that is needed to prompt the user to save their password
// after the onboarding was shown.
std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save_;
// Needed for prompting the user the save their password, as well as
// retrieving web_contents and setting prefs.
ChromePasswordManagerClient* client_;
DISALLOW_COPY_AND_ASSIGN(OnboardingDialogView);
};
#endif // CHROME_BROWSER_UI_ANDROID_PASSWORDS_ONBOARDING_DIALOG_VIEW_H_
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