165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/*
265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Copyright (C) 2016 The Android Open Source Project
365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * you may not use this file except in compliance with the License.
665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * You may obtain a copy of the License at
765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
1065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Unless required by applicable law or agreed to in writing, software
1165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
1265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * See the License for the specific language governing permissions and
1465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * limitations under the License
1565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */
1665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopackage com.android.tv.dvr.ui.browse;
1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
1965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.graphics.drawable.Drawable;
2065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.v17.leanback.R;
2165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.v17.leanback.widget.Action;
2265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.v17.leanback.widget.Presenter;
2365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.v17.leanback.widget.PresenterSelector;
2465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.text.TextUtils;
2565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.view.LayoutInflater;
2665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.view.View;
2765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.view.ViewGroup;
2865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.widget.Button;
2965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
3065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko// This class is adapted from Leanback's library, which does not support action icon with one-line
3165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko// label. This class modified its getPresenter method to support the above situation.
3265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoclass ActionPresenterSelector extends PresenterSelector {
3365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final Presenter mOneLineActionPresenter = new OneLineActionPresenter();
3465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final Presenter mTwoLineActionPresenter = new TwoLineActionPresenter();
3565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final Presenter[] mPresenters = new Presenter[] {
3665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mOneLineActionPresenter, mTwoLineActionPresenter};
3765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public Presenter getPresenter(Object item) {
4065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        Action action = (Action) item;
4165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        if (TextUtils.isEmpty(action.getLabel2()) && action.getIcon() == null) {
4265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return mOneLineActionPresenter;
4365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        } else {
4465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return mTwoLineActionPresenter;
4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
4765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
4865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
4965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public Presenter[] getPresenters() {
5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mPresenters;
5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
5365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    static class ActionViewHolder extends Presenter.ViewHolder {
5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        Action mAction;
5565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        Button mButton;
5665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        int mLayoutDirection;
5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public ActionViewHolder(View view, int layoutDirection) {
5965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            super(view);
6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mButton = (Button) view.findViewById(R.id.lb_action_button);
6165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mLayoutDirection = layoutDirection;
6265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
6365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
6565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    class OneLineActionPresenter extends Presenter {
6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
6765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public ViewHolder onCreateViewHolder(ViewGroup parent) {
6865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            View v = LayoutInflater.from(parent.getContext())
6965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                    .inflate(R.layout.lb_action_1_line, parent, false);
7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return new ActionViewHolder(v, parent.getLayoutDirection());
7165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
7365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
7465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
7565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            Action action = (Action) item;
7665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            ActionViewHolder vh = (ActionViewHolder) viewHolder;
7765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            vh.mAction = action;
7865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            vh.mButton.setText(action.getLabel1());
7965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
8065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
8165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
8265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
8365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            ((ActionViewHolder) viewHolder).mAction = null;
8465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
8565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
8665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    class TwoLineActionPresenter extends Presenter {
8865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
8965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public ViewHolder onCreateViewHolder(ViewGroup parent) {
9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            View v = LayoutInflater.from(parent.getContext())
9165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                    .inflate(R.layout.lb_action_2_lines, parent, false);
9265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return new ActionViewHolder(v, parent.getLayoutDirection());
9365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
9465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
9565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
9665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
9765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            Action action = (Action) item;
9865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            ActionViewHolder vh = (ActionViewHolder) viewHolder;
9965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            Drawable icon = action.getIcon();
10065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            vh.mAction = action;
10165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
10265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            if (icon != null) {
10365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                final int startPadding = vh.view.getResources()
10465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                        .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_start);
10565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                final int endPadding = vh.view.getResources()
10665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                        .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_end);
10765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                vh.view.setPaddingRelative(startPadding, 0, endPadding, 0);
10865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            } else {
10965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                final int padding = vh.view.getResources()
11065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                        .getDimensionPixelSize(R.dimen.lb_action_padding_horizontal);
11165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                vh.view.setPaddingRelative(padding, 0, padding, 0);
11265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            }
1136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            vh.mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null, null, null);
11465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
11565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            CharSequence line1 = action.getLabel1();
11665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            CharSequence line2 = action.getLabel2();
11765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            if (TextUtils.isEmpty(line1)) {
11865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                vh.mButton.setText(line2);
11965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            } else if (TextUtils.isEmpty(line2)) {
12065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                vh.mButton.setText(line1);
12165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            } else {
12265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                vh.mButton.setText(line1 + "\n" + line2);
12365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            }
12465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
12565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
12665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
12765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
12865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            ActionViewHolder vh = (ActionViewHolder) viewHolder;
1296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            vh.mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, null, null);
13065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            vh.view.setPadding(0, 0, 0, 0);
13165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            vh.mAction = null;
13265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
13365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
13465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko}