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 package org.chromium.chrome.browser.autofill;
7 import org.chromium.base.CalledByNative;
8 import org.chromium.base.JNINamespace;
9 import org.chromium.base.ThreadUtils;
11 import java.util.ArrayList;
12 import java.util.List;
15 * Android wrapper of the PersonalDataManager which provides access from the Java
18 * Only usable from the UI thread as it's primary purpose is for supporting the Android
21 * See chrome/browser/autofill/personal_data_manager.h for more details.
23 @JNINamespace("autofill")
24 public class PersonalDataManager {
27 * Observer of PersonalDataManager events.
29 public interface PersonalDataManagerObserver {
31 * Called when the data is changed.
33 public abstract void onPersonalDataChanged();
37 * Autofill address information.
39 public static class AutofillProfile {
41 private String mOrigin;
42 private String mFullName;
43 private String mCompanyName;
44 private String mStreetAddress;
45 private String mRegion;
46 private String mLocality;
47 private String mDependentLocality;
48 private String mPostalCode;
49 private String mSortingCode;
50 private String mCountryCode;
51 private String mPhoneNumber;
52 private String mEmailAddress;
53 private String mLabel;
54 private String mLanguageCode;
56 @CalledByNative("AutofillProfile")
57 public static AutofillProfile create(String guid, String origin,
58 String fullName, String companyName,
59 String streetAddress, String region, String locality, String dependentLocality,
60 String postalCode, String sortingCode,
61 String country, String phoneNumber, String emailAddress, String languageCode) {
62 return new AutofillProfile(guid, origin, fullName, companyName,
64 region, locality, dependentLocality,
65 postalCode, sortingCode, country, phoneNumber, emailAddress, languageCode);
68 public AutofillProfile(String guid, String origin, String fullName, String companyName,
71 String locality, String dependentLocality,
72 String postalCode, String sortingCode,
73 String countryCode, String phoneNumber, String emailAddress, String languageCode) {
77 mCompanyName = companyName;
78 mStreetAddress = streetAddress;
81 mDependentLocality = dependentLocality;
82 mPostalCode = postalCode;
83 mSortingCode = sortingCode;
84 mCountryCode = countryCode;
85 mPhoneNumber = phoneNumber;
86 mEmailAddress = emailAddress;
87 mLanguageCode = languageCode;
90 @CalledByNative("AutofillProfile")
91 public String getGUID() {
95 @CalledByNative("AutofillProfile")
96 public String getOrigin() {
100 @CalledByNative("AutofillProfile")
101 public String getFullName() {
105 @CalledByNative("AutofillProfile")
106 public String getCompanyName() {
110 @CalledByNative("AutofillProfile")
111 public String getStreetAddress() {
112 return mStreetAddress;
115 @CalledByNative("AutofillProfile")
116 public String getRegion() {
120 @CalledByNative("AutofillProfile")
121 public String getLocality() {
125 @CalledByNative("AutofillProfile")
126 public String getDependentLocality() {
127 return mDependentLocality;
130 public String getLabel() {
134 @CalledByNative("AutofillProfile")
135 public String getPostalCode() {
139 @CalledByNative("AutofillProfile")
140 public String getSortingCode() {
144 @CalledByNative("AutofillProfile")
145 public String getCountryCode() {
149 @CalledByNative("AutofillProfile")
150 public String getPhoneNumber() {
154 @CalledByNative("AutofillProfile")
155 public String getEmailAddress() {
156 return mEmailAddress;
159 @CalledByNative("AutofillProfile")
160 public String getLanguageCode() {
161 return mLanguageCode;
164 public void setGUID(String guid) {
168 public void setLabel(String label) {
172 public void setOrigin(String origin) {
176 public void setFullName(String fullName) {
177 mFullName = fullName;
180 public void setCompanyName(String companyName) {
181 mCompanyName = companyName;
184 public void setStreetAddress(String streetAddress) {
185 mStreetAddress = streetAddress;
188 public void setRegion(String region) {
192 public void setLocality(String locality) {
193 mLocality = locality;
196 public void setDependentLocality(String dependentLocality) {
197 mDependentLocality = dependentLocality;
200 public void setPostalCode(String postalCode) {
201 mPostalCode = postalCode;
204 public void setSortingCode(String sortingCode) {
205 mSortingCode = sortingCode;
208 public void setCountryCode(String countryCode) {
209 mCountryCode = countryCode;
212 public void setPhoneNumber(String phoneNumber) {
213 mPhoneNumber = phoneNumber;
216 public void setEmailAddress(String emailAddress) {
217 mEmailAddress = emailAddress;
220 public void setLanguageCode(String languageCode) {
221 mLanguageCode = languageCode;
226 * Autofill credit card information.
228 public static class CreditCard {
229 // Note that while some of these fields are numbers, they're predominantly read,
230 // marshaled and compared as strings. To save conversions, we use strings everywhere.
231 private String mGUID;
232 private String mOrigin;
233 private String mName;
234 private String mNumber;
235 private String mObfuscatedNumber;
236 private String mMonth;
237 private String mYear;
239 @CalledByNative("CreditCard")
240 public static CreditCard create(String guid, String origin, String name, String number,
241 String obfuscatedNumber, String month, String year) {
242 return new CreditCard(guid, origin, name, number, obfuscatedNumber, month, year);
245 public CreditCard(String guid, String origin, String name, String number,
246 String obfuscatedNumber, String month, String year) {
251 mObfuscatedNumber = obfuscatedNumber;
256 @CalledByNative("CreditCard")
257 public String getGUID() {
261 @CalledByNative("CreditCard")
262 public String getOrigin() {
266 @CalledByNative("CreditCard")
267 public String getName() {
271 @CalledByNative("CreditCard")
272 public String getNumber() {
276 public String getObfuscatedNumber() {
277 return mObfuscatedNumber;
280 @CalledByNative("CreditCard")
281 public String getMonth() {
285 @CalledByNative("CreditCard")
286 public String getYear() {
290 public void setGUID(String guid) {
294 public void setOrigin(String origin) {
298 public void setName(String name) {
302 public void setNumber(String number) {
306 public void setObfuscatedNumber(String obfuscatedNumber) {
307 mObfuscatedNumber = obfuscatedNumber;
310 public void setMonth(String month) {
314 public void setYear(String year) {
319 private static PersonalDataManager sManager;
321 public static PersonalDataManager getInstance() {
322 ThreadUtils.assertOnUiThread();
323 if (sManager == null) {
324 sManager = new PersonalDataManager();
329 private final long mPersonalDataManagerAndroid;
330 private final List<PersonalDataManagerObserver> mDataObservers =
331 new ArrayList<PersonalDataManagerObserver>();
333 private PersonalDataManager() {
334 // Note that this technically leaks the native object, however, PersonalDataManager
335 // is a singleton that lives forever and there's no clean shutdown of Chrome on Android
336 mPersonalDataManagerAndroid = nativeInit();
340 * Called from native when template URL service is done loading.
343 private void personalDataChanged() {
344 ThreadUtils.assertOnUiThread();
345 for (PersonalDataManagerObserver observer : mDataObservers) {
346 observer.onPersonalDataChanged();
351 * Registers a PersonalDataManagerObserver on the native side.
353 public void registerDataObserver(PersonalDataManagerObserver observer) {
354 ThreadUtils.assertOnUiThread();
355 assert !mDataObservers.contains(observer);
356 mDataObservers.add(observer);
360 * Unregisters the provided observer.
362 public void unregisterDataObserver(PersonalDataManagerObserver observer) {
363 ThreadUtils.assertOnUiThread();
364 assert (mDataObservers.size() > 0);
365 assert (mDataObservers.contains(observer));
366 mDataObservers.remove(observer);
369 public List<AutofillProfile> getProfiles() {
370 ThreadUtils.assertOnUiThread();
372 String[] profileLabels = nativeGetProfileLabels(mPersonalDataManagerAndroid);
374 int profileCount = nativeGetProfileCount(mPersonalDataManagerAndroid);
375 List<AutofillProfile> profiles = new ArrayList<AutofillProfile>(profileCount);
376 for (int i = 0; i < profileCount; i++) {
377 AutofillProfile profile = nativeGetProfileByIndex(mPersonalDataManagerAndroid, i);
378 profile.setLabel(profileLabels[i]);
379 profiles.add(profile);
385 public AutofillProfile getProfile(String guid) {
386 ThreadUtils.assertOnUiThread();
387 return nativeGetProfileByGUID(mPersonalDataManagerAndroid, guid);
390 public void deleteProfile(String guid) {
391 ThreadUtils.assertOnUiThread();
392 nativeRemoveByGUID(mPersonalDataManagerAndroid, guid);
395 public String setProfile(AutofillProfile profile) {
396 ThreadUtils.assertOnUiThread();
397 return nativeSetProfile(mPersonalDataManagerAndroid, profile);
400 public List<CreditCard> getCreditCards() {
401 ThreadUtils.assertOnUiThread();
402 int count = nativeGetCreditCardCount(mPersonalDataManagerAndroid);
403 List<CreditCard> cards = new ArrayList<CreditCard>(count);
404 for (int i = 0; i < count; i++) {
405 cards.add(nativeGetCreditCardByIndex(mPersonalDataManagerAndroid, i));
410 public CreditCard getCreditCard(String guid) {
411 ThreadUtils.assertOnUiThread();
412 return nativeGetCreditCardByGUID(mPersonalDataManagerAndroid, guid);
415 public String setCreditCard(CreditCard card) {
416 ThreadUtils.assertOnUiThread();
417 return nativeSetCreditCard(mPersonalDataManagerAndroid, card);
420 public void deleteCreditCard(String guid) {
421 ThreadUtils.assertOnUiThread();
422 nativeRemoveByGUID(mPersonalDataManagerAndroid, guid);
426 * @return Whether the Autofill feature is enabled.
428 public static boolean isAutofillEnabled() {
429 return nativeIsAutofillEnabled();
433 * Enables or disables the Autofill feature.
434 * @param enable True to disable Autofill, false otherwise.
436 public static void setAutofillEnabled(boolean enable) {
437 nativeSetAutofillEnabled(enable);
441 * @return Whether the Autofill feature is managed.
443 public static boolean isAutofillManaged() {
444 return nativeIsAutofillManaged();
447 private native long nativeInit();
448 private native int nativeGetProfileCount(long nativePersonalDataManagerAndroid);
449 private native String[] nativeGetProfileLabels(long nativePersonalDataManagerAndroid);
450 private native AutofillProfile nativeGetProfileByIndex(long nativePersonalDataManagerAndroid,
452 private native AutofillProfile nativeGetProfileByGUID(long nativePersonalDataManagerAndroid,
454 private native String nativeSetProfile(long nativePersonalDataManagerAndroid,
455 AutofillProfile profile);
456 private native int nativeGetCreditCardCount(long nativePersonalDataManagerAndroid);
457 private native CreditCard nativeGetCreditCardByIndex(long nativePersonalDataManagerAndroid,
459 private native CreditCard nativeGetCreditCardByGUID(long nativePersonalDataManagerAndroid,
461 private native String nativeSetCreditCard(long nativePersonalDataManagerAndroid,
463 private native void nativeRemoveByGUID(long nativePersonalDataManagerAndroid, String guid);
464 private static native boolean nativeIsAutofillEnabled();
465 private static native void nativeSetAutofillEnabled(boolean enable);
466 private static native boolean nativeIsAutofillManaged();
467 private static native String nativeToCountryCode(String countryName);