| Index: chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialog.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialog.java
|
| deleted file mode 100644
|
| index fa5cd66e97b22c296e2e35e10c876b087ede821b..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialog.java
|
| +++ /dev/null
|
| @@ -1,822 +0,0 @@
|
| -// 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.
|
| -
|
| -package org.chromium.chrome.browser.autofill;
|
| -
|
| -import android.app.AlertDialog;
|
| -import android.app.Dialog;
|
| -import android.content.Context;
|
| -import android.graphics.Bitmap;
|
| -import android.text.Editable;
|
| -import android.text.TextUtils;
|
| -import android.text.TextWatcher;
|
| -import android.util.TypedValue;
|
| -import android.view.View;
|
| -import android.view.View.OnClickListener;
|
| -import android.view.View.OnFocusChangeListener;
|
| -import android.view.ViewGroup;
|
| -import android.view.Window;
|
| -import android.view.WindowManager;
|
| -import android.widget.AdapterView;
|
| -import android.widget.AdapterView.OnItemSelectedListener;
|
| -import android.widget.LinearLayout.LayoutParams;
|
| -import android.widget.Button;
|
| -import android.widget.CheckBox;
|
| -import android.widget.CompoundButton;
|
| -import android.widget.CompoundButton.OnCheckedChangeListener;
|
| -import android.widget.EditText;
|
| -import android.widget.Spinner;
|
| -import android.widget.TextView;
|
| -
|
| -import org.chromium.chrome.R;
|
| -import org.chromium.ui.UiUtils;
|
| -import org.chromium.ui.ViewAndroidDelegate;
|
| -
|
| -import java.util.Arrays;
|
| -
|
| -/**
|
| - * This is the dialog that will act as the java side controller between the
|
| - * AutofillDialogGlue object and the UI elements on the page. It contains the
|
| - * title and the content views and relays messages from the backend to them.
|
| - */
|
| -public class AutofillDialog extends Dialog
|
| - implements OnClickListener, OnItemSelectedListener,
|
| - AutofillDialogView.OnItemEditButtonClickedListener,
|
| - OnFocusChangeListener, ViewAndroidDelegate {
|
| - private final AutofillDialogView mView;
|
| - private final AutofillDialogTitleView mTitleView;
|
| - private final AutofillDialogDelegate mDelegate;
|
| -
|
| - private AutofillDialogField[][] mAutofillSectionFieldData =
|
| - new AutofillDialogField[AutofillDialogConstants.NUM_SECTIONS][];
|
| - private TextWatcher mCurrentTextWatcher;
|
| - private int mFocusedFieldNativePointer;
|
| - private EditText mFocusedField;
|
| -
|
| - /**
|
| - * An interface to handle the interaction with an AutofillDialog object.
|
| - */
|
| - public interface AutofillDialogDelegate {
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that a menu item was selected.
|
| - * @param section Section in which a menu item was selected. Should match one of the values
|
| - * in {@link AutofillDialogConstants}.
|
| - * @param index Index of the selected menu item.
|
| - */
|
| - public void itemSelected(int section, int index);
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that an account was selected.
|
| - * @param index Index of the selected account.
|
| - */
|
| - public void accountSelected(int index);
|
| -
|
| - /**
|
| - * Called when a checkbox in the notification area has changed its state.
|
| - * @param type Notification type.
|
| - * @param checked Whether the checkbox is checked.
|
| - */
|
| - public void notificationCheckboxStateChanged(int type, boolean checked);
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the view is starting editing.
|
| - * @param section Section that is being edited. Should match one of the values in
|
| - * {@link AutofillDialogConstants}.
|
| - */
|
| - public void editingStart(int section);
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the view has completed editing and triggers
|
| - * field validation that will set errors on all invalid fields.
|
| - * @param section Section that was being edited. Should match one of the values in
|
| - * {@link AutofillDialogConstants}.
|
| - * @return Whether editing is done and fields have no validation errors.
|
| - */
|
| - public boolean editingComplete(int section);
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the view has cancelled editing.
|
| - * @param section Section that was being edited. Should match one of the values in
|
| - * {@link AutofillDialogConstants}.
|
| - */
|
| - public void editingCancel(int section);
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the user has edited or activate an EditText field.
|
| - * @param section Section that is being edited. Should match one of the values in
|
| - * {@link AutofillDialogConstants}.
|
| - * @param dialogInputPointer The native pointer to the field that was edited or activated.
|
| - * @param delegate The ViewAndroidDelegate that should be used to attach the AutofillPopup
|
| - * if the AutofillPopup controller has any suggestions.
|
| - * @param value The current value the focused field.
|
| - * @param wasEdit True if it is an edit, otherwise False.
|
| - */
|
| - public void editedOrActivatedField(int section, int dialogInputPointer,
|
| - ViewAndroidDelegate delegate, String value, boolean wasEdit);
|
| -
|
| - /**
|
| - * Requests AutofillDialog controller to validate the specified field. If the field is
|
| - * invalid the returned value contains the error string. If the field is valid then
|
| - * the returned value is null.
|
| - * @param section Section that is being edited. Should match one of the values in
|
| - * {@link AutofillDialogConstants}.
|
| - * @param fieldType The type of the field that is being edited. Should match one of the
|
| - * values in {@link AutofillDialogConstants}.
|
| - * @param value The value of the field that is being edited.
|
| - * @return The error if the field is not valid, otherwise return null.
|
| - */
|
| - public String validateField(int section, int fieldType, String value);
|
| -
|
| - /**
|
| - * Requests AutofillDialog controller to validate the specified section.
|
| - * If there are invalid fields then the controller will call updateSectionErrors().
|
| - * @param section Section that is being edited. Should match one of the values in
|
| - * {@link AutofillDialogConstants}.
|
| - */
|
| - public void validateSection(int section);
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the user clicked on the submit button.
|
| - */
|
| - public void dialogSubmit();
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the user clicked on the cancel button.
|
| - */
|
| - public void dialogCancel();
|
| -
|
| - /**
|
| - * Informs AutofillDialog controller that the user closed the dialog.
|
| - */
|
| - public void dialogDismissed();
|
| -
|
| - /**
|
| - * Get the list associated with this field as a string array.
|
| - * @param field The field for which the list should be returned.
|
| - * @return A string array that contains the list
|
| - **/
|
| - public String[] getListForField(int field);
|
| -
|
| - /**
|
| - * @param section Section for which the label should be returned.
|
| - * @return The string that should appear on the label for the given section.
|
| - */
|
| - public String getLabelForSection(int section);
|
| -
|
| - /**
|
| - * @param fieldType The field type to return the icon for.
|
| - * @param input The current user input on the field.
|
| - * @return The bitmap resource that should be shown on the field.
|
| - */
|
| - public Bitmap getIconForField(int fieldType, String input);
|
| -
|
| - /**
|
| - * @param section The section associated with the field.
|
| - * @param fieldType The field type to return the icon for.
|
| - * @return The placeholder string that should be shown on the field.
|
| - */
|
| - public String getPlaceholderForField(int section, int fieldType);
|
| -
|
| - /**
|
| - * @param dialogButtonId AutofillDialogConstants.DIALOG_BUTTON_ ID of the button.
|
| - * @return The text for the given button.
|
| - */
|
| - public String getDialogButtonText(int dialogButtonId);
|
| -
|
| - /**
|
| - * @param dialogButtonId AutofillDialogConstants.DIALOG_BUTTON_ ID of the button.
|
| - * @return Whether the given button should be enabled.
|
| - */
|
| - public boolean isDialogButtonEnabled(int dialogButtonId);
|
| -
|
| - /**
|
| - * @return The "Save locally" checkbox label.
|
| - */
|
| - public String getSaveLocallyText();
|
| -
|
| - /**
|
| - * @return The legal documents text.
|
| - */
|
| - public String getLegalDocumentsText();
|
| -
|
| - /**
|
| - * @param section The section.
|
| - * @param position The index of an item.
|
| - * @return Whether an item is the "Add..." item.
|
| - */
|
| - public boolean isTheAddItem(int section, int position);
|
| - }
|
| -
|
| - protected AutofillDialog(Context context, AutofillDialogDelegate delegate) {
|
| - super(context);
|
| - requestWindowFeature(Window.FEATURE_NO_TITLE);
|
| - getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
| - mDelegate = delegate;
|
| - mView = (AutofillDialogView) getLayoutInflater().
|
| - inflate(R.layout.autofill_dialog_content, null);
|
| -
|
| - mTitleView = (AutofillDialogTitleView) mView.findViewById(R.id.title);
|
| - mTitleView.setOnItemSelectedListener(this);
|
| -
|
| - getSaveLocallyCheckBox().setText(mDelegate.getSaveLocallyText());
|
| - getSaveLocallyCheckBox().setChecked(true);
|
| -
|
| - String[] labels = new String[AutofillDialogConstants.NUM_SECTIONS];
|
| - for (int i = 0; i < AutofillDialogConstants.NUM_SECTIONS; i++) {
|
| - labels[i] = mDelegate.getLabelForSection(i);
|
| - }
|
| - getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
|
| - setContentView(mView);
|
| - mView.initialize(this);
|
| - mView.initializeLabelsForEachSection(labels);
|
| -
|
| - setButton(AlertDialog.BUTTON_NEGATIVE,
|
| - mDelegate.getDialogButtonText(AutofillDialogConstants.DIALOG_BUTTON_CANCEL), this);
|
| - setButton(AlertDialog.BUTTON_POSITIVE,
|
| - mDelegate.getDialogButtonText(AutofillDialogConstants.DIALOG_BUTTON_OK), this);
|
| -
|
| - mView.setOnItemSelectedListener(this);
|
| - mView.setOnItemEditButtonClickedListener(this);
|
| - }
|
| -
|
| - private AutofillDialogField[] getFieldsForSection(int section) {
|
| - if (section < 0 || section >= mAutofillSectionFieldData.length) {
|
| - assert false;
|
| - return new AutofillDialogField[0];
|
| - }
|
| - return mAutofillSectionFieldData[section];
|
| - }
|
| -
|
| - private void setFieldsForSection(int section, AutofillDialogField[] fields) {
|
| - if (section < 0 || section >= mAutofillSectionFieldData.length) return;
|
| - mAutofillSectionFieldData[section] = fields;
|
| - }
|
| -
|
| - @Override
|
| - public void dismiss() {
|
| - // Any calls coming from the Android View system are ignored.
|
| - // If the dialog should be dismissed, internalDismiss() should be used.
|
| - // TODO(yusufo): http://crbug.com/234477 Consider not using AlertDialog.
|
| - }
|
| -
|
| - @Override
|
| - public void show() {
|
| - mView.createAdapters();
|
| - super.show();
|
| - }
|
| -
|
| - /**
|
| - * Dismisses the dialog.
|
| - **/
|
| - private void internalDismiss() {
|
| - super.dismiss();
|
| - mDelegate.dialogDismissed();
|
| - }
|
| -
|
| - private void setButton(int which, String text, android.view.View.OnClickListener listener) {
|
| - Button button = getButton(which);
|
| -
|
| - if (button == null) return;
|
| - assert(button != null);
|
| -
|
| - button.setVisibility(View.VISIBLE);
|
| - button.setText(text);
|
| - button.setOnClickListener(listener);
|
| - }
|
| -
|
| - private Button getButton(int which) {
|
| - if (which == AlertDialog.BUTTON_POSITIVE) {
|
| - return (Button) mView.findViewById(R.id.positive_button);
|
| - } else {
|
| - return (Button) mView.findViewById(R.id.negative_button);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Get the list associated with this field as a string array.
|
| - * @param field The field for which the list should be returned.
|
| - * @return A string array that contains the list
|
| - **/
|
| - public String[] getListForField(int field) {
|
| - return mDelegate.getListForField(field);
|
| - }
|
| -
|
| - @Override
|
| - public void onClick(View button) {
|
| - int which;
|
| - if (button.getId() == R.id.positive_button) {
|
| - which = AlertDialog.BUTTON_POSITIVE;
|
| - } else {
|
| - which = AlertDialog.BUTTON_NEGATIVE;
|
| - }
|
| -
|
| - // Note that the dialog will NOT be dismissed automatically.
|
| - if (!mView.isInEditingMode()) {
|
| - if (which == AlertDialog.BUTTON_POSITIVE) {
|
| - // The controller will dismiss the dialog if the validation succeeds.
|
| - // Otherwise, the dialog should be in the operational state to show
|
| - // errors, challenges and notifications.
|
| - mDelegate.dialogSubmit();
|
| - } else {
|
| - // The dialog will be dismissed with a call to dismissAutofillDialog().
|
| - mDelegate.dialogCancel();
|
| - }
|
| - // The buttons will be updated as the result of a controller callback.
|
| - disableButtons();
|
| - return;
|
| - }
|
| -
|
| - int section = mView.getCurrentSection();
|
| - assert(section != AutofillDialogUtils.INVALID_SECTION);
|
| -
|
| - if (which == AlertDialog.BUTTON_POSITIVE) {
|
| - // Switch the layout only if validation passes.
|
| - if (!mDelegate.editingComplete(section)) return;
|
| - } else {
|
| - mDelegate.editingCancel(section);
|
| - }
|
| - changeLayoutTo(AutofillDialogView.LAYOUT_STEADY);
|
| - }
|
| -
|
| - @Override
|
| - public void onItemSelected(AdapterView<?> spinner, View view, int position, long id) {
|
| - if (spinner.getId() == R.id.accounts_spinner) {
|
| - mDelegate.accountSelected(position);
|
| - return;
|
| - }
|
| -
|
| - int section = AutofillDialogUtils.getSectionForSpinnerID(spinner.getId());
|
| - if (!isTheAddItem(spinner, section, position)) {
|
| - mDelegate.itemSelected(section, position);
|
| - return;
|
| - }
|
| -
|
| - onItemEditButtonClicked(section, position);
|
| - }
|
| -
|
| - @Override
|
| - public void onItemEditButtonClicked(int section, int position) {
|
| - mView.updateMenuSelectionForSection(section, position);
|
| - mDelegate.itemSelected(section, position);
|
| - mDelegate.editingStart(section);
|
| -
|
| - changeLayoutTo(AutofillDialogView.getLayoutModeForSection(section));
|
| - }
|
| -
|
| - @Override
|
| - public void onNothingSelected(AdapterView<?> spinner) {
|
| - }
|
| -
|
| - /**
|
| - * @param spinner The dropdown that was selected by the user.
|
| - * @param section The section that the dropdown corresponds to.
|
| - * @param position The position for the selected item in the dropdown.
|
| - * @return Whether the selection is the "Add..." item.
|
| - */
|
| - private boolean isTheAddItem(AdapterView<?> spinner, int section, int position) {
|
| - return mDelegate.isTheAddItem(section, position);
|
| - }
|
| -
|
| - /**
|
| - * Disables the dialog buttons.
|
| - */
|
| - private void disableButtons() {
|
| - getButton(BUTTON_NEGATIVE).setEnabled(false);
|
| - getButton(BUTTON_POSITIVE).setEnabled(false);
|
| - mTitleView.setAccountChooserEnabled(false);
|
| - }
|
| -
|
| - /**
|
| - * Updates the buttons state for the given mode.
|
| - * @param mode The layout mode.
|
| - */
|
| - private void updateButtons(int mode) {
|
| - final Button negative = getButton(BUTTON_NEGATIVE);
|
| - final Button positive = getButton(BUTTON_POSITIVE);
|
| -
|
| - switch (mode) {
|
| - case AutofillDialogView.LAYOUT_FETCHING:
|
| - negative.setText(mDelegate.getDialogButtonText(
|
| - AutofillDialogConstants.DIALOG_BUTTON_CANCEL));
|
| - negative.setEnabled(mDelegate.isDialogButtonEnabled(
|
| - AutofillDialogConstants.DIALOG_BUTTON_CANCEL));
|
| - positive.setText(mDelegate.getDialogButtonText(
|
| - AutofillDialogConstants.DIALOG_BUTTON_OK));
|
| - positive.setEnabled(false);
|
| - mTitleView.setAccountChooserEnabled(false);
|
| - break;
|
| - case AutofillDialogView.LAYOUT_STEADY:
|
| - negative.setText(mDelegate.getDialogButtonText(
|
| - AutofillDialogConstants.DIALOG_BUTTON_CANCEL));
|
| - negative.setEnabled(mDelegate.isDialogButtonEnabled(
|
| - AutofillDialogConstants.DIALOG_BUTTON_CANCEL));
|
| - positive.setText(mDelegate.getDialogButtonText(
|
| - AutofillDialogConstants.DIALOG_BUTTON_OK));
|
| - positive.setEnabled(mDelegate.isDialogButtonEnabled(
|
| - AutofillDialogConstants.DIALOG_BUTTON_OK));
|
| - mTitleView.setAccountChooserEnabled(true);
|
| - break;
|
| - default:
|
| - negative.setText(R.string.autofill_negative_button_editing);
|
| - negative.setEnabled(true);
|
| - positive.setText(R.string.autofill_positive_button_editing);
|
| - positive.setEnabled(true);
|
| - mTitleView.setAccountChooserEnabled(false);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Transitions the layout shown to a given layout.
|
| - * @param mode The layout mode to transition to.
|
| - */
|
| - private void changeLayoutTo(int mode) {
|
| - mView.changeLayoutTo(mode);
|
| - updateButtons(mode);
|
| - UiUtils.hideKeyboard(mView);
|
| - if (mFocusedField != null && !mView.isInEditingMode()) {
|
| - mFocusedField.removeTextChangedListener(mCurrentTextWatcher);
|
| - mFocusedField = null;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Updates the account chooser dropdown with given accounts.
|
| - * @param accounts The accounts to be used for the dropdown.
|
| - * @param selectedAccountIndex The index of a currently selected account.
|
| - */
|
| - public void updateAccountChooser(String[] accounts, int selectedAccountIndex) {
|
| - mTitleView.updateAccountsAndSelect(Arrays.asList(accounts), selectedAccountIndex);
|
| - mView.updateLegalDocumentsText(mDelegate.getLegalDocumentsText());
|
| - }
|
| -
|
| - /**
|
| - * Notifies the dialog that the underlying model is changed and all sections will be updated.
|
| - * Any editing should be invalidated.
|
| - * The dialog should either go to the FETCHING or to the STEADY mode.
|
| - * @param fetchingIsActive If true, the data is being fetched and is not yet available.
|
| - */
|
| - public void modelChanged(boolean fetchingIsActive) {
|
| - if (fetchingIsActive) {
|
| - changeLayoutTo(AutofillDialogView.LAYOUT_FETCHING);
|
| - mTitleView.hideLogoAndAccountChooserVisibility();
|
| - } else {
|
| - changeLayoutTo(AutofillDialogView.LAYOUT_STEADY);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Update notification area with the provided notifications.
|
| - * @param notifications Array of notifications to be displayed in the dialog.
|
| - */
|
| - public void updateNotificationArea(AutofillDialogNotification[] notifications) {
|
| - // Clear all the previous notifications
|
| - CheckBox checkBox = ((CheckBox) findViewById(R.id.top_checkbox_notification));
|
| - checkBox.setOnCheckedChangeListener(null);
|
| - checkBox.setVisibility(View.GONE);
|
| - ViewGroup notificationsContainer =
|
| - ((ViewGroup) findViewById(R.id.top_notifications));
|
| - notificationsContainer.removeAllViews();
|
| -
|
| - // Add new notifications
|
| - for (AutofillDialogNotification notification: notifications) {
|
| - if (notification.mHasArrow && notification.mHasCheckbox) {
|
| - // Assuming that there will always be only one top notification.
|
| - checkBox.setBackgroundColor(notification.mBackgroundColor);
|
| - checkBox.setTextColor(notification.mTextColor);
|
| - checkBox.setText(notification.mText);
|
| - checkBox.setEnabled(notification.mInteractive);
|
| - checkBox.setChecked(notification.mChecked);
|
| - checkBox.setVisibility(View.VISIBLE);
|
| - final int type = notification.mType;
|
| - checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
|
| - @Override
|
| - public void onCheckedChanged(CompoundButton view, boolean checked) {
|
| - mDelegate.notificationCheckboxStateChanged(type, checked);
|
| - }
|
| - });
|
| - } else {
|
| - TextView notificationView = new TextView(getContext());
|
| - notificationView.setBackgroundColor(notification.mBackgroundColor);
|
| - notificationView.setTextColor(notification.mTextColor);
|
| - notificationView.setText(notification.mText);
|
| - notificationView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
|
| - getContext().getResources().getDimension(
|
| - R.dimen.autofill_notification_text_size));
|
| - int padding = getContext().getResources().
|
| - getDimensionPixelSize(R.dimen.autofill_notification_padding);
|
| - notificationView.setPadding(padding, padding, padding, padding);
|
| - notificationsContainer.addView(notificationView);
|
| - notificationsContainer.setVisibility(View.VISIBLE);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Update given section with the data provided. This fills out the related {@link EditText}
|
| - * fields in the layout corresponding to the section.
|
| - * @param section The section to update with the given data.
|
| - * @param visible Whether the section should be visible.
|
| - * @param dialogInputs The array that contains the data for each field in the section.
|
| - * @param suggestionText The suggestion text.
|
| - * @param suggestionIcon The suggestion icon.
|
| - * @param suggestionTextExtra The suggestion text extra.
|
| - * @param suggestionIconExtra The suggestion icon extra.
|
| - * @param menuItems The array that contains the dropdown items to be shown for the section.
|
| - * @param selectedMenuItem The menu item that is currently selected or -1 otherwise.
|
| - * @param clobberInputs Whether to clobber the user input.
|
| - * @param fieldTypeToAlwaysClobber Field type to be clobbered anyway, or UNKNOWN_TYPE.
|
| - */
|
| - public void updateSection(int section, boolean visible, AutofillDialogField[] dialogInputs,
|
| - String suggestionText, Bitmap suggestionIcon, String suggestionTextExtra,
|
| - Bitmap suggestionIconExtra, AutofillDialogMenuItem[] menuItems,
|
| - int selectedMenuItem, boolean clobberInputs,
|
| - int fieldTypeToAlwaysClobber) {
|
| - View currentField;
|
| - String inputValue;
|
| -
|
| - for (int i = 0; i < dialogInputs.length; i++) {
|
| - currentField = findViewById(AutofillDialogUtils.getViewIDForField(
|
| - section, dialogInputs[i].mFieldType));
|
| - if (currentField instanceof EditText) {
|
| - EditText currentEdit = (EditText) currentField;
|
| - if (!clobberInputs
|
| - && !TextUtils.isEmpty(currentEdit.getText())
|
| - && dialogInputs[i].mFieldType != fieldTypeToAlwaysClobber) {
|
| - continue;
|
| - }
|
| -
|
| - if (AutofillDialogUtils.containsCreditCardInfo(section)
|
| - && dialogInputs[i].mFieldType
|
| - == AutofillDialogConstants.CREDIT_CARD_VERIFICATION_CODE) {
|
| - currentEdit.setCompoundDrawables(null, null,
|
| - mView.createFieldIconDrawable(suggestionIconExtra), null);
|
| - }
|
| -
|
| - currentEdit.setHint(dialogInputs[i].mPlaceholder);
|
| - currentField.setOnFocusChangeListener(this);
|
| - inputValue = dialogInputs[i].getValue();
|
| - if (TextUtils.isEmpty(inputValue)) {
|
| - currentEdit.setText("");
|
| - } else {
|
| - currentEdit.setText(inputValue);
|
| - }
|
| - } else if (currentField instanceof Spinner) {
|
| - Spinner currentSpinner = (Spinner) currentField;
|
| - for (int k = 0; k < currentSpinner.getCount(); k++) {
|
| - if (currentSpinner.getItemAtPosition(k).equals(dialogInputs[i]
|
| - .getValue())) {
|
| - currentSpinner.setSelection(k);
|
| - }
|
| - currentSpinner.setPrompt(dialogInputs[i].mPlaceholder);
|
| - }
|
| - }
|
| - }
|
| - setFieldsForSection(section, dialogInputs);
|
| - mView.setVisibilityForSection(section, visible);
|
| -
|
| - updateSectionMenuItems(section,
|
| - suggestionText, suggestionIcon, suggestionTextExtra, suggestionIconExtra,
|
| - menuItems, selectedMenuItem);
|
| - }
|
| -
|
| - /**
|
| - * Updates menu items in a given section with the data provided.
|
| - * @param section The section to update with the given data.
|
| - * @param suggestionText The suggestion text.
|
| - * @param suggestionIcon The suggestion icon.
|
| - * @param suggestionTextExtra The suggestion text extra.
|
| - * @param suggestionIconExtra The suggestion icon extra.
|
| - * @param menuItems The array that contains the dropdown items to be shown for the section.
|
| - * @param selectedMenuItem The menu item that is currently selected or -1 otherwise.
|
| - */
|
| - public void updateSectionMenuItems(
|
| - int section, String suggestionText, Bitmap suggestionIcon, String suggestionTextExtra,
|
| - Bitmap suggestionIconExtra, AutofillDialogMenuItem[] menuItems,
|
| - int selectedMenuItem) {
|
| - mView.updateMenuItemsForSection(
|
| - section, suggestionText, suggestionIcon, suggestionTextExtra, suggestionIconExtra,
|
| - Arrays.asList(menuItems), selectedMenuItem);
|
| - }
|
| -
|
| - /**
|
| - * Update validation error values for the given section.
|
| - * @param section The section that needs to be updated.
|
| - * @param errors The array of errors that were found when validating the fields.
|
| - */
|
| - public void updateSectionErrors(int section, AutofillDialogFieldError[] errors) {
|
| - AutofillDialogField[] fields = getFieldsForSection(section);
|
| - if (fields != null) {
|
| - // Clear old errors.
|
| - for (AutofillDialogField field : fields) {
|
| - View currentField = findViewById(
|
| - AutofillDialogUtils.getViewIDForField(section, field.mFieldType));
|
| - if (currentField instanceof EditText) {
|
| - ((EditText) currentField).setError(null);
|
| - } else if (currentField instanceof Spinner) {
|
| - View innerView =
|
| - currentField.findViewById(R.id.autofill_editing_spinner_item);
|
| - if (innerView instanceof TextView) ((TextView) innerView).setError(null);
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Add new errors.
|
| - for(AutofillDialogFieldError error : errors) {
|
| - View currentField = findViewById(
|
| - AutofillDialogUtils.getViewIDForField(section, error.mFieldType));
|
| - if (currentField instanceof EditText) {
|
| - ((EditText) currentField).setError(error.mErrorText);
|
| - } else if (currentField instanceof Spinner) {
|
| - View innerView =
|
| - currentField.findViewById(R.id.autofill_editing_spinner_item);
|
| - if (innerView instanceof TextView) {
|
| - ((TextView) innerView).setError(error.mErrorText);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Clears the field values for the given section.
|
| - * @param section The section to clear the field values for.
|
| - */
|
| - public void clearAutofillSectionFieldData(int section) {
|
| - AutofillDialogField[] fields = getFieldsForSection(section);
|
| - if (fields == null) return;
|
| -
|
| - for (AutofillDialogField field : fields) field.setValue("");
|
| - }
|
| -
|
| - private void clearAutofillSectionFieldValues(int section) {
|
| - AutofillDialogField[] fields = getFieldsForSection(section);
|
| - if (fields == null) return;
|
| -
|
| - for (AutofillDialogField field : fields) {
|
| - View currentField = findViewById(
|
| - AutofillDialogUtils.getViewIDForField(section, field.mFieldType));
|
| - // TODO(yusufo) remove this check when all the fields have been added.
|
| - if (currentField instanceof EditText) {
|
| - ((EditText) currentField).setText("");
|
| - } else if (currentField instanceof Spinner) {
|
| - ((Spinner) currentField).setSelected(false);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private CheckBox getSaveLocallyCheckBox() {
|
| - return (CheckBox) mView.findViewById(R.id.save_locally_checkbox);
|
| - }
|
| -
|
| - /**
|
| - * Update the visibility for the save locally checkbox.
|
| - * @param shouldShow Whether the checkbox should be shown or hidden.
|
| - */
|
| - public void updateSaveLocallyCheckBox(boolean shouldShow) {
|
| - getSaveLocallyCheckBox().setVisibility(
|
| - shouldShow ? View.VISIBLE : View.GONE);
|
| - }
|
| -
|
| - /**
|
| - * Return the array that holds all the data about the fields in the given section.
|
| - * @param section The section to return the data for.
|
| - * @return An array containing the data for each field in the given section.
|
| - */
|
| - public AutofillDialogField[] getSection(int section) {
|
| - AutofillDialogField[] fields = getFieldsForSection(section);
|
| - if (fields == null) return null;
|
| -
|
| - for (AutofillDialogField field : fields) {
|
| - View currentField = findViewById(
|
| - AutofillDialogUtils.getViewIDForField(section, field.mFieldType));
|
| - if (currentField == null) continue;
|
| - String currentValue = "";
|
| - if (currentField instanceof EditText)
|
| - currentValue = ((EditText) currentField).getText().toString();
|
| - else if (currentField instanceof Spinner) {
|
| - Object selectedItem = ((Spinner) currentField).getSelectedItem();
|
| - currentValue = selectedItem != null ? selectedItem.toString() : "";
|
| - }
|
| - field.setValue(currentValue);
|
| - }
|
| - return fields;
|
| - }
|
| -
|
| - /**
|
| - * @return The currently entered or previously saved CVC value in the dialog.
|
| - */
|
| - public String getCvc() {
|
| - EditText cvcEdit = (EditText) findViewById(R.id.cvc_challenge);
|
| - if (cvcEdit != null) return cvcEdit.getText().toString();
|
| - return "";
|
| - }
|
| -
|
| - /**
|
| - * @return Whether the details entered should be saved locally on the device.
|
| - */
|
| - public boolean shouldSaveDetailsLocally() {
|
| - CheckBox saveLocallyCheckBox = getSaveLocallyCheckBox();
|
| - return saveLocallyCheckBox.isShown() && saveLocallyCheckBox.isChecked();
|
| - }
|
| -
|
| - /**
|
| - * Updates the progress for the final transaction with the given value.
|
| - * @param value The current progress percentage value.
|
| - */
|
| - public void updateProgressBar(double value) {
|
| - }
|
| -
|
| - /**
|
| - * Dismisses the Autofill dialog as if cancel was pressed.
|
| - */
|
| - public void dismissAutofillDialog() {
|
| - internalDismiss();
|
| - }
|
| -
|
| - private void addTextWatcher(EditText view, int nativePointer) {
|
| - mFocusedFieldNativePointer = nativePointer;
|
| - if (mCurrentTextWatcher == null) {
|
| - mCurrentTextWatcher = new TextWatcher() {
|
| - @Override
|
| - public void onTextChanged(CharSequence s, int start, int before, int count) {
|
| - }
|
| -
|
| - @Override
|
| - public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
| - }
|
| -
|
| - @Override
|
| - public void afterTextChanged(Editable editable) {
|
| - mDelegate.editedOrActivatedField(mView.getCurrentSection(),
|
| - mFocusedFieldNativePointer, AutofillDialog.this, editable.toString(),
|
| - true);
|
| - }
|
| - };
|
| - }
|
| - view.addTextChangedListener(mCurrentTextWatcher);
|
| - }
|
| -
|
| - /**
|
| - * Follow the EditText that is currently focused and add/remove text watcher for that EditText.
|
| - * Fields also get validated when one of them is defocused.
|
| - * @param v View that just got a focus change.
|
| - * @param hasFocus Whether the focus was gained.
|
| - */
|
| - @Override
|
| - public void onFocusChange(View v, boolean hasFocus) {
|
| - if (!mView.isInEditingMode()) return;
|
| -
|
| - if (!(v instanceof EditText)) return;
|
| - EditText currentfield = (EditText) v;
|
| -
|
| - // New EditText just got focused.
|
| - if (hasFocus) mFocusedField = currentfield;
|
| -
|
| - int section = mView.getCurrentSection();
|
| - AutofillDialogField[] fields = getFieldsForSection(section);
|
| - int fieldType = AutofillDialogConstants.UNKNOWN_TYPE;
|
| - int nativePointer = 0;
|
| - for (AutofillDialogField field : fields) {
|
| - View currentView = findViewById(AutofillDialogUtils.getViewIDForField(
|
| - section, field.mFieldType));
|
| - if (v.equals(currentView)) {
|
| - fieldType = field.mFieldType;
|
| - nativePointer = field.mNativePointer;
|
| - break;
|
| - }
|
| - }
|
| - assert (fieldType != AutofillDialogConstants.UNKNOWN_TYPE);
|
| - if (fieldType == AutofillDialogConstants.UNKNOWN_TYPE) return;
|
| -
|
| - if (hasFocus) {
|
| - // Add text watcher to the currently selected EditText and send out the first
|
| - // editedOrActivated call because text watcher only sends it out after text changes.
|
| - addTextWatcher(currentfield, nativePointer);
|
| - mDelegate.editedOrActivatedField(mView.getCurrentSection(), mFocusedFieldNativePointer,
|
| - this, mFocusedField.getText().toString(), false);
|
| - } else {
|
| - // Remove text watcher for the EditText that is being defocused, then validate that
|
| - // field. Entire section is validated if the field is valid.
|
| - currentfield.removeTextChangedListener(mCurrentTextWatcher);
|
| - String errorText = mDelegate.validateField(mView.getCurrentSection(), fieldType,
|
| - currentfield.getText().toString());
|
| - currentfield.setError(errorText);
|
| - if (errorText == null) mDelegate.validateSection(section);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public View acquireAnchorView() {
|
| - return mFocusedField;
|
| - }
|
| -
|
| - @Override
|
| - public void setAnchorViewPosition(View view, float x, float y, float width, float height) {
|
| - }
|
| -
|
| - @Override
|
| - public void releaseAnchorView(View anchorView) {
|
| - }
|
| -}
|
|
|