blob: b739c18f3167bed886cc93d534f3a6cb915bff66 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.tv.dvr.ui.list;
import android.content.Context;
import android.support.annotation.Nullable;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.dvr.ui.DvrUiHelper;
/** A class for schedule recording row. */
class ScheduleRow {
private final SchedulesHeaderRow mHeaderRow;
@Nullable private ScheduledRecording mSchedule;
private boolean mStopRecordingRequested;
private boolean mStartRecordingRequested;
public ScheduleRow(@Nullable ScheduledRecording recording, SchedulesHeaderRow headerRow) {
mSchedule = recording;
mHeaderRow = headerRow;
}
/** Gets which {@link SchedulesHeaderRow} this schedule row belongs to. */
public SchedulesHeaderRow getHeaderRow() {
return mHeaderRow;
}
/** Returns the recording schedule. */
@Nullable
public ScheduledRecording getSchedule() {
return mSchedule;
}
/** Checks if the stop recording has been requested or not. */
public boolean isStopRecordingRequested() {
return mStopRecordingRequested;
}
/** Sets the flag of stop recording request. */
public void setStopRecordingRequested(boolean stopRecordingRequested) {
SoftPreconditions.checkState(!mStartRecordingRequested);
mStopRecordingRequested = stopRecordingRequested;
}
/** Checks if the start recording has been requested or not. */
public boolean isStartRecordingRequested() {
return mStartRecordingRequested;
}
/** Sets the flag of start recording request. */
public void setStartRecordingRequested(boolean startRecordingRequested) {
SoftPreconditions.checkState(!mStopRecordingRequested);
mStartRecordingRequested = startRecordingRequested;
}
/** Sets the recording schedule. */
public void setSchedule(@Nullable ScheduledRecording schedule) {
mSchedule = schedule;
}
/** Returns the channel ID. */
public long getChannelId() {
return mSchedule != null ? mSchedule.getChannelId() : -1;
}
/** Returns the start time. */
public long getStartTimeMs() {
return mSchedule != null ? mSchedule.getStartTimeMs() : -1;
}
/** Returns the end time. */
public long getEndTimeMs() {
return mSchedule != null ? mSchedule.getEndTimeMs() : -1;
}
/** Returns the duration. */
public final long getDuration() {
return getEndTimeMs() - getStartTimeMs();
}
/** Checks if the program is on air. */
public final boolean isOnAir() {
long currentTimeMs = System.currentTimeMillis();
return getStartTimeMs() <= currentTimeMs && getEndTimeMs() > currentTimeMs;
}
/** Checks if the schedule is not started. */
public final boolean isRecordingNotStarted() {
return mSchedule != null
&& mSchedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED;
}
/** Checks if the schedule is in progress. */
public final boolean isRecordingInProgress() {
return mSchedule != null
&& mSchedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS;
}
/** Checks if the schedule is failed. */
public final boolean isRecordingFailed() {
return mSchedule != null
&& mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FAILED;
}
/** Checks if the schedule has been canceled or not. */
public final boolean isScheduleCanceled() {
return mSchedule != null
&& mSchedule.getState() == ScheduledRecording.STATE_RECORDING_CANCELED;
}
public boolean isRecordingFinished() {
return mSchedule != null
&& (mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FAILED
|| mSchedule.getState() == ScheduledRecording.STATE_RECORDING_CLIPPED
|| mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FINISHED);
}
public boolean hasRecordedProgram() {
return mSchedule != null
&& mSchedule.getRecordedProgramId() != null
&& mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FINISHED;
}
/** Creates and returns the new schedule with the existing information. */
public ScheduledRecording.Builder createNewScheduleBuilder() {
return mSchedule != null ? ScheduledRecording.buildFrom(mSchedule) : null;
}
/** Returns the program title with episode number. */
public String getProgramTitleWithEpisodeNumber(Context context) {
return mSchedule != null
? DvrUiHelper.getStyledTitleWithEpisodeNumber(context, mSchedule, 0).toString()
: null;
}
/** Returns the program title including the season/episode number. */
public String getEpisodeDisplayTitle(Context context) {
return mSchedule != null ? mSchedule.getEpisodeDisplayTitle(context) : null;
}
@Override
public String toString() {
return getClass().getSimpleName()
+ "(schedule="
+ mSchedule
+ ",stopRecordingRequested="
+ mStopRecordingRequested
+ ",startRecordingRequested="
+ mStartRecordingRequested
+ ")";
}
/** Checks if the {@code schedule} is for the program or channel. */
public boolean matchSchedule(ScheduledRecording schedule) {
if (mSchedule == null) {
return false;
}
if (mSchedule.getType() == ScheduledRecording.TYPE_TIMED) {
return mSchedule.getChannelId() == schedule.getChannelId()
&& mSchedule.getStartTimeMs() == schedule.getStartTimeMs()
&& mSchedule.getEndTimeMs() == schedule.getEndTimeMs();
} else {
return mSchedule.getProgramId() == schedule.getProgramId();
}
}
}