Index: chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogView.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogView.java |
deleted file mode 100644 |
index e3751dab936672811e9a9b3e1d920641afd82dba..0000000000000000000000000000000000000000 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogView.java |
+++ /dev/null |
@@ -1,743 +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 static org.chromium.chrome.browser.autofill.AutofillDialogConstants.NUM_SECTIONS; |
-import static org.chromium.chrome.browser.autofill.AutofillDialogConstants.SECTION_BILLING; |
-import static org.chromium.chrome.browser.autofill.AutofillDialogConstants.SECTION_CC; |
-import static org.chromium.chrome.browser.autofill.AutofillDialogConstants.SECTION_CC_BILLING; |
-import static org.chromium.chrome.browser.autofill.AutofillDialogConstants.SECTION_EMAIL; |
-import static org.chromium.chrome.browser.autofill.AutofillDialogConstants.SECTION_SHIPPING; |
- |
-import android.animation.Animator; |
-import android.animation.AnimatorListenerAdapter; |
-import android.animation.ObjectAnimator; |
-import android.animation.PropertyValuesHolder; |
-import android.animation.ValueAnimator; |
-import android.animation.ValueAnimator.AnimatorUpdateListener; |
-import android.content.Context; |
-import android.content.res.Configuration; |
-import android.content.res.Resources; |
-import android.graphics.Bitmap; |
-import android.graphics.Canvas; |
-import android.graphics.Color; |
-import android.graphics.Rect; |
-import android.graphics.drawable.BitmapDrawable; |
-import android.graphics.drawable.ColorDrawable; |
-import android.graphics.drawable.Drawable; |
-import android.os.Build; |
-import android.text.TextUtils; |
-import android.util.AttributeSet; |
-import android.util.Property; |
-import android.view.KeyEvent; |
-import android.view.View; |
-import android.view.ViewGroup; |
-import android.view.animation.Animation; |
-import android.view.animation.AnimationSet; |
-import android.view.animation.ScaleAnimation; |
-import android.view.animation.TranslateAnimation; |
-import android.widget.AdapterView.OnItemSelectedListener; |
-import android.widget.ArrayAdapter; |
-import android.widget.Button; |
-import android.widget.EditText; |
-import android.widget.FrameLayout; |
-import android.widget.ImageView; |
-import android.widget.Spinner; |
-import android.widget.TextView; |
- |
-import org.chromium.chrome.R; |
- |
-import java.util.ArrayList; |
-import java.util.Arrays; |
-import java.util.List; |
- |
-/** |
- * This is the parent layout that contains the layouts for different states of |
- * autofill dialog. In principle it shouldn't contain any logic related with the |
- * actual workflow, but rather respond to any UI update messages coming to it |
- * from the AutofillDialog. |
- */ |
-public class AutofillDialogView extends FrameLayout { |
- private static final int ANIMATION_DURATION_MS = 600; |
- static final int INVALID_LAYOUT = -1; |
- static final int LAYOUT_EDITING_EMAIL = 0; |
- static final int LAYOUT_EDITING_SHIPPING = 1; |
- static final int LAYOUT_EDITING_CC = 2; |
- static final int LAYOUT_EDITING_BILLING = 3; |
- static final int LAYOUT_EDITING_CC_BILLING = 4; |
- static final int LAYOUT_FETCHING = 5; |
- static final int LAYOUT_STEADY = 6; |
- private final Runnable mDismissSteadyLayoutRunnable = new Runnable() { |
- @Override |
- public void run() { |
- mSteadyLayout.setVisibility(GONE); |
- } |
- }; |
- private final Property<AutofillDialogView, Float> mContentPropertyHeight = |
- new Property<AutofillDialogView, Float>(Float.class, "") { |
- @Override |
- public Float get(AutofillDialogView view) { |
- return view.getVisibleContentHeight(); |
- } |
- |
- @Override |
- public void set(AutofillDialogView view, Float height) { |
- view.setVisibleContentHeight(height); |
- } |
- }; |
- private AutofillDialog mDialog; |
- private Spinner[] mSpinners = new Spinner[NUM_SECTIONS]; |
- private AutofillDialogMenuAdapter[] mAdapters = new AutofillDialogMenuAdapter[NUM_SECTIONS]; |
- private ViewGroup mSteadyLayout; |
- private ViewGroup[] mEditLayouts = new ViewGroup[NUM_SECTIONS]; |
- private int mCurrentLayout = -1; |
- private OnItemSelectedListener mOnItemSelectedListener; |
- private OnItemEditButtonClickedListener mOnItemEditButtonClickedListener; |
- private View mTitle; |
- private View mContent; |
- private View mFooter; |
- private boolean mTransitionAnimationPlaying; |
- private float mVisibleContentHeight; |
- private ObjectAnimator mCurrentHeightAnimator; |
- private AnimationSet mCurrentLayoutAnimation; |
- private Drawable mBackground = new ColorDrawable(Color.LTGRAY); |
- private boolean mAnimateOnNextLayoutChange = false; |
- private int mCurrentOrientation; |
- private int mFrameHeight; |
- private int mFrameWidth; |
- |
- /** |
- * Interface definition for a callback to be invoked when an "Edit" button |
- * in the AutofillDialogMenuAdapter is clicked. |
- */ |
- public interface OnItemEditButtonClickedListener { |
- /** |
- * Callback method to be invoked when an "Edit" button has been clicked. |
- * @param section The dialog section associated with the adapter. |
- * @param position The position of the view in the adapter |
- */ |
- void onItemEditButtonClicked(int section, int position); |
- } |
- |
- public AutofillDialogView(Context context, AttributeSet attrs) { |
- super(context, attrs); |
- setWillNotDraw(false); |
- } |
- |
- @Override |
- protected void onFinishInflate () { |
- mSteadyLayout = (ViewGroup) findViewById(R.id.general_layout); |
- mTitle = findViewById(R.id.title); |
- mContent = findViewById(R.id.content); |
- mFooter = findViewById(R.id.footer); |
- |
- for (int i = 0; i < AutofillDialogConstants.NUM_SECTIONS; i++) { |
- mEditLayouts[i] = (ViewGroup) findViewById( |
- AutofillDialogUtils.getLayoutIDForSection(i)); |
- int id = AutofillDialogUtils.getSpinnerIDForSection(i); |
- mSpinners[i] = (Spinner) findViewById(id); |
- } |
- |
- int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); |
- for (int i = 0; i < NUM_SECTIONS; i++) { |
- (mEditLayouts[i]).measure(spec, spec); |
- } |
- findViewById(R.id.loading_icon).measure(spec, spec); |
- |
- mContent.addOnLayoutChangeListener(new OnLayoutChangeListener() { |
- @Override |
- public void onLayoutChange(View v, int left, int top, int right, int bottom, |
- int oldLeft, int oldTop, int oldRight, int oldBottom) { |
- if (mAnimateOnNextLayoutChange && mCurrentHeightAnimator != null |
- && !mCurrentHeightAnimator.isStarted()) { |
- mCurrentHeightAnimator.start(); |
- mAnimateOnNextLayoutChange = false; |
- if (mCurrentLayoutAnimation != null && !mCurrentLayoutAnimation.hasStarted()) { |
- mCurrentLayoutAnimation.start(); |
- } |
- } |
- } |
- }); |
- |
- mVisibleContentHeight = getAdjustedContentLayoutHeight(LAYOUT_FETCHING, null); |
- changeLayoutTo(LAYOUT_FETCHING); |
- } |
- |
- /** |
- * Sets the controller dialog for this content view and initializes the view. |
- * @param dialog The autofill Dialog that should be set as the controller. |
- */ |
- public void initialize(AutofillDialog dialog) { |
- mDialog = dialog; |
- |
- mDialog.getWindow().getDecorView().setBackgroundResource(0); |
- |
- FrameLayout.LayoutParams layoutParams = |
- (android.widget.FrameLayout.LayoutParams) getLayoutParams(); |
- |
- mCurrentOrientation = getResources().getConfiguration().orientation; |
- mFrameHeight = getResources().getDimensionPixelSize(R.dimen.autofill_dialog_max_height); |
- layoutParams.height = mFrameHeight; |
- mFrameWidth = getResources().getDimensionPixelSize(R.dimen.autofill_dialog_width); |
- layoutParams.width = mFrameWidth; |
- requestLayout(); |
- } |
- |
- @Override |
- protected void onConfigurationChanged (Configuration newConfig) { |
- super.onConfigurationChanged(newConfig); |
- if (mCurrentOrientation == newConfig.orientation) return; |
- |
- mCurrentOrientation = newConfig.orientation; |
- FrameLayout.LayoutParams layoutParams = |
- (android.widget.FrameLayout.LayoutParams) getLayoutParams(); |
- mFrameHeight = getResources().getDimensionPixelSize(R.dimen.autofill_dialog_max_height); |
- layoutParams.height = mFrameHeight; |
- requestLayout(); |
- |
- } |
- |
- @Override |
- protected boolean drawChild(Canvas canvas, View child, long drawingTime) { |
- if (!mTransitionAnimationPlaying || child.getId() != R.id.content) { |
- return super.drawChild(canvas, child, drawingTime); |
- } |
- |
- float top = mContent.getTop() + getTranslationForHiddenContentHeight(); |
- float bottom = mContent.getBottom() - getTranslationForHiddenContentHeight(); |
- |
- canvas.save(); |
- canvas.clipRect(getLeft(), top, getRight(), bottom); |
- boolean result = super.drawChild(canvas, child, drawingTime); |
- canvas.restore(); |
- return result; |
- } |
- |
- @Override |
- public void onDraw(Canvas canvas) { |
- if (mTransitionAnimationPlaying) { |
- mTitle.setTranslationY(getTranslationForHiddenContentHeight()); |
- mContent.setTranslationY(getTranslationForHiddenContentHeight()); |
- mFooter.setTranslationY(-getTranslationForHiddenContentHeight()); |
- } |
- |
- canvas.save(); |
- mBackground.setBounds(getLeft() ,(int) (mTitle.getTop() + mTitle.getTranslationY()), |
- getRight(),(int) (mFooter.getBottom() + mFooter.getTranslationY())); |
- mBackground.draw(canvas); |
- canvas.restore(); |
- |
- super.onDraw(canvas); |
- } |
- |
- /** |
- * Prompts the content view to create the adapters for each section. This is |
- * separated to be able to control the timing in a flexible manner. |
- */ |
- public void createAdapters() { |
- for (int i = 0; i < AutofillDialogConstants.NUM_SECTIONS; i++) { |
- AutofillDialogMenuAdapter adapter = |
- new AutofillDialogMenuAdapter(i, getContext(), |
- new ArrayList<AutofillDialogMenuItem>()); |
- adapter.setOnItemEditButtonClickedListener(mOnItemEditButtonClickedListener); |
- mAdapters[i] = adapter; |
- mSpinners[i].setAdapter(adapter); |
- } |
- |
- initializeSpinner(SECTION_SHIPPING, AutofillDialogConstants.ADDRESS_HOME_COUNTRY); |
- initializeSpinner(SECTION_BILLING, AutofillDialogConstants.ADDRESS_BILLING_COUNTRY); |
- initializeSpinner(SECTION_CC, AutofillDialogConstants.CREDIT_CARD_EXP_MONTH); |
- initializeSpinner(SECTION_CC, AutofillDialogConstants.CREDIT_CARD_EXP_4_DIGIT_YEAR); |
- } |
- |
- private void initializeSpinner(int section, int field) { |
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), |
- R.layout.autofill_editing_spinner_item); |
- adapter.addAll(Arrays.asList(mDialog.getListForField(field))); |
- ((Spinner) findViewById(AutofillDialogUtils |
- .getViewIDForField(section, field))).setAdapter(adapter); |
- } |
- |
- /** |
- * Initializes the labels for each section. |
- * @param labels The label strings to be used for each section. |
- */ |
- public void initializeLabelsForEachSection(String[] labels) { |
- TextView labelView; |
- for (int i = 0; i < labels.length && i < NUM_SECTIONS; i++) { |
- labelView = (TextView) findViewById(AutofillDialogUtils.getLabelIDForSection(i)); |
- labelView.setText(labels[i]); |
- } |
- } |
- |
- private int getMeasuredTitleHeight() { |
- return mTitle.getMeasuredHeight(); |
- } |
- |
- private int getMeasuredFooterHeight() { |
- return mFooter.getMeasuredHeight(); |
- } |
- |
- private float getTranslationForHiddenContentHeight() { |
- return (mContent.getMeasuredHeight() - mVisibleContentHeight) / 2; |
- } |
- |
- private int getAdjustedContentLayoutHeight(int mode, View layout) { |
- assert mode != INVALID_LAYOUT; |
- int measuredContentHeight; |
- if (mode == LAYOUT_STEADY) { |
- measuredContentHeight = mSteadyLayout.getMeasuredHeight(); |
- } else if (mode == LAYOUT_FETCHING) { |
- measuredContentHeight = findViewById(R.id.loading_icon).getMeasuredHeight(); |
- } else { |
- if (mode == LAYOUT_EDITING_CC_BILLING) { |
- // For CC_BILLING we have to measure again since it contains both CC and |
- // BILLING also. The last measure may be for just one of them. |
- // TODO(yusufo): Do this if the mode that was measured before is wrong. |
- int widthSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY); |
- int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); |
- layout.measure(widthSpec, heightSpec); |
- } |
- measuredContentHeight = layout.getMeasuredHeight(); |
- } |
- return Math.min(measuredContentHeight, |
- getMeasuredHeight() - getMeasuredTitleHeight() - getMeasuredFooterHeight()); |
- } |
- |
- @Override |
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
- // When the new layout height is higher than the old one in a transition, we end up with a |
- // a nonzero translation value at the end of the animation, since we set translations only |
- // while we are animating we set them back to zero here on a measure. |
- mTitle.setTranslationY(0); |
- mContent.setTranslationY(0); |
- mFooter.setTranslationY(0); |
- |
- Rect outRect = new Rect(); |
- mDialog.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect); |
- Resources resources = getResources(); |
- mFrameHeight = Math.min( |
- resources.getDimensionPixelSize(R.dimen.autofill_dialog_max_height), |
- outRect.height() - 2 * resources.getDimensionPixelSize( |
- R.dimen.autofill_dialog_vertical_margin)); |
- |
- int widthSpec = MeasureSpec.makeMeasureSpec(mFrameWidth, MeasureSpec.EXACTLY); |
- int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); |
- measureChild(mTitle, widthSpec, heightSpec); |
- measureChild(mFooter, widthSpec, heightSpec); |
- heightSpec = MeasureSpec.makeMeasureSpec( |
- mFrameHeight - getMeasuredTitleHeight() - getMeasuredFooterHeight(), |
- MeasureSpec.AT_MOST); |
- mContent.measure(widthSpec, heightSpec); |
- |
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { |
- for (int i = 0; i < NUM_SECTIONS; i++) { |
- mSpinners[i].setDropDownWidth(mSpinners[i].getMeasuredWidth()); |
- mSpinners[i].setDropDownVerticalOffset(-mSpinners[i].getMeasuredHeight()); |
- } |
- } |
- setMeasuredDimension(mFrameWidth, mFrameHeight); |
- } |
- |
- @Override |
- protected void onLayout (boolean changed, int left, int top, int right, int bottom) { |
- int totalHeight = getMeasuredTitleHeight() |
- + getMeasuredFooterHeight() + mContent.getMeasuredHeight(); |
- int verticalSpacing = (getMeasuredHeight() - totalHeight) / 2 ; |
- mTitle.layout(left, verticalSpacing, right, getMeasuredTitleHeight() + verticalSpacing); |
- mContent.layout(left, mTitle.getBottom(), right, |
- mTitle.getBottom() + mContent.getMeasuredHeight()); |
- mFooter.layout(left, mContent.getBottom(), right, bottom - verticalSpacing); |
- } |
- |
- /** |
- * Set the listener for all the dropdown members in the layout. |
- * @param listener The listener object to attach to the dropdowns. |
- */ |
- public void setOnItemSelectedListener(OnItemSelectedListener listener) { |
- mOnItemSelectedListener = listener; |
- for (int i = 0; i < NUM_SECTIONS; i++) mSpinners[i].setOnItemSelectedListener(listener); |
- } |
- |
- /** |
- * Set the listener for all the dropdown members in the layout. |
- * @param listener The listener object to attach to the dropdowns. |
- */ |
- public void setOnItemEditButtonClickedListener(OnItemEditButtonClickedListener listener) { |
- mOnItemEditButtonClickedListener = listener; |
- for (int i = 0; i < NUM_SECTIONS; i++) { |
- if (mAdapters[i] != null) { |
- mAdapters[i].setOnItemEditButtonClickedListener(listener); |
- } |
- } |
- } |
- |
- /** |
- * @return Whether the current layout is one of the editing layouts. |
- */ |
- public boolean isInEditingMode() { |
- return mCurrentLayout != INVALID_LAYOUT |
- && mCurrentLayout != LAYOUT_STEADY |
- && mCurrentLayout != LAYOUT_FETCHING; |
- } |
- |
- /** |
- * @return The current section if we are in editing mode, INVALID_SECTION otherwise. |
- */ |
- public int getCurrentSection() { |
- return getSectionForLayoutMode(mCurrentLayout); |
- } |
- |
- /** |
- * Updates the legal documents footer. |
- * @param legalDocumentsText The text to show, or a null/empty string. |
- */ |
- public void updateLegalDocumentsText(String legalDocumentsText) { |
- TextView legalView = (TextView) findViewById(R.id.terms_info); |
- if (TextUtils.isEmpty(legalDocumentsText)) { |
- legalView.setVisibility(View.GONE); |
- return; |
- } |
- |
- legalView.setText(legalDocumentsText); |
- legalView.setVisibility(View.VISIBLE); |
- } |
- |
- /** |
- * Updates a dropdown with the given items and adds default items to the end. |
- * @param section The dialog section. |
- * @param suggestionText The suggestion text. |
- * @param suggestionIcon The suggestion icon. |
- * @param suggestionTextExtra The suggestion text extra. |
- * @param suggestionIconExtra The suggestion icon extra. |
- * @param items The {@link AutofillDialogMenuItem} array to update the dropdown with. |
- * @param selectedMenuItem The index of the selected menu item, or -1. |
- */ |
- public void updateMenuItemsForSection(int section, |
- String suggestionText, Bitmap suggestionIcon, |
- String suggestionTextExtra, Bitmap suggestionIconExtra, |
- List<AutofillDialogMenuItem> items, final int selectedMenuItem) { |
- final Spinner spinner = mSpinners[section]; |
- // Set the listener to null and reset it after updating the menu items to avoid getting an |
- // onItemSelected call when the first item is selected after updating the items. |
- spinner.setOnItemSelectedListener(null); |
- AutofillDialogMenuAdapter adapter = mAdapters[section]; |
- adapter.clear(); |
- adapter.setSuggestionExtra(suggestionTextExtra, |
- createFieldIconDrawable(suggestionIconExtra)); |
- adapter.addAll(items); |
- spinner.setSelection(selectedMenuItem); |
- spinner.post(new Runnable() { |
- @Override |
- public void run() { |
- spinner.setOnItemSelectedListener(mOnItemSelectedListener); |
- } |
- }); |
- } |
- |
- /** |
- * Updates a dropdown selection. |
- * @param section The dialog section. |
- * @param selectedMenuItem The index of the selected menu item, or -1. |
- */ |
- public void updateMenuSelectionForSection(int section, int selectedMenuItem) { |
- final Spinner spinner = mSpinners[section]; |
- spinner.setSelection(selectedMenuItem); |
- } |
- |
- /** |
- * Transitions the layout shown to a given layout. |
- * @param mode The layout mode to transition to. |
- */ |
- public void changeLayoutTo(int mode) { |
- assert(mode != INVALID_LAYOUT); |
- if (mode == mCurrentLayout || mode == INVALID_LAYOUT) return; |
- |
- mCurrentLayout = mode; |
- removeCallbacks(mDismissSteadyLayoutRunnable); |
- setVisibilityForEditLayouts(false); |
- if (mode == LAYOUT_FETCHING) { |
- mSteadyLayout.setVisibility(GONE); |
- findViewById(R.id.loading_icon).setVisibility(VISIBLE); |
- return; |
- } |
- findViewById(R.id.loading_icon).setVisibility(GONE); |
- mSteadyLayout.setVisibility(VISIBLE); |
- if (mode == LAYOUT_STEADY) return; |
- |
- View centeredLayout = mEditLayouts[getSectionForLayoutMode(mode)]; |
- |
- if (mode == LAYOUT_EDITING_CC_BILLING) { |
- mEditLayouts[SECTION_CC].setVisibility(VISIBLE); |
- mEditLayouts[SECTION_BILLING].setVisibility(VISIBLE); |
- } else if (mode == LAYOUT_EDITING_CC || mode == LAYOUT_EDITING_BILLING) { |
- mEditLayouts[SECTION_CC_BILLING].setVisibility(VISIBLE); |
- } |
- centeredLayout.setVisibility(VISIBLE); |
- final float fromHeight = mSteadyLayout.getMeasuredHeight(); |
- final float toHeight = getAdjustedContentLayoutHeight(mode, centeredLayout); |
- PropertyValuesHolder pvhVisibleHeight = PropertyValuesHolder.ofFloat( |
- mContentPropertyHeight, fromHeight, toHeight); |
- mCurrentHeightAnimator = |
- ObjectAnimator.ofPropertyValuesHolder(this, pvhVisibleHeight); |
- mCurrentHeightAnimator.setDuration(ANIMATION_DURATION_MS); |
- mCurrentHeightAnimator.addUpdateListener(new AnimatorUpdateListener() { |
- @Override |
- public void onAnimationUpdate(ValueAnimator animator) { |
- invalidate(); |
- } |
- }); |
- mCurrentHeightAnimator.addListener(new AnimatorListenerAdapter() { |
- @Override |
- public void onAnimationStart(Animator animator) { |
- mTransitionAnimationPlaying = true; |
- } |
- |
- @Override |
- public void onAnimationEnd(Animator animator) { |
- mTransitionAnimationPlaying = false; |
- mVisibleContentHeight = toHeight; |
- } |
- }); |
- mCurrentLayoutAnimation = addTranslateAnimations(mode); |
- mCurrentLayoutAnimation.addAnimation(addAppearAnimationForEditLayout(mode, centeredLayout)); |
- mAnimateOnNextLayoutChange = true; |
- |
- postDelayed(mDismissSteadyLayoutRunnable, ANIMATION_DURATION_MS); |
- mCurrentLayout = mode; |
- } |
- |
- private void setVisibilityForEditLayouts(boolean visible) { |
- int visibility = visible ? VISIBLE : GONE; |
- for (int i = 0; i < NUM_SECTIONS; i++) { |
- if (mEditLayouts[i] != null) mEditLayouts[i].setVisibility(visibility); |
- } |
- } |
- |
- /** |
- * Sets the visibility for all items related with the given section. |
- * @param section The section that will change visibility. |
- * @param visible Whether the section should be visible. |
- */ |
- public void setVisibilityForSection(int section, boolean visible) { |
- int visibility = visible ? VISIBLE : GONE; |
- mSpinners[section].setVisibility(visibility); |
- View labelView = findViewById(AutofillDialogUtils.getLabelIDForSection(section)); |
- if (labelView != null) labelView.setVisibility(visibility); |
- } |
- |
- /** |
- * @param bitmap A bitmap. |
- * @return A drawable with the dimensions of a field icon and the contents from the bitmap. |
- */ |
- public BitmapDrawable createFieldIconDrawable(Bitmap bitmap) { |
- if (bitmap == null) return null; |
- |
- Resources resources = getContext().getResources(); |
- BitmapDrawable drawable = new BitmapDrawable(resources, bitmap); |
- int width = resources.getDimensionPixelSize(R.dimen.autofill_field_icon_width); |
- int height = resources.getDimensionPixelSize(R.dimen.autofill_field_icon_height); |
- drawable.setBounds(0, 0, width, height); |
- return drawable; |
- } |
- |
- private AnimationSet addAppearAnimationForEditLayout(int mode, View layout) { |
- View centerView = mSpinners[getSectionForLayoutMode(mode)]; |
- float yOffset = centerView.getY() - (float) centerView.getHeight() / 2; |
- |
- TranslateAnimation toLocationAnimation = new TranslateAnimation(0, 0, yOffset, 0); |
- toLocationAnimation.setDuration(ANIMATION_DURATION_MS); |
- ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, |
- Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f); |
- scaleAnimation.setDuration(ANIMATION_DURATION_MS); |
- |
- AnimationSet appearAnimation = new AnimationSet(true); |
- appearAnimation.addAnimation(toLocationAnimation); |
- appearAnimation.addAnimation(scaleAnimation); |
- |
- layout.setAnimation(appearAnimation); |
- return appearAnimation; |
- } |
- |
- private AnimationSet addTranslateAnimations(int mode) { |
- float distance = getResources(). |
- getDimensionPixelSize(R.dimen.autofill_translation_anim_distance); |
- TranslateAnimation toTopAnimation = new TranslateAnimation(0, 0, 0, -distance); |
- toTopAnimation.setDuration(ANIMATION_DURATION_MS); |
- TranslateAnimation toBottomAnimation = new TranslateAnimation(0, 0, 0, distance); |
- toBottomAnimation.setDuration(ANIMATION_DURATION_MS); |
- for (int i = 0; i < mSteadyLayout.getChildCount(); i++) { |
- View currentChild = mSteadyLayout.getChildAt(i); |
- if (currentChild.getVisibility() == GONE) continue; |
- |
- if (currentChild.getTop() <= |
- mSpinners[getSectionForLayoutMode(mode)].getTop()) { |
- currentChild.setAnimation(toTopAnimation); |
- } else { |
- currentChild.setAnimation(toBottomAnimation); |
- } |
- } |
- AnimationSet combined = new AnimationSet(true); |
- combined.addAnimation(toBottomAnimation); |
- combined.addAnimation(toTopAnimation); |
- return combined; |
- } |
- |
- private static int getSectionForLayoutMode(int mode) { |
- switch (mode) { |
- case LAYOUT_EDITING_EMAIL: |
- return SECTION_EMAIL; |
- case LAYOUT_EDITING_CC: |
- return SECTION_CC; |
- case LAYOUT_EDITING_BILLING: |
- return SECTION_BILLING; |
- case LAYOUT_EDITING_CC_BILLING: |
- return SECTION_CC_BILLING; |
- case LAYOUT_EDITING_SHIPPING: |
- return SECTION_SHIPPING; |
- default: |
- assert(false); |
- return AutofillDialogUtils.INVALID_SECTION; |
- } |
- } |
- |
- /** |
- * Returns the layout mode for editing the given section. |
- * @param section The section to look up. |
- * @return The layout mode for editing the given section. |
- */ |
- public static int getLayoutModeForSection(int section) { |
- assert(section != AutofillDialogUtils.INVALID_SECTION); |
- for (int i = 0; i < AutofillDialogConstants.NUM_SECTIONS; i++) { |
- if (getSectionForLayoutMode(i) == section) return i; |
- } |
- assert(false); |
- return INVALID_LAYOUT; |
- } |
- |
- /** |
- * @return The current visible content height. |
- */ |
- public float getVisibleContentHeight() { |
- return mVisibleContentHeight; |
- } |
- |
- /** |
- * Sets the visible content height. This value is used for setting the clipRect for the canvas |
- * in layout transitions. |
- * @param height The value to use for the visible content height. |
- */ |
- public void setVisibleContentHeight(float height) { |
- mVisibleContentHeight = height; |
- } |
- |
- private static class AutofillDialogMenuAdapter extends ArrayAdapter<AutofillDialogMenuItem> { |
- private int mSection; |
- private OnItemEditButtonClickedListener mOnItemEditButtonClickedListener; |
- private String mSuggestionTextExtra; |
- private BitmapDrawable mSuggestionIconExtraDrawable; |
- |
- public AutofillDialogMenuAdapter( |
- int section, |
- Context context, |
- List<AutofillDialogMenuItem> objects) { |
- super(context, R.layout.autofill_menu_item, objects); |
- mSection = section; |
- } |
- |
- public void setOnItemEditButtonClickedListener(OnItemEditButtonClickedListener listener) { |
- mOnItemEditButtonClickedListener = listener; |
- } |
- |
- public void setSuggestionExtra(String suggestionTextExtra, |
- BitmapDrawable suggestionIconExtraDrawable) { |
- mSuggestionTextExtra = suggestionTextExtra; |
- mSuggestionIconExtraDrawable = suggestionIconExtraDrawable; |
- } |
- |
- @Override |
- public View getView(int position, View convertView, ViewGroup parent) { |
- return initView(position, convertView, parent, false, |
- AutofillDialogUtils.getItemLayoutIDForSection(mSection)); |
- } |
- |
- @Override |
- public View getDropDownView(int position, View convertView, ViewGroup parent) { |
- return initView(position, convertView, parent, true, R.layout.autofill_menu_item); |
- } |
- |
- private View initView( |
- final int position, View convertView, final ViewGroup parent, boolean isDropDown, |
- int layoutId) { |
- if (convertView == null) { |
- convertView = View.inflate(getContext(), layoutId, null); |
- } |
- |
- AutofillDialogMenuItem item = getItem(position); |
- ImageView icon = (ImageView) convertView.findViewById(R.id.cc_icon); |
- TextView line1 = (TextView) convertView.findViewById(R.id.adapter_item_line_1); |
- TextView line2 = (TextView) convertView.findViewById(R.id.adapter_item_line_2); |
- Button button = (Button) convertView.findViewById(R.id.adapter_item_edit_button); |
- EditText extraEdit = (EditText) convertView.findViewById(R.id.cvc_challenge); |
- |
- if (icon != null) { |
- if (item.mIcon != null) { |
- icon.setImageBitmap(item.mIcon); |
- icon.setVisibility(VISIBLE); |
- } else { |
- icon.setImageBitmap(null); |
- icon.setVisibility(GONE); |
- } |
- } |
- if (line1 != null) line1.setText(item.mLine1); |
- if (line2 != null) { |
- if (!TextUtils.isEmpty(item.mLine2)) { |
- line2.setVisibility(VISIBLE); |
- line2.setText(item.mLine2); |
- } else { |
- line2.setVisibility(GONE); |
- } |
- } |
- |
- if (extraEdit != null) { |
- if (!isDropDown && !TextUtils.isEmpty(mSuggestionTextExtra)) { |
- extraEdit.setVisibility(VISIBLE); |
- extraEdit.setHint(mSuggestionTextExtra); |
- extraEdit.setCompoundDrawables( |
- null, null, mSuggestionIconExtraDrawable, null); |
- } else { |
- extraEdit.setVisibility(GONE); |
- } |
- } |
- |
- if (button != null) { |
- if (isDropDown && item.mShowButton) { |
- button.setText(item.mButtonLabelResourceId); |
- button.setOnClickListener(new OnClickListener() { |
- // TODO(aruslan): http://crbug.com/236101. |
- @Override |
- public void onClick(View view) { |
- View root = parent.getRootView(); |
- root.dispatchKeyEvent( |
- new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); |
- root.dispatchKeyEvent( |
- new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); |
- assert mOnItemEditButtonClickedListener != null; |
- if (mOnItemEditButtonClickedListener != null) { |
- mOnItemEditButtonClickedListener.onItemEditButtonClicked( |
- mSection, position); |
- } |
- } |
- }); |
- button.setVisibility(VISIBLE); |
- } else { |
- button.setOnClickListener(null); |
- button.setVisibility(GONE); |
- } |
- } |
- return convertView; |
- } |
- } |
-} |