1 // Copyright (c) 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 {
26 public interface PersonalDataManagerObserver {
27 public abstract void onPersonalDataChanged();
30 public static class AutofillProfile {
32 private String mOrigin;
33 private String mFullName;
34 private String mCompanyName;
35 private String mAddressLine1;
36 private String mAddressLine2;
38 private String mState;
40 private String mCountry;
41 private String mPhoneNumber;
42 private String mEmailAddress;
44 @CalledByNative("AutofillProfile")
45 public static AutofillProfile create(String guid, String origin, String fullName,
46 String companyName, String addressLine1, String addressLine2, String city,
47 String state, String zip, String country, String phoneNumber, String emailAddress) {
48 return new AutofillProfile(guid, origin, fullName, companyName, addressLine1,
49 addressLine2, city, state, zip, country, phoneNumber, emailAddress);
52 public AutofillProfile(String guid, String origin, String fullName, String companyName,
53 String addressLine1, String addressLine2, String city, String state,
54 String zip, String country, String phoneNumber, String emailAddress) {
58 mCompanyName = companyName;
59 mAddressLine1 = addressLine1;
60 mAddressLine2 = addressLine2;
65 mPhoneNumber = phoneNumber;
66 mEmailAddress = emailAddress;
69 @CalledByNative("AutofillProfile")
70 public String getGUID() {
74 @CalledByNative("AutofillProfile")
75 public String getOrigin() {
79 @CalledByNative("AutofillProfile")
80 public String getFullName() {
84 @CalledByNative("AutofillProfile")
85 public String getCompanyName() {
89 @CalledByNative("AutofillProfile")
90 public String getAddressLine1() {
94 @CalledByNative("AutofillProfile")
95 public String getAddressLine2() {
99 @CalledByNative("AutofillProfile")
100 public String getCity() {
104 @CalledByNative("AutofillProfile")
105 public String getState() {
109 @CalledByNative("AutofillProfile")
110 public String getZip() {
114 @CalledByNative("AutofillProfile")
115 public String getCountry() {
119 public String getCountryCode() {
120 return nativeToCountryCode(mCountry);
123 @CalledByNative("AutofillProfile")
124 public String getPhoneNumber() {
128 @CalledByNative("AutofillProfile")
129 public String getEmailAddress() {
130 return mEmailAddress;
133 public void setGUID(String guid) {
137 public void setOrigin(String origin) {
141 public void setFullName(String fullName) {
142 mFullName = fullName;
145 public void setCompanyName(String companyName) {
146 mCompanyName = companyName;
149 public void setAddressLine1(String addressLine1) {
150 mAddressLine1 = addressLine1;
153 public void setAddressLine2(String addressLine2) {
154 mAddressLine2 = addressLine2;
157 public void setCity(String city) {
161 public void setState(String state) {
165 public void setZip(String zip) {
169 public void setCountry(String country) {
173 public void setPhoneNumber(String phoneNumber) {
174 mPhoneNumber = phoneNumber;
177 public void setEmailAddress(String emailAddress) {
178 mEmailAddress = emailAddress;
182 public static class CreditCard {
183 // Note that while some of these fields are numbers, they're predominantly read,
184 // marshaled and compared as strings. To save conversions, we use strings everywhere.
185 private String mGUID;
186 private String mOrigin;
187 private String mName;
188 private String mNumber;
189 private String mObfuscatedNumber;
190 private String mMonth;
191 private String mYear;
193 @CalledByNative("CreditCard")
194 public static CreditCard create(String guid, String origin, String name, String number,
195 String obfuscatedNumber, String month, String year) {
196 return new CreditCard(guid, origin, name, number, obfuscatedNumber, month, year);
199 public CreditCard(String guid, String origin, String name, String number,
200 String obfuscatedNumber, String month, String year) {
205 mObfuscatedNumber = obfuscatedNumber;
210 @CalledByNative("CreditCard")
211 public String getGUID() {
215 @CalledByNative("CreditCard")
216 public String getOrigin() {
220 @CalledByNative("CreditCard")
221 public String getName() {
225 @CalledByNative("CreditCard")
226 public String getNumber() {
230 public String getObfuscatedNumber() {
231 return mObfuscatedNumber;
234 @CalledByNative("CreditCard")
235 public String getMonth() {
239 @CalledByNative("CreditCard")
240 public String getYear() {
244 public void setGUID(String guid) {
248 public void setOrigin(String origin) {
252 public void setName(String name) {
256 public void setNumber(String number) {
260 public void setObfuscatedNumber(String obfuscatedNumber) {
261 mObfuscatedNumber = obfuscatedNumber;
264 public void setMonth(String month) {
268 public void setYear(String year) {
273 private static PersonalDataManager sManager;
275 public static PersonalDataManager getInstance() {
276 ThreadUtils.assertOnUiThread();
277 if (sManager == null) {
278 sManager = new PersonalDataManager();
283 private final int mPersonalDataManagerAndroid;
284 private final List<PersonalDataManagerObserver> mDataObservers =
285 new ArrayList<PersonalDataManagerObserver>();
287 private PersonalDataManager() {
288 // Note that this technically leaks the native object, however, PersonalDataManager
289 // is a singleton that lives forever and there's no clean shutdown of Chrome on Android
290 mPersonalDataManagerAndroid = nativeInit();
294 * Called from native when template URL service is done loading.
297 private void personalDataChanged() {
298 ThreadUtils.assertOnUiThread();
299 for (PersonalDataManagerObserver observer : mDataObservers) {
300 observer.onPersonalDataChanged();
305 * Registers a PersonalDataManagerObserver on the native side.
307 public void registerDataObserver(PersonalDataManagerObserver observer) {
308 ThreadUtils.assertOnUiThread();
309 assert !mDataObservers.contains(observer);
310 mDataObservers.add(observer);
314 * Unregisters the provided observer.
316 public void unregisterDataObserver(PersonalDataManagerObserver observer) {
317 ThreadUtils.assertOnUiThread();
318 assert (mDataObservers.size() > 0);
319 assert (mDataObservers.contains(observer));
320 mDataObservers.remove(observer);
323 public List<AutofillProfile> getProfiles() {
324 ThreadUtils.assertOnUiThread();
325 int profileCount = nativeGetProfileCount(mPersonalDataManagerAndroid);
326 List<AutofillProfile> profiles = new ArrayList<AutofillProfile>(profileCount);
327 for (int i = 0; i < profileCount; i++) {
328 profiles.add(nativeGetProfileByIndex(mPersonalDataManagerAndroid, i));
333 public AutofillProfile getProfile(String guid) {
334 ThreadUtils.assertOnUiThread();
335 return nativeGetProfileByGUID(mPersonalDataManagerAndroid, guid);
338 public void deleteProfile(String guid) {
339 ThreadUtils.assertOnUiThread();
340 nativeRemoveByGUID(mPersonalDataManagerAndroid, guid);
343 public String setProfile(AutofillProfile profile) {
344 ThreadUtils.assertOnUiThread();
345 return nativeSetProfile(mPersonalDataManagerAndroid, profile);
348 public List<CreditCard> getCreditCards() {
349 ThreadUtils.assertOnUiThread();
350 int count = nativeGetCreditCardCount(mPersonalDataManagerAndroid);
351 List<CreditCard> cards = new ArrayList<CreditCard>(count);
352 for (int i = 0; i < count; i++) {
353 cards.add(nativeGetCreditCardByIndex(mPersonalDataManagerAndroid, i));
358 public CreditCard getCreditCard(String guid) {
359 ThreadUtils.assertOnUiThread();
360 return nativeGetCreditCardByGUID(mPersonalDataManagerAndroid, guid);
363 public String setCreditCard(CreditCard card) {
364 ThreadUtils.assertOnUiThread();
365 return nativeSetCreditCard(mPersonalDataManagerAndroid, card);
368 public void deleteCreditCard(String guid) {
369 ThreadUtils.assertOnUiThread();
370 nativeRemoveByGUID(mPersonalDataManagerAndroid, guid);
374 * @return Whether the Autofill feature is enabled.
376 public static boolean isAutofillEnabled() {
377 return nativeIsAutofillEnabled();
381 * Enables or disables the Autofill feature.
382 * @param enable True to disable Autofill, false otherwise.
384 public static void setAutofillEnabled(boolean enable) {
385 nativeSetAutofillEnabled(enable);
389 * @return Whether the Autofill feature is managed.
391 public static boolean isAutofillManaged() {
392 return nativeIsAutofillManaged();
395 private native int nativeInit();
396 private native int nativeGetProfileCount(int nativePersonalDataManagerAndroid);
397 private native AutofillProfile nativeGetProfileByIndex(int nativePersonalDataManagerAndroid,
399 private native AutofillProfile nativeGetProfileByGUID(int nativePersonalDataManagerAndroid,
401 private native String nativeSetProfile(int nativePersonalDataManagerAndroid,
402 AutofillProfile profile);
403 private native int nativeGetCreditCardCount(int nativePersonalDataManagerAndroid);
404 private native CreditCard nativeGetCreditCardByIndex(int nativePersonalDataManagerAndroid,
406 private native CreditCard nativeGetCreditCardByGUID(int nativePersonalDataManagerAndroid,
408 private native String nativeSetCreditCard(int nativePersonalDataManagerAndroid,
410 private native void nativeRemoveByGUID(int nativePersonalDataManagerAndroid, String guid);
411 private static native boolean nativeIsAutofillEnabled();
412 private static native void nativeSetAutofillEnabled(boolean enable);
413 private static native boolean nativeIsAutofillManaged();
414 private static native String nativeToCountryCode(String countryName);