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 */
14package androidx.leanback.widget;
15
16import android.graphics.drawable.Drawable;
17import android.text.TextUtils;
18import android.view.LayoutInflater;
19import android.view.View;
20import android.view.ViewGroup;
21import android.widget.Button;
22
23import androidx.leanback.R;
24
25class ActionPresenterSelector extends PresenterSelector {
26
27    private final Presenter mOneLineActionPresenter = new OneLineActionPresenter();
28    private final Presenter mTwoLineActionPresenter = new TwoLineActionPresenter();
29    private final Presenter[] mPresenters = new Presenter[] {
30            mOneLineActionPresenter, mTwoLineActionPresenter};
31
32    @Override
33    public Presenter getPresenter(Object item) {
34        Action action = (Action) item;
35        if (TextUtils.isEmpty(action.getLabel2())) {
36            return mOneLineActionPresenter;
37        } else {
38            return mTwoLineActionPresenter;
39        }
40    }
41
42    @Override
43    public Presenter[] getPresenters() {
44        return mPresenters;
45    }
46
47    static class ActionViewHolder extends Presenter.ViewHolder {
48        Action mAction;
49        Button mButton;
50        int mLayoutDirection;
51
52        public ActionViewHolder(View view, int layoutDirection) {
53            super(view);
54            mButton = (Button) view.findViewById(R.id.lb_action_button);
55            mLayoutDirection = layoutDirection;
56        }
57    }
58
59    abstract static class ActionPresenter extends Presenter {
60        @Override
61        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
62            Action action = (Action) item;
63            ActionViewHolder vh = (ActionViewHolder) viewHolder;
64            vh.mAction = action;
65            Drawable icon = action.getIcon();
66            if (icon != null) {
67                final int startPadding = vh.view.getResources()
68                        .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_start);
69                final int endPadding = vh.view.getResources()
70                        .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_end);
71                vh.view.setPaddingRelative(startPadding, 0, endPadding, 0);
72            } else {
73                final int padding = vh.view.getResources()
74                        .getDimensionPixelSize(R.dimen.lb_action_padding_horizontal);
75                vh.view.setPaddingRelative(padding, 0, padding, 0);
76            }
77            if (vh.mLayoutDirection == View.LAYOUT_DIRECTION_RTL) {
78                vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);
79            } else {
80                vh.mButton.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
81            }
82        }
83
84        @Override
85        public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
86            ActionViewHolder vh = (ActionViewHolder) viewHolder;
87            vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
88            vh.view.setPadding(0, 0, 0, 0);
89            vh.mAction = null;
90        }
91    }
92
93    static class OneLineActionPresenter extends ActionPresenter {
94        @Override
95        public ViewHolder onCreateViewHolder(ViewGroup parent) {
96            View v = LayoutInflater.from(parent.getContext())
97                .inflate(R.layout.lb_action_1_line, parent, false);
98            return new ActionViewHolder(v, parent.getLayoutDirection());
99        }
100
101        @Override
102        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
103            super.onBindViewHolder(viewHolder, item);
104            ActionViewHolder vh = ((ActionViewHolder) viewHolder);
105            Action action = (Action) item;
106            vh.mButton.setText(action.getLabel1());
107        }
108    }
109
110    static class TwoLineActionPresenter extends ActionPresenter {
111        @Override
112        public ViewHolder onCreateViewHolder(ViewGroup parent) {
113            View v = LayoutInflater.from(parent.getContext())
114                .inflate(R.layout.lb_action_2_lines, parent, false);
115            return new ActionViewHolder(v, parent.getLayoutDirection());
116        }
117
118        @Override
119        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
120            super.onBindViewHolder(viewHolder, item);
121            Action action = (Action) item;
122            ActionViewHolder vh = (ActionViewHolder) viewHolder;
123
124            CharSequence line1 = action.getLabel1();
125            CharSequence line2 = action.getLabel2();
126            if (TextUtils.isEmpty(line1)) {
127                vh.mButton.setText(line2);
128            } else if (TextUtils.isEmpty(line2)) {
129                vh.mButton.setText(line1);
130            } else {
131                vh.mButton.setText(line1 + "\n" + line2);
132            }
133        }
134    }
135}
136