personal_data_manager_android.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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/autofill/android/personal_data_manager_android.h" 6 7#include "base/android/jni_array.h" 8#include "base/android/jni_string.h" 9#include "base/format_macros.h" 10#include "base/prefs/pref_service.h" 11#include "base/strings/stringprintf.h" 12#include "base/strings/utf_string_conversions.h" 13#include "chrome/browser/autofill/personal_data_manager_factory.h" 14#include "chrome/browser/browser_process.h" 15#include "chrome/browser/profiles/profile_manager.h" 16#include "chrome/common/pref_names.h" 17#include "components/autofill/core/browser/autofill_country.h" 18#include "components/autofill/core/browser/autofill_type.h" 19#include "components/autofill/core/browser/field_types.h" 20#include "components/autofill/core/browser/personal_data_manager.h" 21#include "jni/PersonalDataManager_jni.h" 22 23using base::android::ConvertJavaStringToUTF8; 24using base::android::ConvertUTF16ToJavaString; 25using base::android::ConvertUTF8ToJavaString; 26using base::android::ScopedJavaLocalRef; 27 28namespace autofill { 29namespace { 30 31PrefService* GetPrefs() { 32 return 33 ProfileManager::GetActiveUserProfile()->GetOriginalProfile()->GetPrefs(); 34} 35 36ScopedJavaLocalRef<jobject> CreateJavaProfileFromNative( 37 JNIEnv* env, 38 const AutofillProfile& profile) { 39 return Java_AutofillProfile_create( 40 env, 41 ConvertUTF8ToJavaString(env, profile.guid()).obj(), 42 ConvertUTF8ToJavaString(env, profile.origin()).obj(), 43 ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(), 44 ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(), 45 ConvertUTF16ToJavaString( 46 env, 47 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)).obj(), 48 ConvertUTF16ToJavaString( 49 env, 50 profile.GetRawInfo(ADDRESS_HOME_STATE)).obj(), 51 ConvertUTF16ToJavaString( 52 env, 53 profile.GetRawInfo(ADDRESS_HOME_CITY)).obj(), 54 ConvertUTF16ToJavaString( 55 env, 56 profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)).obj(), 57 ConvertUTF16ToJavaString( 58 env, 59 profile.GetRawInfo(ADDRESS_HOME_ZIP)).obj(), 60 ConvertUTF16ToJavaString( 61 env, 62 profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)).obj(), 63 ConvertUTF16ToJavaString( 64 env, 65 profile.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), 66 g_browser_process->GetApplicationLocale())).obj(), 67 ConvertUTF16ToJavaString( 68 env, 69 profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)).obj(), 70 ConvertUTF16ToJavaString(env, profile.GetRawInfo(EMAIL_ADDRESS)).obj(), 71 ConvertUTF8ToJavaString(env, profile.language_code()).obj()); 72} 73 74void PopulateNativeProfileFromJava( 75 const jobject& jprofile, 76 JNIEnv* env, 77 AutofillProfile* profile) { 78 profile->set_origin( 79 ConvertJavaStringToUTF8( 80 Java_AutofillProfile_getOrigin(env, jprofile))); 81 profile->SetInfo( 82 AutofillType(NAME_FULL), 83 ConvertJavaStringToUTF16( 84 Java_AutofillProfile_getFullName(env, jprofile)), 85 g_browser_process->GetApplicationLocale()); 86 profile->SetInfo( 87 AutofillType(COMPANY_NAME), 88 ConvertJavaStringToUTF16( 89 Java_AutofillProfile_getCompanyName(env, jprofile)), 90 g_browser_process->GetApplicationLocale()); 91 profile->SetInfo( 92 AutofillType(ADDRESS_HOME_STREET_ADDRESS), 93 ConvertJavaStringToUTF16( 94 Java_AutofillProfile_getStreetAddress(env, jprofile)), 95 g_browser_process->GetApplicationLocale()); 96 profile->SetInfo( 97 AutofillType(ADDRESS_HOME_STATE), 98 ConvertJavaStringToUTF16( 99 Java_AutofillProfile_getRegion(env, jprofile)), 100 g_browser_process->GetApplicationLocale()); 101 profile->SetInfo( 102 AutofillType(ADDRESS_HOME_CITY), 103 ConvertJavaStringToUTF16( 104 Java_AutofillProfile_getLocality(env, jprofile)), 105 g_browser_process->GetApplicationLocale()); 106 profile->SetInfo( 107 AutofillType(ADDRESS_HOME_DEPENDENT_LOCALITY), 108 ConvertJavaStringToUTF16( 109 Java_AutofillProfile_getDependentLocality(env, jprofile)), 110 g_browser_process->GetApplicationLocale()); 111 profile->SetInfo( 112 AutofillType(ADDRESS_HOME_ZIP), 113 ConvertJavaStringToUTF16( 114 Java_AutofillProfile_getPostalCode(env, jprofile)), 115 g_browser_process->GetApplicationLocale()); 116 profile->SetInfo( 117 AutofillType(ADDRESS_HOME_SORTING_CODE), 118 ConvertJavaStringToUTF16( 119 Java_AutofillProfile_getSortingCode(env, jprofile)), 120 g_browser_process->GetApplicationLocale()); 121 profile->SetInfo( 122 AutofillType(ADDRESS_HOME_COUNTRY), 123 ConvertJavaStringToUTF16( 124 Java_AutofillProfile_getCountry(env, jprofile)), 125 g_browser_process->GetApplicationLocale()); 126 profile->SetInfo( 127 AutofillType(PHONE_HOME_WHOLE_NUMBER), 128 ConvertJavaStringToUTF16( 129 Java_AutofillProfile_getPhoneNumber(env, jprofile)), 130 g_browser_process->GetApplicationLocale()); 131 profile->SetInfo( 132 AutofillType(EMAIL_ADDRESS), 133 ConvertJavaStringToUTF16( 134 Java_AutofillProfile_getEmailAddress(env, jprofile)), 135 g_browser_process->GetApplicationLocale()); 136 profile->set_language_code( 137 ConvertJavaStringToUTF8( 138 Java_AutofillProfile_getLanguageCode(env, jprofile))); 139} 140 141ScopedJavaLocalRef<jobject> CreateJavaCreditCardFromNative( 142 JNIEnv* env, 143 const CreditCard& card) { 144 return Java_CreditCard_create( 145 env, 146 ConvertUTF8ToJavaString(env, card.guid()).obj(), 147 ConvertUTF8ToJavaString(env, card.origin()).obj(), 148 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NAME)).obj(), 149 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NUMBER)).obj(), 150 ConvertUTF16ToJavaString(env, card.ObfuscatedNumber()).obj(), 151 ConvertUTF16ToJavaString( 152 env, 153 card.GetRawInfo(CREDIT_CARD_EXP_MONTH)).obj(), 154 ConvertUTF16ToJavaString( 155 env, 156 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)).obj()); 157} 158 159void PopulateNativeCreditCardFromJava( 160 const jobject& jcard, 161 JNIEnv* env, 162 CreditCard* card) { 163 card->set_origin( 164 ConvertJavaStringToUTF8(Java_CreditCard_getOrigin(env, jcard))); 165 card->SetRawInfo( 166 CREDIT_CARD_NAME, 167 ConvertJavaStringToUTF16(Java_CreditCard_getName(env, jcard))); 168 card->SetRawInfo( 169 CREDIT_CARD_NUMBER, 170 ConvertJavaStringToUTF16(Java_CreditCard_getNumber(env, jcard))); 171 card->SetRawInfo( 172 CREDIT_CARD_EXP_MONTH, 173 ConvertJavaStringToUTF16(Java_CreditCard_getMonth(env, jcard))); 174 card->SetRawInfo( 175 CREDIT_CARD_EXP_4_DIGIT_YEAR, 176 ConvertJavaStringToUTF16(Java_CreditCard_getYear(env, jcard))); 177} 178 179} // namespace 180 181PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, 182 jobject obj) 183 : weak_java_obj_(env, obj), 184 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( 185 ProfileManager::GetActiveUserProfile())) { 186 personal_data_manager_->AddObserver(this); 187} 188 189PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { 190 personal_data_manager_->RemoveObserver(this); 191} 192 193jint PersonalDataManagerAndroid::GetProfileCount(JNIEnv* unused_env, 194 jobject unused_obj) { 195 return personal_data_manager_->GetProfiles().size(); 196} 197 198ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByIndex( 199 JNIEnv* env, 200 jobject unused_obj, 201 jint index) { 202 const std::vector<AutofillProfile*>& profiles = 203 personal_data_manager_->GetProfiles(); 204 size_t index_size_t = static_cast<size_t>(index); 205 DCHECK_LT(index_size_t, profiles.size()); 206 return CreateJavaProfileFromNative(env, *profiles[index_size_t]); 207} 208 209ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByGUID( 210 JNIEnv* env, 211 jobject unused_obj, 212 jstring jguid) { 213 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID( 214 ConvertJavaStringToUTF8(env, jguid)); 215 if (!profile) 216 return ScopedJavaLocalRef<jobject>(); 217 218 return CreateJavaProfileFromNative(env, *profile); 219} 220 221ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetProfile( 222 JNIEnv* env, 223 jobject unused_obj, 224 jobject jprofile) { 225 std::string guid = ConvertJavaStringToUTF8( 226 env, 227 Java_AutofillProfile_getGUID(env, jprofile).obj()); 228 229 AutofillProfile profile; 230 PopulateNativeProfileFromJava(jprofile, env, &profile); 231 232 if (guid.empty()) { 233 personal_data_manager_->AddProfile(profile); 234 } else { 235 profile.set_guid(guid); 236 personal_data_manager_->UpdateProfile(profile); 237 } 238 239 return ConvertUTF8ToJavaString(env, profile.guid()); 240} 241 242jint PersonalDataManagerAndroid::GetCreditCardCount(JNIEnv* unused_env, 243 jobject unused_obj) { 244 return personal_data_manager_->GetCreditCards().size(); 245} 246 247ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByIndex( 248 JNIEnv* env, 249 jobject unused_obj, 250 jint index) { 251 const std::vector<CreditCard*>& credit_cards = 252 personal_data_manager_->GetCreditCards(); 253 size_t index_size_t = static_cast<size_t>(index); 254 DCHECK_LT(index_size_t, credit_cards.size()); 255 return CreateJavaCreditCardFromNative(env, *credit_cards[index_size_t]); 256} 257 258ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByGUID( 259 JNIEnv* env, 260 jobject unused_obj, 261 jstring jguid) { 262 CreditCard* card = personal_data_manager_->GetCreditCardByGUID( 263 ConvertJavaStringToUTF8(env, jguid)); 264 if (!card) 265 return ScopedJavaLocalRef<jobject>(); 266 267 return CreateJavaCreditCardFromNative(env, *card); 268} 269 270ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetCreditCard( 271 JNIEnv* env, 272 jobject unused_obj, 273 jobject jcard) { 274 std::string guid = ConvertJavaStringToUTF8( 275 env, 276 Java_CreditCard_getGUID(env, jcard).obj()); 277 278 CreditCard card; 279 PopulateNativeCreditCardFromJava(jcard, env, &card); 280 281 if (guid.empty()) { 282 personal_data_manager_->AddCreditCard(card); 283 } else { 284 card.set_guid(guid); 285 personal_data_manager_->UpdateCreditCard(card); 286 } 287 return ConvertUTF8ToJavaString(env, card.guid()); 288} 289 290ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( 291 JNIEnv* env, 292 jobject unused_obj) { 293 std::vector<base::string16> labels; 294 AutofillProfile::CreateInferredLabels( 295 personal_data_manager_->GetProfiles(), 296 NULL, 297 NAME_FULL, 298 2, 299 g_browser_process->GetApplicationLocale(), 300 &labels); 301 302 return base::android::ToJavaArrayOfStrings(env, labels); 303} 304 305void PersonalDataManagerAndroid::RemoveByGUID(JNIEnv* env, 306 jobject unused_obj, 307 jstring jguid) { 308 personal_data_manager_->RemoveByGUID(ConvertJavaStringToUTF8(env, jguid)); 309} 310 311void PersonalDataManagerAndroid::OnPersonalDataChanged() { 312 JNIEnv* env = base::android::AttachCurrentThread(); 313 if (weak_java_obj_.get(env).is_null()) 314 return; 315 316 Java_PersonalDataManager_personalDataChanged(env, 317 weak_java_obj_.get(env).obj()); 318} 319 320// static 321bool PersonalDataManagerAndroid::Register(JNIEnv* env) { 322 return RegisterNativesImpl(env); 323} 324 325// Returns whether the Autofill feature is enabled. 326static jboolean IsAutofillEnabled(JNIEnv* env, jclass clazz) { 327 return GetPrefs()->GetBoolean(autofill::prefs::kAutofillEnabled); 328} 329 330// Enables or disables the Autofill feature. 331static void SetAutofillEnabled(JNIEnv* env, jclass clazz, jboolean enable) { 332 GetPrefs()->SetBoolean(autofill::prefs::kAutofillEnabled, enable); 333} 334 335// Returns whether Autofill feature is managed. 336static jboolean IsAutofillManaged(JNIEnv* env, jclass clazz) { 337 return GetPrefs()->IsManagedPreference(autofill::prefs::kAutofillEnabled); 338} 339 340// Returns an ISO 3166-1-alpha-2 country code for a |jcountry_name| using 341// the application locale, or an empty string. 342static jstring ToCountryCode(JNIEnv* env, jclass clazz, jstring jcountry_name) { 343 return ConvertUTF8ToJavaString( 344 env, 345 AutofillCountry::GetCountryCode( 346 base::android::ConvertJavaStringToUTF16(env, jcountry_name), 347 g_browser_process->GetApplicationLocale())).Release(); 348} 349 350static jlong Init(JNIEnv* env, jobject obj) { 351 PersonalDataManagerAndroid* personal_data_manager_android = 352 new PersonalDataManagerAndroid(env, obj); 353 return reinterpret_cast<intptr_t>(personal_data_manager_android); 354} 355 356} // namespace autofill 357