Chromium Code Reviews| 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 |
| index 4318e15f5ad1492acda7d697546612873e143b9f..0fa19c88fe207eabf6b061dddfc729867189475f 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialog.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialog.java |
| @@ -4,14 +4,12 @@ |
| package org.chromium.chrome.browser.autofill; |
| -import java.util.ArrayList; |
| -import java.util.List; |
| - |
| import android.app.AlertDialog; |
| import android.content.Context; |
| import android.content.DialogInterface; |
| import android.content.DialogInterface.OnClickListener; |
| +import android.content.res.Resources; |
| import android.text.TextUtils; |
| import android.view.View; |
| import android.widget.AdapterView; |
| @@ -21,6 +19,10 @@ import android.widget.ScrollView; |
| import org.chromium.chrome.R; |
| +import java.util.ArrayList; |
| +import java.util.Arrays; |
| +import java.util.List; |
| + |
| /** |
| * 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 |
| @@ -28,12 +30,19 @@ import org.chromium.chrome.R; |
| */ |
| public class AutofillDialog extends AlertDialog |
| implements OnClickListener, OnItemSelectedListener { |
| + private static final int ADD_MENU_ITEM_INDEX = -1; |
| + private static final int EDIT_MENU_ITEM_INDEX = -2; |
| + private static final AutofillDialogMenuItem[][] mDefaultMenuItems = |
| + new AutofillDialogMenuItem[AutofillDialogConstants.NUM_SECTIONS][]; |
| + |
| private AutofillDialogContentView mContentView; |
| private AutofillDialogTitleView mTitleView; |
| private AutofillDialogField[][] mAutofillSectionFieldData = |
| new AutofillDialogField[AutofillDialogConstants.NUM_SECTIONS][]; |
| private AutofillDialogMenuItem[][] mAutofillSectionMenuData = |
| new AutofillDialogMenuItem[AutofillDialogConstants.NUM_SECTIONS][]; |
| + private static final List<String> mDefaultAccountItems = new ArrayList<String>(); |
|
Ted C
2013/03/21 01:01:14
I actually meant this should't be static.
I also
Yusuf
2013/03/21 17:53:36
Done.
|
| + private AutofillDialogDelegate mDelegate; |
| private boolean mWillDismiss = false; |
| /** |
| @@ -87,8 +96,9 @@ public class AutofillDialog extends AlertDialog |
| public void dialogCancel(); |
| } |
| - protected AutofillDialog(Context context) { |
| + protected AutofillDialog(Context context, AutofillDialogDelegate delegate) { |
| super(context); |
| + mDelegate = delegate; |
| addTitleWithPlaceholders(); |
| @@ -97,13 +107,33 @@ public class AutofillDialog extends AlertDialog |
| inflate(R.layout.autofill_dialog_content, null); |
| scroll.addView(mContentView); |
| setView(scroll); |
| + Resources resources = context.getResources(); |
| setButton(AlertDialog.BUTTON_NEGATIVE, |
| - getContext().getResources().getString(R.string.autofill_negative_button), this); |
| + resources.getString(R.string.autofill_negative_button), this); |
| setButton(AlertDialog.BUTTON_POSITIVE, |
| getContext().getResources().getString(R.string.autofill_positive_button), this); |
| mContentView.setOnItemSelectedListener(this); |
| + |
| + AutofillDialogMenuItem[] billingItems = { |
| + new AutofillDialogMenuItem(ADD_MENU_ITEM_INDEX, |
| + resources.getString(R.string.autofill_new_billing)), |
| + new AutofillDialogMenuItem(EDIT_MENU_ITEM_INDEX, |
| + resources.getString(R.string.autofill_edit_billing)) |
| + }; |
| + AutofillDialogMenuItem[] shippingItems = { |
| + new AutofillDialogMenuItem(ADD_MENU_ITEM_INDEX, |
| + resources.getString(R.string.autofill_new_shipping)), |
| + new AutofillDialogMenuItem(EDIT_MENU_ITEM_INDEX, |
| + resources.getString(R.string.autofill_edit_shipping)) |
| + }; |
| + |
| + mDefaultMenuItems[AutofillDialogConstants.SECTION_CC_BILLING] = billingItems; |
| + mDefaultMenuItems[AutofillDialogConstants.SECTION_SHIPPING] = shippingItems; |
| + |
| + mDefaultAccountItems.add(resources.getString(R.string.autofill_new_account)); |
| + mDefaultAccountItems.add(resources.getString(R.string.autofill_use_local)); |
| } |
| @Override |
| @@ -113,35 +143,40 @@ public class AutofillDialog extends AlertDialog |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| - if (mContentView.getCurrentLayout() == AutofillDialogContentView.LAYOUT_STEADY) { |
| + if (!mContentView.isInEditingMode()) { |
| mWillDismiss = true; |
| + if (which == AlertDialog.BUTTON_POSITIVE) mDelegate.dialogSubmit(); |
| + else mDelegate.dialogCancel(); |
| return; |
| } |
| + int section = mContentView.getCurrentSection(); |
| + assert(section != AutofillDialogUtils.INVALID_SECTION); |
| + |
| + if (which == AlertDialog.BUTTON_POSITIVE) mDelegate.editingComplete(section); |
| + else mDelegate.editingCancel(section); |
| + |
| mContentView.changeLayoutTo(AutofillDialogContentView.LAYOUT_STEADY); |
| getButton(BUTTON_POSITIVE).setText(R.string.autofill_positive_button); |
| mWillDismiss = false; |
| } |
| @Override |
| - public void onItemSelected(AdapterView<?> spinner, View view, int position, |
| - long id) { |
| - if (spinner.getId() == R.id.accounts_spinner) { |
| - if (spinner.getItemAtPosition(position).toString().equals( |
| - getContext().getResources().getString(R.string.autofill_use_local))) { |
| - mContentView.changeLayoutTo(AutofillDialogContentView.LAYOUT_STEADY); |
| - } else { |
| - mContentView.changeLayoutTo(AutofillDialogContentView.LAYOUT_FETCHING); |
| - } |
| - return; |
| - } |
| + public void onItemSelected(AdapterView<?> spinner, View view, int position, long id) { |
| + if (spinner.getId() == R.id.accounts_spinner) return; |
| int section = AutofillDialogUtils.getSectionForSpinnerID(spinner.getId()); |
| - if (!mContentView.selectionShouldChangeLayout(spinner, section, position)) return; |
| + if (!selectionShouldChangeLayout(spinner, section, position)) { |
| + mDelegate.itemSelected(section, position); |
| + return; |
| + } |
| + mDelegate.editingStart(section); |
| + AutofillDialogMenuItem currentItem = |
| + (AutofillDialogMenuItem) spinner.getItemAtPosition(position); |
| + if (currentItem.mIndex == ADD_MENU_ITEM_INDEX) clearAutofillSectionFieldValues(section); |
| mContentView.changeLayoutTo(AutofillDialogContentView.getLayoutModeForSection(section)); |
| - spinner.setSelection(0); |
| getButton(BUTTON_POSITIVE).setText(R.string.autofill_positive_button_editing); |
| } |
| @@ -149,26 +184,59 @@ public class AutofillDialog extends AlertDialog |
| 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 should cause a layout state change. |
| + */ |
| + private boolean selectionShouldChangeLayout(AdapterView<?> spinner, int section, int position) { |
| + int numDefaultItems = mDefaultMenuItems[section] != null ? |
| + mDefaultMenuItems[section].length : 0; |
| + return position >= spinner.getCount() - numDefaultItems; |
| + } |
| + |
| //TODO(yusufo): Remove this. updateAccountChooserAndAddTitle will get initiated from glue. |
| private void addTitleWithPlaceholders() { |
| - List<String> accounts = new ArrayList<String>(); |
| - accounts.add("placeholder@gmail.com"); |
| - accounts.add("placeholder@google.com"); |
| - updateAccountChooserAndAddTitle(accounts); |
| + String[] accounts = { |
| + "placeholder@gmail.com", |
| + "placeholder@google.com" |
| + }; |
| + updateAccountChooserAndAddTitle(accounts, 0); |
| } |
| /** |
| * Update account chooser dropdown with given accounts and create the title view if needed. |
| * @param accounts The accounts to be used for the dropdown. |
| + * @param selectedAccountIndex The index of a currently selected account or -1 |
| + * if the local payments should be used. |
| */ |
| - public void updateAccountChooserAndAddTitle(List<String> accounts) { |
| + public void updateAccountChooserAndAddTitle(String[] accounts, int selectedAccountIndex) { |
| + ArrayList<String> combinedItems = |
| + new ArrayList<String>(accounts.length + mDefaultAccountItems.size()); |
| + combinedItems.addAll(Arrays.asList(accounts)); |
| + combinedItems.addAll(mDefaultAccountItems); |
| if (mTitleView == null) { |
| - mTitleView = new AutofillDialogTitleView(getContext(), accounts); |
| + mTitleView = new AutofillDialogTitleView(getContext(), combinedItems); |
| mTitleView.setOnItemSelectedListener(this); |
| setCustomTitle(mTitleView); |
| return; |
| } |
| - // TODO(yusufo): Add code to update accounts after title is created. |
| + mTitleView.updateAccountsAndSelect(combinedItems, selectedAccountIndex); |
| + } |
| + |
| + /** |
| + * 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) { |
| + mContentView.changeLayoutTo(AutofillDialogContentView.LAYOUT_FETCHING); |
| + } else { |
| + mContentView.changeLayoutTo(AutofillDialogContentView.LAYOUT_STEADY); |
| + } |
| } |
| /** |
| @@ -194,7 +262,16 @@ public class AutofillDialog extends AlertDialog |
| } |
| mAutofillSectionFieldData[section] = dialogInputs; |
| mContentView.setVisibilityForSection(section, visible); |
| - mContentView.updateMenuItemsForSection(section, menuItems); |
| + List<AutofillDialogMenuItem> combinedItems; |
| + if (mDefaultMenuItems[section] == null) { |
| + combinedItems = Arrays.asList(menuItems); |
| + } else { |
| + combinedItems = new ArrayList<AutofillDialogMenuItem>( |
| + menuItems.length + mDefaultMenuItems[section].length); |
| + combinedItems.addAll(Arrays.asList(menuItems)); |
| + combinedItems.addAll(Arrays.asList(mDefaultMenuItems[section])); |
| + } |
| + mContentView.updateMenuItemsForSection(section, combinedItems); |
| mAutofillSectionMenuData[section] = menuItems; |
| } |
| @@ -202,13 +279,27 @@ public class AutofillDialog extends AlertDialog |
| * Clears the field values for the given section. |
| * @param section The section to clear the field values for. |
| */ |
| - public void clearAutofillSectionFieldValues(int section) { |
| + public void clearAutofillSectionFieldData(int section) { |
| AutofillDialogField[] fieldData = mAutofillSectionFieldData[section]; |
| if (fieldData == null) return; |
| for (int i = 0; i < fieldData.length; i++) fieldData[i].setValue(""); |
| } |
| + private void clearAutofillSectionFieldValues(int section) { |
| + AutofillDialogField[] fieldData = mAutofillSectionFieldData[section]; |
| + if (fieldData == null) return; |
| + |
| + EditText currentField; |
| + for (int i = 0; i < fieldData.length; i++) { |
| + currentField = (EditText) findViewById(AutofillDialogUtils.getEditTextIDForField( |
| + section, fieldData[i].mFieldType)); |
| + if (currentField == null) continue; |
| + |
| + currentField.setText(""); |
| + } |
| + } |
| + |
| /** |
| * Return the array that holds all the data about the fields in the given section. |
| * @param section The section to return the data for. |