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