/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package android.support.v17.leanback.widget; import android.content.Context; import android.graphics.Color; import android.support.v17.leanback.R; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Abstract presenter class for rendering the header for a list of media items in a playlist. * The presenter creates a {@link ViewHolder} for the TextView holding the header text. *

* Subclasses of this class must override {@link * #onBindMediaListHeaderViewHolder(ViewHolder, Object)} in order to bind their header text to * the media list header view. *

*

* {@link AbstractMediaItemPresenter} can be used in conjunction with this presenter in order to * display a playlist with a header view. *

*/ public abstract class AbstractMediaListHeaderPresenter extends RowPresenter{ private final Context mContext; private int mBackgroundColor = Color.TRANSPARENT; private boolean mBackgroundColorSet; /** * The ViewHolder for the {@link AbstractMediaListHeaderPresenter}. It references the TextView * that places the header text provided by the data binder. */ public static class ViewHolder extends RowPresenter.ViewHolder { private final TextView mHeaderView; public ViewHolder(View view) { super(view); mHeaderView = (TextView) view.findViewById(R.id.mediaListHeader); } /** * * @return the header {@link TextView} responsible for rendering the playlist header text. */ public TextView getHeaderView() { return mHeaderView; } } /** * Constructor used for creating an abstract media-list header presenter of a given theme. * @param context The context the user of this presenter is running in. * @param mThemeResId The resource id of the desired theme used for styling of this presenter. */ public AbstractMediaListHeaderPresenter(Context context, int mThemeResId) { mContext = new ContextThemeWrapper(context.getApplicationContext(), mThemeResId); setHeaderPresenter(null); } /** * Constructor used for creating an abstract media-list header presenter. * The styling for this presenter is extracted from Context of parent in * {@link #createRowViewHolder(ViewGroup)}. */ public AbstractMediaListHeaderPresenter() { mContext = null; setHeaderPresenter(null); } @Override public boolean isUsingDefaultSelectEffect() { return false; } @Override protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { Context context = (mContext != null) ? mContext : parent.getContext(); View view = LayoutInflater.from(context).inflate(R.layout.lb_media_list_header, parent, false); view.setFocusable(false); view.setFocusableInTouchMode(false); ViewHolder vh = new ViewHolder(view); if (mBackgroundColorSet) { vh.view.setBackgroundColor(mBackgroundColor); } return vh; } @Override protected void onBindRowViewHolder(RowPresenter.ViewHolder vh, Object item) { super.onBindRowViewHolder(vh, item); onBindMediaListHeaderViewHolder((ViewHolder) vh, item); } /** * Sets the background color for the row views within the playlist. * If this is not set, a default color, defaultBrandColor, from theme is used. * This defaultBrandColor defaults to android:attr/colorPrimary on v21, if it's specified. * @param color The ARGB color used to set as the header text background color. */ public void setBackgroundColor(int color) { mBackgroundColorSet = true; mBackgroundColor = color; } /** * Binds the playlist header data model provided by the user to the {@link ViewHolder} * provided by the {@link AbstractMediaListHeaderPresenter}. * The subclasses of this presenter can access and bind the text view corresponding to the * header by calling {@link ViewHolder#getHeaderView()}, on the * {@link ViewHolder} provided as the argument {@code vh} by this presenter. * * @param vh The ViewHolder for this {@link AbstractMediaListHeaderPresenter}. * @param item The header data object being presented. */ protected abstract void onBindMediaListHeaderViewHolder(ViewHolder vh, Object item); }