blob: 3448382e2d40059461aed8db3b75edb843af5876 [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/touch_to_fill/android/touch_to_fill_view_impl.h"
#include <memory>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/macros.h"
#include "base/strings/string_piece.h"
#include "chrome/browser/password_manager/touch_to_fill_controller.h"
#include "chrome/browser/touch_to_fill/android/jni_headers/Credential_jni.h"
#include "chrome/browser/touch_to_fill/android/jni_headers/TouchToFillBridge_jni.h"
#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
#include "components/password_manager/core/browser/origin_credential_store.h"
#include "ui/android/view_android.h"
#include "ui/android/window_android.h"
#include "url/gurl.h"
using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF16;
using base::android::ConvertJavaStringToUTF8;
using base::android::ConvertUTF16ToJavaString;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using password_manager::CredentialPair;
namespace {
CredentialPair ConvertJavaCredential(JNIEnv* env,
const JavaParamRef<jobject>& credential) {
return CredentialPair(
ConvertJavaStringToUTF16(env,
Java_Credential_getUsername(env, credential)),
ConvertJavaStringToUTF16(env,
Java_Credential_getPassword(env, credential)),
GURL(ConvertJavaStringToUTF8(
env, Java_Credential_getOriginUrl(env, credential))),
CredentialPair::IsPublicSuffixMatch(
Java_Credential_isPublicSuffixMatch(env, credential)));
}
} // namespace
TouchToFillViewImpl::TouchToFillViewImpl(TouchToFillController* controller)
: controller_(controller) {
java_object_ = Java_TouchToFillBridge_create(
AttachCurrentThread(), reinterpret_cast<intptr_t>(this),
controller_->GetNativeView()->GetWindowAndroid()->GetJavaObject());
}
TouchToFillViewImpl::~TouchToFillViewImpl() {
Java_TouchToFillBridge_destroy(AttachCurrentThread(), java_object_);
}
void TouchToFillViewImpl::Show(
base::StringPiece16 formatted_url,
IsOriginSecure is_origin_secure,
base::span<const password_manager::CredentialPair> credentials) {
// Serialize the |credentials| span into a Java array and instruct the bridge
// to show it together with |formatted_url| to the user.
JNIEnv* env = AttachCurrentThread();
auto credential_array =
Java_TouchToFillBridge_createCredentialArray(env, credentials.size());
for (size_t i = 0; i < credentials.size(); ++i) {
const auto& credential = credentials[i];
Java_TouchToFillBridge_insertCredential(
env, credential_array, i,
ConvertUTF16ToJavaString(env, credential.username),
ConvertUTF16ToJavaString(env, credential.password),
ConvertUTF16ToJavaString(env, GetDisplayUsername(credential)),
ConvertUTF8ToJavaString(env, credential.origin_url.spec()),
credential.is_public_suffix_match.value());
}
Java_TouchToFillBridge_showCredentials(
env, java_object_, ConvertUTF16ToJavaString(env, formatted_url),
is_origin_secure.value(), credential_array);
}
void TouchToFillViewImpl::OnCredentialSelected(
const CredentialPair& credential) {
controller_->OnCredentialSelected(credential);
}
void TouchToFillViewImpl::OnDismiss() {
controller_->OnDismiss();
}
void TouchToFillViewImpl::OnCredentialSelected(
JNIEnv* env,
const JavaParamRef<jobject>& credential) {
OnCredentialSelected(ConvertJavaCredential(env, credential));
}
void TouchToFillViewImpl::OnDismiss(JNIEnv* env) {
OnDismiss();
}