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