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_string.h" 8#include "base/android/jni_weak_ref.h" 9#include "base/command_line.h" 10#include "base/metrics/field_trial.h" 11#include "chrome/browser/profiles/profile_manager.h" 12#include "chrome/common/url_constants.h" 13#include "components/autofill/core/common/password_form.h" 14#include "components/password_manager/core/common/password_manager_switches.h" 15#include "jni/PasswordUIView_jni.h" 16 17using base::android::ConvertUTF16ToJavaString; 18using base::android::ConvertUTF8ToJavaString; 19using base::android::ScopedJavaLocalRef; 20 21PasswordUIViewAndroid::PasswordUIViewAndroid(JNIEnv* env, jobject obj) 22 : password_manager_presenter_(this), weak_java_ui_controller_(env, obj) {} 23 24PasswordUIViewAndroid::~PasswordUIViewAndroid() {} 25 26void PasswordUIViewAndroid::Destroy(JNIEnv*, jobject) { delete this; } 27 28Profile* PasswordUIViewAndroid::GetProfile() { 29 return ProfileManager::GetLastUsedProfile(); 30} 31 32void PasswordUIViewAndroid::ShowPassword( 33 size_t index, const base::string16& password_value) { 34 NOTIMPLEMENTED(); 35} 36 37void PasswordUIViewAndroid::SetPasswordList( 38 const ScopedVector<autofill::PasswordForm>& password_list, 39 bool show_passwords) { 40 // Android just ignores the |show_passwords| argument. 41 JNIEnv* env = base::android::AttachCurrentThread(); 42 ScopedJavaLocalRef<jobject> ui_controller = weak_java_ui_controller_.get(env); 43 if (!ui_controller.is_null()) { 44 Java_PasswordUIView_passwordListAvailable( 45 env, ui_controller.obj(), static_cast<int>(password_list.size())); 46 } 47} 48 49void PasswordUIViewAndroid::SetPasswordExceptionList( 50 const ScopedVector<autofill::PasswordForm>& password_exception_list) { 51 JNIEnv* env = base::android::AttachCurrentThread(); 52 ScopedJavaLocalRef<jobject> ui_controller = weak_java_ui_controller_.get(env); 53 if (!ui_controller.is_null()) { 54 Java_PasswordUIView_passwordExceptionListAvailable( 55 env, 56 ui_controller.obj(), 57 static_cast<int>(password_exception_list.size())); 58 } 59} 60 61void PasswordUIViewAndroid::UpdatePasswordLists(JNIEnv* env, jobject) { 62 password_manager_presenter_.UpdatePasswordLists(); 63} 64 65ScopedJavaLocalRef<jobject> 66PasswordUIViewAndroid::GetSavedPasswordEntry(JNIEnv* env, jobject, int index) { 67 const autofill::PasswordForm* form = 68 password_manager_presenter_.GetPassword(index); 69 if (!form) { 70 return Java_PasswordUIView_createSavedPasswordEntry( 71 env, 72 ConvertUTF8ToJavaString(env, std::string()).obj(), 73 ConvertUTF16ToJavaString(env, base::string16()).obj()); 74 } 75 return Java_PasswordUIView_createSavedPasswordEntry( 76 env, 77 ConvertUTF8ToJavaString(env, form->origin.spec()).obj(), 78 ConvertUTF16ToJavaString(env, form->username_value).obj()); 79} 80 81ScopedJavaLocalRef<jstring> PasswordUIViewAndroid::GetSavedPasswordException( 82 JNIEnv* env, jobject, int index) { 83 const autofill::PasswordForm* form = 84 password_manager_presenter_.GetPasswordException(index); 85 if (!form) 86 return ConvertUTF8ToJavaString(env, std::string()); 87 return ConvertUTF8ToJavaString(env, form->origin.spec()); 88} 89 90void PasswordUIViewAndroid::HandleRemoveSavedPasswordEntry( 91 JNIEnv* env, jobject, int index) { 92 password_manager_presenter_.RemoveSavedPassword(index); 93} 94 95void PasswordUIViewAndroid::HandleRemoveSavedPasswordException( 96 JNIEnv* env, jobject, int index) { 97 password_manager_presenter_.RemovePasswordException(index); 98} 99 100jstring GetAccountDashboardURL(JNIEnv* env, jclass) { 101 return ConvertUTF8ToJavaString( 102 env, chrome::kPasswordManagerAccountDashboardURL).Release(); 103} 104 105static jboolean ShouldDisplayManageAccountLink( 106 JNIEnv* env, jclass) { 107 std::string group_name = 108 base::FieldTrialList::FindFullName("AndroidPasswordLinkInSettings"); 109 110 CommandLine* command_line = CommandLine::ForCurrentProcess(); 111 if (command_line->HasSwitch( 112 password_manager::switches::kDisableAndroidPasswordLink)) { 113 return false; 114 } 115 116 if (command_line->HasSwitch( 117 password_manager::switches::kEnableAndroidPasswordLink)) { 118 return true; 119 } 120 121 return group_name == "Enabled"; 122} 123 124// static 125static jlong Init(JNIEnv* env, jobject obj) { 126 PasswordUIViewAndroid* controller = new PasswordUIViewAndroid(env, obj); 127 return reinterpret_cast<intptr_t>(controller); 128} 129 130bool PasswordUIViewAndroid::RegisterPasswordUIViewAndroid(JNIEnv* env) { 131 return RegisterNativesImpl(env); 132} 133