Index: chrome/browser/autofill/android/auxiliary_profiles_android.cc |
diff --git a/chrome/browser/autofill/android/auxiliary_profiles_android.cc b/chrome/browser/autofill/android/auxiliary_profiles_android.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7d33f03ae89e9cac72d1cfacd6548e3cc3096a03 |
--- /dev/null |
+++ b/chrome/browser/autofill/android/auxiliary_profiles_android.cc |
@@ -0,0 +1,118 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Populates default autofill profile from user's own Android contact. |
+#include "chrome/browser/autofill/android/auxiliary_profiles_android.h" |
+ |
+#include <vector> |
+ |
+#include "base/guid.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/string16.h" |
+#include "base/string_util.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/autofill/android/auxiliary_profile_loader_android.h" |
+#include "chrome/browser/autofill/autofill_profile.h" |
+#include "chrome/browser/autofill/phone_number.h" |
+ |
+// Generates the autofill profile by accessing the Android |
+// ContactsContract.Profile API through PersonalAutofillPopulator via JNI. |
+// The generated profile corresponds to the user's "ME" contact in the |
+// "People" app. The caller passes a vector of profiles into the constructor |
+// then initiates a fetch using |GetContactsProfile()| method. This clears |
+// any existing addresses. |
+ |
+// Randomly generated guid. The Autofillprofile class requires a consistent |
+// unique guid or else things break. |
+const char kAndroidMeContactA[] = "9A9E1C06-7A3B-48FA-AA4F-135CA6FC25D9"; |
+ |
+namespace { |
+ |
+// Takes misc. address information strings from Android API and collapses |
+// into single string for "address line 2" |
+string16 CollapseAddress(const string16& post_office_box, |
+ const string16& neighborhood) { |
+ std::vector<string16> accumulator; |
+ if (!post_office_box.empty()) { |
+ accumulator.push_back(post_office_box); |
+ } |
Ilya Sherman
2013/03/09 01:42:58
nit: No need for curly braces. Ditto below.
apiccion
2013/03/09 03:43:17
Done.
|
+ if (!neighborhood.empty()) { |
+ accumulator.push_back(neighborhood); |
+ } |
+ |
+ return JoinString(accumulator, ASCIIToUTF16(", ")); |
+} |
+ |
+} // namespace |
+ |
+namespace autofill { |
+ |
+AuxiliaryProfilesAndroid::AuxiliaryProfilesAndroid( |
+ const AuxiliaryProfileLoaderAndroid& profileLoader) |
+ : profile_loader_(profileLoader) {} |
Ilya Sherman
2013/03/09 01:42:58
nit: Indent this line two fewer spaces.
apiccion
2013/03/09 03:43:17
Done.
|
+ |
+AuxiliaryProfilesAndroid::~AuxiliaryProfilesAndroid() { |
+} |
+ |
+scoped_ptr<AutofillProfile> AuxiliaryProfilesAndroid::LoadContactsProfile() { |
+ scoped_ptr<AutofillProfile> profile(new AutofillProfile(kAndroidMeContactA)); |
+ LoadName(profile.get()); |
+ LoadEmailAddress(profile.get()); |
+ LoadPhoneNumbers(profile.get()); |
+ |
+ // Android user's profile contact does not parse its address |
+ // into constituent parts. Instead we just get a long string blob. |
+ // Disable address population until we implement a way to parse the |
+ // data. |
+ // http://crbug.com/178838 |
+ // LoadAddress(profile.get()); |
+ |
+ return profile.Pass(); |
+} |
+ |
+void AuxiliaryProfilesAndroid::LoadAddress(AutofillProfile* profile) { |
+ string16 street = profile_loader_.GetStreet(); |
+ string16 post_office_box = profile_loader_.GetPostOfficeBox(); |
+ string16 neighborhood = profile_loader_.GetNeighborhood(); |
+ string16 city = profile_loader_.GetCity(); |
+ string16 postal_code = profile_loader_.GetPostalCode(); |
+ string16 region = profile_loader_.GetRegion(); |
+ string16 country = profile_loader_.GetCountry(); |
+ |
+ string16 street2 = |
+ CollapseAddress(post_office_box, neighborhood); |
+ |
+ profile->SetRawInfo(ADDRESS_HOME_LINE1, street); |
+ profile->SetRawInfo(ADDRESS_HOME_LINE2, street2); |
+ profile->SetRawInfo(ADDRESS_HOME_CITY, city); |
+ profile->SetRawInfo(ADDRESS_HOME_STATE, region); |
+ profile->SetRawInfo(ADDRESS_HOME_ZIP, postal_code); |
+ profile->SetRawInfo(ADDRESS_HOME_COUNTRY, country); |
+} |
+ |
+void AuxiliaryProfilesAndroid::LoadName(AutofillProfile* profile) { |
+ string16 firstName = profile_loader_.GetFirstName(); |
+ string16 middleName = profile_loader_.GetMiddleName(); |
+ string16 lastName = profile_loader_.GetLastName(); |
+ |
+ profile->SetRawInfo(NAME_FIRST, firstName); |
+ profile->SetRawInfo(NAME_LAST, lastName); |
+ profile->SetRawInfo(NAME_MIDDLE, middleName); |
+} |
+ |
+void AuxiliaryProfilesAndroid::LoadEmailAddress(AutofillProfile* profile) { |
+ std::vector<string16> emails; |
+ profile_loader_.GetEmailAddresses(&emails); |
+ profile->SetRawMultiInfo(EMAIL_ADDRESS, emails); |
+} |
+ |
+void AuxiliaryProfilesAndroid::LoadPhoneNumbers(AutofillProfile* profile) { |
+ std::vector<string16> phone_numbers; |
+ profile_loader_.GetPhoneNumbers(&phone_numbers); |
+ profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, phone_numbers); |
+} |
+ |
+} // namespace |