1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.guide;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.res.Resources;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.support.v7.widget.RecyclerView;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.Log;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.LayoutInflater;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.ViewGroup;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Channel;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.guide.ProgramManager.TableEntriesUpdatedListener;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.guide.ProgramManager.TableEntry;
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/**
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Adapts a program list for a specific channel from {@link ProgramManager} to a row of the program
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * guide table.
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoclass ProgramListAdapter extends RecyclerView.Adapter<ProgramListAdapter.ProgramItemViewHolder>
362e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        implements TableEntriesUpdatedListener {
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TAG = "ProgramListAdapter";
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final boolean DEBUG = false;
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private final ProgramGuide mProgramGuide;
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final ProgramManager mProgramManager;
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final int mChannelIndex;
432e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private final String mNoInfoProgramTitle;
442e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private final String mBlockedProgramTitle;
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private long mChannelId;
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    ProgramListAdapter(Resources res, ProgramGuide programGuide, int channelIndex) {
492e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        setHasStableIds(true);
506ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        mProgramGuide = programGuide;
516ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        mProgramManager = programGuide.getProgramManager();
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mChannelIndex = channelIndex;
532e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mNoInfoProgramTitle = res.getString(R.string.program_title_for_no_information);
542e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mBlockedProgramTitle = res.getString(R.string.program_title_for_blocked_channel);
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        onTableEntriesUpdated();
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onTableEntriesUpdated() {
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Channel channel = mProgramManager.getChannel(mChannelIndex);
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (channel == null) {
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            // The channel has just been removed. Do nothing.
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        } else {
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mChannelId = channel.getId();
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (DEBUG) Log.d(TAG, "update for channel " + mChannelId);
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            notifyDataSetChanged();
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public int getItemCount() {
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mProgramManager.getTableEntryCount(mChannelId);
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public int getItemViewType(int position) {
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return R.layout.program_guide_table_item;
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
812e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public long getItemId(int position) {
822e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        return mProgramManager.getTableEntry(mChannelId, position).getId();
832e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
842e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
852e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
866ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public void onBindViewHolder(ProgramItemViewHolder holder, int position) {
872e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        TableEntry tableEntry = mProgramManager.getTableEntry(mChannelId, position);
882e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        String gapTitle = tableEntry.isBlocked() ? mBlockedProgramTitle : mNoInfoProgramTitle;
896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        holder.onBind(tableEntry, mProgramGuide, gapTitle);
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
936ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public void onViewRecycled(ProgramItemViewHolder holder) {
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        holder.onUnbind();
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
986ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public ProgramItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        View itemView = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
1006ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return new ProgramItemViewHolder(itemView);
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1036ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    static class ProgramItemViewHolder extends RecyclerView.ViewHolder {
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Should be called from main thread.
1056ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ProgramItemViewHolder(View itemView) {
106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super(itemView);
107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        void onBind(TableEntry entry, ProgramGuide programGuide, String gapTitle) {
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (DEBUG) {
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                Log.d(TAG, "onBind. View = " + itemView + ", Entry = " + entry);
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
1136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            ProgramManager programManager = programGuide.getProgramManager();
1146ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            ((ProgramItemView) itemView).setValues(programGuide, entry,
1156ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    programManager.getSelectedGenreId(), programManager.getFromUtcMillis(),
1166ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    programManager.getToUtcMillis(), gapTitle);
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        void onUnbind() {
1202e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            ((ProgramItemView) itemView).clearValues();
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
124