blob: 9f2e4527e6bb47db0695f4540521aac30d900b25 [file] [log] [blame]
/*
* 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.
* <p>
* Subclasses of this class must override {@link
* #onBindMediaListHeaderViewHolder(ViewHolder, Object)} in order to bind their header text to
* the media list header view.
* </p>
* <p>
* {@link AbstractMediaItemPresenter} can be used in conjunction with this presenter in order to
* display a playlist with a header view.
* </p>
*/
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);
}