165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/* 265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Copyright (C) 2016 The Android Open Source Project 365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * 465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * you may not use this file except in compliance with the License. 665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * You may obtain a copy of the License at 765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * 865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * 1065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Unless required by applicable law or agreed to in writing, software 1165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 1265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * See the License for the specific language governing permissions and 1465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * limitations under the License 1565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 1665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 1765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopackage com.android.tv.dvr.ui.list; 1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 19d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalkoimport android.content.Context; 20d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalkoimport android.support.annotation.Nullable; 21d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 22d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalkoimport com.android.tv.common.SoftPreconditions; 236ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.dvr.data.ScheduledRecording; 246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.dvr.ui.DvrUiHelper; 2565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 2665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/** 2765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * A class for schedule recording row. 2865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoclass ScheduleRow { 30d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko private final SchedulesHeaderRow mHeaderRow; 31d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko @Nullable private ScheduledRecording mSchedule; 32d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko private boolean mStopRecordingRequested; 33d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko private boolean mStartRecordingRequested; 3465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 35d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public ScheduleRow(@Nullable ScheduledRecording recording, SchedulesHeaderRow headerRow) { 36d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko mSchedule = recording; 3765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mHeaderRow = headerRow; 3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 4065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 41d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Gets which {@link SchedulesHeaderRow} this schedule row belongs to. 4265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 43d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public SchedulesHeaderRow getHeaderRow() { 44d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mHeaderRow; 4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 4765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 48d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the recording schedule. 4965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 50d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko @Nullable 51d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public ScheduledRecording getSchedule() { 52d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule; 5365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 5565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 56d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the stop recording has been requested or not. 5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 58d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public boolean isStopRecordingRequested() { 59d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mStopRecordingRequested; 6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 6265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 63d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Sets the flag of stop recording request. 6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 65d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public void setStopRecordingRequested(boolean stopRecordingRequested) { 66d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko SoftPreconditions.checkState(!mStartRecordingRequested); 67d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko mStopRecordingRequested = stopRecordingRequested; 6865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 71d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the start recording has been requested or not. 7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 73d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public boolean isStartRecordingRequested() { 74d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mStartRecordingRequested; 75d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 76d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 77d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 78d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Sets the flag of start recording request. 79d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 80d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public void setStartRecordingRequested(boolean startRecordingRequested) { 81d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko SoftPreconditions.checkState(!mStopRecordingRequested); 82d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko mStartRecordingRequested = startRecordingRequested; 83d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 84d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 85d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 86d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Sets the recording schedule. 87d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 88d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public void setSchedule(@Nullable ScheduledRecording schedule) { 89d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko mSchedule = schedule; 90d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 91d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 92d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 93d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the channel ID. 94d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 95d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public long getChannelId() { 96d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null ? mSchedule.getChannelId() : -1; 97d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 98d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 99d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 100d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the start time. 101d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 102d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public long getStartTimeMs() { 103d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null ? mSchedule.getStartTimeMs() : -1; 104d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 105d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 106d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 107d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the end time. 108d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 109d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public long getEndTimeMs() { 110d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null ? mSchedule.getEndTimeMs() : -1; 111d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 112d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 113d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 114d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the duration. 115d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 116d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public final long getDuration() { 117d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return getEndTimeMs() - getStartTimeMs(); 118d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 119d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 120d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 121d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the program is on air. 122d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 123d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public final boolean isOnAir() { 124d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko long currentTimeMs = System.currentTimeMillis(); 125d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return getStartTimeMs() <= currentTimeMs && getEndTimeMs() > currentTimeMs; 126d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 127d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 128d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 129d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the schedule is not started. 130d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 131d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public final boolean isRecordingNotStarted() { 132d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null 133d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko && mSchedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED; 134d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 135d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 136d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 137d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the schedule is in progress. 138d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 139d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public final boolean isRecordingInProgress() { 140d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null 141d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko && mSchedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS; 142d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 143d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 144d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 145d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the schedule has been canceled or not. 146d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 147d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public final boolean isScheduleCanceled() { 148d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null 149d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko && mSchedule.getState() == ScheduledRecording.STATE_RECORDING_CANCELED; 150d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 151d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 152d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public boolean isRecordingFinished() { 153d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null 154d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko && (mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FAILED 155d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko || mSchedule.getState() == ScheduledRecording.STATE_RECORDING_CLIPPED 156d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko || mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FINISHED); 157d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 158d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 159d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 160d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Creates and returns the new schedule with the existing information. 161d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 162d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public ScheduledRecording.Builder createNewScheduleBuilder() { 163d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null ? ScheduledRecording.buildFrom(mSchedule) : null; 164d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 165d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 166d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 167d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the program title with episode number. 168d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 169d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public String getProgramTitleWithEpisodeNumber(Context context) { 1706ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return mSchedule != null ? DvrUiHelper.getStyledTitleWithEpisodeNumber(context, 1716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mSchedule, 0).toString() : null; 172d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 173d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 174d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 175d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Returns the program title including the season/episode number. 176d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 177d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public String getEpisodeDisplayTitle(Context context) { 178d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule != null ? mSchedule.getEpisodeDisplayTitle(context) : null; 179d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 180d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 181d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko @Override 182d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public String toString() { 183d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return getClass().getSimpleName() 184d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko + "(schedule=" + mSchedule 185d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko + ",stopRecordingRequested=" + mStopRecordingRequested 186d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko + ",startRecordingRequested=" + mStartRecordingRequested 187d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko + ")"; 188d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 189d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko 190d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko /** 191d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko * Checks if the {@code schedule} is for the program or channel. 192d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko */ 193d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko public boolean matchSchedule(ScheduledRecording schedule) { 194d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (mSchedule == null) { 195d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return false; 196d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 197d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (mSchedule.getType() == ScheduledRecording.TYPE_TIMED) { 198d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule.getChannelId() == schedule.getChannelId() 199d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko && mSchedule.getStartTimeMs() == schedule.getStartTimeMs() 200d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko && mSchedule.getEndTimeMs() == schedule.getEndTimeMs(); 201d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } else { 202d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko return mSchedule.getProgramId() == schedule.getProgramId(); 203d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko } 20465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 20565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko} 206