Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuSpinnerHelper.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuSpinnerHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuSpinnerHelper.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c828b61226f05fb502cb1f3526e7d75566e20be4 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuSpinnerHelper.java |
@@ -0,0 +1,144 @@ |
+// Copyright 2017 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.infobar.translate; |
+ |
+import android.content.Context; |
+import android.view.ContextThemeWrapper; |
+import android.view.LayoutInflater; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.widget.AdapterView; |
+import android.widget.ArrayAdapter; |
+import android.widget.Spinner; |
+import android.widget.TextView; |
+ |
+import org.chromium.chrome.R; |
+ |
+import java.util.List; |
+ |
+/** |
+ * A Helper class for managing the Translate Overflow Menu. |
+ */ |
+public class TranslateMenuSpinnerHelper implements AdapterView.OnItemSelectedListener { |
+ // A dummy element, selecting it means "select none". |
+ private static final int POSITION_NONE = 0; |
+ |
+ private Spinner mSpinner; |
+ private final TranslateSpinnerItemListener mItemListener; |
+ |
+ /** |
+ * Interface for receiving the click event of spinner item. |
+ */ |
+ public interface TranslateSpinnerItemListener { void onSpinnerItemSelected(String id); } |
+ |
+ public TranslateMenuSpinnerHelper(Context context, Spinner spinner, |
+ List<TranslateSpinnerElement> list, TranslateSpinnerItemListener itemListener) { |
+ mItemListener = itemListener; |
+ mSpinner = spinner; |
+ |
+ // Added a dummy (for "select none") element as the first element of the list. |
+ list.add(POSITION_NONE, new TranslateSpinnerElement("", null)); |
+ |
+ ContextThemeWrapper wrapper = new ContextThemeWrapper(context, R.style.OverflowMenuTheme); |
+ |
+ TranslateMenuSpinnerAdapter translateMenuSpinnerAdapter = new TranslateMenuSpinnerAdapter( |
+ context, android.R.layout.simple_spinner_item, list, LayoutInflater.from(wrapper)); |
+ translateMenuSpinnerAdapter.setDropDownViewResource( |
+ android.R.layout.simple_spinner_dropdown_item); |
+ int popupWidth = context.getResources().getDimensionPixelSize(R.dimen.menu_width); |
+ mSpinner.setOnItemSelectedListener(this); |
+ mSpinner.setDropDownWidth(popupWidth); |
+ mSpinner.setAdapter(translateMenuSpinnerAdapter); |
+ } |
+ |
+ @Override |
+ public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { |
+ if (position == POSITION_NONE) { |
+ return; |
+ } |
+ String code = ((TranslateSpinnerElement) mSpinner.getSelectedItem()).getId(); |
+ mItemListener.onSpinnerItemSelected(code); |
+ |
+ // Reset selection. this way the spinner will scroll back to the top when it reopens. |
+ mSpinner.setSelection(POSITION_NONE); |
+ } |
+ |
+ @Override |
+ public void onNothingSelected(AdapterView<?> adapter) {} |
+ |
+ /** |
+ * The provides the views of the spinner, spinner items and dividers. |
+ */ |
+ public class TranslateMenuSpinnerAdapter extends ArrayAdapter<TranslateSpinnerElement> { |
+ LayoutInflater mInflater; |
+ |
+ public TranslateMenuSpinnerAdapter(Context context, int textViewResourceId, |
+ List<TranslateSpinnerElement> items, LayoutInflater inflater) { |
+ super(context, textViewResourceId, items); |
+ mInflater = inflater; |
+ } |
+ |
+ @Override |
+ public boolean isEnabled(int position) { |
+ return (position != POSITION_NONE |
+ && !((TranslateSpinnerElement) mSpinner.getItemAtPosition(position)) |
+ .isDividerLine()); |
+ } |
+ |
+ @Override |
+ public View getView(int position, View convertView, ViewGroup parent) { |
+ convertView = new View(getContext()); |
+ convertView.setVisibility(View.GONE); |
+ return convertView; |
+ } |
+ |
+ @Override |
+ public View getDropDownView(int position, View convertView, ViewGroup parent) { |
+ TranslateSpinnerElement item = |
+ ((TranslateSpinnerElement) mSpinner.getItemAtPosition(position)); |
+ if (position == POSITION_NONE) { |
+ convertView = new View(getContext()); |
+ convertView.setVisibility(View.GONE); |
+ } else if (item.isDividerLine()) { |
+ convertView = |
+ mInflater.inflate(R.layout.translate_menu_spinner_divider, parent, false); |
+ } else { |
+ convertView = |
+ mInflater.inflate(R.layout.translate_menu_spinner_item, parent, false); |
+ ((TextView) convertView.findViewById(R.id.menu_item_text)).setText(item.toString()); |
+ } |
+ return convertView; |
+ } |
+ } |
+ |
+ /** |
+ * The element that goes inside the spinner. |
+ */ |
+ public static class TranslateSpinnerElement { |
+ private final String mTitle; |
+ private final String mId; |
+ |
+ public TranslateSpinnerElement(String title, String id) { |
+ mTitle = title; |
+ mId = id; |
+ } |
+ |
+ public String getId() { |
+ return mId; |
+ } |
+ |
+ public boolean isDividerLine() { |
+ return mId == null; |
+ } |
+ |
+ /** |
+ * This is the text displayed in the spinner element. |
+ */ |
+ @Override |
+ public String toString() { |
+ return mTitle; |
+ } |
+ } |
+} |