Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..db0a5e39419f04e54c995c53f1abcaf8e5416568 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java |
| @@ -0,0 +1,191 @@ |
| +// Copyright 2016 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. |
| + |
| +package org.chromium.chrome.browser.payments; |
| + |
| +import android.content.Context; |
| +import android.telephony.PhoneNumberUtils; |
| +import android.util.Patterns; |
| + |
| +import org.chromium.base.Callback; |
| +import org.chromium.chrome.R; |
| +import org.chromium.chrome.browser.autofill.PersonalDataManager; |
| +import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; |
| +import org.chromium.chrome.browser.payments.ui.EditorFieldModel; |
| +import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorFieldValidator; |
| +import org.chromium.chrome.browser.payments.ui.EditorModel; |
| +import org.chromium.chrome.browser.payments.ui.EditorView; |
| + |
| +import java.util.ArrayList; |
| +import java.util.List; |
| + |
| +import javax.annotation.Nullable; |
| + |
| +/** |
| + * Contact information editor. |
| + */ |
| +public class ContactEditor { |
| + private final boolean mRequestPayerPhone; |
| + private final boolean mRequestPayerEmail; |
| + private final List<CharSequence> mAllPhoneNumbers; |
|
gone
2016/06/27 21:20:52
Weird to call this mAllPhoneNumbers/mAllEmailAddre
please use gerrit instead
2016/06/27 22:26:28
Renamed.
|
| + private final List<CharSequence> mAllEmailAddresses; |
| + @Nullable private EditorView mEditorView; |
| + @Nullable private Context mContext; |
| + @Nullable private EditorFieldValidator mPhoneValidator; |
| + @Nullable private EditorFieldValidator mEmailValidator; |
| + |
| + /** |
| + * Builds a contact information editor. |
| + * |
| + * @param requestPayerPhone Whether to request the user's phone number. |
| + * @param requestPayerEmail Whether to request the user's email address. |
| + */ |
| + public ContactEditor(boolean requestPayerPhone, boolean requestPayerEmail) { |
| + assert requestPayerPhone || requestPayerEmail; |
| + mRequestPayerPhone = requestPayerPhone; |
| + mRequestPayerEmail = requestPayerEmail; |
| + mAllPhoneNumbers = new ArrayList<>(); |
| + mAllEmailAddresses = new ArrayList<>(); |
| + } |
| + |
| + /** |
| + * Returns whether the following contact information can be sent to the merchant as-is without |
| + * editing first. |
| + * |
| + * @param phone The phone number to check. |
| + * @param email The email address to check. |
| + * @return Whether the contact information is complete. |
| + */ |
| + public boolean isContactInformationComplete(@Nullable String phone, @Nullable String email) { |
| + return (!mRequestPayerPhone || getPhoneValidator().isValid(phone)) |
| + && (!mRequestPayerEmail || getEmailValidator().isValid(email)); |
| + } |
| + |
| + /** |
| + * Sets the user interface to be used for editing contact information. |
| + * |
| + * @param editorView The user interface to be used. |
| + */ |
| + public void setEditorView(EditorView editorView) { |
| + assert editorView != null; |
| + mEditorView = editorView; |
| + mContext = mEditorView.getContext(); |
| + } |
| + |
| + /** |
| + * Adds the given phone number to the autocomplete list, if it's valid. |
| + * |
| + * @param phoneNumber The phone number to possibly add. |
| + */ |
| + public void addPhoneNumberIfValid(@Nullable CharSequence phoneNumber) { |
| + if (getPhoneValidator().isValid(phoneNumber)) mAllPhoneNumbers.add(phoneNumber); |
| + } |
| + |
| + /** |
| + * Adds the given email address to the autocomplete list, if it's valid. |
| + * |
| + * @param emailAddress The email address to possibly add. |
| + */ |
| + public void addEmailAddressIfValid(@Nullable CharSequence emailAddress) { |
| + if (getEmailValidator().isValid(emailAddress)) mAllEmailAddresses.add(emailAddress); |
| + } |
| + |
| + /** |
| + * Shows the user interface for editing the given contact. The contact is also updated on disk, |
| + * so there's no need to do that in the calling code. |
| + * |
| + * @param toEdit The contact to edit. Can be null if the user is adding a new contact instead |
| + * of editing an existing one. |
| + * @param callback The callback to invoke with the complete and valid contact information. Can |
| + * be invoked with null if the user clicked Cancel. |
| + */ |
| + public void editContact( |
| + @Nullable AutofillContact toEdit, final Callback<AutofillContact> callback) { |
| + assert mEditorView != null; |
| + assert mContext != null; |
| + |
| + final AutofillContact contact = toEdit == null |
| + ? new AutofillContact(new AutofillProfile(), null, null, false) : toEdit; |
| + |
| + final EditorFieldModel phoneField = mRequestPayerPhone |
| + ? new EditorFieldModel(EditorFieldModel.INPUT_TYPE_HINT_PHONE, |
| + mContext.getString(R.string.autofill_profile_editor_phone_number), |
| + mAllPhoneNumbers, getPhoneValidator(), |
| + mContext.getString(R.string.payments_phone_required_validation_message), |
| + mContext.getString(R.string.payments_phone_invalid_validation_message), |
| + contact.getPayerPhone()) |
| + : null; |
| + |
| + final EditorFieldModel emailField = mRequestPayerEmail |
| + ? new EditorFieldModel(EditorFieldModel.INPUT_TYPE_HINT_EMAIL, |
| + mContext.getString(R.string.autofill_profile_editor_email_address), |
| + mAllEmailAddresses, getEmailValidator(), |
| + mContext.getString(R.string.payments_email_required_validation_message), |
| + mContext.getString(R.string.payments_email_invalid_validation_message), |
| + contact.getPayerEmail()) |
| + : null; |
| + |
| + EditorModel editor = |
| + new EditorModel(mContext.getString(R.string.payments_add_contact_details_label)); |
| + if (phoneField != null) editor.addField(phoneField); |
| + if (emailField != null) editor.addField(emailField); |
| + |
| + editor.setCancelCallback(new Runnable() { |
| + @Override |
| + public void run() { |
| + callback.onResult(null); |
| + } |
| + }); |
| + |
| + editor.setDoneCallback(new Runnable() { |
| + @Override |
| + public void run() { |
| + String phone = null; |
| + String email = null; |
| + |
| + if (phoneField != null) { |
| + phone = phoneField.getValue().toString(); |
| + contact.getProfile().setPhoneNumber(phone); |
| + } |
| + |
| + if (emailField != null) { |
| + email = emailField.getValue().toString(); |
| + contact.getProfile().setEmailAddress(email); |
| + } |
| + |
| + PersonalDataManager.getInstance().setProfile(contact.getProfile()); |
| + contact.completeContact(phone, email); |
| + callback.onResult(contact); |
| + } |
| + }); |
| + |
| + mEditorView.show(editor); |
| + } |
| + |
| + private EditorFieldValidator getPhoneValidator() { |
| + if (mPhoneValidator == null) { |
| + mPhoneValidator = new EditorFieldValidator() { |
| + @Override |
| + public boolean isValid(@Nullable CharSequence value) { |
| + return value != null |
| + && PhoneNumberUtils.isGlobalPhoneNumber( |
| + PhoneNumberUtils.stripSeparators(value.toString())); |
| + } |
| + }; |
| + } |
| + return mPhoneValidator; |
| + } |
| + |
| + private EditorFieldValidator getEmailValidator() { |
| + if (mEmailValidator == null) { |
| + mEmailValidator = new EditorFieldValidator() { |
| + @Override |
| + public boolean isValid(@Nullable CharSequence value) { |
| + return value != null && Patterns.EMAIL_ADDRESS.matcher(value).matches(); |
| + } |
| + }; |
| + } |
| + return mEmailValidator; |
| + } |
| +} |