1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/android/password_ui_view_android.h"
6
7#include "base/android/jni_helper.h"
8#include "base/android/jni_string.h"
9#include "chrome/browser/profiles/profile_manager.h"
10#include "components/autofill/core/common/password_form.h"
11#include "jni/PasswordUIView_jni.h"
12
13using base::android::ConvertUTF16ToJavaString;
14using base::android::ConvertUTF8ToJavaString;
15using base::android::ScopedJavaLocalRef;
16
17PasswordUIViewAndroid::PasswordUIViewAndroid(JNIEnv* env, jobject obj)
18    : password_manager_presenter_(this), weak_java_ui_controller_(env, obj) {}
19
20PasswordUIViewAndroid::~PasswordUIViewAndroid() {}
21
22void PasswordUIViewAndroid::Destroy(JNIEnv*, jobject) { delete this; }
23
24Profile* PasswordUIViewAndroid::GetProfile() {
25  return ProfileManager::GetLastUsedProfile();
26}
27
28void PasswordUIViewAndroid::ShowPassword(
29    size_t index, const base::string16& password_value) {
30  NOTIMPLEMENTED();
31}
32
33void PasswordUIViewAndroid::SetPasswordList(
34    const ScopedVector<autofill::PasswordForm>& password_list,
35    bool show_passwords) {
36  // Android just ignores the |show_passwords| argument.
37  JNIEnv* env = base::android::AttachCurrentThread();
38  ScopedJavaLocalRef<jobject> ui_controller = weak_java_ui_controller_.get(env);
39  if (!ui_controller.is_null()) {
40    Java_PasswordUIView_passwordListAvailable(
41        env, ui_controller.obj(), static_cast<int>(password_list.size()));
42  }
43}
44
45void PasswordUIViewAndroid::SetPasswordExceptionList(
46    const ScopedVector<autofill::PasswordForm>& password_exception_list) {
47  JNIEnv* env = base::android::AttachCurrentThread();
48  ScopedJavaLocalRef<jobject> ui_controller = weak_java_ui_controller_.get(env);
49  if (!ui_controller.is_null()) {
50    Java_PasswordUIView_passwordExceptionListAvailable(
51        env,
52        ui_controller.obj(),
53        static_cast<int>(password_exception_list.size()));
54  }
55}
56
57void PasswordUIViewAndroid::UpdatePasswordLists(JNIEnv* env, jobject) {
58  password_manager_presenter_.UpdatePasswordLists();
59}
60
61ScopedJavaLocalRef<jobject>
62PasswordUIViewAndroid::GetSavedPasswordEntry(JNIEnv* env, jobject, int index) {
63  const autofill::PasswordForm& form =
64      password_manager_presenter_.GetPassword(index);
65  return Java_PasswordUIView_createSavedPasswordEntry(
66      env,
67      ConvertUTF8ToJavaString(env, form.origin.spec()).obj(),
68      ConvertUTF16ToJavaString(env, form.username_value).obj());
69}
70
71ScopedJavaLocalRef<jstring> PasswordUIViewAndroid::GetSavedPasswordException(
72    JNIEnv* env, jobject, int index) {
73  const autofill::PasswordForm& form =
74      password_manager_presenter_.GetPasswordException(index);
75  return ConvertUTF8ToJavaString(env, form.origin.spec());
76}
77
78void PasswordUIViewAndroid::HandleRemoveSavedPasswordEntry(
79    JNIEnv* env, jobject, int index) {
80  password_manager_presenter_.RemoveSavedPassword(index);
81}
82
83void PasswordUIViewAndroid::HandleRemoveSavedPasswordException(
84    JNIEnv* env, jobject, int index) {
85  password_manager_presenter_.RemovePasswordException(index);
86}
87
88// static
89static jlong Init(JNIEnv* env, jobject obj) {
90  PasswordUIViewAndroid* controller = new PasswordUIViewAndroid(env, obj);
91  return reinterpret_cast<intptr_t>(controller);
92}
93
94bool PasswordUIViewAndroid::RegisterPasswordUIViewAndroid(JNIEnv* env) {
95  return RegisterNativesImpl(env);
96}
97