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 */
3548dadb49248271b01997862e1335912a4f2e189fYoungsang Chopublic class ProgramListAdapter extends RecyclerView.Adapter<ProgramListAdapter.ProgramViewHolder>
3648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        implements TableEntriesUpdatedListener {
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TAG = "ProgramListAdapter";
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final boolean DEBUG = false;
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
403a72b93e554bd22a5c64e71a6956d9604ce05108Youngsang Cho    private final ProgramManager mProgramManager;
413a72b93e554bd22a5c64e71a6956d9604ce05108Youngsang Cho    private final int mChannelIndex;
4248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private final String mNoInfoProgramTitle;
4348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private final String mBlockedProgramTitle;
443a72b93e554bd22a5c64e71a6956d9604ce05108Youngsang Cho
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private long mChannelId;
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
4748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    public ProgramListAdapter(Resources res, ProgramManager programManager, int channelIndex) {
4848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        setHasStableIds(true);
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mProgramManager = programManager;
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mChannelIndex = channelIndex;
5148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        mNoInfoProgramTitle = res.getString(R.string.program_title_for_no_information);
5248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        mBlockedProgramTitle = res.getString(R.string.program_title_for_blocked_channel);
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        onTableEntriesUpdated();
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onTableEntriesUpdated() {
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Channel channel = mProgramManager.getChannel(mChannelIndex);
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (channel == null) {
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            // The channel has just been removed. Do nothing.
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        } else {
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mChannelId = channel.getId();
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (DEBUG) Log.d(TAG, "update for channel " + mChannelId);
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            notifyDataSetChanged();
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public ProgramManager getProgramManager() {
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mProgramManager;
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public int getItemCount() {
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mProgramManager.getTableEntryCount(mChannelId);
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public int getItemViewType(int position) {
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return R.layout.program_guide_table_item;
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
8348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    public long getItemId(int position) {
8448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        return mProgramManager.getTableEntry(mChannelId, position).getId();
8548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
8648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
8748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    @Override
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onBindViewHolder(ProgramViewHolder holder, int position) {
8948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        TableEntry tableEntry = mProgramManager.getTableEntry(mChannelId, position);
9048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        String gapTitle = tableEntry.isBlocked() ? mBlockedProgramTitle : mNoInfoProgramTitle;
9148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        holder.onBind(tableEntry, this.getProgramManager(), gapTitle);
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onViewRecycled(ProgramViewHolder holder) {
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        holder.onUnbind();
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public ProgramViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        View itemView = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return new ProgramViewHolder(itemView);
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public static class ProgramViewHolder extends RecyclerView.ViewHolder {
106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Should be called from main thread.
107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public ProgramViewHolder(View itemView) {
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super(itemView);
109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
11148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        public void onBind(TableEntry entry, ProgramManager programManager, String gapTitle) {
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (DEBUG) {
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                Log.d(TAG, "onBind. View = " + itemView + ", Entry = " + entry);
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
11548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            ((ProgramItemView) itemView).setValues(entry, programManager.getSelectedGenreId(),
11648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                    programManager.getFromUtcMillis(), programManager.getToUtcMillis(), gapTitle);
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public void onUnbind() {
12048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            ((ProgramItemView) itemView).clearValues();
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
124