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