1b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri/* 2b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Copyright (C) 2016 The Android Open Source Project 3b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * 4b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * in compliance with the License. You may obtain a copy of the License at 6b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * 7b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * http://www.apache.org/licenses/LICENSE-2.0 8b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * 9b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Unless required by applicable law or agreed to in writing, software distributed under the License 10b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * or implied. See the License for the specific language governing permissions and limitations under 12b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * the License. 13b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 14b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiripackage android.support.v17.leanback.widget; 15b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 16b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.content.Context; 17b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.graphics.Color; 18b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.util.TypedValue; 19b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.view.ContextThemeWrapper; 20b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.view.LayoutInflater; 21b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.view.View; 22b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.support.v17.leanback.R; 23b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.view.ViewGroup; 24b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiriimport android.widget.TextView; 25b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 26b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri/** 274fe538f2d65eefc57f618887ccb1226ec1a9741dKeyvan Amiri * Abstract presenter class for rendering the header for a list of media items in a playlist. 28b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * The presenter creates a {@link ViewHolder} for the TextView holding the header text. 29b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * <p> 30b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Subclasses of this class must override {@link 31b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * #onBindMediaListHeaderViewHolder(ViewHolder, Object)} in order to bind their header text to 324fe538f2d65eefc57f618887ccb1226ec1a9741dKeyvan Amiri * the media list header view. 33b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * </p> 34b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * <p> 35b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * {@link AbstractMediaItemPresenter} can be used in conjunction with this presenter in order to 36b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * display a playlist with a header view. 37b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * </p> 38b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 39b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiripublic abstract class AbstractMediaListHeaderPresenter extends RowPresenter{ 40b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 41b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri private final Context mContext; 42b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri private int mBackgroundColor = Color.TRANSPARENT; 43b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri private boolean mBackgroundColorSet; 44b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 45b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri /** 46b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * The ViewHolder for the {@link AbstractMediaListHeaderPresenter}. It references the TextView 47b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * that places the header text provided by the data binder. 48b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 49b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public static class ViewHolder extends RowPresenter.ViewHolder { 50b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 51b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri private final TextView mHeaderView; 52b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 53b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public ViewHolder(View view) { 54b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri super(view); 554fe538f2d65eefc57f618887ccb1226ec1a9741dKeyvan Amiri mHeaderView = (TextView) view.findViewById(R.id.mediaListHeader); 56b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 57b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 58b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri /** 59b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * 60b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * @return the header {@link TextView} responsible for rendering the playlist header text. 61b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 62b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public TextView getHeaderView() { 63b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri return mHeaderView; 64b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 65b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 66b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 67b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri /** 68b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Constructor used for creating an abstract media-list header presenter of a given theme. 69b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * @param context The context the user of this presenter is running in. 70b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * @param mThemeResId The resource id of the desired theme used for styling of this presenter. 71b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 72b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public AbstractMediaListHeaderPresenter(Context context, int mThemeResId) { 73b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri mContext = new ContextThemeWrapper(context.getApplicationContext(), mThemeResId); 74b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri setHeaderPresenter(null); 75b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 76b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 77b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri /** 78b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Constructor used for creating an abstract media-list header presenter. 79b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * The styling for this presenter is extracted from Context of parent in 80b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * {@link #createRowViewHolder(ViewGroup)}. 81b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 82b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public AbstractMediaListHeaderPresenter() { 83b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri mContext = null; 84b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri setHeaderPresenter(null); 85b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 86b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 87b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri @Override 88b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public boolean isUsingDefaultSelectEffect() { 89b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri return false; 90b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 91b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 92b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri @Override 93b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { 94b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri Context context = (mContext != null) ? mContext : parent.getContext(); 954fe538f2d65eefc57f618887ccb1226ec1a9741dKeyvan Amiri View view = LayoutInflater.from(context).inflate(R.layout.lb_media_list_header, 96b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri parent, false); 97b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri view.setFocusable(false); 98b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri view.setFocusableInTouchMode(false); 99b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri ViewHolder vh = new ViewHolder(view); 100b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri if (mBackgroundColorSet) { 101b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri vh.view.setBackgroundColor(mBackgroundColor); 102b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 103b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri return vh; 104b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 105b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 106b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri @Override 107b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri protected void onBindRowViewHolder(RowPresenter.ViewHolder vh, Object item) { 108b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri super.onBindRowViewHolder(vh, item); 109b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri onBindMediaListHeaderViewHolder((ViewHolder) vh, item); 110b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 111b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 112b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri /** 113b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Sets the background color for the row views within the playlist. 114b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * If this is not set, a default color, defaultBrandColor, from theme is used. 115b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * This defaultBrandColor defaults to android:attr/colorPrimary on v21, if it's specified. 116b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * @param color The ARGB color used to set as the header text background color. 117b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 118b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri public void setBackgroundColor(int color) { 119b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri mBackgroundColorSet = true; 120b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri mBackgroundColor = color; 121b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri } 122b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 123b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri /** 124b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * Binds the playlist header data model provided by the user to the {@link ViewHolder} 125b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * provided by the {@link AbstractMediaListHeaderPresenter}. 126b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * The subclasses of this presenter can access and bind the text view corresponding to the 127b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * header by calling {@link ViewHolder#getHeaderView()}, on the 128b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * {@link ViewHolder} provided as the argument {@code vh} by this presenter. 129b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * 130b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * @param vh The ViewHolder for this {@link AbstractMediaListHeaderPresenter}. 131b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri * @param item The header data object being presented. 132b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri */ 133b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri protected abstract void onBindMediaListHeaderViewHolder(ViewHolder vh, Object item); 134b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri 135b6ea4fa686b06fdb91f10998bd1d4b14c14af0ceKeyvan Amiri} 136