1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 package androidx.leanback.widget; 15 16 import android.text.TextUtils; 17 import android.view.LayoutInflater; 18 import android.view.View; 19 import android.view.ViewGroup; 20 import android.view.accessibility.AccessibilityEvent; 21 import android.widget.ImageView; 22 import android.widget.TextView; 23 24 import androidx.leanback.R; 25 26 /** 27 * Displays primary and secondary controls for a {@link PlaybackControlsRow}. 28 * 29 * Binds to items of type {@link Action}. 30 */ 31 public class ControlButtonPresenterSelector extends PresenterSelector { 32 33 private final Presenter mPrimaryPresenter = 34 new ControlButtonPresenter(R.layout.lb_control_button_primary); 35 private final Presenter mSecondaryPresenter = 36 new ControlButtonPresenter(R.layout.lb_control_button_secondary); 37 private final Presenter[] mPresenters = new Presenter[]{mPrimaryPresenter}; 38 39 /** 40 * Returns the presenter for primary controls. 41 */ getPrimaryPresenter()42 public Presenter getPrimaryPresenter() { 43 return mPrimaryPresenter; 44 } 45 46 /** 47 * Returns the presenter for secondary controls. 48 */ getSecondaryPresenter()49 public Presenter getSecondaryPresenter() { 50 return mSecondaryPresenter; 51 } 52 53 /** 54 * Always returns the presenter for primary controls. 55 */ 56 @Override getPresenter(Object item)57 public Presenter getPresenter(Object item) { 58 return mPrimaryPresenter; 59 } 60 61 @Override getPresenters()62 public Presenter[] getPresenters() { 63 return mPresenters; 64 } 65 66 static class ActionViewHolder extends Presenter.ViewHolder { 67 ImageView mIcon; 68 TextView mLabel; 69 View mFocusableView; 70 ActionViewHolder(View view)71 public ActionViewHolder(View view) { 72 super(view); 73 mIcon = (ImageView) view.findViewById(R.id.icon); 74 mLabel = (TextView) view.findViewById(R.id.label); 75 mFocusableView = view.findViewById(R.id.button); 76 } 77 } 78 79 static class ControlButtonPresenter extends Presenter { 80 private int mLayoutResourceId; 81 ControlButtonPresenter(int layoutResourceId)82 ControlButtonPresenter(int layoutResourceId) { 83 mLayoutResourceId = layoutResourceId; 84 } 85 86 @Override onCreateViewHolder(ViewGroup parent)87 public ViewHolder onCreateViewHolder(ViewGroup parent) { 88 View v = LayoutInflater.from(parent.getContext()) 89 .inflate(mLayoutResourceId, parent, false); 90 return new ActionViewHolder(v); 91 } 92 93 @Override onBindViewHolder(Presenter.ViewHolder viewHolder, Object item)94 public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) { 95 Action action = (Action) item; 96 ActionViewHolder vh = (ActionViewHolder) viewHolder; 97 vh.mIcon.setImageDrawable(action.getIcon()); 98 if (vh.mLabel != null) { 99 if (action.getIcon() == null) { 100 vh.mLabel.setText(action.getLabel1()); 101 } else { 102 vh.mLabel.setText(null); 103 } 104 } 105 CharSequence contentDescription = TextUtils.isEmpty(action.getLabel2()) 106 ? action.getLabel1() : action.getLabel2(); 107 if (!TextUtils.equals(vh.mFocusableView.getContentDescription(), contentDescription)) { 108 vh.mFocusableView.setContentDescription(contentDescription); 109 vh.mFocusableView.sendAccessibilityEvent( 110 AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); 111 } 112 } 113 114 @Override onUnbindViewHolder(Presenter.ViewHolder viewHolder)115 public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { 116 ActionViewHolder vh = (ActionViewHolder) viewHolder; 117 vh.mIcon.setImageDrawable(null); 118 if (vh.mLabel != null) { 119 vh.mLabel.setText(null); 120 } 121 vh.mFocusableView.setContentDescription(null); 122 } 123 124 @Override setOnClickListener(Presenter.ViewHolder viewHolder, View.OnClickListener listener)125 public void setOnClickListener(Presenter.ViewHolder viewHolder, 126 View.OnClickListener listener) { 127 ((ActionViewHolder) viewHolder).mFocusableView.setOnClickListener(listener); 128 } 129 } 130 } 131