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}