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