Commit cd920ac0 authored by Ioana Pandele's avatar Ioana Pandele Committed by Commit Bot

[Android] Wire dialog for leak warning

This CL adds the bridge to java, as well as basic showing and hiding
logic.

Bug: 986317
Change-Id: Iec8a65a7c025da71505b16487e2070234ea58fda
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1763677
Commit-Queue: Ioana Pandele <ioanap@chromium.org>
Reviewed-by: default avatarFriedrich [CET] <fhorschig@chromium.org>
Reviewed-by: default avatarVasilii Sukhanov <vasilii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#689538}
parent 7fef27e9
...@@ -2577,6 +2577,7 @@ generate_jni("chrome_jni_headers") { ...@@ -2577,6 +2577,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/CredentialLeakDialogBridge.java",
"java/src/org/chromium/chrome/browser/password_manager/OnboardingDialogBridge.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",
......
...@@ -1166,6 +1166,7 @@ chrome_java_sources = [ ...@@ -1166,6 +1166,7 @@ chrome_java_sources = [
"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/CredentialLeakDialogBridge.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/OnboardingDialogBridge.java",
"java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java", "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.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.R;
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 CredentialLeak class and Java objects. */
public class CredentialLeakDialogBridge {
private long mNativeCredentialLeakDialogViewAndroid;
private final PasswordManagerDialogCoordinator mCredentialLeakDialog;
private CredentialLeakDialogBridge(
WindowAndroid windowAndroid, long nativeCredentialLeakDialogViewAndroid) {
mNativeCredentialLeakDialogViewAndroid = nativeCredentialLeakDialogViewAndroid;
ChromeActivity activity = (ChromeActivity) windowAndroid.getActivity().get();
mCredentialLeakDialog = new PasswordManagerDialogCoordinator(activity);
}
@CalledByNative
public static CredentialLeakDialogBridge create(
WindowAndroid windowAndroid, long nativeDialog) {
return new CredentialLeakDialogBridge(windowAndroid, nativeDialog);
}
@CalledByNative
public void showDialog(String credentialLeakTitle, String credentialLeakDetails,
String positiveButton, String negativeButton) {
// TODO(crbug.com/986317): Update drawable once added.
mCredentialLeakDialog.showDialog(credentialLeakTitle, credentialLeakDetails,
R.drawable.data_reduction_illustration, positiveButton, negativeButton,
this::onClick);
}
@CalledByNative
private void destroy() {
mNativeCredentialLeakDialogViewAndroid = 0;
mCredentialLeakDialog.dismissDialog(DialogDismissalCause.DISMISSED_BY_NATIVE);
}
private void onClick(boolean ok) {
if (mNativeCredentialLeakDialogViewAndroid == 0) return;
if (ok) {
nativeAccepted(mNativeCredentialLeakDialogViewAndroid);
} else {
nativeClosed(mNativeCredentialLeakDialogViewAndroid);
}
}
private native void nativeAccepted(long nativeCredentialLeakDialogViewAndroid);
private native void nativeClosed(long nativeCredentialLeakDialogViewAndroid);
}
...@@ -41,8 +41,8 @@ public class PasswordManagerDialogCoordinator { ...@@ -41,8 +41,8 @@ public class PasswordManagerDialogCoordinator {
mMediator.showDialog(); mMediator.showDialog();
} }
public void dismissDialog(@DialogDismissalCause int dismissalClause) { public void dismissDialog(@DialogDismissalCause int dismissalCause) {
mMediator.dismissDialog(dismissalClause); mMediator.dismissDialog(dismissalCause);
} }
private static PropertyModel.Builder createDialogModelBuilder(View customView) { private static PropertyModel.Builder createDialogModelBuilder(View customView) {
......
...@@ -2800,6 +2800,8 @@ jumbo_split_static_library("browser") { ...@@ -2800,6 +2800,8 @@ jumbo_split_static_library("browser") {
"password_manager/auto_signin_first_run_dialog_android.h", "password_manager/auto_signin_first_run_dialog_android.h",
"password_manager/credential_android.cc", "password_manager/credential_android.cc",
"password_manager/credential_android.h", "password_manager/credential_android.h",
"password_manager/credential_leak_controller_android.cc",
"password_manager/credential_leak_controller_android.h",
"password_manager/generated_password_saved_infobar_delegate_android.cc", "password_manager/generated_password_saved_infobar_delegate_android.cc",
"password_manager/generated_password_saved_infobar_delegate_android.h", "password_manager/generated_password_saved_infobar_delegate_android.h",
"password_manager/password_accessory_controller.h", "password_manager/password_accessory_controller.h",
......
...@@ -104,6 +104,7 @@ ...@@ -104,6 +104,7 @@
#include "chrome/browser/autofill/manual_filling_controller.h" #include "chrome/browser/autofill/manual_filling_controller.h"
#include "chrome/browser/password_manager/account_chooser_dialog_android.h" #include "chrome/browser/password_manager/account_chooser_dialog_android.h"
#include "chrome/browser/password_manager/auto_signin_first_run_dialog_android.h" #include "chrome/browser/password_manager/auto_signin_first_run_dialog_android.h"
#include "chrome/browser/password_manager/credential_leak_controller_android.h"
#include "chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.h" #include "chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.h"
#include "chrome/browser/password_manager/password_accessory_controller.h" #include "chrome/browser/password_manager/password_accessory_controller.h"
#include "chrome/browser/password_manager/password_accessory_controller_impl.h" #include "chrome/browser/password_manager/password_accessory_controller_impl.h"
...@@ -508,7 +509,8 @@ void ChromePasswordManagerClient::NotifyUserCredentialsWereLeaked( ...@@ -508,7 +509,8 @@ void ChromePasswordManagerClient::NotifyUserCredentialsWereLeaked(
password_manager::CredentialLeakType leak_type, password_manager::CredentialLeakType leak_type,
const GURL& origin) { const GURL& origin) {
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// TODO(crbug.com/986317): Implement Android part of the feature. (new CredentialLeakControllerAndroid())
->ShowDialog(web_contents()->GetTopLevelNativeWindow());
#else // !defined(OS_ANDROID) #else // !defined(OS_ANDROID)
PasswordsClientUIDelegate* manage_passwords_ui_controller = PasswordsClientUIDelegate* manage_passwords_ui_controller =
PasswordsClientUIDelegateFromWebContents(web_contents()); PasswordsClientUIDelegateFromWebContents(web_contents());
......
// 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/password_manager/credential_leak_controller_android.h"
#include "chrome/browser/ui/android/passwords/credential_leak_dialog_view_android.h"
#include "ui/android/window_android.h"
CredentialLeakControllerAndroid::CredentialLeakControllerAndroid() = default;
CredentialLeakControllerAndroid::~CredentialLeakControllerAndroid() = default;
void CredentialLeakControllerAndroid::ShowDialog(
ui::WindowAndroid* window_android) {
dialog_view_.reset(new CredentialLeakDialogViewAndroid(this));
dialog_view_->Show(window_android);
}
void CredentialLeakControllerAndroid::OnDialogDismissRequested() {
delete this;
}
void CredentialLeakControllerAndroid::OnPasswordCheckTriggered() {
// TODO(crbug.com/986317): Navigate to the password check site.
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_PASSWORD_MANAGER_CREDENTIAL_LEAK_CONTROLLER_ANDROID_H_
#define CHROME_BROWSER_PASSWORD_MANAGER_CREDENTIAL_LEAK_CONTROLLER_ANDROID_H_
#include <memory>
#include "base/macros.h"
namespace ui {
class WindowAndroid;
}
class CredentialLeakDialogViewAndroid;
// Class which manages the dialog displayed when a credential leak was
// detected. It is self-owned and it owns the dialog view.
class CredentialLeakControllerAndroid {
public:
CredentialLeakControllerAndroid();
~CredentialLeakControllerAndroid();
// Called when a leaked credential was detected.
void ShowDialog(ui::WindowAndroid* window_android);
// Called from the UI when the dialog dismissal was requested.
// Will destroy the controller.
void OnDialogDismissRequested();
// Called from the UI when the password check button was pressed.
// Will destroy the controller.
void OnPasswordCheckTriggered();
private:
std::unique_ptr<CredentialLeakDialogViewAndroid> dialog_view_;
DISALLOW_COPY_AND_ASSIGN(CredentialLeakControllerAndroid);
};
#endif // CHROME_BROWSER_PASSWORD_MANAGER_CREDENTIAL_LEAK_CONTROLLER_ANDROID_H_
\ No newline at end of file
...@@ -722,6 +722,8 @@ jumbo_split_static_library("ui") { ...@@ -722,6 +722,8 @@ jumbo_split_static_library("ui") {
"android/page_info/connection_info_popup_android.h", "android/page_info/connection_info_popup_android.h",
"android/page_info/page_info_controller_android.cc", "android/page_info/page_info_controller_android.cc",
"android/page_info/page_info_controller_android.h", "android/page_info/page_info_controller_android.h",
"android/passwords/credential_leak_dialog_view_android.cc",
"android/passwords/credential_leak_dialog_view_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.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/credential_leak_dialog_view_android.h"
#include <cstdint>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/android/chrome_jni_headers/CredentialLeakDialogBridge_jni.h"
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#include "chrome/browser/password_manager/credential_leak_controller_android.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/common/password_manager_pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
#include "ui/android/window_android.h"
#include "ui/base/l10n/l10n_util.h"
CredentialLeakDialogViewAndroid::CredentialLeakDialogViewAndroid(
CredentialLeakControllerAndroid* controller)
: controller_(controller) {}
CredentialLeakDialogViewAndroid::~CredentialLeakDialogViewAndroid() {
Java_CredentialLeakDialogBridge_destroy(base::android::AttachCurrentThread(),
java_object_);
}
void CredentialLeakDialogViewAndroid::Show(ui::WindowAndroid* window_android) {
JNIEnv* env = base::android::AttachCurrentThread();
java_object_.Reset(Java_CredentialLeakDialogBridge_create(
env, window_android->GetJavaObject(), reinterpret_cast<intptr_t>(this)));
base::string16 leak_warning_title =
l10n_util::GetStringUTF16(IDS_CREDENTIAL_LEAK_CURRENT_SITE_TITLE);
base::string16 leak_warning_details =
l10n_util::GetStringUTF16(IDS_CREDENTIAL_LEAK_CURRENT_SITE_MESSAGE);
base::string16 positive_button =
l10n_util::GetStringUTF16(IDS_LEAK_CHECK_CREDENTIALS);
base::string16 negative_button = l10n_util::GetStringUTF16(IDS_CLOSE);
Java_CredentialLeakDialogBridge_showDialog(
env, java_object_,
base::android::ConvertUTF16ToJavaString(env, leak_warning_title),
base::android::ConvertUTF16ToJavaString(env, leak_warning_details),
base::android::ConvertUTF16ToJavaString(env, positive_button),
base::android::ConvertUTF16ToJavaString(env, negative_button));
}
void CredentialLeakDialogViewAndroid::Accepted(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
controller_->OnPasswordCheckTriggered();
}
void CredentialLeakDialogViewAndroid::Closed(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
controller_->OnDialogDismissRequested();
}
// 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_CREDENTIAL_LEAK_DIALOG_VIEW_ANDROID_H_
#define CHROME_BROWSER_UI_ANDROID_PASSWORDS_CREDENTIAL_LEAK_DIALOG_VIEW_ANDROID_H_
#include <jni.h>
#include "base/android/scoped_java_ref.h"
#include "chrome/browser/ui/passwords/password_dialog_prompts.h"
namespace ui {
class WindowAndroid;
}
class CredentialLeakControllerAndroid;
// Modal dialog displaying a warning for the user when an entered credential was
// detected to have been part of a leak. Communicated with its Java counterpart
// and passes responses back to the |CredentialLeakControllerAndroid|.
class CredentialLeakDialogViewAndroid {
public:
explicit CredentialLeakDialogViewAndroid(
CredentialLeakControllerAndroid* controller);
~CredentialLeakDialogViewAndroid();
// Called to create and show the dialog.
void Show(ui::WindowAndroid* window_android);
// Called from Java via JNI. Prompts user to save their password.
void Accepted(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
// Called from Java via JNI.
void Closed(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
private:
// The controller which owns this dialog and handles the dialog events.
CredentialLeakControllerAndroid* controller_;
// The corresponding java object.
base::android::ScopedJavaGlobalRef<jobject> java_object_;
DISALLOW_COPY_AND_ASSIGN(CredentialLeakDialogViewAndroid);
};
#endif // CHROME_BROWSER_UI_ANDROID_PASSWORDS_CREDENTIAL_LEAK_DIALOG_VIEW_ANDROID_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