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.menu; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.graphics.Bitmap; 21ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.Nullable; 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.text.TextUtils; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.AttributeSet; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.Log; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.ImageView; 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.ProgressBar; 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.TextView; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.MainActivity; 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R; 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Channel; 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Program; 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.parental.ParentalControlSettings; 35ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.util.ImageLoader; 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport java.util.Objects; 386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * A view to render channel card. 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopublic class ChannelCardView extends BaseCardView<ChannelsRowItem> { 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TAG = MenuView.TAG; 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final boolean DEBUG = MenuView.DEBUG; 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final int mCardImageWidth; 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final int mCardImageHeight; 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private ImageView mImageView; 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private TextView mChannelNumberNameView; 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private ProgressBar mProgressBar; 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Channel mChannel; 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Program mProgram; 546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private String mPosterArtUri; 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final MainActivity mMainActivity; 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelCardView(Context context) { 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko this(context, null); 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelCardView(Context context, AttributeSet attrs) { 62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko this(context, attrs, 0); 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelCardView(Context context, AttributeSet attrs, int defStyle) { 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(context, attrs, defStyle); 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mCardImageWidth = getResources().getDimensionPixelSize(R.dimen.card_image_layout_width); 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mCardImageHeight = getResources().getDimensionPixelSize(R.dimen.card_image_layout_height); 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mMainActivity = (MainActivity) context; 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onFinishInflate() { 74ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko super.onFinishInflate(); 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mImageView = (ImageView) findViewById(R.id.image); 766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mImageView.setBackgroundResource(R.color.channel_card); 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannelNumberNameView = (TextView) findViewById(R.id.channel_number_and_name); 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar = (ProgressBar) findViewById(R.id.progress); 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public void onBind(ChannelsRowItem item, boolean selected) { 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (DEBUG) { 846ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko Log.d(TAG, "onBind(channelName=" + item.getChannel().getDisplayName() + ", selected=" 856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko + selected + ")"); 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 876ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko updateChannel(item); 886ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko updateProgram(); 896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko super.onBind(item, selected); 906ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 926ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private void updateChannel(ChannelsRowItem item) { 936ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (!item.getChannel().equals(mChannel)) { 946ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mChannel = item.getChannel(); 956ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mChannelNumberNameView.setText(mChannel.getDisplayText()); 966ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mChannelNumberNameView.setVisibility(VISIBLE); 976ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 986ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 996ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1006ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private void updateProgram() { 1016ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko ParentalControlSettings parental = mMainActivity.getParentalControlSettings(); 1026ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (parental.isParentalControlsEnabled() && mChannel.isLocked()) { 103d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setText(R.string.program_title_for_blocked_channel); 1046ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgram = null; 1056ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } else { 1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko Program currentProgram = 1076ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mMainActivity.getProgramDataManager().getCurrentProgram(mChannel.getId()); 1086ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (!Objects.equals(currentProgram, mProgram)) { 1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgram = currentProgram; 1106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (mProgram == null || TextUtils.isEmpty(mProgram.getTitle())) { 1116ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko setTextViewEnabled(false); 1126ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko setText(R.string.program_title_for_no_information); 1136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } else { 1146ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko setTextViewEnabled(true); 1156ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko setText(mProgram.getTitle()); 1166ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1186ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (mProgram == null) { 1206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgressBar.setVisibility(GONE); 1216ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko setPosterArt(null); 122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 1236ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko // Update progress. 1246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgressBar.setVisibility(View.VISIBLE); 1256ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko long startTime = mProgram.getStartTimeUtcMillis(); 1266ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko long endTime = mProgram.getEndTimeUtcMillis(); 1276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko long currTime = System.currentTimeMillis(); 1286ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (currTime <= startTime) { 1296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgressBar.setProgress(0); 1306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } else if (currTime >= endTime) { 1316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgressBar.setProgress(100); 1326ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } else { 1336ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mProgressBar.setProgress( 1346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko (int) (100 * (currTime - startTime) / (endTime - startTime))); 1356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1366ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko // Update image. 1376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (!parental.isParentalControlsEnabled() 1386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko || !parental.isRatingBlocked(mProgram.getContentRatings())) { 1396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko setPosterArt(mProgram.getPosterArtUri()); 1406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 144ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private static ImageLoader.ImageLoaderCallback<ChannelCardView> createProgramPosterArtCallback( 145ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko ChannelCardView cardView, final Program program) { 146ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return new ImageLoader.ImageLoaderCallback<ChannelCardView>(cardView) { 147ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko @Override 148ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public void onBitmapLoaded(ChannelCardView cardView, @Nullable Bitmap posterArt) { 149ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (posterArt == null || cardView.mProgram == null 150ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko || program.getChannelId() != cardView.mProgram.getChannelId() 151ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko || program.getChannelId() != cardView.mChannel.getId()) { 152ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return; 153ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 154ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko cardView.updatePosterArt(posterArt); 155ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 156ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko }; 157ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 158ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 1596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private void setPosterArt(String posterArtUri) { 1606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (!TextUtils.equals(mPosterArtUri, posterArtUri)) { 1616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mPosterArtUri = posterArtUri; 1626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (posterArtUri == null 1636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko || !mProgram.loadPosterArt(getContext(), mCardImageWidth, mCardImageHeight, 1646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko createProgramPosterArtCallback(this, mProgram))) { 1656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mImageView.setImageResource(R.drawable.ic_recent_thumbnail_default); 1666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mImageView.setForeground(null); 1676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 1696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 170816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 1716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private void updatePosterArt(Bitmap posterArt) { 1726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mImageView.setImageBitmap(posterArt); 1736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mImageView.setForeground(getContext().getDrawable(R.drawable.card_image_gradient)); 174816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 1756ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko}