• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.tv.dvr.ui;
18 
19 import android.graphics.drawable.Drawable;
20 import android.support.v17.leanback.R;
21 import android.support.v17.leanback.widget.Action;
22 import android.support.v17.leanback.widget.Presenter;
23 import android.support.v17.leanback.widget.PresenterSelector;
24 import android.text.TextUtils;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.Button;
29 
30 // This class is adapted from Leanback's library, which does not support action icon with one-line
31 // label. This class modified its getPresenter method to support the above situation.
32 class ActionPresenterSelector extends PresenterSelector {
33     private final Presenter mOneLineActionPresenter = new OneLineActionPresenter();
34     private final Presenter mTwoLineActionPresenter = new TwoLineActionPresenter();
35     private final Presenter[] mPresenters = new Presenter[] {
36             mOneLineActionPresenter, mTwoLineActionPresenter};
37 
38     @Override
getPresenter(Object item)39     public Presenter getPresenter(Object item) {
40         Action action = (Action) item;
41         if (TextUtils.isEmpty(action.getLabel2()) && action.getIcon() == null) {
42             return mOneLineActionPresenter;
43         } else {
44             return mTwoLineActionPresenter;
45         }
46     }
47 
48     @Override
getPresenters()49     public Presenter[] getPresenters() {
50         return mPresenters;
51     }
52 
53     static class ActionViewHolder extends Presenter.ViewHolder {
54         Action mAction;
55         Button mButton;
56         int mLayoutDirection;
57 
ActionViewHolder(View view, int layoutDirection)58         public ActionViewHolder(View view, int layoutDirection) {
59             super(view);
60             mButton = (Button) view.findViewById(R.id.lb_action_button);
61             mLayoutDirection = layoutDirection;
62         }
63     }
64 
65     class OneLineActionPresenter extends Presenter {
66         @Override
onCreateViewHolder(ViewGroup parent)67         public ViewHolder onCreateViewHolder(ViewGroup parent) {
68             View v = LayoutInflater.from(parent.getContext())
69                     .inflate(R.layout.lb_action_1_line, parent, false);
70             return new ActionViewHolder(v, parent.getLayoutDirection());
71         }
72 
73         @Override
onBindViewHolder(Presenter.ViewHolder viewHolder, Object item)74         public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
75             Action action = (Action) item;
76             ActionViewHolder vh = (ActionViewHolder) viewHolder;
77             vh.mAction = action;
78             vh.mButton.setText(action.getLabel1());
79         }
80 
81         @Override
onUnbindViewHolder(Presenter.ViewHolder viewHolder)82         public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
83             ((ActionViewHolder) viewHolder).mAction = null;
84         }
85     }
86 
87     class TwoLineActionPresenter extends Presenter {
88         @Override
onCreateViewHolder(ViewGroup parent)89         public ViewHolder onCreateViewHolder(ViewGroup parent) {
90             View v = LayoutInflater.from(parent.getContext())
91                     .inflate(R.layout.lb_action_2_lines, parent, false);
92             return new ActionViewHolder(v, parent.getLayoutDirection());
93         }
94 
95         @Override
onBindViewHolder(Presenter.ViewHolder viewHolder, Object item)96         public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
97             Action action = (Action) item;
98             ActionViewHolder vh = (ActionViewHolder) viewHolder;
99             Drawable icon = action.getIcon();
100             vh.mAction = action;
101 
102             if (icon != null) {
103                 final int startPadding = vh.view.getResources()
104                         .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_start);
105                 final int endPadding = vh.view.getResources()
106                         .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_end);
107                 vh.view.setPaddingRelative(startPadding, 0, endPadding, 0);
108             } else {
109                 final int padding = vh.view.getResources()
110                         .getDimensionPixelSize(R.dimen.lb_action_padding_horizontal);
111                 vh.view.setPaddingRelative(padding, 0, padding, 0);
112             }
113             if (vh.mLayoutDirection == View.LAYOUT_DIRECTION_RTL) {
114                 vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);
115             } else {
116                 vh.mButton.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
117             }
118 
119             CharSequence line1 = action.getLabel1();
120             CharSequence line2 = action.getLabel2();
121             if (TextUtils.isEmpty(line1)) {
122                 vh.mButton.setText(line2);
123             } else if (TextUtils.isEmpty(line2)) {
124                 vh.mButton.setText(line1);
125             } else {
126                 vh.mButton.setText(line1 + "\n" + line2);
127             }
128         }
129 
130         @Override
onUnbindViewHolder(Presenter.ViewHolder viewHolder)131         public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
132             ActionViewHolder vh = (ActionViewHolder) viewHolder;
133             vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
134             vh.view.setPadding(0, 0, 0, 0);
135             vh.mAction = null;
136         }
137     }
138 }