1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.content.browser.input; 6 7 import android.content.Context; 8 import android.view.View; 9 import android.view.ViewGroup; 10 import android.widget.ArrayAdapter; 11 import android.widget.CheckedTextView; 12 import android.widget.TextView; 13 14 import java.util.ArrayList; 15 import java.util.List; 16 17 /** 18 * Select popup item adapter for SelectPopupDialog, used so we can disable 19 * OPTION_GROUP items. 20 */ 21 public class SelectPopupAdapter extends ArrayAdapter<SelectPopupItem> { 22 // Holds the items of the select popup alert dialog list. 23 private List<SelectPopupItem> mItems; 24 25 // True if all items have type PopupItemType.ENABLED. 26 private boolean mAreAllItemsEnabled; 27 28 /** 29 * Creates a new SelectPopupItem adapter for the select popup alert dialog list. 30 * @param context Application context. 31 * @param layoutResource Layout resource used for the alert dialog list. 32 * @param items SelectPopupItem array list. 33 */ SelectPopupAdapter(Context context, int layoutResource, List<SelectPopupItem> items)34 public SelectPopupAdapter(Context context, int layoutResource, 35 List<SelectPopupItem> items) { 36 super(context, layoutResource, items); 37 mItems = new ArrayList<SelectPopupItem>(items); 38 39 mAreAllItemsEnabled = true; 40 for (int i = 0; i < mItems.size(); i++) { 41 if (mItems.get(i).getType() != PopupItemType.ENABLED) { 42 mAreAllItemsEnabled = false; 43 break; 44 } 45 } 46 } 47 48 @Override getView(int position, View convertView, ViewGroup parent)49 public View getView(int position, View convertView, ViewGroup parent) { 50 if (position < 0 || position >= getCount()) return null; 51 52 // Always pass in null so that we will get a new CheckedTextView. Otherwise, an item 53 // which was previously used as an <optgroup> element (i.e. has no check), could get 54 // used as an <option> element, which needs a checkbox/radio, but it would not have 55 // one. 56 convertView = super.getView(position, null, parent); 57 ((TextView) convertView).setText(mItems.get(position).getLabel()); 58 59 if (mItems.get(position).getType() != PopupItemType.ENABLED) { 60 if (mItems.get(position).getType() == PopupItemType.GROUP) { 61 // Currently select_dialog_multichoice uses CheckedTextViews. 62 // If that changes, the class cast will no longer be valid. 63 // The WebView build cannot rely on this being the case, so 64 // we must check. 65 if (convertView instanceof CheckedTextView) { 66 ((CheckedTextView) convertView).setCheckMarkDrawable(null); 67 } 68 } else { 69 // Draw the disabled element in a disabled state. 70 convertView.setEnabled(false); 71 } 72 } 73 return convertView; 74 } 75 76 @Override areAllItemsEnabled()77 public boolean areAllItemsEnabled() { 78 return mAreAllItemsEnabled; 79 } 80 81 @Override isEnabled(int position)82 public boolean isEnabled(int position) { 83 if (position < 0 || position >= getCount()) return false; 84 return mItems.get(position).getType() == PopupItemType.ENABLED; 85 } 86 } 87