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.
5 #include "chrome/browser/autofill/android/personal_data_manager_android.h"
7 #include "base/android/jni_string.h"
8 #include "base/format_macros.h"
9 #include "base/prefs/pref_service.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/autofill/personal_data_manager_factory.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/profiles/profile_manager.h"
15 #include "chrome/common/pref_names.h"
16 #include "components/autofill/core/browser/autofill_country.h"
17 #include "components/autofill/core/browser/autofill_type.h"
18 #include "components/autofill/core/browser/field_types.h"
19 #include "components/autofill/core/browser/personal_data_manager.h"
20 #include "jni/PersonalDataManager_jni.h"
22 using base::android::ConvertJavaStringToUTF8;
23 using base::android::ConvertUTF16ToJavaString;
24 using base::android::ConvertUTF8ToJavaString;
25 using base::android::ScopedJavaLocalRef;
30 Profile* GetDefaultProfile() {
31 return g_browser_process->profile_manager()->GetDefaultProfile();
34 PrefService* GetPrefs() {
35 return GetDefaultProfile()->GetOriginalProfile()->GetPrefs();
38 ScopedJavaLocalRef<jobject> CreateJavaProfileFromNative(
40 const AutofillProfile& profile) {
41 return Java_AutofillProfile_create(
43 ConvertUTF8ToJavaString(env, profile.guid()).obj(),
44 ConvertUTF8ToJavaString(env, profile.origin()).obj(),
45 ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(),
46 ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(),
47 ConvertUTF16ToJavaString(
49 profile.GetRawInfo(ADDRESS_HOME_LINE1)).obj(),
50 ConvertUTF16ToJavaString(
52 profile.GetRawInfo(ADDRESS_HOME_LINE2)).obj(),
53 ConvertUTF16ToJavaString(
55 profile.GetRawInfo(ADDRESS_HOME_CITY)).obj(),
56 ConvertUTF16ToJavaString(
58 profile.GetRawInfo(ADDRESS_HOME_STATE)).obj(),
59 ConvertUTF16ToJavaString(
61 profile.GetRawInfo(ADDRESS_HOME_ZIP)).obj(),
62 ConvertUTF16ToJavaString(
64 profile.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY),
65 g_browser_process->GetApplicationLocale())).obj(),
66 ConvertUTF16ToJavaString(
68 profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)).obj(),
69 ConvertUTF16ToJavaString(env, profile.GetRawInfo(EMAIL_ADDRESS)).obj());
72 void PopulateNativeProfileFromJava(
73 const jobject& jprofile,
75 AutofillProfile* profile) {
77 ConvertJavaStringToUTF8(
78 Java_AutofillProfile_getOrigin(env, jprofile)));
81 ConvertJavaStringToUTF16(
82 Java_AutofillProfile_getFullName(env, jprofile)));
85 ConvertJavaStringToUTF16(
86 Java_AutofillProfile_getCompanyName(env, jprofile)));
89 ConvertJavaStringToUTF16(
90 Java_AutofillProfile_getAddressLine1(env, jprofile)));
93 ConvertJavaStringToUTF16(
94 Java_AutofillProfile_getAddressLine2(env, jprofile)));
97 ConvertJavaStringToUTF16(
98 Java_AutofillProfile_getCity(env, jprofile)));
101 ConvertJavaStringToUTF16(
102 Java_AutofillProfile_getState(env, jprofile)));
105 ConvertJavaStringToUTF16(
106 Java_AutofillProfile_getZip(env, jprofile)));
108 AutofillType(ADDRESS_HOME_COUNTRY),
109 ConvertJavaStringToUTF16(
110 Java_AutofillProfile_getCountry(env, jprofile)),
111 g_browser_process->GetApplicationLocale());
113 PHONE_HOME_WHOLE_NUMBER,
114 ConvertJavaStringToUTF16(
115 Java_AutofillProfile_getPhoneNumber(env, jprofile)));
118 ConvertJavaStringToUTF16(
119 Java_AutofillProfile_getEmailAddress(env, jprofile)));
122 ScopedJavaLocalRef<jobject> CreateJavaCreditCardFromNative(
124 const CreditCard& card) {
125 return Java_CreditCard_create(
127 ConvertUTF8ToJavaString(env, card.guid()).obj(),
128 ConvertUTF8ToJavaString(env, card.origin()).obj(),
129 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NAME)).obj(),
130 ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NUMBER)).obj(),
131 ConvertUTF16ToJavaString(env, card.ObfuscatedNumber()).obj(),
132 ConvertUTF16ToJavaString(
134 card.GetRawInfo(CREDIT_CARD_EXP_MONTH)).obj(),
135 ConvertUTF16ToJavaString(
137 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)).obj());
140 void PopulateNativeCreditCardFromJava(
141 const jobject& jcard,
145 ConvertJavaStringToUTF8(Java_CreditCard_getOrigin(env, jcard)));
148 ConvertJavaStringToUTF16(Java_CreditCard_getName(env, jcard)));
151 ConvertJavaStringToUTF16(Java_CreditCard_getNumber(env, jcard)));
153 CREDIT_CARD_EXP_MONTH,
154 ConvertJavaStringToUTF16(Java_CreditCard_getMonth(env, jcard)));
156 CREDIT_CARD_EXP_4_DIGIT_YEAR,
157 ConvertJavaStringToUTF16(Java_CreditCard_getYear(env, jcard)));
162 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env,
164 : weak_java_obj_(env, obj),
165 personal_data_manager_(
166 PersonalDataManagerFactory::GetForProfile(GetDefaultProfile())) {
167 personal_data_manager_->AddObserver(this);
170 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() {
171 personal_data_manager_->RemoveObserver(this);
174 jint PersonalDataManagerAndroid::GetProfileCount(JNIEnv* unused_env,
175 jobject unused_obj) {
176 return personal_data_manager_->GetProfiles().size();
179 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByIndex(
183 const std::vector<AutofillProfile*>& profiles =
184 personal_data_manager_->GetProfiles();
185 size_t index_size_t = static_cast<size_t>(index);
186 DCHECK_LT(index_size_t, profiles.size());
187 return CreateJavaProfileFromNative(env, *profiles[index_size_t]);
190 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByGUID(
194 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(
195 ConvertJavaStringToUTF8(env, jguid));
197 return ScopedJavaLocalRef<jobject>();
199 return CreateJavaProfileFromNative(env, *profile);
202 ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetProfile(
206 std::string guid = ConvertJavaStringToUTF8(
208 Java_AutofillProfile_getGUID(env, jprofile).obj());
210 AutofillProfile profile;
211 PopulateNativeProfileFromJava(jprofile, env, &profile);
214 personal_data_manager_->AddProfile(profile);
216 profile.set_guid(guid);
217 personal_data_manager_->UpdateProfile(profile);
220 return ConvertUTF8ToJavaString(env, profile.guid());
223 jint PersonalDataManagerAndroid::GetCreditCardCount(JNIEnv* unused_env,
224 jobject unused_obj) {
225 return personal_data_manager_->GetCreditCards().size();
228 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByIndex(
232 const std::vector<CreditCard*>& credit_cards =
233 personal_data_manager_->GetCreditCards();
234 size_t index_size_t = static_cast<size_t>(index);
235 DCHECK_LT(index_size_t, credit_cards.size());
236 return CreateJavaCreditCardFromNative(env, *credit_cards[index_size_t]);
239 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByGUID(
243 CreditCard* card = personal_data_manager_->GetCreditCardByGUID(
244 ConvertJavaStringToUTF8(env, jguid));
246 return ScopedJavaLocalRef<jobject>();
248 return CreateJavaCreditCardFromNative(env, *card);
251 ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetCreditCard(
255 std::string guid = ConvertJavaStringToUTF8(
257 Java_CreditCard_getGUID(env, jcard).obj());
260 PopulateNativeCreditCardFromJava(jcard, env, &card);
263 personal_data_manager_->AddCreditCard(card);
266 personal_data_manager_->UpdateCreditCard(card);
268 return ConvertUTF8ToJavaString(env, card.guid());
271 void PersonalDataManagerAndroid::RemoveByGUID(JNIEnv* env,
274 personal_data_manager_->RemoveByGUID(ConvertJavaStringToUTF8(env, jguid));
277 void PersonalDataManagerAndroid::OnPersonalDataChanged() {
278 JNIEnv* env = base::android::AttachCurrentThread();
279 if (weak_java_obj_.get(env).is_null())
282 Java_PersonalDataManager_personalDataChanged(env,
283 weak_java_obj_.get(env).obj());
287 bool PersonalDataManagerAndroid::Register(JNIEnv* env) {
288 return RegisterNativesImpl(env);
291 // Returns whether the Autofill feature is enabled.
292 static jboolean IsAutofillEnabled(JNIEnv* env, jclass clazz) {
293 return GetPrefs()->GetBoolean(autofill::prefs::kAutofillEnabled);
296 // Enables or disables the Autofill feature.
297 static void SetAutofillEnabled(JNIEnv* env, jclass clazz, jboolean enable) {
298 GetPrefs()->SetBoolean(autofill::prefs::kAutofillEnabled, enable);
301 // Returns whether Autofill feature is managed.
302 static jboolean IsAutofillManaged(JNIEnv* env, jclass clazz) {
303 return GetPrefs()->IsManagedPreference(autofill::prefs::kAutofillEnabled);
306 // Returns an ISO 3166-1-alpha-2 country code for a |jcountry_name| using
307 // the application locale, or an empty string.
308 static jstring ToCountryCode(JNIEnv* env, jclass clazz, jstring jcountry_name) {
309 return ConvertUTF8ToJavaString(
311 AutofillCountry::GetCountryCode(
312 base::android::ConvertJavaStringToUTF16(env, jcountry_name),
313 g_browser_process->GetApplicationLocale())).Release();
316 static jint Init(JNIEnv* env, jobject obj) {
317 PersonalDataManagerAndroid* personal_data_manager_android =
318 new PersonalDataManagerAndroid(env, obj);
319 return reinterpret_cast<jint>(personal_data_manager_android);
322 } // namespace autofill