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