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