ChannelCardView.java revision d41f0075a7d2ea826204e81fcec57d0aa57171a9
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 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * A view to render channel card. 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopublic class ChannelCardView extends BaseCardView<Channel> { 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TAG = MenuView.TAG; 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final boolean DEBUG = MenuView.DEBUG; 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final int mCardImageWidth; 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final int mCardImageHeight; 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private ImageView mImageView; 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private View mGradientView; 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private TextView mChannelNumberNameView; 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private ProgressBar mProgressBar; 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Channel mChannel; 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Program mProgram; 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final MainActivity mMainActivity; 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelCardView(Context context) { 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko this(context, null); 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelCardView(Context context, AttributeSet attrs) { 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko this(context, attrs, 0); 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelCardView(Context context, AttributeSet attrs, int defStyle) { 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(context, attrs, defStyle); 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mCardImageWidth = getResources().getDimensionPixelSize(R.dimen.card_image_layout_width); 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mCardImageHeight = getResources().getDimensionPixelSize(R.dimen.card_image_layout_height); 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mMainActivity = (MainActivity) context; 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onFinishInflate() { 72ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko super.onFinishInflate(); 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mImageView = (ImageView) findViewById(R.id.image); 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGradientView = findViewById(R.id.image_gradient); 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannelNumberNameView = (TextView) findViewById(R.id.channel_number_and_name); 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar = (ProgressBar) findViewById(R.id.progress); 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onBind(Channel channel, boolean selected) { 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (DEBUG) { 827d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko Log.d(TAG, "onBind(channelName=" + channel.getDisplayName() + ", selected=" + selected 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko + ")"); 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannel = channel; 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgram = null; 8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mChannelNumberNameView.setText(mChannel.getDisplayText()); 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannelNumberNameView.setVisibility(VISIBLE); 89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mImageView.setImageResource(R.drawable.ic_recent_thumbnail_default); 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mImageView.setBackgroundResource(R.color.channel_card); 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGradientView.setVisibility(View.GONE); 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar.setVisibility(GONE); 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 94d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setTextViewEnabled(true); 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mMainActivity.getParentalControlSettings().isParentalControlsEnabled() 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko && mChannel.isLocked()) { 97d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setText(R.string.program_title_for_blocked_channel); 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return; 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 100d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setText(""); 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko updateProgramInformation(); 104d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko // Call super.onBind() at the end intentionally. In order to correctly handle extension of 105d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko // text view, text should be set before calling super.onBind. 106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onBind(channel, selected); 107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 109ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private static ImageLoader.ImageLoaderCallback<ChannelCardView> createProgramPosterArtCallback( 110ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko ChannelCardView cardView, final Program program) { 111ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return new ImageLoader.ImageLoaderCallback<ChannelCardView>(cardView) { 112ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko @Override 113ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public void onBitmapLoaded(ChannelCardView cardView, @Nullable Bitmap posterArt) { 114ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (posterArt == null || cardView.mProgram == null 115ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko || program.getChannelId() != cardView.mProgram.getChannelId() 116ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko || program.getChannelId() != cardView.mChannel.getId()) { 117ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return; 118ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 119ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko cardView.updatePosterArt(posterArt); 120ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 121ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko }; 122ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 123ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 124ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private void updatePosterArt(Bitmap posterArt) { 125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mImageView.setImageBitmap(posterArt); 126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGradientView.setVisibility(View.VISIBLE); 127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void updateProgramInformation() { 130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mChannel == null) { 131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return; 132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgram = mMainActivity.getProgramDataManager().getCurrentProgram(mChannel.getId()); 134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mProgram == null || TextUtils.isEmpty(mProgram.getTitle())) { 135d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setTextViewEnabled(false); 136d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setText(R.string.program_title_for_no_information); 137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 138d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko setText(mProgram.getTitle()); 139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mProgram == null) { 142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return; 143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko long startTime = mProgram.getStartTimeUtcMillis(); 146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko long endTime = mProgram.getEndTimeUtcMillis(); 147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko long currTime = System.currentTimeMillis(); 148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar.setVisibility(View.VISIBLE); 149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (currTime <= startTime) { 150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar.setProgress(0); 151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else if (currTime >= endTime) { 152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar.setProgress(100); 153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgressBar.setProgress((int) (100 * (currTime - startTime) / (endTime - startTime))); 155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (!(getContext() instanceof MainActivity)) { 158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Log.e(TAG, "Fails to check program's content rating."); 159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return; 160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 161816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ParentalControlSettings parental = mMainActivity.getParentalControlSettings(); 162816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if ((!parental.isParentalControlsEnabled() 163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko || !parental.isRatingBlocked(mProgram.getContentRatings())) 164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko && !TextUtils.isEmpty(mProgram.getPosterArtUri())) { 165816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mProgram.loadPosterArt(getContext(), mCardImageWidth, mCardImageHeight, 166ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko createProgramPosterArtCallback(this, mProgram)); 167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 170