OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.appmenu; | 5 package org.chromium.chrome.browser.appmenu; |
6 | 6 |
7 import android.graphics.drawable.Drawable; | 7 import android.graphics.drawable.Drawable; |
8 import android.view.LayoutInflater; | 8 import android.view.LayoutInflater; |
9 import android.view.MenuItem; | 9 import android.view.MenuItem; |
10 import android.view.View; | 10 import android.view.View; |
11 import android.view.View.OnClickListener; | |
11 import android.view.ViewGroup; | 12 import android.view.ViewGroup; |
12 import android.widget.BaseAdapter; | 13 import android.widget.BaseAdapter; |
14 import android.widget.Button; | |
15 import android.widget.ImageButton; | |
13 import android.widget.ListView; | 16 import android.widget.ListView; |
14 import android.widget.TextView; | 17 import android.widget.TextView; |
15 | 18 |
16 import org.chromium.chrome.R; | 19 import org.chromium.chrome.R; |
17 | 20 |
18 import java.util.List; | 21 import java.util.List; |
19 | 22 |
20 /** | 23 /** |
21 * ListAdapter to customize the view of items in the list. | 24 * ListAdapter to customize the view of items in the list. |
22 */ | 25 */ |
23 class AppMenuAdapter extends BaseAdapter { | 26 class AppMenuAdapter extends BaseAdapter { |
27 private static final int VIEW_TYPE_COUNT = 3; | |
28 | |
24 private static final int VIEW_TYPE_MENUITEM = 0; | 29 private static final int VIEW_TYPE_MENUITEM = 0; |
25 private static final int VIEW_TYPE_COUNT = 1; | 30 private static final int VIEW_TYPE_TITLE_BUTTON_MENUITEM = 1; |
31 private static final int VIEW_TYPE_THREE_BUTTON_MENUITEM = 2; | |
Kibeom Kim (inactive)
2014/03/19 22:04:46
maybe comment what they represent?
aurimas (slooooooooow)
2014/03/19 23:31:32
Done.
| |
26 | 32 |
33 private final AppMenu mAppMenu; | |
27 private final LayoutInflater mInflater; | 34 private final LayoutInflater mInflater; |
28 private final List<MenuItem> mMenuItems; | 35 private final List<MenuItem> mMenuItems; |
29 private final int mNumMenuItems; | 36 private final int mNumMenuItems; |
30 | 37 |
31 public AppMenuAdapter(List<MenuItem> menuItems, LayoutInflater inflater) { | 38 public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInfla ter inflater) { |
39 mAppMenu = appMenu; | |
32 mMenuItems = menuItems; | 40 mMenuItems = menuItems; |
33 mInflater = inflater; | 41 mInflater = inflater; |
34 mNumMenuItems = menuItems.size(); | 42 mNumMenuItems = menuItems.size(); |
35 } | 43 } |
36 | 44 |
37 @Override | 45 @Override |
38 public int getCount() { | 46 public int getCount() { |
39 return mNumMenuItems; | 47 return mNumMenuItems; |
40 } | 48 } |
41 | 49 |
42 @Override | 50 @Override |
43 public int getViewTypeCount() { | 51 public int getViewTypeCount() { |
44 return VIEW_TYPE_COUNT; | 52 return VIEW_TYPE_COUNT; |
45 } | 53 } |
46 | 54 |
47 @Override | 55 @Override |
48 public int getItemViewType(int position) { | 56 public int getItemViewType(int position) { |
57 if (getItem(position).hasSubMenu()) { | |
58 if (getItem(position).getSubMenu().size() == 3) { | |
59 return VIEW_TYPE_THREE_BUTTON_MENUITEM; | |
60 } else if (getItem(position).getSubMenu().size() == 2) { | |
61 return VIEW_TYPE_TITLE_BUTTON_MENUITEM; | |
62 } | |
63 } | |
49 return VIEW_TYPE_MENUITEM; | 64 return VIEW_TYPE_MENUITEM; |
50 } | 65 } |
51 | 66 |
52 @Override | 67 @Override |
53 public long getItemId(int position) { | 68 public long getItemId(int position) { |
54 return getItem(position).getItemId(); | 69 return getItem(position).getItemId(); |
55 } | 70 } |
56 | 71 |
57 @Override | 72 @Override |
58 public MenuItem getItem(int position) { | 73 public MenuItem getItem(int position) { |
59 if (position == ListView.INVALID_POSITION) return null; | 74 if (position == ListView.INVALID_POSITION) return null; |
60 assert position >= 0; | 75 assert position >= 0; |
61 assert position < mMenuItems.size(); | 76 assert position < mMenuItems.size(); |
62 return mMenuItems.get(position); | 77 return mMenuItems.get(position); |
63 } | 78 } |
64 | 79 |
65 @Override | 80 @Override |
66 public View getView(int position, View convertView, ViewGroup parent) { | 81 public View getView(int position, View convertView, ViewGroup parent) { |
67 View rowView = convertView; | 82 final MenuItem item = getItem(position); |
68 // A ViewHolder keeps references to children views to avoid unneccessary calls | 83 if (getItemViewType(position) == VIEW_TYPE_MENUITEM) { |
Kibeom Kim (inactive)
2014/03/19 22:04:46
optinal: In this case, I think switch statement wi
aurimas (slooooooooow)
2014/03/19 23:31:32
Done.
| |
69 // to findViewById() on each row. | 84 // A ViewHolder keeps references to children views to avoid unnecces sary calls |
70 ViewHolder holder = null; | 85 // to findViewById() on each row. |
86 ViewHolder holder = null; | |
71 | 87 |
72 // When convertView is not null, we can reuse it directly, there is no n eed | 88 // When convertView is not null, we can reuse it directly, there is no need |
73 // to reinflate it. | 89 // to reinflate it. |
74 if (rowView == null) { | 90 if (convertView == null) { |
75 holder = new ViewHolder(); | 91 holder = new ViewHolder(); |
76 rowView = mInflater.inflate(R.layout.menu_item, null); | 92 convertView = mInflater.inflate(R.layout.menu_item, null); |
77 holder.text = (TextView) rowView.findViewById(R.id.menu_item_text); | 93 holder.text = (TextView) convertView.findViewById(R.id.menu_item _text); |
78 holder.image = (AppMenuItemIcon) rowView.findViewById(R.id.menu_item _icon); | 94 holder.image = (AppMenuItemIcon) convertView.findViewById(R.id.m enu_item_icon); |
79 rowView.setTag(holder); | 95 convertView.setTag(holder); |
96 } else { | |
97 holder = (ViewHolder) convertView.getTag(); | |
98 } | |
99 convertView.setOnClickListener(new OnClickListener() { | |
100 @Override | |
101 public void onClick(View v) { | |
102 mAppMenu.onItemClick(item); | |
103 } | |
104 }); | |
105 // Set up the icon. | |
106 Drawable icon = item.getIcon(); | |
107 holder.image.setImageDrawable(icon); | |
108 holder.image.setVisibility(icon == null ? View.GONE : View.VISIBLE); | |
109 holder.image.setChecked(item.isChecked()); | |
110 | |
111 holder.text.setText(item.getTitle()); | |
112 boolean isEnabled = item.isEnabled(); | |
113 // Set the text color (using a color state list). | |
114 holder.text.setEnabled(isEnabled); | |
115 // This will ensure that the item is not highlighted when selected. | |
116 convertView.setEnabled(isEnabled); | |
117 return convertView; | |
118 } else if (getItemViewType(position) == VIEW_TYPE_THREE_BUTTON_MENUITEM) { | |
Kibeom Kim (inactive)
2014/03/19 22:04:46
probably not important but just Q: can't we reuse
aurimas (slooooooooow)
2014/03/19 23:31:32
Done.
| |
119 convertView = mInflater.inflate(R.layout.three_button_menu_item, nul l); | |
120 setupImageButton((ImageButton) convertView.findViewById(R.id.button_ one), | |
121 item.getSubMenu().getItem(0)); | |
122 setupImageButton((ImageButton) convertView.findViewById(R.id.button_ two), | |
123 item.getSubMenu().getItem(1)); | |
124 setupImageButton((ImageButton) convertView.findViewById(R.id.button_ three), | |
125 item.getSubMenu().getItem(2)); | |
126 convertView.setFocusable(false); | |
127 convertView.setEnabled(false); | |
128 return convertView; | |
80 } else { | 129 } else { |
Kibeom Kim (inactive)
2014/03/19 22:04:46
I'd either use switch statement or put "assert get
aurimas (slooooooooow)
2014/03/19 23:31:32
Done.
| |
81 holder = (ViewHolder) convertView.getTag(); | 130 convertView = mInflater.inflate(R.layout.title_button_menu_item, nul l); |
131 Button button = (Button) convertView.findViewById(R.id.menu_item_tex t); | |
132 final MenuItem textItem = item.getSubMenu().getItem(0); | |
133 button.setText(textItem.getTitle()); | |
134 button.setEnabled(textItem.isEnabled()); | |
135 button.setFocusable(textItem.isEnabled()); | |
136 button.setOnClickListener(new OnClickListener() { | |
137 @Override | |
138 public void onClick(View v) { | |
139 mAppMenu.onItemClick(textItem); | |
140 } | |
141 }); | |
142 setupImageButton((ImageButton) convertView.findViewById(R.id.button) , | |
143 item.getSubMenu().getItem(1)); | |
144 convertView.setFocusable(false); | |
145 convertView.setEnabled(false); | |
146 return convertView; | |
82 } | 147 } |
83 MenuItem item = getItem(position); | 148 } |
84 | 149 |
85 // Set up the icon. | 150 private void setupImageButton(ImageButton button, final MenuItem item) { |
86 Drawable icon = item.getIcon(); | 151 button.setImageDrawable(item.getIcon()); |
87 holder.image.setImageDrawable(icon); | 152 button.setContentDescription(item.getTitle()); |
88 holder.image.setVisibility(icon == null ? View.GONE : View.VISIBLE); | 153 button.setEnabled(item.isEnabled()); |
89 holder.image.setChecked(item.isChecked()); | 154 button.setFocusable(item.isEnabled()); |
90 | 155 button.setOnClickListener(new OnClickListener() { |
91 holder.text.setText(item.getTitle()); | 156 @Override |
92 boolean isEnabled = item.isEnabled(); | 157 public void onClick(View v) { |
93 // Set the text color (using a color state list). | 158 mAppMenu.onItemClick(item); |
94 holder.text.setEnabled(isEnabled); | 159 } |
95 // This will ensure that the item is not highlighted when selected. | 160 }); |
96 rowView.setEnabled(isEnabled); | |
97 return rowView; | |
98 } | 161 } |
99 | 162 |
100 static class ViewHolder { | 163 static class ViewHolder { |
101 public TextView text; | 164 public TextView text; |
102 public AppMenuItemIcon image; | 165 public AppMenuItemIcon image; |
103 } | 166 } |
104 } | 167 } |
OLD | NEW |