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}