aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/dvr/SeriesRecording.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/dvr/SeriesRecording.java')
-rw-r--r--src/com/android/tv/dvr/SeriesRecording.java755
1 files changed, 0 insertions, 755 deletions
diff --git a/src/com/android/tv/dvr/SeriesRecording.java b/src/com/android/tv/dvr/SeriesRecording.java
deleted file mode 100644
index f0690f5f..00000000
--- a/src/com/android/tv/dvr/SeriesRecording.java
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright (C) 2015 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;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.IntDef;
-import android.support.annotation.VisibleForTesting;
-import android.text.TextUtils;
-
-import com.android.tv.data.BaseProgram;
-import com.android.tv.data.Program;
-import com.android.tv.dvr.provider.DvrContract.SeriesRecordings;
-import com.android.tv.util.Utils;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Objects;
-
-/**
- * Schedules the recording of a Series of Programs.
- *
- * <p>
- * Contains the data needed to create new ScheduleRecordings as the programs become available in
- * the EPG.
- */
-public class SeriesRecording implements Parcelable {
- /**
- * Indicates that the ID is not assigned yet.
- */
- public static final long ID_NOT_SET = 0;
-
- /**
- * The default priority of this recording.
- */
- public static final long DEFAULT_PRIORITY = Long.MAX_VALUE >> 1;
-
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true,
- value = {OPTION_CHANNEL_ONE, OPTION_CHANNEL_ALL})
- public @interface ChannelOption {}
- /**
- * An option which indicates that the episodes in one channel are recorded.
- */
- public static final int OPTION_CHANNEL_ONE = 0;
- /**
- * An option which indicates that the episodes in all the channels are recorded.
- */
- public static final int OPTION_CHANNEL_ALL = 1;
-
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true,
- value = {STATE_SERIES_NORMAL, STATE_SERIES_STOPPED})
- public @interface SeriesState {}
-
- /**
- * The state indicates that the series recording is a normal one.
- */
- public static final int STATE_SERIES_NORMAL = 0;
-
- /**
- * The state indicates that the series recording is stopped.
- */
- public static final int STATE_SERIES_STOPPED = 1;
-
- /**
- * Compare priority in descending order.
- */
- public static final Comparator<SeriesRecording> PRIORITY_COMPARATOR =
- new Comparator<SeriesRecording>() {
- @Override
- public int compare(SeriesRecording lhs, SeriesRecording rhs) {
- int value = Long.compare(rhs.mPriority, lhs.mPriority);
- if (value == 0) {
- // New recording has the higher priority.
- value = Long.compare(rhs.mId, lhs.mId);
- }
- return value;
- }
- };
-
- /**
- * Compare ID in ascending order.
- */
- public static final Comparator<SeriesRecording> ID_COMPARATOR =
- new Comparator<SeriesRecording>() {
- @Override
- public int compare(SeriesRecording lhs, SeriesRecording rhs) {
- return Long.compare(lhs.mId, rhs.mId);
- }
- };
-
- /**
- * Creates a new Builder with the values set from the series information of {@link BaseProgram}.
- */
- public static Builder builder(String inputId, BaseProgram p) {
- return new Builder()
- .setInputId(inputId)
- .setSeriesId(p.getSeriesId())
- .setChannelId(p.getChannelId())
- .setTitle(p.getTitle())
- .setDescription(p.getDescription())
- .setLongDescription(p.getLongDescription())
- .setCanonicalGenreIds(p.getCanonicalGenreIds())
- .setPosterUri(p.getPosterArtUri())
- .setPhotoUri(p.getThumbnailUri());
- }
-
- /**
- * Creates a new Builder with the values set from an existing {@link SeriesRecording}.
- */
- @VisibleForTesting
- public static Builder buildFrom(SeriesRecording r) {
- return new Builder()
- .setId(r.mId)
- .setInputId(r.getInputId())
- .setChannelId(r.getChannelId())
- .setPriority(r.getPriority())
- .setTitle(r.getTitle())
- .setDescription(r.getDescription())
- .setLongDescription(r.getLongDescription())
- .setSeriesId(r.getSeriesId())
- .setStartFromEpisode(r.getStartFromEpisode())
- .setStartFromSeason(r.getStartFromSeason())
- .setChannelOption(r.getChannelOption())
- .setCanonicalGenreIds(r.getCanonicalGenreIds())
- .setPosterUri(r.getPosterUri())
- .setPhotoUri(r.getPhotoUri())
- .setState(r.getState());
- }
-
- /**
- * Use this projection if you want to create {@link SeriesRecording} object using
- * {@link #fromCursor}.
- */
- public static final String[] PROJECTION = {
- // Columns must match what is read in fromCursor()
- SeriesRecordings._ID,
- SeriesRecordings.COLUMN_INPUT_ID,
- SeriesRecordings.COLUMN_CHANNEL_ID,
- SeriesRecordings.COLUMN_PRIORITY,
- SeriesRecordings.COLUMN_TITLE,
- SeriesRecordings.COLUMN_SHORT_DESCRIPTION,
- SeriesRecordings.COLUMN_LONG_DESCRIPTION,
- SeriesRecordings.COLUMN_SERIES_ID,
- SeriesRecordings.COLUMN_START_FROM_EPISODE,
- SeriesRecordings.COLUMN_START_FROM_SEASON,
- SeriesRecordings.COLUMN_CHANNEL_OPTION,
- SeriesRecordings.COLUMN_CANONICAL_GENRE,
- SeriesRecordings.COLUMN_POSTER_URI,
- SeriesRecordings.COLUMN_PHOTO_URI,
- SeriesRecordings.COLUMN_STATE
- };
- /**
- * Creates {@link SeriesRecording} object from the given {@link Cursor}.
- */
- public static SeriesRecording fromCursor(Cursor c) {
- int index = -1;
- return new Builder()
- .setId(c.getLong(++index))
- .setInputId(c.getString(++index))
- .setChannelId(c.getLong(++index))
- .setPriority(c.getLong(++index))
- .setTitle(c.getString(++index))
- .setDescription(c.getString(++index))
- .setLongDescription(c.getString(++index))
- .setSeriesId(c.getString(++index))
- .setStartFromEpisode(c.getInt(++index))
- .setStartFromSeason(c.getInt(++index))
- .setChannelOption(channelOption(c.getString(++index)))
- .setCanonicalGenreIds(c.getString(++index))
- .setPosterUri(c.getString(++index))
- .setPhotoUri(c.getString(++index))
- .setState(seriesRecordingState(c.getString(++index)))
- .build();
- }
-
- /**
- * Returns the ContentValues with keys as the columns specified in {@link SeriesRecordings}
- * and the values from {@code r}.
- */
- public static ContentValues toContentValues(SeriesRecording r) {
- ContentValues values = new ContentValues();
- if (r.getId() != ID_NOT_SET) {
- values.put(SeriesRecordings._ID, r.getId());
- } else {
- values.putNull(SeriesRecordings._ID);
- }
- values.put(SeriesRecordings.COLUMN_INPUT_ID, r.getInputId());
- values.put(SeriesRecordings.COLUMN_CHANNEL_ID, r.getChannelId());
- values.put(SeriesRecordings.COLUMN_PRIORITY, r.getPriority());
- values.put(SeriesRecordings.COLUMN_TITLE, r.getTitle());
- values.put(SeriesRecordings.COLUMN_SHORT_DESCRIPTION, r.getDescription());
- values.put(SeriesRecordings.COLUMN_LONG_DESCRIPTION, r.getLongDescription());
- values.put(SeriesRecordings.COLUMN_SERIES_ID, r.getSeriesId());
- values.put(SeriesRecordings.COLUMN_START_FROM_EPISODE, r.getStartFromEpisode());
- values.put(SeriesRecordings.COLUMN_START_FROM_SEASON, r.getStartFromSeason());
- values.put(SeriesRecordings.COLUMN_CHANNEL_OPTION,
- channelOption(r.getChannelOption()));
- values.put(SeriesRecordings.COLUMN_CANONICAL_GENRE,
- Utils.getCanonicalGenre(r.getCanonicalGenreIds()));
- values.put(SeriesRecordings.COLUMN_POSTER_URI, r.getPosterUri());
- values.put(SeriesRecordings.COLUMN_PHOTO_URI, r.getPhotoUri());
- values.put(SeriesRecordings.COLUMN_STATE, seriesRecordingState(r.getState()));
- return values;
- }
-
- private static String channelOption(@ChannelOption int option) {
- switch (option) {
- case OPTION_CHANNEL_ONE:
- return SeriesRecordings.OPTION_CHANNEL_ONE;
- case OPTION_CHANNEL_ALL:
- return SeriesRecordings.OPTION_CHANNEL_ALL;
- }
- return SeriesRecordings.OPTION_CHANNEL_ONE;
- }
-
- @ChannelOption private static int channelOption(String option) {
- switch (option) {
- case SeriesRecordings.OPTION_CHANNEL_ONE:
- return OPTION_CHANNEL_ONE;
- case SeriesRecordings.OPTION_CHANNEL_ALL:
- return OPTION_CHANNEL_ALL;
- }
- return OPTION_CHANNEL_ONE;
- }
-
- private static String seriesRecordingState(@SeriesState int state) {
- switch (state) {
- case STATE_SERIES_NORMAL:
- return SeriesRecordings.STATE_SERIES_NORMAL;
- case STATE_SERIES_STOPPED:
- return SeriesRecordings.STATE_SERIES_STOPPED;
- }
- return SeriesRecordings.STATE_SERIES_NORMAL;
- }
-
- @SeriesState private static int seriesRecordingState(String state) {
- switch (state) {
- case SeriesRecordings.STATE_SERIES_NORMAL:
- return STATE_SERIES_NORMAL;
- case SeriesRecordings.STATE_SERIES_STOPPED:
- return STATE_SERIES_STOPPED;
- }
- return STATE_SERIES_NORMAL;
- }
-
- /**
- * Builder for {@link SeriesRecording}.
- */
- public static class Builder {
- private long mId = ID_NOT_SET;
- private long mPriority = DvrScheduleManager.DEFAULT_SERIES_PRIORITY;
- private String mTitle;
- private String mDescription;
- private String mLongDescription;
- private String mInputId;
- private long mChannelId;
- private String mSeriesId;
- private int mStartFromSeason = SeriesRecordings.THE_BEGINNING;
- private int mStartFromEpisode = SeriesRecordings.THE_BEGINNING;
- private int mChannelOption = OPTION_CHANNEL_ONE;
- private int[] mCanonicalGenreIds;
- private String mPosterUri;
- private String mPhotoUri;
- private int mState = SeriesRecording.STATE_SERIES_NORMAL;
-
- /**
- * @see #getId()
- */
- public Builder setId(long id) {
- mId = id;
- return this;
- }
-
- /**
- * @see #getPriority() ()
- */
- public Builder setPriority(long priority) {
- mPriority = priority;
- return this;
- }
-
- /**
- * @see #getTitle()
- */
- public Builder setTitle(String title) {
- mTitle = title;
- return this;
- }
-
- /**
- * @see #getDescription()
- */
- public Builder setDescription(String description) {
- mDescription = description;
- return this;
- }
-
- /**
- * @see #getLongDescription()
- */
- public Builder setLongDescription(String longDescription) {
- mLongDescription = longDescription;
- return this;
- }
-
- /**
- * @see #getInputId()
- */
- public Builder setInputId(String inputId) {
- mInputId = inputId;
- return this;
- }
-
- /**
- * @see #getChannelId()
- */
- public Builder setChannelId(long channelId) {
- mChannelId = channelId;
- return this;
- }
-
- /**
- * @see #getSeriesId()
- */
- public Builder setSeriesId(String seriesId) {
- mSeriesId = seriesId;
- return this;
- }
-
- /**
- * @see #getStartFromSeason()
- */
- public Builder setStartFromSeason(int startFromSeason) {
- mStartFromSeason = startFromSeason;
- return this;
- }
-
- /**
- * @see #getChannelOption()
- */
- public Builder setChannelOption(@ChannelOption int option) {
- mChannelOption = option;
- return this;
- }
-
- /**
- * @see #getStartFromEpisode()
- */
- public Builder setStartFromEpisode(int startFromEpisode) {
- mStartFromEpisode = startFromEpisode;
- return this;
- }
-
- /**
- * @see #getCanonicalGenreIds()
- */
- public Builder setCanonicalGenreIds(String genres) {
- mCanonicalGenreIds = Utils.getCanonicalGenreIds(genres);
- return this;
- }
-
- /**
- * @see #getCanonicalGenreIds()
- */
- public Builder setCanonicalGenreIds(int[] canonicalGenreIds) {
- mCanonicalGenreIds = canonicalGenreIds;
- return this;
- }
-
- /**
- * @see #getPosterUri()
- */
- public Builder setPosterUri(String posterUri) {
- mPosterUri = posterUri;
- return this;
- }
-
- /**
- * @see #getPhotoUri()
- */
- public Builder setPhotoUri(String photoUri) {
- mPhotoUri = photoUri;
- return this;
- }
-
- /**
- * @see #getState()
- */
- public Builder setState(@SeriesState int state) {
- mState = state;
- return this;
- }
-
- /**
- * Creates a new {@link SeriesRecording}.
- */
- public SeriesRecording build() {
- return new SeriesRecording(mId, mPriority, mTitle, mDescription, mLongDescription,
- mInputId, mChannelId, mSeriesId, mStartFromSeason, mStartFromEpisode,
- mChannelOption, mCanonicalGenreIds, mPosterUri, mPhotoUri, mState);
- }
- }
-
- public static SeriesRecording fromParcel(Parcel in) {
- return new Builder()
- .setId(in.readLong())
- .setPriority(in.readLong())
- .setTitle(in.readString())
- .setDescription(in.readString())
- .setLongDescription(in.readString())
- .setInputId(in.readString())
- .setChannelId(in.readLong())
- .setSeriesId(in.readString())
- .setStartFromSeason(in.readInt())
- .setStartFromEpisode(in.readInt())
- .setChannelOption(in.readInt())
- .setCanonicalGenreIds(in.createIntArray())
- .setPosterUri(in.readString())
- .setPhotoUri(in.readString())
- .setState(in.readInt())
- .build();
- }
-
- public static final Parcelable.Creator<SeriesRecording> CREATOR =
- new Parcelable.Creator<SeriesRecording>() {
- @Override
- public SeriesRecording createFromParcel(Parcel in) {
- return SeriesRecording.fromParcel(in);
- }
-
- @Override
- public SeriesRecording[] newArray(int size) {
- return new SeriesRecording[size];
- }
- };
-
- private long mId;
- private final long mPriority;
- private final String mTitle;
- private final String mDescription;
- private final String mLongDescription;
- private final String mInputId;
- private final long mChannelId;
- private final String mSeriesId;
- private final int mStartFromSeason;
- private final int mStartFromEpisode;
- @ChannelOption private final int mChannelOption;
- private final int[] mCanonicalGenreIds;
- private final String mPosterUri;
- private final String mPhotoUri;
- @SeriesState private int mState;
-
- /**
- * The input id of this SeriesRecording.
- */
- public String getInputId() {
- return mInputId;
- }
-
- /**
- * The channelId to match. The channel ID might not be valid when the channel option is "ALL".
- */
- public long getChannelId() {
- return mChannelId;
- }
-
- /**
- * The id of this SeriesRecording.
- */
- public long getId() {
- return mId;
- }
-
- /**
- * Sets the ID.
- */
- public void setId(long id) {
- mId = id;
- }
-
- /**
- * The priority of this recording.
- *
- * <p> The highest number is recorded first. If there is a tie in mPriority then the higher mId
- * wins.
- */
- public long getPriority() {
- return mPriority;
- }
-
- /**
- * The series title.
- */
- public String getTitle() {
- return mTitle;
- }
-
- /**
- * The series description.
- */
- public String getDescription() {
- return mDescription;
- }
-
- /**
- * The long series description.
- */
- public String getLongDescription() {
- return mLongDescription;
- }
-
- /**
- * SeriesId when not null is used to match programs instead of using title and channelId.
- *
- * <p>SeriesId is an opaque but stable string.
- */
- public String getSeriesId() {
- return mSeriesId;
- }
-
- /**
- * If not == {@link SeriesRecordings#THE_BEGINNING} and seasonNumber == startFromSeason then
- * only record episodes with a episodeNumber >= this
- */
- public int getStartFromEpisode() {
- return mStartFromEpisode;
- }
-
- /**
- * If not == {@link SeriesRecordings#THE_BEGINNING} then only record episodes with a
- * seasonNumber >= this
- */
- public int getStartFromSeason() {
- return mStartFromSeason;
- }
-
- /**
- * Returns the channel recording option.
- */
- @ChannelOption public int getChannelOption() {
- return mChannelOption;
- }
-
- /**
- * Returns the canonical genre ID's.
- */
- public int[] getCanonicalGenreIds() {
- return mCanonicalGenreIds;
- }
-
- /**
- * Returns the poster URI.
- */
- public String getPosterUri() {
- return mPosterUri;
- }
-
- /**
- * Returns the photo URI.
- */
- public String getPhotoUri() {
- return mPhotoUri;
- }
-
- /**
- * Returns the state of series recording.
- */
- @SeriesState public int getState() {
- return mState;
- }
-
- /**
- * Checks whether the series recording is stopped or not.
- */
- public boolean isStopped() {
- return mState == STATE_SERIES_STOPPED;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SeriesRecording)) return false;
- SeriesRecording that = (SeriesRecording) o;
- return mPriority == that.mPriority
- && mChannelId == that.mChannelId
- && mStartFromSeason == that.mStartFromSeason
- && mStartFromEpisode == that.mStartFromEpisode
- && Objects.equals(mId, that.mId)
- && Objects.equals(mTitle, that.mTitle)
- && Objects.equals(mDescription, that.mDescription)
- && Objects.equals(mLongDescription, that.mLongDescription)
- && Objects.equals(mSeriesId, that.mSeriesId)
- && mChannelOption == that.mChannelOption
- && Arrays.equals(mCanonicalGenreIds, that.mCanonicalGenreIds)
- && Objects.equals(mPosterUri, that.mPosterUri)
- && Objects.equals(mPhotoUri, that.mPhotoUri)
- && mState == that.mState;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mPriority, mChannelId, mStartFromSeason, mStartFromEpisode, mId,
- mTitle, mDescription, mLongDescription, mSeriesId, mChannelOption,
- mCanonicalGenreIds, mPosterUri, mPhotoUri, mState);
- }
-
- @Override
- public String toString() {
- return "SeriesRecording{" +
- "inputId=" + mInputId +
- ", channelId=" + mChannelId +
- ", id='" + mId + '\'' +
- ", priority=" + mPriority +
- ", title='" + mTitle + '\'' +
- ", description='" + mDescription + '\'' +
- ", longDescription='" + mLongDescription + '\'' +
- ", startFromSeason=" + mStartFromSeason +
- ", startFromEpisode=" + mStartFromEpisode +
- ", channelOption=" + mChannelOption +
- ", canonicalGenreIds=" + Arrays.toString(mCanonicalGenreIds) +
- ", posterUri=" + mPosterUri +
- ", photoUri=" + mPhotoUri +
- ", state=" + mState +
- '}';
- }
-
- private SeriesRecording(long id, long priority, String title, String description,
- String longDescription, String inputId, long channelId, String seriesId,
- int startFromSeason, int startFromEpisode, int channelOption, int[] canonicalGenreIds,
- String posterUri, String photoUri, int state) {
- this.mId = id;
- this.mPriority = priority;
- this.mTitle = title;
- this.mDescription = description;
- this.mLongDescription = longDescription;
- this.mInputId = inputId;
- this.mChannelId = channelId;
- this.mSeriesId = seriesId;
- this.mStartFromSeason = startFromSeason;
- this.mStartFromEpisode = startFromEpisode;
- this.mChannelOption = channelOption;
- this.mCanonicalGenreIds = canonicalGenreIds;
- this.mPosterUri = posterUri;
- this.mPhotoUri = photoUri;
- this.mState = state;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int paramInt) {
- out.writeLong(mId);
- out.writeLong(mPriority);
- out.writeString(mTitle);
- out.writeString(mDescription);
- out.writeString(mLongDescription);
- out.writeString(mInputId);
- out.writeLong(mChannelId);
- out.writeString(mSeriesId);
- out.writeInt(mStartFromSeason);
- out.writeInt(mStartFromEpisode);
- out.writeInt(mChannelOption);
- out.writeIntArray(mCanonicalGenreIds);
- out.writeString(mPosterUri);
- out.writeString(mPhotoUri);
- out.writeInt(mState);
- }
-
- /**
- * Returns an array containing all of the elements in the list.
- */
- public static SeriesRecording[] toArray(Collection<SeriesRecording> series) {
- return series.toArray(new SeriesRecording[series.size()]);
- }
-
- /**
- * Returns {@code true} if the {@code program} is part of the series and meets the season and
- * episode constraints.
- */
- public boolean matchProgram(Program program) {
- return matchProgram(program, mChannelOption);
- }
-
- /**
- * Returns {@code true} if the {@code program} is part of the series and meets the season and
- * episode constraints. It checks the channel option only if {@code checkChannelOption} is
- * {@code true}.
- */
- public boolean matchProgram(Program program, @ChannelOption int channelOption) {
- String seriesId = program.getSeriesId();
- long channelId = program.getChannelId();
- String seasonNumber = program.getSeasonNumber();
- String episodeNumber = program.getEpisodeNumber();
- if (!mSeriesId.equals(seriesId) || (channelOption == SeriesRecording.OPTION_CHANNEL_ONE
- && mChannelId != channelId)) {
- return false;
- }
- // Season number and episode number matches if
- // start_season_number < program_season_number
- // || (start_season_number == program_season_number
- // && start_episode_number <= program_episode_number).
- if (mStartFromSeason == SeriesRecordings.THE_BEGINNING
- || TextUtils.isEmpty(seasonNumber)) {
- return true;
- } else {
- int intSeasonNumber;
- try {
- intSeasonNumber = Integer.valueOf(seasonNumber);
- } catch (NumberFormatException e) {
- return true;
- }
- if (intSeasonNumber > mStartFromSeason) {
- return true;
- } else if (intSeasonNumber < mStartFromSeason) {
- return false;
- }
- }
- if (mStartFromEpisode == SeriesRecordings.THE_BEGINNING
- || TextUtils.isEmpty(episodeNumber)) {
- return true;
- } else {
- int intEpisodeNumber;
- try {
- intEpisodeNumber = Integer.valueOf(episodeNumber);
- } catch (NumberFormatException e) {
- return true;
- }
- return intEpisodeNumber >= mStartFromEpisode;
- }
- }
-}