1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.tv.dvr.ui.browse;
18 
19 import android.content.Context;
20 import android.media.tv.TvInputManager;
21 import com.android.tv.R;
22 import com.android.tv.TvSingletons;
23 import com.android.tv.dvr.DvrWatchedPositionManager;
24 import com.android.tv.dvr.DvrWatchedPositionManager.WatchedPositionChangedListener;
25 import com.android.tv.dvr.data.RecordedProgram;
26 import com.android.tv.util.Utils;
27 
28 /** Presents a {@link RecordedProgram} in the {@link DvrBrowseFragment}. */
29 public class RecordedProgramPresenter extends DvrItemPresenter<RecordedProgram> {
30     private final DvrWatchedPositionManager mDvrWatchedPositionManager;
31     private String mTodayString;
32     private String mYesterdayString;
33     private final int mProgressBarColor;
34     private final boolean mShowEpisodeTitle;
35     private final boolean mExpandTitleWhenFocused;
36 
37     protected final class RecordedProgramViewHolder extends DvrItemViewHolder
38             implements WatchedPositionChangedListener {
39         private RecordedProgram mProgram;
40         private boolean mShowProgress;
41 
RecordedProgramViewHolder(RecordingCardView view, Integer progressColor)42         public RecordedProgramViewHolder(RecordingCardView view, Integer progressColor) {
43             super(view);
44             if (progressColor == null) {
45                 mShowProgress = false;
46             } else {
47                 mShowProgress = true;
48                 view.setProgressBarColor(progressColor);
49             }
50         }
51 
setProgressBar(long watchedPositionMs)52         private void setProgressBar(long watchedPositionMs) {
53             ((RecordingCardView) view)
54                     .setProgressBar(
55                             (watchedPositionMs == TvInputManager.TIME_SHIFT_INVALID_TIME)
56                                     ? null
57                                     : Math.min(
58                                             100,
59                                             (int)
60                                                     (100.0f
61                                                             * watchedPositionMs
62                                                             / mProgram.getDurationMillis())));
63         }
64 
65         @Override
onWatchedPositionChanged(long programId, long positionMs)66         public void onWatchedPositionChanged(long programId, long positionMs) {
67             if (programId == mProgram.getId()) {
68                 setProgressBar(positionMs);
69             }
70         }
71 
72         @Override
onBound(RecordedProgram program)73         protected void onBound(RecordedProgram program) {
74             mProgram = program;
75             if (mShowProgress) {
76                 mDvrWatchedPositionManager.addListener(this, program.getId());
77                 setProgressBar(mDvrWatchedPositionManager.getWatchedPosition(program.getId()));
78             } else {
79                 getView().setProgressBar(null);
80             }
81         }
82 
83         @Override
onUnbound()84         protected void onUnbound() {
85             if (mShowProgress) {
86                 mDvrWatchedPositionManager.removeListener(this, mProgram.getId());
87             }
88             getView().reset();
89         }
90     }
91 
RecordedProgramPresenter( Context context, boolean showEpisodeTitle, boolean expandTitleWhenFocused)92     RecordedProgramPresenter(
93             Context context, boolean showEpisodeTitle, boolean expandTitleWhenFocused) {
94         super(context);
95         mTodayString = mContext.getString(R.string.dvr_date_today);
96         mYesterdayString = mContext.getString(R.string.dvr_date_yesterday);
97         mDvrWatchedPositionManager =
98                 TvSingletons.getSingletons(mContext).getDvrWatchedPositionManager();
99         mProgressBarColor =
100                 mContext.getResources().getColor(R.color.play_controls_progress_bar_watched);
101         mShowEpisodeTitle = showEpisodeTitle;
102         mExpandTitleWhenFocused = expandTitleWhenFocused;
103     }
104 
RecordedProgramPresenter(Context context)105     public RecordedProgramPresenter(Context context) {
106         this(context, false, false);
107     }
108 
109     @Override
onCreateDvrItemViewHolder()110     public DvrItemViewHolder onCreateDvrItemViewHolder() {
111         return new RecordedProgramViewHolder(
112                 new RecordingCardView(mContext, mExpandTitleWhenFocused), mProgressBarColor);
113     }
114 
115     @Override
onBindDvrItemViewHolder(DvrItemViewHolder baseHolder, RecordedProgram program)116     public void onBindDvrItemViewHolder(DvrItemViewHolder baseHolder, RecordedProgram program) {
117         final RecordedProgramViewHolder viewHolder = (RecordedProgramViewHolder) baseHolder;
118         final RecordingCardView cardView = viewHolder.getView();
119         DetailsContent details = DetailsContent.createFromRecordedProgram(mContext, program);
120         cardView.setTitle(
121                 mShowEpisodeTitle ? program.getEpisodeDisplayTitle(mContext) : details.getTitle());
122         cardView.setImageUri(details.getLogoImageUri(), details.isUsingChannelLogo());
123         cardView.setContent(generateMajorContent(program), generateMinorContent(program));
124         cardView.setDetailBackgroundImageUri(details.getBackgroundImageUri());
125     }
126 
generateMajorContent(RecordedProgram program)127     private String generateMajorContent(RecordedProgram program) {
128         int dateDifference =
129                 Utils.computeDateDifference(
130                         program.getStartTimeUtcMillis(), System.currentTimeMillis());
131         if (dateDifference == 0) {
132             return mTodayString;
133         } else if (dateDifference == 1) {
134             return mYesterdayString;
135         } else {
136             return Utils.getDurationString(
137                     mContext,
138                     program.getStartTimeUtcMillis(),
139                     program.getStartTimeUtcMillis(),
140                     false,
141                     true,
142                     false,
143                     0);
144         }
145     }
146 
generateMinorContent(RecordedProgram program)147     private String generateMinorContent(RecordedProgram program) {
148         int durationMinutes = Math.max(1, Utils.getRoundOffMinsFromMs(program.getDurationMillis()));
149         return mContext.getResources()
150                 .getQuantityString(
151                         R.plurals.dvr_program_duration, durationMinutes, durationMinutes);
152     }
153 }
154