Index: ui/android/java/src/org/chromium/ui/autofill/AutofillPopup.java |
diff --git a/ui/android/java/src/org/chromium/ui/autofill/AutofillPopup.java b/ui/android/java/src/org/chromium/ui/autofill/AutofillPopup.java |
index 749ab75e7efa6301c9b40351077fc63cfe8f1eae..d2f9bc7ea7696ad3d00635134e8661f989a98092 100644 |
--- a/ui/android/java/src/org/chromium/ui/autofill/AutofillPopup.java |
+++ b/ui/android/java/src/org/chromium/ui/autofill/AutofillPopup.java |
@@ -5,17 +5,12 @@ |
package org.chromium.ui.autofill; |
import android.content.Context; |
-import android.graphics.Paint; |
-import android.graphics.Rect; |
-import android.text.TextUtils; |
-import android.view.LayoutInflater; |
import android.view.View; |
-import android.view.View.OnLayoutChangeListener; |
import android.widget.AdapterView; |
-import android.widget.ListPopupWindow; |
-import android.widget.TextView; |
-import org.chromium.ui.R; |
+import org.chromium.ui.DropdownAdapter; |
+import org.chromium.ui.DropdownItem; |
+import org.chromium.ui.DropdownPopupWindow; |
import org.chromium.ui.base.ViewAndroidDelegate; |
import java.util.ArrayList; |
@@ -26,7 +21,7 @@ import java.util.List; |
/** |
* The Autofill suggestion popup that lists relevant suggestions. |
*/ |
-public class AutofillPopup extends ListPopupWindow implements AdapterView.OnItemClickListener { |
+public class AutofillPopup extends DropdownPopupWindow implements AdapterView.OnItemClickListener { |
/** |
* Constants defining types of Autofill suggestion entries. |
@@ -40,19 +35,8 @@ public class AutofillPopup extends ListPopupWindow implements AdapterView.OnItem |
private static final int ITEM_ID_SEPARATOR_ENTRY = -3; |
private static final int ITEM_ID_DATA_LIST_ENTRY = -6; |
- private static final int TEXT_PADDING_DP = 30; |
- |
- private final AutofillPopupDelegate mAutofillCallback; |
private final Context mContext; |
- private final ViewAndroidDelegate mViewAndroidDelegate; |
- private View mAnchorView; |
- private float mAnchorWidth; |
- private float mAnchorHeight; |
- private float mAnchorX; |
- private float mAnchorY; |
- private Paint mLabelViewPaint; |
- private Paint mSublabelViewPaint; |
- private OnLayoutChangeListener mLayoutChangeListener; |
+ private final AutofillPopupDelegate mAutofillCallback; |
private List<AutofillSuggestion> mSuggestions; |
@@ -80,67 +64,21 @@ public class AutofillPopup extends ListPopupWindow implements AdapterView.OnItem |
*/ |
public AutofillPopup(Context context, ViewAndroidDelegate viewAndroidDelegate, |
AutofillPopupDelegate autofillCallback) { |
- super(context, null, 0, R.style.AutofillPopupWindow); |
+ super(context, viewAndroidDelegate); |
mContext = context; |
- mViewAndroidDelegate = viewAndroidDelegate; |
mAutofillCallback = autofillCallback; |
setOnItemClickListener(this); |
- |
- mAnchorView = mViewAndroidDelegate.acquireAnchorView(); |
- mAnchorView.setId(R.id.autofill_popup_window); |
- mAnchorView.setTag(this); |
- |
- mViewAndroidDelegate.setAnchorViewPosition(mAnchorView, mAnchorX, mAnchorY, mAnchorWidth, |
- mAnchorHeight); |
- |
- mLayoutChangeListener = 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 (v == mAnchorView) AutofillPopup.this.show(); |
- } |
- }; |
- |
- mAnchorView.addOnLayoutChangeListener(mLayoutChangeListener); |
- setAnchorView(mAnchorView); |
- } |
- |
- @Override |
- public void show() { |
- // An ugly hack to keep the popup from expanding on top of the keyboard. |
- setInputMethodMode(INPUT_METHOD_NEEDED); |
- super.show(); |
- getListView().setDividerHeight(0); |
} |
/** |
- * Sets the location and the size of the anchor view that the AutofillPopup will use to attach |
- * itself. |
- * @param x X coordinate of the top left corner of the anchor view. |
- * @param y Y coordinate of the top left corner of the anchor view. |
- * @param width The width of the anchor view. |
- * @param height The height of the anchor view. |
- */ |
- public void setAnchorRect(float x, float y, float width, float height) { |
- mAnchorWidth = width; |
- mAnchorHeight = height; |
- mAnchorX = x; |
- mAnchorY = y; |
- if (mAnchorView != null) { |
- mViewAndroidDelegate.setAnchorViewPosition(mAnchorView, mAnchorX, mAnchorY, |
- mAnchorWidth, mAnchorHeight); |
- } |
- } |
- |
- /** |
- * Sets the Autofill suggestions to display in the popup and shows the popup. |
+ * Filters the Autofill suggestions to the ones that we support and shows the popup. |
* @param suggestions Autofill suggestion data. |
*/ |
- public void show(AutofillSuggestion[] suggestions) { |
+ public void filterAndShow(AutofillSuggestion[] suggestions) { |
mSuggestions = new ArrayList<AutofillSuggestion>(Arrays.asList(suggestions)); |
// Remove the AutofillSuggestions with IDs that are not supported by Android |
- ArrayList<AutofillSuggestion> cleanedData = new ArrayList<AutofillSuggestion>(); |
+ ArrayList<DropdownItem> cleanedData = new ArrayList<DropdownItem>(); |
HashSet<Integer> separators = new HashSet<Integer>(); |
for (int i = 0; i < suggestions.length; i++) { |
int itemId = suggestions[i].mUniqueId; |
@@ -151,11 +89,8 @@ public class AutofillPopup extends ListPopupWindow implements AdapterView.OnItem |
separators.add(cleanedData.size()); |
} |
} |
- setAdapter(new AutofillListAdapter(mContext, cleanedData, separators)); |
- // Once the mAnchorRect is resized and placed correctly, it will show the Autofill popup. |
- mAnchorWidth = Math.max(getDesiredWidth(cleanedData), mAnchorWidth); |
- mViewAndroidDelegate.setAnchorViewPosition(mAnchorView, mAnchorX, mAnchorY, mAnchorWidth, |
- mAnchorHeight); |
+ setAdapter(new DropdownAdapter(mContext, cleanedData, separators)); |
+ show(); |
} |
/** |
@@ -167,61 +102,16 @@ public class AutofillPopup extends ListPopupWindow implements AdapterView.OnItem |
} |
/** |
- * Hides the popup and removes the anchor view from the ContainerView. |
+ * Hides the popup. |
*/ |
public void hide() { |
super.dismiss(); |
- mAnchorView.removeOnLayoutChangeListener(mLayoutChangeListener); |
- mAnchorView.setTag(null); |
- mViewAndroidDelegate.releaseAnchorView(mAnchorView); |
- } |
- |
- /** |
- * Get desired popup window width by calculating the maximum text length from Autofill data. |
- * @param data Autofill suggestion data. |
- * @return The popup window width in DIP. |
- */ |
- private float getDesiredWidth(ArrayList<AutofillSuggestion> data) { |
- if (mLabelViewPaint == null || mSublabelViewPaint == null) { |
- LayoutInflater inflater = |
- (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
- View layout = inflater.inflate(R.layout.autofill_text, null); |
- TextView labelView = (TextView) layout.findViewById(R.id.autofill_label); |
- mLabelViewPaint = labelView.getPaint(); |
- TextView sublabelView = (TextView) layout.findViewById(R.id.autofill_sublabel); |
- mSublabelViewPaint = sublabelView.getPaint(); |
- } |
- |
- float maxTextWidth = 0; |
- Rect bounds = new Rect(); |
- for (int i = 0; i < data.size(); ++i) { |
- bounds.setEmpty(); |
- String label = data.get(i).mLabel; |
- if (!TextUtils.isEmpty(label)) { |
- mLabelViewPaint.getTextBounds(label, 0, label.length(), bounds); |
- } |
- float labelWidth = bounds.width(); |
- |
- bounds.setEmpty(); |
- String sublabel = data.get(i).mSublabel; |
- if (!TextUtils.isEmpty(sublabel)) { |
- mSublabelViewPaint.getTextBounds(sublabel, 0, sublabel.length(), bounds); |
- } |
- |
- float localMax = Math.max(labelWidth, bounds.width()); |
- maxTextWidth = Math.max(maxTextWidth, localMax); |
- } |
- // Scale it down to make it unscaled by screen density. |
- maxTextWidth = maxTextWidth / mContext.getResources().getDisplayMetrics().density; |
- // Adding padding. |
- return maxTextWidth + TEXT_PADDING_DP; |
} |
@Override |
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
- AutofillListAdapter adapter = (AutofillListAdapter) parent.getAdapter(); |
- AutofillSuggestion selectedSuggestion = adapter.getItem(position); |
- int listIndex = mSuggestions.indexOf(selectedSuggestion); |
+ DropdownAdapter adapter = (DropdownAdapter) parent.getAdapter(); |
+ int listIndex = mSuggestions.indexOf(adapter.getItem(position)); |
assert listIndex > -1; |
mAutofillCallback.suggestionSelected(listIndex); |
} |