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