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.os.Handler; 21 22 import com.android.tv.R; 23 import com.android.tv.TvApplication; 24 import com.android.tv.dvr.DvrManager; 25 import com.android.tv.dvr.data.ScheduledRecording; 26 import com.android.tv.util.Utils; 27 28 import java.util.concurrent.TimeUnit; 29 30 /** 31 * Presents a {@link ScheduledRecording} in the {@link DvrBrowseFragment}. 32 */ 33 class ScheduledRecordingPresenter extends DvrItemPresenter<ScheduledRecording> { 34 private static final long PROGRESS_UPDATE_INTERVAL_MS = TimeUnit.SECONDS.toMillis(5); 35 36 private final DvrManager mDvrManager; 37 private final int mProgressBarColor; 38 39 private final class ScheduledRecordingViewHolder extends DvrItemViewHolder { 40 private final Handler mHandler = new Handler(); 41 private ScheduledRecording mScheduledRecording; 42 private final Runnable mProgressBarUpdater = new Runnable() { 43 @Override 44 public void run() { 45 updateProgressBar(); 46 mHandler.postDelayed(this, PROGRESS_UPDATE_INTERVAL_MS); 47 } 48 }; 49 50 ScheduledRecordingViewHolder(RecordingCardView view, int progressBarColor) { 51 super(view); 52 view.setProgressBarColor(progressBarColor); 53 } 54 55 @Override 56 protected void onBound(ScheduledRecording recording) { 57 mScheduledRecording = recording; 58 updateProgressBar(); 59 startUpdateProgressBar(); 60 } 61 62 @Override 63 protected void onUnbound() { 64 stopUpdateProgressBar(); 65 mScheduledRecording = null; 66 getView().reset(); 67 } 68 69 private void updateProgressBar() { 70 if (mScheduledRecording == null) { 71 return; 72 } 73 int recordingState = mScheduledRecording.getState(); 74 RecordingCardView cardView = (RecordingCardView) view; 75 if (recordingState == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) { 76 cardView.setProgressBar(Math.max(0, Math.min((int) (100 * 77 (System.currentTimeMillis() - mScheduledRecording.getStartTimeMs()) 78 / mScheduledRecording.getDuration()), 100))); 79 } else if (recordingState == ScheduledRecording.STATE_RECORDING_FINISHED) { 80 cardView.setProgressBar(100); 81 } else { 82 // Hides progress bar. 83 cardView.setProgressBar(null); 84 } 85 } 86 87 private void startUpdateProgressBar() { 88 mHandler.post(mProgressBarUpdater); 89 } 90 91 private void stopUpdateProgressBar() { 92 mHandler.removeCallbacks(mProgressBarUpdater); 93 } 94 } 95 96 public ScheduledRecordingPresenter(Context context) { 97 super(context); 98 mDvrManager = TvApplication.getSingletons(mContext).getDvrManager(); 99 mProgressBarColor = mContext.getResources() 100 .getColor(R.color.play_controls_recording_icon_color_on_focus); 101 } 102 103 @Override 104 public DvrItemViewHolder onCreateDvrItemViewHolder() { 105 return new ScheduledRecordingViewHolder(new RecordingCardView(mContext), mProgressBarColor); 106 } 107 108 @Override 109 public void onBindDvrItemViewHolder(DvrItemViewHolder baseHolder, 110 ScheduledRecording recording) { 111 final ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder; 112 final RecordingCardView cardView = viewHolder.getView(); 113 DetailsContent details = DetailsContent.createFromScheduledRecording(mContext, recording); 114 cardView.setTitle(details.getTitle()); 115 cardView.setImageUri(details.getLogoImageUri(), details.isUsingChannelLogo()); 116 cardView.setAffiliatedIcon(mDvrManager.isConflicting(recording) ? 117 R.drawable.ic_warning_white_32dp : 0); 118 cardView.setContent(generateMajorContent(recording), null); 119 cardView.setDetailBackgroundImageUri(details.getBackgroundImageUri()); 120 } 121 122 private String generateMajorContent(ScheduledRecording recording) { 123 int dateDifference = Utils.computeDateDifference(System.currentTimeMillis(), 124 recording.getStartTimeMs()); 125 if (dateDifference <= 0) { 126 return mContext.getString(R.string.dvr_date_today_time, 127 Utils.getDurationString(mContext, recording.getStartTimeMs(), 128 recording.getEndTimeMs(), false, false, true, 0)); 129 } else if (dateDifference == 1) { 130 return mContext.getString(R.string.dvr_date_tomorrow_time, 131 Utils.getDurationString(mContext, recording.getStartTimeMs(), 132 recording.getEndTimeMs(), false, false, true, 0)); 133 } else { 134 return Utils.getDurationString(mContext, recording.getStartTimeMs(), 135 recording.getStartTimeMs(), false, true, false, 0); 136 } 137 } 138 }