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.animation.Animator; | 7 import android.animation.Animator; |
8 import android.animation.AnimatorListenerAdapter; | 8 import android.animation.AnimatorListenerAdapter; |
9 import android.animation.AnimatorSet; | 9 import android.animation.AnimatorSet; |
10 import android.animation.ObjectAnimator; | 10 import android.animation.ObjectAnimator; |
11 import android.content.res.Resources; | |
11 import android.graphics.drawable.Drawable; | 12 import android.graphics.drawable.Drawable; |
13 import android.graphics.drawable.LayerDrawable; | |
14 import android.support.annotation.IdRes; | |
12 import android.text.TextUtils; | 15 import android.text.TextUtils; |
13 import android.view.LayoutInflater; | 16 import android.view.LayoutInflater; |
14 import android.view.MenuItem; | 17 import android.view.MenuItem; |
15 import android.view.View; | 18 import android.view.View; |
16 import android.view.View.OnClickListener; | 19 import android.view.View.OnClickListener; |
17 import android.view.ViewGroup; | 20 import android.view.ViewGroup; |
18 import android.widget.BaseAdapter; | 21 import android.widget.BaseAdapter; |
19 import android.widget.ImageView; | 22 import android.widget.ImageView; |
20 import android.widget.ListView; | 23 import android.widget.ListView; |
21 import android.widget.TextView; | 24 import android.widget.TextView; |
22 | 25 |
23 import org.chromium.base.ApiCompatibilityUtils; | 26 import org.chromium.base.ApiCompatibilityUtils; |
27 import org.chromium.base.ContextUtils; | |
24 import org.chromium.chrome.R; | 28 import org.chromium.chrome.R; |
25 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; | 29 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; |
26 import org.chromium.chrome.browser.widget.TintedImageButton; | 30 import org.chromium.chrome.browser.widget.TintedImageButton; |
27 import org.chromium.ui.base.LocalizationUtils; | 31 import org.chromium.ui.base.LocalizationUtils; |
28 import org.chromium.ui.interpolators.BakedBezierInterpolator; | 32 import org.chromium.ui.interpolators.BakedBezierInterpolator; |
29 | 33 |
30 import java.util.List; | 34 import java.util.List; |
31 | 35 |
32 /** | 36 /** |
33 * ListAdapter to customize the view of items in the list. | 37 * ListAdapter to customize the view of items in the list. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
90 private static final int ENTER_ITEM_DURATION_MS = 350; | 94 private static final int ENTER_ITEM_DURATION_MS = 350; |
91 private static final int ENTER_ITEM_BASE_DELAY_MS = 80; | 95 private static final int ENTER_ITEM_BASE_DELAY_MS = 80; |
92 private static final int ENTER_ITEM_ADDL_DELAY_MS = 30; | 96 private static final int ENTER_ITEM_ADDL_DELAY_MS = 30; |
93 private static final float ENTER_STANDARD_ITEM_OFFSET_Y_DP = -10.f; | 97 private static final float ENTER_STANDARD_ITEM_OFFSET_Y_DP = -10.f; |
94 private static final float ENTER_STANDARD_ITEM_OFFSET_X_DP = 10.f; | 98 private static final float ENTER_STANDARD_ITEM_OFFSET_X_DP = 10.f; |
95 | 99 |
96 private final AppMenu mAppMenu; | 100 private final AppMenu mAppMenu; |
97 private final LayoutInflater mInflater; | 101 private final LayoutInflater mInflater; |
98 private final List<MenuItem> mMenuItems; | 102 private final List<MenuItem> mMenuItems; |
99 private final int mNumMenuItems; | 103 private final int mNumMenuItems; |
104 @IdRes | |
105 private final int mHighlightedItemId; | |
100 private final float mDpToPx; | 106 private final float mDpToPx; |
101 | 107 |
102 public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInfla ter inflater) { | 108 // Use a single PulseDrawable to spawn the other drawables so that the Const antState gets |
109 // shared. This allows the animation to stay in step even as the views are recycled and the | |
110 // background gets changed. This Drawable isn't just used directly because Drawables need to | |
111 // have a single owner or the internals of View can modify it's state as it gets cleared later. | |
112 private PulseDrawable mHighlightDrawableSource; | |
113 | |
114 public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInfla ter inflater, | |
115 @IdRes int highlightedItemId) { | |
103 mAppMenu = appMenu; | 116 mAppMenu = appMenu; |
104 mMenuItems = menuItems; | 117 mMenuItems = menuItems; |
105 mInflater = inflater; | 118 mInflater = inflater; |
119 mHighlightedItemId = highlightedItemId; | |
106 mNumMenuItems = menuItems.size(); | 120 mNumMenuItems = menuItems.size(); |
107 mDpToPx = inflater.getContext().getResources().getDisplayMetrics().densi ty; | 121 mDpToPx = inflater.getContext().getResources().getDisplayMetrics().densi ty; |
108 } | 122 } |
109 | 123 |
110 @Override | 124 @Override |
111 public int getCount() { | 125 public int getCount() { |
112 return mNumMenuItems; | 126 return mNumMenuItems; |
113 } | 127 } |
114 | 128 |
115 @Override | 129 @Override |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
157 StandardMenuItemViewHolder holder = null; | 171 StandardMenuItemViewHolder holder = null; |
158 if (convertView == null | 172 if (convertView == null |
159 || !(convertView.getTag() instanceof StandardMenuItemVie wHolder)) { | 173 || !(convertView.getTag() instanceof StandardMenuItemVie wHolder)) { |
160 holder = new StandardMenuItemViewHolder(); | 174 holder = new StandardMenuItemViewHolder(); |
161 convertView = mInflater.inflate(R.layout.menu_item, parent, false); | 175 convertView = mInflater.inflate(R.layout.menu_item, parent, false); |
162 holder.text = (TextView) convertView.findViewById(R.id.menu_ item_text); | 176 holder.text = (TextView) convertView.findViewById(R.id.menu_ item_text); |
163 holder.image = (AppMenuItemIcon) convertView.findViewById(R. id.menu_item_icon); | 177 holder.image = (AppMenuItemIcon) convertView.findViewById(R. id.menu_item_icon); |
164 convertView.setTag(holder); | 178 convertView.setTag(holder); |
165 convertView.setTag(R.id.menu_item_enter_anim_id, | 179 convertView.setTag(R.id.menu_item_enter_anim_id, |
166 buildStandardItemEnterAnimator(convertView, position )); | 180 buildStandardItemEnterAnimator(convertView, position )); |
181 convertView.setTag( | |
182 R.id.menu_item_original_background, convertView.getB ackground()); | |
167 } else { | 183 } else { |
168 holder = (StandardMenuItemViewHolder) convertView.getTag(); | 184 holder = (StandardMenuItemViewHolder) convertView.getTag(); |
169 } | 185 } |
170 | 186 |
171 setupStandardMenuItemViewHolder(holder, convertView, item); | 187 setupStandardMenuItemViewHolder(holder, convertView, item); |
172 break; | 188 break; |
173 } | 189 } |
174 case UPDATE_MENU_ITEM: { | 190 case UPDATE_MENU_ITEM: { |
175 CustomMenuItemViewHolder holder = null; | 191 CustomMenuItemViewHolder holder = null; |
176 if (convertView == null | 192 if (convertView == null |
177 || !(convertView.getTag() instanceof CustomMenuItemViewH older)) { | 193 || !(convertView.getTag() instanceof CustomMenuItemViewH older)) { |
178 holder = new CustomMenuItemViewHolder(); | 194 holder = new CustomMenuItemViewHolder(); |
179 convertView = mInflater.inflate(R.layout.update_menu_item, p arent, false); | 195 convertView = mInflater.inflate(R.layout.update_menu_item, p arent, false); |
180 holder.text = (TextView) convertView.findViewById(R.id.menu_ item_text); | 196 holder.text = (TextView) convertView.findViewById(R.id.menu_ item_text); |
181 holder.image = (AppMenuItemIcon) convertView.findViewById(R. id.menu_item_icon); | 197 holder.image = (AppMenuItemIcon) convertView.findViewById(R. id.menu_item_icon); |
182 holder.summary = (TextView) convertView.findViewById(R.id.me nu_item_summary); | 198 holder.summary = (TextView) convertView.findViewById(R.id.me nu_item_summary); |
183 convertView.setTag(holder); | 199 convertView.setTag(holder); |
184 convertView.setTag(R.id.menu_item_enter_anim_id, | 200 convertView.setTag(R.id.menu_item_enter_anim_id, |
185 buildStandardItemEnterAnimator(convertView, position )); | 201 buildStandardItemEnterAnimator(convertView, position )); |
202 convertView.setTag( | |
203 R.id.menu_item_original_background, convertView.getB ackground()); | |
186 } else { | 204 } else { |
187 holder = (CustomMenuItemViewHolder) convertView.getTag(); | 205 holder = (CustomMenuItemViewHolder) convertView.getTag(); |
188 } | 206 } |
189 | 207 |
190 setupStandardMenuItemViewHolder(holder, convertView, item); | 208 setupStandardMenuItemViewHolder(holder, convertView, item); |
191 String summary = UpdateMenuItemHelper.getInstance().getMenuItemS ummaryText( | 209 String summary = UpdateMenuItemHelper.getInstance().getMenuItemS ummaryText( |
192 mInflater.getContext()); | 210 mInflater.getContext()); |
193 if (TextUtils.isEmpty(summary)) { | 211 if (TextUtils.isEmpty(summary)) { |
194 holder.summary.setVisibility(View.GONE); | 212 holder.summary.setVisibility(View.GONE); |
195 } else { | 213 } else { |
(...skipping 15 matching lines...) Expand all Loading... | |
211 break; | 229 break; |
212 } | 230 } |
213 case TITLE_BUTTON_MENU_ITEM: { | 231 case TITLE_BUTTON_MENU_ITEM: { |
214 TitleButtonMenuItemViewHolder holder = null; | 232 TitleButtonMenuItemViewHolder holder = null; |
215 if (convertView == null | 233 if (convertView == null |
216 || !(convertView.getTag() instanceof TitleButtonMenuItem ViewHolder)) { | 234 || !(convertView.getTag() instanceof TitleButtonMenuItem ViewHolder)) { |
217 holder = new TitleButtonMenuItemViewHolder(); | 235 holder = new TitleButtonMenuItemViewHolder(); |
218 convertView = mInflater.inflate(R.layout.title_button_menu_i tem, parent, false); | 236 convertView = mInflater.inflate(R.layout.title_button_menu_i tem, parent, false); |
219 holder.title = (TextView) convertView.findViewById(R.id.titl e); | 237 holder.title = (TextView) convertView.findViewById(R.id.titl e); |
220 holder.button = (TintedImageButton) convertView.findViewById (R.id.button); | 238 holder.button = (TintedImageButton) convertView.findViewById (R.id.button); |
221 | 239 holder.button.setTag( |
240 R.id.menu_item_original_background, holder.button.ge tBackground()); | |
222 View animatedView = convertView; | 241 View animatedView = convertView; |
223 | 242 |
224 convertView.setTag(holder); | 243 convertView.setTag(holder); |
225 convertView.setTag(R.id.menu_item_enter_anim_id, | 244 convertView.setTag(R.id.menu_item_enter_anim_id, |
226 buildStandardItemEnterAnimator(animatedView, positio n)); | 245 buildStandardItemEnterAnimator(animatedView, positio n)); |
246 convertView.setTag( | |
247 R.id.menu_item_original_background, convertView.getB ackground()); | |
227 } else { | 248 } else { |
228 holder = (TitleButtonMenuItemViewHolder) convertView.getTag( ); | 249 holder = (TitleButtonMenuItemViewHolder) convertView.getTag( ); |
229 } | 250 } |
230 final MenuItem titleItem = item.hasSubMenu() ? item.getSubMenu() .getItem(0) : item; | 251 final MenuItem titleItem = item.hasSubMenu() ? item.getSubMenu() .getItem(0) : item; |
231 holder.title.setText(titleItem.getTitle()); | 252 holder.title.setText(titleItem.getTitle()); |
232 holder.title.setEnabled(titleItem.isEnabled()); | 253 holder.title.setEnabled(titleItem.isEnabled()); |
233 holder.title.setFocusable(titleItem.isEnabled()); | 254 holder.title.setFocusable(titleItem.isEnabled()); |
234 holder.title.setOnClickListener(new OnClickListener() { | 255 holder.title.setOnClickListener(new OnClickListener() { |
235 @Override | 256 @Override |
236 public void onClick(View v) { | 257 public void onClick(View v) { |
237 mAppMenu.onItemClick(titleItem); | 258 mAppMenu.onItemClick(titleItem); |
238 } | 259 } |
239 }); | 260 }); |
240 | 261 |
241 if (item.getSubMenu().getItem(1).getIcon() != null) { | 262 if (item.getSubMenu().getItem(1).getIcon() != null) { |
242 holder.button.setVisibility(View.VISIBLE); | 263 holder.button.setVisibility(View.VISIBLE); |
243 setupImageButton(holder.button, item.getSubMenu().getItem(1) ); | 264 setupImageButton(holder.button, item.getSubMenu().getItem(1) ); |
244 } else { | 265 } else { |
245 holder.button.setVisibility(View.GONE); | 266 holder.button.setVisibility(View.GONE); |
246 } | 267 } |
247 convertView.setFocusable(false); | 268 convertView.setFocusable(false); |
248 convertView.setEnabled(false); | 269 convertView.setEnabled(false); |
249 break; | 270 break; |
250 } | 271 } |
251 default: | 272 default: |
252 assert false : "Unexpected MenuItem type"; | 273 assert false : "Unexpected MenuItem type"; |
253 } | 274 } |
275 | |
276 checkHighlightDrawable(convertView, false, item.getItemId()); | |
277 | |
254 return convertView; | 278 return convertView; |
255 } | 279 } |
256 | 280 |
257 private void setupImageButton(TintedImageButton button, final MenuItem item) { | 281 private void setupImageButton(TintedImageButton button, final MenuItem item) { |
258 // Store and recover the level of image as button.setimageDrawable | 282 // Store and recover the level of image as button.setimageDrawable |
259 // resets drawable to default level. | 283 // resets drawable to default level. |
260 int currentLevel = item.getIcon().getLevel(); | 284 int currentLevel = item.getIcon().getLevel(); |
261 button.setImageDrawable(item.getIcon()); | 285 button.setImageDrawable(item.getIcon()); |
262 item.getIcon().setLevel(currentLevel); | 286 item.getIcon().setLevel(currentLevel); |
263 if (item.isChecked()) { | 287 if (item.isChecked()) { |
264 button.setTint(ApiCompatibilityUtils.getColorStateList( | 288 button.setTint(ApiCompatibilityUtils.getColorStateList( |
265 button.getResources(), R.color.blue_mode_tint)); | 289 button.getResources(), R.color.blue_mode_tint)); |
266 } | 290 } |
267 button.setEnabled(item.isEnabled()); | 291 button.setEnabled(item.isEnabled()); |
268 button.setFocusable(item.isEnabled()); | 292 button.setFocusable(item.isEnabled()); |
269 button.setContentDescription(item.getTitleCondensed()); | 293 button.setContentDescription(item.getTitleCondensed()); |
270 | 294 |
271 button.setOnClickListener(new OnClickListener() { | 295 button.setOnClickListener(new OnClickListener() { |
272 @Override | 296 @Override |
273 public void onClick(View v) { | 297 public void onClick(View v) { |
274 mAppMenu.onItemClick(item); | 298 mAppMenu.onItemClick(item); |
275 } | 299 } |
276 }); | 300 }); |
277 | 301 |
302 checkHighlightDrawable(button, true, item.getItemId()); | |
303 | |
278 // Menu items may be hidden by command line flags before they get to thi s point. | 304 // Menu items may be hidden by command line flags before they get to thi s point. |
279 button.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE); | 305 button.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE); |
280 } | 306 } |
281 | 307 |
282 private void setupStandardMenuItemViewHolder(StandardMenuItemViewHolder hold er, | 308 private void setupStandardMenuItemViewHolder(StandardMenuItemViewHolder hold er, |
283 View convertView, final MenuItem item) { | 309 View convertView, final MenuItem item) { |
284 // Set up the icon. | 310 // Set up the icon. |
285 Drawable icon = item.getIcon(); | 311 Drawable icon = item.getIcon(); |
286 holder.image.setImageDrawable(icon); | 312 holder.image.setImageDrawable(icon); |
287 holder.image.setVisibility(icon == null ? View.GONE : View.VISIBLE); | 313 holder.image.setVisibility(icon == null ? View.GONE : View.VISIBLE); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 view.setAlpha(0.f); | 355 view.setAlpha(0.f); |
330 } | 356 } |
331 }); | 357 }); |
332 return animation; | 358 return animation; |
333 } | 359 } |
334 | 360 |
335 /** | 361 /** |
336 * This builds an {@link Animator} for the enter animation of icon row menu items. This means | 362 * This builds an {@link Animator} for the enter animation of icon row menu items. This means |
337 * it will animate the alpha from 0 to 1 and translate the views from 10dp t o 0dp on the x axis. | 363 * it will animate the alpha from 0 to 1 and translate the views from 10dp t o 0dp on the x axis. |
338 * | 364 * |
339 * @param views The list if icons in the menu item that should be ani mated. | 365 * @param buttons The list of icons in the menu item that should be animated . |
340 * @return The {@link Animator}. | 366 * @return The {@link Animator}. |
341 */ | 367 */ |
342 private Animator buildIconItemEnterAnimator(final ImageView[] views) { | 368 private Animator buildIconItemEnterAnimator(final ImageView[] buttons) { |
343 final boolean rtl = LocalizationUtils.isLayoutRtl(); | 369 final boolean rtl = LocalizationUtils.isLayoutRtl(); |
344 final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * mDpToPx * (rtl ? -1.f : 1.f); | 370 final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * mDpToPx * (rtl ? -1.f : 1.f); |
345 final int maxViewsToAnimate = views.length; | 371 final int maxViewsToAnimate = buttons.length; |
346 | 372 |
347 AnimatorSet animation = new AnimatorSet(); | 373 AnimatorSet animation = new AnimatorSet(); |
348 AnimatorSet.Builder builder = null; | 374 AnimatorSet.Builder builder = null; |
349 for (int i = 0; i < maxViewsToAnimate; i++) { | 375 for (int i = 0; i < maxViewsToAnimate; i++) { |
350 final int startDelay = ENTER_ITEM_ADDL_DELAY_MS * i; | 376 final int startDelay = ENTER_ITEM_ADDL_DELAY_MS * i; |
351 | 377 |
352 Animator alpha = ObjectAnimator.ofFloat(views[i], View.ALPHA, 0.f, 1 .f); | 378 ImageView view = buttons[i]; |
353 Animator translate = ObjectAnimator.ofFloat(views[i], View.TRANSLATI ON_X, offsetXPx, 0); | 379 Animator alpha = ObjectAnimator.ofFloat(view, View.ALPHA, 0.f, 1.f); |
380 Animator translate = ObjectAnimator.ofFloat(view, View.TRANSLATION_X , offsetXPx, 0); | |
354 alpha.setStartDelay(startDelay); | 381 alpha.setStartDelay(startDelay); |
355 translate.setStartDelay(startDelay); | 382 translate.setStartDelay(startDelay); |
356 alpha.setDuration(ENTER_ITEM_DURATION_MS); | 383 alpha.setDuration(ENTER_ITEM_DURATION_MS); |
357 translate.setDuration(ENTER_ITEM_DURATION_MS); | 384 translate.setDuration(ENTER_ITEM_DURATION_MS); |
358 | 385 |
359 if (builder == null) { | 386 if (builder == null) { |
360 builder = animation.play(alpha); | 387 builder = animation.play(alpha); |
361 } else { | 388 } else { |
362 builder.with(alpha); | 389 builder.with(alpha); |
363 } | 390 } |
364 builder.with(translate); | 391 builder.with(translate); |
365 } | 392 } |
366 animation.setStartDelay(ENTER_ITEM_BASE_DELAY_MS); | 393 animation.setStartDelay(ENTER_ITEM_BASE_DELAY_MS); |
367 animation.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); | 394 animation.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); |
368 | 395 |
369 animation.addListener(new AnimatorListenerAdapter() { | 396 animation.addListener(new AnimatorListenerAdapter() { |
370 @Override | 397 @Override |
371 public void onAnimationStart(Animator animation) { | 398 public void onAnimationStart(Animator animation) { |
372 for (int i = 0; i < maxViewsToAnimate; i++) { | 399 for (int i = 0; i < maxViewsToAnimate; i++) { |
373 views[i].setAlpha(0.f); | 400 buttons[i].setAlpha(0.f); |
374 } | 401 } |
375 } | 402 } |
376 }); | 403 }); |
377 return animation; | 404 return animation; |
378 } | 405 } |
379 | 406 |
380 private View createMenuItemRow( | 407 private View createMenuItemRow( |
381 View convertView, ViewGroup parent, MenuItem item, int numItems) { | 408 View convertView, ViewGroup parent, MenuItem item, int numItems) { |
382 RowItemViewHolder holder = null; | 409 RowItemViewHolder holder = null; |
383 if (convertView == null | 410 if (convertView == null |
384 || !(convertView.getTag() instanceof RowItemViewHolder) | 411 || !(convertView.getTag() instanceof RowItemViewHolder) |
385 || ((RowItemViewHolder) convertView.getTag()).buttons.length != numItems) { | 412 || ((RowItemViewHolder) convertView.getTag()).buttons.length != numItems) { |
386 holder = new RowItemViewHolder(numItems); | 413 holder = new RowItemViewHolder(numItems); |
387 convertView = mInflater.inflate(R.layout.icon_row_menu_item, parent, false); | 414 convertView = mInflater.inflate(R.layout.icon_row_menu_item, parent, false); |
415 convertView.setTag(R.id.menu_item_original_background, convertView.g etBackground()); | |
388 | 416 |
389 // Save references to all the buttons. | 417 // Save references to all the buttons. |
390 for (int i = 0; i < numItems; i++) { | 418 for (int i = 0; i < numItems; i++) { |
391 holder.buttons[i] = | 419 TintedImageButton view = |
392 (TintedImageButton) convertView.findViewById(BUTTON_IDS[ i]); | 420 (TintedImageButton) convertView.findViewById(BUTTON_IDS[ i]); |
421 holder.buttons[i] = view; | |
422 holder.buttons[i].setTag( | |
423 R.id.menu_item_original_background, holder.buttons[i].ge tBackground()); | |
393 } | 424 } |
394 | 425 |
395 // Remove unused menu items. | 426 // Remove unused menu items. |
396 for (int j = numItems; j < 5; j++) { | 427 for (int j = numItems; j < 5; j++) { |
397 ((ViewGroup) convertView).removeView(convertView.findViewById(BU TTON_IDS[j])); | 428 ((ViewGroup) convertView).removeView(convertView.findViewById(BU TTON_IDS[j])); |
398 } | 429 } |
399 | 430 |
400 convertView.setTag(holder); | 431 convertView.setTag(holder); |
401 convertView.setTag(R.id.menu_item_enter_anim_id, | 432 convertView.setTag(R.id.menu_item_enter_anim_id, |
402 buildIconItemEnterAnimator(holder.buttons)); | 433 buildIconItemEnterAnimator(holder.buttons)); |
403 } else { | 434 } else { |
404 holder = (RowItemViewHolder) convertView.getTag(); | 435 holder = (RowItemViewHolder) convertView.getTag(); |
405 } | 436 } |
406 | 437 |
407 for (int i = 0; i < numItems; i++) { | 438 for (int i = 0; i < numItems; i++) { |
408 setupImageButton(holder.buttons[i], item.getSubMenu().getItem(i)); | 439 setupImageButton(holder.buttons[i], item.getSubMenu().getItem(i)); |
409 } | 440 } |
410 convertView.setFocusable(false); | 441 convertView.setFocusable(false); |
411 convertView.setEnabled(false); | 442 convertView.setEnabled(false); |
412 return convertView; | 443 return convertView; |
413 } | 444 } |
414 | 445 |
446 private void checkHighlightDrawable(View view, boolean isIcon, int itemId) { | |
Ted C
2017/04/12 18:05:57
I think maybe this should be:
highlightItemIfNece
David Trainor- moved to gerrit
2017/04/12 18:59:37
Done.
| |
447 Drawable background = (Drawable) view.getTag(R.id.menu_item_original_bac kground); | |
448 if (background == null) return; | |
449 | |
450 if (itemId != mHighlightedItemId) { | |
451 view.setBackground(background); | |
452 return; | |
453 } | |
454 | |
455 if (mHighlightDrawableSource == null) { | |
456 mHighlightDrawableSource = isIcon ? PulseDrawableFactory.createCircl e() | |
457 : PulseDrawableFactory.createHighl ight(); | |
458 } | |
459 | |
460 Resources resources = ContextUtils.getApplicationContext().getResources( ); | |
461 | |
462 PulseDrawable pulse = | |
463 (PulseDrawable) mHighlightDrawableSource.getConstantState().newD rawable(resources); | |
464 if (background.getConstantState() != null) { | |
465 background = background.getConstantState().newDrawable(resources); | |
Ted C
2017/04/12 18:05:56
Why aren't we reusing the background as is?
David Trainor- moved to gerrit
2017/04/12 18:59:36
I can probably make it work. Here's why it's brea
| |
466 } | |
467 | |
468 LayerDrawable drawable = new LayerDrawable(new Drawable[] {pulse, backgr ound}); | |
469 view.setBackground(drawable); | |
470 pulse.start(); | |
471 } | |
472 | |
415 static class StandardMenuItemViewHolder { | 473 static class StandardMenuItemViewHolder { |
416 public TextView text; | 474 public TextView text; |
417 public AppMenuItemIcon image; | 475 public AppMenuItemIcon image; |
418 } | 476 } |
419 | 477 |
420 static class CustomMenuItemViewHolder extends StandardMenuItemViewHolder { | 478 static class CustomMenuItemViewHolder extends StandardMenuItemViewHolder { |
421 public TextView summary; | 479 public TextView summary; |
422 } | 480 } |
423 | 481 |
424 private static class RowItemViewHolder { | 482 private static class RowItemViewHolder { |
425 public TintedImageButton[] buttons; | 483 public TintedImageButton[] buttons; |
426 | 484 |
427 RowItemViewHolder(int numButtons) { | 485 RowItemViewHolder(int numButtons) { |
428 buttons = new TintedImageButton[numButtons]; | 486 buttons = new TintedImageButton[numButtons]; |
429 } | 487 } |
430 } | 488 } |
431 | 489 |
432 static class TitleButtonMenuItemViewHolder { | 490 static class TitleButtonMenuItemViewHolder { |
433 public TextView title; | 491 public TextView title; |
434 public TintedImageButton button; | 492 public TintedImageButton button; |
435 } | 493 } |
436 } | 494 } |
OLD | NEW |