Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/SingleSelectPopup.java

Issue 231953003: Show Ash like <select> popup on Android tablets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@newpopupx
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/input/SingleSelectPopup.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SingleSelectPopup.java b/content/public/android/java/src/org/chromium/content/browser/input/SingleSelectPopup.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebd6ec099420e399d4035a0f56c69fe57737db65
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/input/SingleSelectPopup.java
@@ -0,0 +1,154 @@
+// Copyright 2012 The Chromium Authors. All rights reserved.
Ted C 2014/04/18 01:28:05 2014
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser.input;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.View.OnLayoutChangeListener;
+import android.widget.AdapterView;
+import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
+
+import org.chromium.content.R;
+import org.chromium.content.browser.ContentViewCore;
+import org.chromium.content.browser.RenderCoordinates;
+import org.chromium.ui.base.ViewAndroidDelegate;
+
+import java.util.List;
+
+/**
+ * The Autofill suggestion popup that lists relevant suggestions.
+ */
+public class SingleSelectPopup extends ListPopupWindow implements AdapterView.OnItemClickListener {
+
+ private static final int TEXT_PADDING_DP = 30;
+
+ private final ContentViewCore mContentViewCore;
+ private final Context mContext;
+ private final ViewAndroidDelegate mViewAndroidDelegate;
+ private final SingleSelectPopupDelegate mSelectDelegate;
+ private View mAnchorView;
+ private OnLayoutChangeListener mLayoutChangeListener;
+
+ /**
+ * An interface to handle a SingleSelectPopup object.
+ */
+ public interface SingleSelectPopupDelegate {
+ /**
+ * Handles the selection of an option from a SingleSelectPopup.
+ * @param index The index of the selected option.
+ */
+ public void optionSelected(int index);
+ }
+
+ /**
+ * Shows the popup with the given items.
+ * @param contentViewCore The list of items to show.
+ * @param selectCallback The delegate that gets notified when an option has been selected.
+ */
+ public SingleSelectPopup(ContentViewCore contentViewCore,
+ SingleSelectPopupDelegate selectCallback) {
+ super(contentViewCore.getContext(), null, 0, R.style.SingleSelectPopupWindow);
+ mContext = contentViewCore.getContext();
+ mViewAndroidDelegate = contentViewCore.getViewAndroidDelegate();
+ mContentViewCore = contentViewCore;
+ mSelectDelegate = selectCallback;
+
+ setModal(true);
+ setOnItemClickListener(this);
+
+ mAnchorView = mViewAndroidDelegate.acquireAnchorView();
+ mAnchorView.setId(R.id.single_select_popup_window);
+ mAnchorView.setTag(this);
+
+ 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) SingleSelectPopup.this.show();
+ }
+ };
+
+ mAnchorView.addOnLayoutChangeListener(mLayoutChangeListener);
+ setAnchorView(mAnchorView);
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ getListView().setDividerHeight(0);
+ }
+
+ /**
+ * Shows the popup with the given items.
+ * @param items The list of items to show.
+ * @param originRect The rect of the select element in css pixels.
+ */
+ public void show(List<SelectPopupItem> items, Rect originRect) {
+ setAdapter(new SingleSelectPopupAdapter(mContext, items));
+ show();
+ float horizontalMargin = mContext.getResources().getDimension(
+ R.dimen.select_popup_horizontal_margin);
+ float borderWidth = mContext.getResources().getDimension(R.dimen.select_popup_border_width);
+ RenderCoordinates renderCoordinates = mContentViewCore.getRenderCoordinates();
+ float anchorX = renderCoordinates.fromPixToDip(
+ renderCoordinates.fromLocalCssToPix(originRect.left)) - horizontalMargin;
+ float anchorY = renderCoordinates.fromPixToDip(
+ renderCoordinates.fromLocalCssToPix(originRect.top));
+ float anchorWidth = renderCoordinates.fromPixToDip(
+ renderCoordinates.fromLocalCssToPix(originRect.right)) - anchorX +
+ horizontalMargin * 2;
+ anchorWidth = Math.max(getDesiredListWidth() + (horizontalMargin + borderWidth) * 2,
+ anchorWidth);
+ float anchorHeight = renderCoordinates.fromPixToDip(
+ renderCoordinates.fromLocalCssToPix(originRect.bottom)) - anchorY;
+ mViewAndroidDelegate.setAnchorViewPosition(mAnchorView, anchorX, anchorY, anchorWidth,
+ anchorHeight);
+ }
+
+ /**
+ * Overrides the default dismiss behavior to request the controller to dismiss the view.
+ */
+ @Override
+ public void dismiss() {
+ hide();
+ }
+
+ /**
+ * Hides the popup and removes the anchor view from the ContainerView.
+ */
+ public void hide() {
+ super.dismiss();
+ mAnchorView.removeOnLayoutChangeListener(mLayoutChangeListener);
+ mAnchorView.setTag(null);
+ mViewAndroidDelegate.releaseAnchorView(mAnchorView);
+ }
+
+ private float getDesiredListWidth() {
+ SingleSelectPopupAdapter adapter = (SingleSelectPopupAdapter) getListView().getAdapter();
+ int maxWidth = 0;
+ View view = null;
+ //FrameLayout fakeParent = new FrameLayout(mContext);
+ for (int i = 0; i < adapter.getCount(); i++) {
+ view = adapter.getView(i, view, null);
+ LinearLayout.LayoutParams params =
+ new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT);
+ view.setLayoutParams(params);
+ view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ int width = view.getMeasuredWidth();
+ maxWidth = Math.max(maxWidth, view.getMeasuredWidth());
+ }
+ RenderCoordinates renderCoordinates = mContentViewCore.getRenderCoordinates();
+ return renderCoordinates.fromPixToDip(maxWidth);
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ mSelectDelegate.optionSelected(position);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698