personal_data_manager_android.cc revision 868fa2fe829687343ffae624259930155e16dbd8
19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// Copyright 2013 The Chromium Authors. All rights reserved. 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// Use of this source code is governed by a BSD-style license that can be 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// found in the LICENSE file. 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "chrome/browser/autofill/android/personal_data_manager_android.h" 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "base/android/jni_string.h" 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "base/format_macros.h" 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "base/strings/stringprintf.h" 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "base/strings/utf_string_conversions.h" 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "chrome/browser/autofill/personal_data_manager_factory.h" 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "chrome/browser/browser_process.h" 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "chrome/browser/profiles/profile_manager.h" 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "components/autofill/browser/field_types.h" 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "components/autofill/browser/personal_data_manager.h" 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "jni/PersonalDataManager_jni.h" 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonusing base::android::ConvertJavaStringToUTF8; 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonusing base::android::ConvertUTF16ToJavaString; 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonusing base::android::ConvertUTF8ToJavaString; 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonusing base::android::ScopedJavaLocalRef; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonnamespace autofill { 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonnamespace { 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse WilsonProfile* GetDefaultProfile() { 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return g_browser_process->profile_manager()->GetDefaultProfile(); 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse WilsonScopedJavaLocalRef<jobject> CreateJavaProfileFromNative( 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson JNIEnv* env, 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson const AutofillProfile& profile) { 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Java_AutofillProfile_create( 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson env, 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF8ToJavaString(env, profile.guid()).obj(), 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF8ToJavaString(env, profile.origin()).obj(), 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(), 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(), 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString( 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson env, 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson profile.GetRawInfo(ADDRESS_HOME_LINE1)).obj(), 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString( 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson env, 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson profile.GetRawInfo(ADDRESS_HOME_LINE2)).obj(), 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString( 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson env, 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson profile.GetRawInfo(ADDRESS_HOME_CITY)).obj(), 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString( 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson env, 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson profile.GetRawInfo(ADDRESS_HOME_STATE)).obj(), 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ConvertUTF16ToJavaString( 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson env, 53 profile.GetRawInfo(ADDRESS_HOME_ZIP)).obj(), 54 ConvertUTF16ToJavaString( 55 env, 56 profile.GetInfo(ADDRESS_HOME_COUNTRY, 57 g_browser_process->GetApplicationLocale())).obj(), 58 ConvertUTF16ToJavaString( 59 env, 60 profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)).obj(), 61 ConvertUTF16ToJavaString(env, profile.GetRawInfo(EMAIL_ADDRESS)).obj()); 62} 63 64void PopulateNativeProfileFromJava( 65 const jobject& jprofile, 66 JNIEnv* env, 67 AutofillProfile* profile) { 68 profile->set_origin( 69 ConvertJavaStringToUTF8( 70 Java_AutofillProfile_getOrigin(env, jprofile))); 71 profile->SetRawInfo( 72 NAME_FULL, 73 ConvertJavaStringToUTF16( 74 Java_AutofillProfile_getFullName(env, jprofile))); 75 profile->SetRawInfo( 76 COMPANY_NAME, 77 ConvertJavaStringToUTF16( 78 Java_AutofillProfile_getCompanyName(env, jprofile))); 79 profile->SetRawInfo( 80 ADDRESS_HOME_LINE1, 81 ConvertJavaStringToUTF16( 82 Java_AutofillProfile_getAddressLine1(env, jprofile))); 83 profile->SetRawInfo( 84 ADDRESS_HOME_LINE2, 85 ConvertJavaStringToUTF16( 86 Java_AutofillProfile_getAddressLine2(env, jprofile))); 87 profile->SetRawInfo( 88 ADDRESS_HOME_CITY, 89 ConvertJavaStringToUTF16( 90 Java_AutofillProfile_getCity(env, jprofile))); 91 profile->SetRawInfo( 92 ADDRESS_HOME_STATE, 93 ConvertJavaStringToUTF16( 94 Java_AutofillProfile_getState(env, jprofile))); 95 profile->SetRawInfo( 96 ADDRESS_HOME_ZIP, 97 ConvertJavaStringToUTF16( 98 Java_AutofillProfile_getZip(env, jprofile))); 99 profile->SetInfo( 100 ADDRESS_HOME_COUNTRY, 101 ConvertJavaStringToUTF16( 102 Java_AutofillProfile_getCountry(env, jprofile)), 103 g_browser_process->GetApplicationLocale()); 104 profile->SetRawInfo( 105 PHONE_HOME_WHOLE_NUMBER, 106 ConvertJavaStringToUTF16( 107 Java_AutofillProfile_getPhoneNumber(env, jprofile))); 108 profile->SetRawInfo( 109 EMAIL_ADDRESS, 110 ConvertJavaStringToUTF16( 111 Java_AutofillProfile_getEmailAddress(env, jprofile))); 112} 113 114ScopedJavaLocalRef<jobject> CreateJavaCreditCardFromNative( 115 JNIEnv* env, 116 const CreditCard& card) { 117 return Java_CreditCard_create( 118 env, 119 ConvertUTF8ToJavaString(env, card.guid()).obj(), 120 ConvertUTF8ToJavaString(env, card.origin()).obj(), 121 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NAME)).obj(), 122 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NUMBER)).obj(), 123 ConvertUTF16ToJavaString(env, card.ObfuscatedNumber()).obj(), 124 ConvertUTF16ToJavaString( 125 env, 126 card.GetRawInfo(CREDIT_CARD_EXP_MONTH)).obj(), 127 ConvertUTF16ToJavaString( 128 env, 129 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)).obj()); 130} 131 132void PopulateNativeCreditCardFromJava( 133 const jobject& jcard, 134 JNIEnv* env, 135 CreditCard* card) { 136 card->set_origin( 137 ConvertJavaStringToUTF8(Java_CreditCard_getOrigin(env, jcard))); 138 card->SetRawInfo( 139 CREDIT_CARD_NAME, 140 ConvertJavaStringToUTF16(Java_CreditCard_getName(env, jcard))); 141 card->SetRawInfo( 142 CREDIT_CARD_NUMBER, 143 ConvertJavaStringToUTF16(Java_CreditCard_getNumber(env, jcard))); 144 card->SetRawInfo( 145 CREDIT_CARD_EXP_MONTH, 146 ConvertJavaStringToUTF16(Java_CreditCard_getMonth(env, jcard))); 147 card->SetRawInfo( 148 CREDIT_CARD_EXP_4_DIGIT_YEAR, 149 ConvertJavaStringToUTF16(Java_CreditCard_getYear(env, jcard))); 150} 151 152} // namespace 153 154PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, 155 jobject obj) 156 : weak_java_obj_(env, obj), 157 personal_data_manager_( 158 PersonalDataManagerFactory::GetForProfile(GetDefaultProfile())) { 159 personal_data_manager_->AddObserver(this); 160} 161 162PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { 163 personal_data_manager_->RemoveObserver(this); 164} 165 166 167jint PersonalDataManagerAndroid::GetProfileCount(JNIEnv* unused_env, 168 jobject unused_obj) { 169 return personal_data_manager_->GetProfiles().size(); 170} 171 172ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByIndex( 173 JNIEnv* env, 174 jobject unused_obj, 175 jint index) { 176 const std::vector<AutofillProfile*>& profiles = 177 personal_data_manager_->GetProfiles(); 178 size_t index_size_t = static_cast<size_t>(index); 179 DCHECK_LT(index_size_t, profiles.size()); 180 return CreateJavaProfileFromNative(env, *profiles[index_size_t]); 181} 182 183ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByGUID( 184 JNIEnv* env, 185 jobject unused_obj, 186 jstring jguid) { 187 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID( 188 ConvertJavaStringToUTF8(env, jguid)); 189 if (!profile) 190 return ScopedJavaLocalRef<jobject>(); 191 192 return CreateJavaProfileFromNative(env, *profile); 193} 194 195ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetProfile( 196 JNIEnv* env, 197 jobject unused_obj, 198 jobject jprofile) { 199 std::string guid = ConvertJavaStringToUTF8( 200 env, 201 Java_AutofillProfile_getGUID(env, jprofile).obj()); 202 203 AutofillProfile profile; 204 PopulateNativeProfileFromJava(jprofile, env, &profile); 205 206 if (guid.empty()) { 207 personal_data_manager_->AddProfile(profile); 208 } else { 209 profile.set_guid(guid); 210 personal_data_manager_->UpdateProfile(profile); 211 } 212 213 return ConvertUTF8ToJavaString(env, profile.guid()); 214} 215 216 217jint PersonalDataManagerAndroid::GetCreditCardCount(JNIEnv* unused_env, 218 jobject unused_obj) { 219 return personal_data_manager_->GetCreditCards().size(); 220} 221 222ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByIndex( 223 JNIEnv* env, 224 jobject unused_obj, 225 jint index) { 226 const std::vector<CreditCard*>& credit_cards = 227 personal_data_manager_->GetCreditCards(); 228 size_t index_size_t = static_cast<size_t>(index); 229 DCHECK_LT(index_size_t, credit_cards.size()); 230 return CreateJavaCreditCardFromNative(env, *credit_cards[index_size_t]); 231} 232 233ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByGUID( 234 JNIEnv* env, 235 jobject unused_obj, 236 jstring jguid) { 237 CreditCard* card = personal_data_manager_->GetCreditCardByGUID( 238 ConvertJavaStringToUTF8(env, jguid)); 239 if (!card) 240 return ScopedJavaLocalRef<jobject>(); 241 242 return CreateJavaCreditCardFromNative(env, *card); 243} 244 245ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetCreditCard( 246 JNIEnv* env, 247 jobject unused_obj, 248 jobject jcard) { 249 std::string guid = ConvertJavaStringToUTF8( 250 env, 251 Java_CreditCard_getGUID(env, jcard).obj()); 252 253 CreditCard card; 254 PopulateNativeCreditCardFromJava(jcard, env, &card); 255 256 if (guid.empty()) { 257 personal_data_manager_->AddCreditCard(card); 258 } else { 259 card.set_guid(guid); 260 personal_data_manager_->UpdateCreditCard(card); 261 } 262 return ConvertUTF8ToJavaString(env, card.guid()); 263} 264 265void PersonalDataManagerAndroid::RemoveByGUID(JNIEnv* env, 266 jobject unused_obj, 267 jstring jguid) { 268 personal_data_manager_->RemoveByGUID(ConvertJavaStringToUTF8(env, jguid)); 269} 270 271void PersonalDataManagerAndroid::OnPersonalDataChanged() { 272 JNIEnv* env = base::android::AttachCurrentThread(); 273 if (weak_java_obj_.get(env).is_null()) 274 return; 275 276 Java_PersonalDataManager_personalDataChanged(env, 277 weak_java_obj_.get(env).obj()); 278} 279 280// static 281bool PersonalDataManagerAndroid::Register(JNIEnv* env) { 282 return RegisterNativesImpl(env); 283} 284 285static jint Init(JNIEnv* env, jobject obj) { 286 PersonalDataManagerAndroid* personal_data_manager_android = 287 new PersonalDataManagerAndroid(env, obj); 288 return reinterpret_cast<jint>(personal_data_manager_android); 289} 290 291} // namespace autofill 292