Home | History | Annotate | Download | only in browse
      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 }