// Copyright 2013 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/android/password_ui_view_android.h" #include "base/android/jni_string.h" #include "base/android/jni_weak_ref.h" #include "base/command_line.h" #include "base/metrics/field_trial.h" #include "base/prefs/pref_service.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/sync/profile_sync_service.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "components/autofill/core/common/password_form.h" #include "components/password_manager/core/browser/affiliation_utils.h" #include "components/password_manager/core/browser/password_bubble_experiment.h" #include "components/password_manager/core/common/experiments.h" #include "components/password_manager/core/common/password_manager_switches.h" #include "jni/PasswordUIView_jni.h" using base::android::ConvertUTF16ToJavaString; using base::android::ConvertUTF8ToJavaString; using base::android::ScopedJavaLocalRef; PasswordUIViewAndroid::PasswordUIViewAndroid(JNIEnv* env, jobject obj) : password_manager_presenter_(this), weak_java_ui_controller_(env, obj) {} PasswordUIViewAndroid::~PasswordUIViewAndroid() {} void PasswordUIViewAndroid::Destroy(JNIEnv*, jobject) { delete this; } Profile* PasswordUIViewAndroid::GetProfile() { return ProfileManager::GetLastUsedProfile(); } void PasswordUIViewAndroid::ShowPassword( size_t index, const std::string& origin_url, const std::string& username, const base::string16& password_value) { NOTIMPLEMENTED(); } void PasswordUIViewAndroid::SetPasswordList( const ScopedVector& password_list, bool show_passwords) { // Android just ignores the |show_passwords| argument. JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef ui_controller = weak_java_ui_controller_.get(env); if (!ui_controller.is_null()) { Java_PasswordUIView_passwordListAvailable( env, ui_controller.obj(), static_cast(password_list.size())); } } void PasswordUIViewAndroid::SetPasswordExceptionList( const ScopedVector& password_exception_list) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef ui_controller = weak_java_ui_controller_.get(env); if (!ui_controller.is_null()) { Java_PasswordUIView_passwordExceptionListAvailable( env, ui_controller.obj(), static_cast(password_exception_list.size())); } } void PasswordUIViewAndroid::UpdatePasswordLists(JNIEnv* env, jobject) { password_manager_presenter_.UpdatePasswordLists(); } ScopedJavaLocalRef PasswordUIViewAndroid::GetSavedPasswordEntry(JNIEnv* env, jobject, int index) { const autofill::PasswordForm* form = password_manager_presenter_.GetPassword(index); if (!form) { return Java_PasswordUIView_createSavedPasswordEntry( env, ConvertUTF8ToJavaString(env, std::string()).obj(), ConvertUTF16ToJavaString(env, base::string16()).obj()); } std::string human_readable_origin = password_manager::GetHumanReadableOrigin( *form, GetProfile()->GetPrefs()->GetString(prefs::kAcceptLanguages)); return Java_PasswordUIView_createSavedPasswordEntry( env, ConvertUTF8ToJavaString(env, human_readable_origin).obj(), ConvertUTF16ToJavaString(env, form->username_value).obj()); } ScopedJavaLocalRef PasswordUIViewAndroid::GetSavedPasswordException( JNIEnv* env, jobject, int index) { const autofill::PasswordForm* form = password_manager_presenter_.GetPasswordException(index); if (!form) return ConvertUTF8ToJavaString(env, std::string()); std::string human_readable_origin = password_manager::GetHumanReadableOrigin( *form, GetProfile()->GetPrefs()->GetString(prefs::kAcceptLanguages)); return ConvertUTF8ToJavaString(env, human_readable_origin); } void PasswordUIViewAndroid::HandleRemoveSavedPasswordEntry( JNIEnv* env, jobject, int index) { password_manager_presenter_.RemoveSavedPassword(index); } void PasswordUIViewAndroid::HandleRemoveSavedPasswordException( JNIEnv* env, jobject, int index) { password_manager_presenter_.RemovePasswordException(index); } ScopedJavaLocalRef GetAccountDashboardURL( JNIEnv* env, const JavaParamRef&) { return ConvertUTF8ToJavaString(env, chrome::kPasswordManagerAccountDashboardURL); } static jboolean ShouldDisplayManageAccountLink(JNIEnv* env, const JavaParamRef&) { return password_manager::ManageAccountLinkExperimentEnabled(); } static jboolean ShouldUseSmartLockBranding(JNIEnv* env, const JavaParamRef&) { const ProfileSyncService* sync_service = ProfileSyncServiceFactory::GetForProfile( ProfileManager::GetLastUsedProfile()); return password_bubble_experiment::IsSmartLockBrandingEnabled(sync_service); } // static static jlong Init(JNIEnv* env, const JavaParamRef& obj) { PasswordUIViewAndroid* controller = new PasswordUIViewAndroid(env, obj); return reinterpret_cast(controller); } bool PasswordUIViewAndroid::RegisterPasswordUIViewAndroid(JNIEnv* env) { return RegisterNativesImpl(env); }