personal_data_manager_android.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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_string.h" 8#include "base/format_macros.h" 9#include "base/stringprintf.h" 10#include "base/utf_string_conversions.h" 11#include "chrome/browser/autofill/personal_data_manager_factory.h" 12#include "chrome/browser/browser_process.h" 13#include "chrome/browser/profiles/profile_manager.h" 14#include "components/autofill/browser/field_types.h" 15#include "components/autofill/browser/personal_data_manager.h" 16#include "jni/PersonalDataManager_jni.h" 17 18using base::android::ConvertJavaStringToUTF8; 19using base::android::ConvertUTF16ToJavaString; 20using base::android::ConvertUTF8ToJavaString; 21using base::android::ScopedJavaLocalRef; 22 23namespace { 24 25Profile* GetDefaultProfile() { 26 return g_browser_process->profile_manager()->GetDefaultProfile(); 27} 28 29ScopedJavaLocalRef<jobject> CreateJavaProfileFromNative( 30 JNIEnv* env, 31 const AutofillProfile& profile) { 32 return Java_AutofillProfile_create( 33 env, 34 ConvertUTF8ToJavaString(env, profile.GetGUID()).obj(), 35 ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(), 36 ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(), 37 ConvertUTF16ToJavaString( 38 env, 39 profile.GetRawInfo(ADDRESS_HOME_LINE1)).obj(), 40 ConvertUTF16ToJavaString( 41 env, 42 profile.GetRawInfo(ADDRESS_HOME_LINE2)).obj(), 43 ConvertUTF16ToJavaString( 44 env, 45 profile.GetRawInfo(ADDRESS_HOME_CITY)).obj(), 46 ConvertUTF16ToJavaString( 47 env, 48 profile.GetRawInfo(ADDRESS_HOME_STATE)).obj(), 49 ConvertUTF16ToJavaString( 50 env, 51 profile.GetRawInfo(ADDRESS_HOME_ZIP)).obj(), 52 ConvertUTF16ToJavaString( 53 env, 54 profile.GetRawInfo(ADDRESS_HOME_COUNTRY)).obj(), 55 ConvertUTF16ToJavaString( 56 env, 57 profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)).obj(), 58 ConvertUTF16ToJavaString(env, profile.GetRawInfo(EMAIL_ADDRESS)).obj()); 59} 60 61void PopulateNativeProfileFromJava( 62 const jobject& jprofile, 63 JNIEnv* env, 64 AutofillProfile* profile) { 65 profile->SetRawInfo( 66 NAME_FULL, 67 ConvertJavaStringToUTF16( 68 Java_AutofillProfile_getFullName(env, jprofile))); 69 profile->SetRawInfo( 70 COMPANY_NAME, 71 ConvertJavaStringToUTF16( 72 Java_AutofillProfile_getCompanyName(env, jprofile))); 73 profile->SetRawInfo( 74 ADDRESS_HOME_LINE1, 75 ConvertJavaStringToUTF16( 76 Java_AutofillProfile_getAddressLine1(env, jprofile))); 77 profile->SetRawInfo( 78 ADDRESS_HOME_LINE2, 79 ConvertJavaStringToUTF16( 80 Java_AutofillProfile_getAddressLine2(env, jprofile))); 81 profile->SetRawInfo( 82 ADDRESS_HOME_CITY, 83 ConvertJavaStringToUTF16( 84 Java_AutofillProfile_getCity(env, jprofile))); 85 profile->SetRawInfo( 86 ADDRESS_HOME_STATE, 87 ConvertJavaStringToUTF16( 88 Java_AutofillProfile_getState(env, jprofile))); 89 profile->SetRawInfo( 90 ADDRESS_HOME_ZIP, 91 ConvertJavaStringToUTF16( 92 Java_AutofillProfile_getZip(env, jprofile))); 93 profile->SetRawInfo( 94 ADDRESS_HOME_COUNTRY, 95 ConvertJavaStringToUTF16( 96 Java_AutofillProfile_getCountry(env, jprofile))); 97 profile->SetRawInfo( 98 PHONE_HOME_WHOLE_NUMBER, 99 ConvertJavaStringToUTF16( 100 Java_AutofillProfile_getPhoneNumber(env, jprofile))); 101 profile->SetRawInfo( 102 EMAIL_ADDRESS, 103 ConvertJavaStringToUTF16( 104 Java_AutofillProfile_getEmailAddress(env, jprofile))); 105} 106 107ScopedJavaLocalRef<jobject> CreateJavaCreditCardFromNative( 108 JNIEnv* env, 109 const CreditCard& card) { 110 return Java_CreditCard_create( 111 env, 112 ConvertUTF8ToJavaString(env, card.GetGUID()).obj(), 113 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NAME)).obj(), 114 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NUMBER)).obj(), 115 ConvertUTF16ToJavaString(env, card.ObfuscatedNumber()).obj(), 116 ConvertUTF16ToJavaString( 117 env, 118 card.GetRawInfo(CREDIT_CARD_EXP_MONTH)).obj(), 119 ConvertUTF16ToJavaString( 120 env, 121 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)).obj()); 122} 123 124void PopulateNativeCreditCardFromJava( 125 const jobject& jcard, 126 JNIEnv* env, 127 CreditCard* card) { 128 card->SetRawInfo( 129 CREDIT_CARD_NAME, 130 ConvertJavaStringToUTF16(Java_CreditCard_getName(env, jcard))); 131 card->SetRawInfo( 132 CREDIT_CARD_NUMBER, 133 ConvertJavaStringToUTF16(Java_CreditCard_getNumber(env, jcard))); 134 card->SetRawInfo( 135 CREDIT_CARD_EXP_MONTH, 136 ConvertJavaStringToUTF16(Java_CreditCard_getMonth(env, jcard))); 137 card->SetRawInfo( 138 CREDIT_CARD_EXP_4_DIGIT_YEAR, 139 ConvertJavaStringToUTF16(Java_CreditCard_getYear(env, jcard))); 140} 141 142} // namespace 143 144PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, 145 jobject obj) 146 : weak_java_obj_(env, obj), 147 personal_data_manager_( 148 PersonalDataManagerFactory::GetForProfile(GetDefaultProfile())) { 149 personal_data_manager_->AddObserver(this); 150} 151 152PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { 153 personal_data_manager_->RemoveObserver(this); 154} 155 156 157jint PersonalDataManagerAndroid::GetProfileCount(JNIEnv* unused_env, 158 jobject unused_obj) { 159 return personal_data_manager_->GetProfiles().size(); 160} 161 162ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByIndex( 163 JNIEnv* env, 164 jobject unused_obj, 165 jint index) { 166 const std::vector<AutofillProfile*>& profiles = 167 personal_data_manager_->GetProfiles(); 168 size_t index_size_t = static_cast<size_t>(index); 169 DCHECK_LT(index_size_t, profiles.size()); 170 return CreateJavaProfileFromNative(env, *profiles[index_size_t]); 171} 172 173ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByGUID( 174 JNIEnv* env, 175 jobject unused_obj, 176 jstring jguid) { 177 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID( 178 ConvertJavaStringToUTF8(env, jguid)); 179 if (!profile) 180 return ScopedJavaLocalRef<jobject>(); 181 182 return CreateJavaProfileFromNative(env, *profile); 183} 184 185ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetProfile( 186 JNIEnv* env, 187 jobject unused_obj, 188 jobject jprofile) { 189 std::string guid = ConvertJavaStringToUTF8( 190 env, 191 Java_AutofillProfile_getGUID(env, jprofile).obj()); 192 193 AutofillProfile profile; 194 PopulateNativeProfileFromJava(jprofile, env, &profile); 195 196 if (guid.empty()) { 197 personal_data_manager_->AddProfile(profile); 198 } else { 199 profile.set_guid(guid); 200 personal_data_manager_->UpdateProfile(profile); 201 } 202 203 return ConvertUTF8ToJavaString(env, profile.GetGUID()); 204} 205 206 207jint PersonalDataManagerAndroid::GetCreditCardCount(JNIEnv* unused_env, 208 jobject unused_obj) { 209 return personal_data_manager_->credit_cards().size(); 210} 211 212ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByIndex( 213 JNIEnv* env, 214 jobject unused_obj, 215 jint index) { 216 const std::vector<CreditCard*>& credit_cards = 217 personal_data_manager_->credit_cards(); 218 size_t index_size_t = static_cast<size_t>(index); 219 DCHECK_LT(index_size_t, credit_cards.size()); 220 return CreateJavaCreditCardFromNative(env, *credit_cards[index_size_t]); 221} 222 223ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByGUID( 224 JNIEnv* env, 225 jobject unused_obj, 226 jstring jguid) { 227 CreditCard* card = personal_data_manager_->GetCreditCardByGUID( 228 ConvertJavaStringToUTF8(env, jguid)); 229 if (!card) 230 return ScopedJavaLocalRef<jobject>(); 231 232 return CreateJavaCreditCardFromNative(env, *card); 233} 234 235ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetCreditCard( 236 JNIEnv* env, 237 jobject unused_obj, 238 jobject jcard) { 239 std::string guid = ConvertJavaStringToUTF8( 240 env, 241 Java_CreditCard_getGUID(env, jcard).obj()); 242 243 CreditCard card; 244 PopulateNativeCreditCardFromJava(jcard, env, &card); 245 246 if (guid.empty()) { 247 personal_data_manager_->AddCreditCard(card); 248 } else { 249 card.set_guid(guid); 250 personal_data_manager_->UpdateCreditCard(card); 251 } 252 return ConvertUTF8ToJavaString(env, card.GetGUID()); 253} 254 255void PersonalDataManagerAndroid::RemoveByGUID(JNIEnv* env, 256 jobject unused_obj, 257 jstring jguid) { 258 personal_data_manager_->RemoveByGUID(ConvertJavaStringToUTF8(env, jguid)); 259} 260 261void PersonalDataManagerAndroid::OnPersonalDataChanged() { 262 JNIEnv* env = base::android::AttachCurrentThread(); 263 if (weak_java_obj_.get(env).is_null()) 264 return; 265 266 Java_PersonalDataManager_personalDataChanged(env, 267 weak_java_obj_.get(env).obj()); 268} 269 270// static 271bool PersonalDataManagerAndroid::Register(JNIEnv* env) { 272 return RegisterNativesImpl(env); 273} 274 275static jint Init(JNIEnv* env, jobject obj) { 276 PersonalDataManagerAndroid* personal_data_manager_android = 277 new PersonalDataManagerAndroid(env, obj); 278 return reinterpret_cast<jint>(personal_data_manager_android); 279} 280