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