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