Home | History | Annotate | Download | only in widget
      1 /*
      2  * Copyright (C) 2016 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  */
     14 package android.support.v17.leanback.widget;
     15 
     16 import android.content.Context;
     17 import android.graphics.Color;
     18 import android.support.v17.leanback.R;
     19 import android.view.ContextThemeWrapper;
     20 import android.view.LayoutInflater;
     21 import android.view.View;
     22 import android.view.ViewGroup;
     23 import android.widget.TextView;
     24 
     25 /**
     26  * Abstract presenter class for rendering the header for a list of media items in a playlist.
     27  * The presenter creates a {@link ViewHolder} for the TextView holding the header text.
     28  * <p>
     29  *    Subclasses of this class must override {@link
     30  *    #onBindMediaListHeaderViewHolder(ViewHolder, Object)} in order to bind their header text to
     31  *    the media list header view.
     32  * </p>
     33  * <p>
     34  * {@link AbstractMediaItemPresenter} can be used in conjunction with this presenter in order to
     35  * display a playlist with a header view.
     36  * </p>
     37  */
     38 public abstract class AbstractMediaListHeaderPresenter extends RowPresenter{
     39 
     40     private final Context mContext;
     41     private int mBackgroundColor = Color.TRANSPARENT;
     42     private boolean mBackgroundColorSet;
     43 
     44     /**
     45      * The ViewHolder for the {@link AbstractMediaListHeaderPresenter}. It references the TextView
     46      * that places the header text provided by the data binder.
     47      */
     48     public static class ViewHolder extends RowPresenter.ViewHolder {
     49 
     50         private final TextView mHeaderView;
     51 
     52         public ViewHolder(View view) {
     53             super(view);
     54             mHeaderView = (TextView) view.findViewById(R.id.mediaListHeader);
     55         }
     56 
     57         /**
     58          *
     59          * @return the header {@link TextView} responsible for rendering the playlist header text.
     60          */
     61         public TextView getHeaderView() {
     62             return mHeaderView;
     63         }
     64     }
     65 
     66     /**
     67      * Constructor used for creating an abstract media-list header presenter of a given theme.
     68      * @param context The context the user of this presenter is running in.
     69      * @param mThemeResId The resource id of the desired theme used for styling of this presenter.
     70      */
     71     public AbstractMediaListHeaderPresenter(Context context, int mThemeResId) {
     72         mContext = new ContextThemeWrapper(context.getApplicationContext(), mThemeResId);
     73         setHeaderPresenter(null);
     74     }
     75 
     76     /**
     77      * Constructor used for creating an abstract media-list header presenter.
     78      * The styling for this presenter is extracted from Context of parent in
     79      * {@link #createRowViewHolder(ViewGroup)}.
     80      */
     81     public AbstractMediaListHeaderPresenter() {
     82         mContext = null;
     83         setHeaderPresenter(null);
     84     }
     85 
     86     @Override
     87     public boolean isUsingDefaultSelectEffect() {
     88         return false;
     89     }
     90 
     91     @Override
     92     protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
     93         Context context = (mContext != null) ? mContext : parent.getContext();
     94         View view = LayoutInflater.from(context).inflate(R.layout.lb_media_list_header,
     95                 parent, false);
     96         view.setFocusable(false);
     97         view.setFocusableInTouchMode(false);
     98         ViewHolder vh = new ViewHolder(view);
     99         if (mBackgroundColorSet) {
    100             vh.view.setBackgroundColor(mBackgroundColor);
    101         }
    102         return vh;
    103     }
    104 
    105     @Override
    106     protected void onBindRowViewHolder(RowPresenter.ViewHolder vh, Object item) {
    107         super.onBindRowViewHolder(vh, item);
    108         onBindMediaListHeaderViewHolder((ViewHolder) vh, item);
    109     }
    110 
    111     /**
    112      * Sets the background color for the row views within the playlist.
    113      * If this is not set, a default color, defaultBrandColor, from theme is used.
    114      * This defaultBrandColor defaults to android:attr/colorPrimary on v21, if it's specified.
    115      * @param color The ARGB color used to set as the header text background color.
    116      */
    117     public void setBackgroundColor(int color) {
    118         mBackgroundColorSet = true;
    119         mBackgroundColor = color;
    120     }
    121 
    122     /**
    123      * Binds the playlist header data model provided by the user to the {@link ViewHolder}
    124      * provided by the {@link AbstractMediaListHeaderPresenter}.
    125      * The subclasses of this presenter can access and bind the text view corresponding to the
    126      * header by calling {@link ViewHolder#getHeaderView()}, on the
    127      * {@link ViewHolder} provided as the argument {@code vh} by this presenter.
    128      *
    129      * @param vh The ViewHolder for this {@link AbstractMediaListHeaderPresenter}.
    130      * @param item The header data object being presented.
    131      */
    132     protected abstract void onBindMediaListHeaderViewHolder(ViewHolder vh, Object item);
    133 
    134 }
    135