165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/*
265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Copyright (C) 2015 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
176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopackage com.android.tv.dvr.data;
1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
1965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.content.ContentValues;
2065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.database.Cursor;
2165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.os.Parcel;
2265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.os.Parcelable;
2365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.annotation.IntDef;
2465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.annotation.VisibleForTesting;
2565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.text.TextUtils;
2665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
27d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalkoimport com.android.tv.data.BaseProgram;
2865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.data.Program;
296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.dvr.DvrScheduleManager;
3065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.dvr.provider.DvrContract.SeriesRecordings;
3165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.util.Utils;
3265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
3365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.lang.annotation.Retention;
3465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.lang.annotation.RetentionPolicy;
3565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Arrays;
3665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Collection;
3765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Comparator;
3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Objects;
3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
4065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/**
4165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Schedules the recording of a Series of Programs.
4265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
4365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * <p>
4465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Contains the data needed to create new ScheduleRecordings as the programs become available in
4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * the EPG.
4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */
4765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopublic class SeriesRecording implements Parcelable {
4865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
4965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Indicates that the ID is not assigned yet.
5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final long ID_NOT_SET = 0;
5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
5365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The default priority of this recording.
5565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
5665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final long DEFAULT_PRIORITY = Long.MAX_VALUE >> 1;
5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Retention(RetentionPolicy.SOURCE)
5965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @IntDef(flag = true,
6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            value = {OPTION_CHANNEL_ONE, OPTION_CHANNEL_ALL})
6165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public @interface ChannelOption {}
6265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
6365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * An option which indicates that the episodes in one channel are recorded.
6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
6565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final int OPTION_CHANNEL_ONE = 0;
6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
6765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * An option which indicates that the episodes in all the channels are recorded.
6865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
6965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final int OPTION_CHANNEL_ALL = 1;
7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
7165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Retention(RetentionPolicy.SOURCE)
7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @IntDef(flag = true,
73d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko            value = {STATE_SERIES_NORMAL, STATE_SERIES_STOPPED})
74d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public @interface SeriesState {}
7565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
7665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
7765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The state indicates that the series recording is a normal one.
7865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
7965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final int STATE_SERIES_NORMAL = 0;
8065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
8165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
82d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * The state indicates that the series recording is stopped.
8365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
84d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public static final int STATE_SERIES_STOPPED = 1;
8565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
8665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Compare priority in descending order.
8865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
8965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final Comparator<SeriesRecording> PRIORITY_COMPARATOR =
9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            new Comparator<SeriesRecording>() {
9165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
9265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public int compare(SeriesRecording lhs, SeriesRecording rhs) {
9365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            int value = Long.compare(rhs.mPriority, lhs.mPriority);
9465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            if (value == 0) {
9565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                // New recording has the higher priority.
9665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                value = Long.compare(rhs.mId, lhs.mId);
9765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            }
9865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return value;
9965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
10065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    };
10165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
10265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
10365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Compare ID in ascending order.
10465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
10565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final Comparator<SeriesRecording> ID_COMPARATOR =
10665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            new Comparator<SeriesRecording>() {
10765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                @Override
10865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                public int compare(SeriesRecording lhs, SeriesRecording rhs) {
10965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                    return Long.compare(lhs.mId, rhs.mId);
11065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                }
11165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            };
11265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
11365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
114d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * Creates a new Builder with the values set from the series information of {@link BaseProgram}.
11565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
116d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public static Builder builder(String inputId, BaseProgram p) {
11765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return new Builder()
11865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setInputId(inputId)
11965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setSeriesId(p.getSeriesId())
12065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelId(p.getChannelId())
12165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setTitle(p.getTitle())
12265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setDescription(p.getDescription())
12365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setLongDescription(p.getLongDescription())
12465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setCanonicalGenreIds(p.getCanonicalGenreIds())
12565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPosterUri(p.getPosterArtUri())
12665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPhotoUri(p.getThumbnailUri());
12765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
12865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
12965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
13065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Creates a new Builder with the values set from an existing {@link SeriesRecording}.
13165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
13265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static Builder buildFrom(SeriesRecording r) {
13365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return new Builder()
13465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setId(r.mId)
13565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setInputId(r.getInputId())
13665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelId(r.getChannelId())
13765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPriority(r.getPriority())
13865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setTitle(r.getTitle())
13965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setDescription(r.getDescription())
14065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setLongDescription(r.getLongDescription())
14165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setSeriesId(r.getSeriesId())
14265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setStartFromEpisode(r.getStartFromEpisode())
14365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setStartFromSeason(r.getStartFromSeason())
14465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelOption(r.getChannelOption())
14565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setCanonicalGenreIds(r.getCanonicalGenreIds())
14665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPosterUri(r.getPosterUri())
14765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPhotoUri(r.getPhotoUri())
14865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setState(r.getState());
14965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
15065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
15165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
15265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Use this projection if you want to create {@link SeriesRecording} object using
15365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * {@link #fromCursor}.
15465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
15565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final String[] PROJECTION = {
15665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            // Columns must match what is read in fromCursor()
15765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings._ID,
15865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_INPUT_ID,
15965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_CHANNEL_ID,
16065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_PRIORITY,
16165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_TITLE,
16265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_SHORT_DESCRIPTION,
16365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_LONG_DESCRIPTION,
16465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_SERIES_ID,
16565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_START_FROM_EPISODE,
16665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_START_FROM_SEASON,
16765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_CHANNEL_OPTION,
16865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_CANONICAL_GENRE,
16965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_POSTER_URI,
17065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_PHOTO_URI,
17165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            SeriesRecordings.COLUMN_STATE
17265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    };
17365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
17465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Creates {@link SeriesRecording} object from the given {@link Cursor}.
17565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
17665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static SeriesRecording fromCursor(Cursor c) {
17765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        int index = -1;
17865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return new Builder()
17965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setId(c.getLong(++index))
18065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setInputId(c.getString(++index))
18165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelId(c.getLong(++index))
18265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPriority(c.getLong(++index))
18365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setTitle(c.getString(++index))
18465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setDescription(c.getString(++index))
18565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setLongDescription(c.getString(++index))
18665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setSeriesId(c.getString(++index))
18765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setStartFromEpisode(c.getInt(++index))
18865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setStartFromSeason(c.getInt(++index))
18965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelOption(channelOption(c.getString(++index)))
19065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setCanonicalGenreIds(c.getString(++index))
19165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPosterUri(c.getString(++index))
19265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPhotoUri(c.getString(++index))
193d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko                .setState(seriesRecordingState(c.getString(++index)))
19465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .build();
19565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
19665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
19765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
19865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns the ContentValues with keys as the columns specified in {@link SeriesRecordings}
19965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * and the values from {@code r}.
20065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
20165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static ContentValues toContentValues(SeriesRecording r) {
20265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        ContentValues values = new ContentValues();
20365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        if (r.getId() != ID_NOT_SET) {
20465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            values.put(SeriesRecordings._ID, r.getId());
20565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        } else {
20665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            values.putNull(SeriesRecordings._ID);
20765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
20865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_INPUT_ID, r.getInputId());
20965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_CHANNEL_ID, r.getChannelId());
21065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_PRIORITY, r.getPriority());
21165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_TITLE, r.getTitle());
21265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_SHORT_DESCRIPTION, r.getDescription());
21365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_LONG_DESCRIPTION, r.getLongDescription());
21465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_SERIES_ID, r.getSeriesId());
21565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_START_FROM_EPISODE, r.getStartFromEpisode());
21665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_START_FROM_SEASON, r.getStartFromSeason());
21765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_CHANNEL_OPTION,
21865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                channelOption(r.getChannelOption()));
21965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_CANONICAL_GENRE,
22065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                Utils.getCanonicalGenre(r.getCanonicalGenreIds()));
22165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_POSTER_URI, r.getPosterUri());
22265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        values.put(SeriesRecordings.COLUMN_PHOTO_URI, r.getPhotoUri());
223d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        values.put(SeriesRecordings.COLUMN_STATE, seriesRecordingState(r.getState()));
22465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return values;
22565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
22665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
22765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private static String channelOption(@ChannelOption int option) {
22865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        switch (option) {
22965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            case OPTION_CHANNEL_ONE:
23065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return SeriesRecordings.OPTION_CHANNEL_ONE;
23165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            case OPTION_CHANNEL_ALL:
23265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return SeriesRecordings.OPTION_CHANNEL_ALL;
23365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
23465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return SeriesRecordings.OPTION_CHANNEL_ONE;
23565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
23665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
23765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @ChannelOption private static int channelOption(String option) {
23865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        switch (option) {
23965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            case SeriesRecordings.OPTION_CHANNEL_ONE:
24065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return OPTION_CHANNEL_ONE;
24165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            case SeriesRecordings.OPTION_CHANNEL_ALL:
24265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return OPTION_CHANNEL_ALL;
24365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
24465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return OPTION_CHANNEL_ONE;
24565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
24665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
247d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    private static String seriesRecordingState(@SeriesState int state) {
24865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        switch (state) {
24965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            case STATE_SERIES_NORMAL:
25065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return SeriesRecordings.STATE_SERIES_NORMAL;
251d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko            case STATE_SERIES_STOPPED:
252d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko                return SeriesRecordings.STATE_SERIES_STOPPED;
25365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
25465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return SeriesRecordings.STATE_SERIES_NORMAL;
25565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
25665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
257d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    @SeriesState private static int seriesRecordingState(String state) {
25865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        switch (state) {
25965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            case SeriesRecordings.STATE_SERIES_NORMAL:
26065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return STATE_SERIES_NORMAL;
261d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko            case SeriesRecordings.STATE_SERIES_STOPPED:
262d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko                return STATE_SERIES_STOPPED;
26365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
26465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return STATE_SERIES_NORMAL;
26565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
26665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
26765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
26865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Builder for {@link SeriesRecording}.
26965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
27065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static class Builder {
27165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private long mId = ID_NOT_SET;
27265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private long mPriority = DvrScheduleManager.DEFAULT_SERIES_PRIORITY;
27365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mTitle;
27465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mDescription;
27565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mLongDescription;
27665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mInputId;
27765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private long mChannelId;
27865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mSeriesId;
27965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private int mStartFromSeason = SeriesRecordings.THE_BEGINNING;
28065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private int mStartFromEpisode = SeriesRecordings.THE_BEGINNING;
28165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private int mChannelOption = OPTION_CHANNEL_ONE;
28265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private int[] mCanonicalGenreIds;
28365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mPosterUri;
28465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private String mPhotoUri;
28565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        private int mState = SeriesRecording.STATE_SERIES_NORMAL;
28665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
28765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
28865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getId()
28965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
29065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setId(long id) {
29165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mId = id;
29265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
29365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
29465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
29565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
29665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getPriority() ()
29765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
29865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setPriority(long priority) {
29965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mPriority = priority;
30065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
30165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
30265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
30365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
30465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getTitle()
30565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
30665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setTitle(String title) {
30765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mTitle = title;
30865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
30965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
31065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
31165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
31265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getDescription()
31365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
31465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setDescription(String description) {
31565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mDescription = description;
31665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
31765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
31865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
31965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
32065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getLongDescription()
32165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
32265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setLongDescription(String longDescription) {
32365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mLongDescription = longDescription;
32465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
32565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
32665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
32765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
32865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getInputId()
32965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
33065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setInputId(String inputId) {
33165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mInputId = inputId;
33265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
33365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
334d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
33565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
33665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getChannelId()
33765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
33865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setChannelId(long channelId) {
33965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mChannelId = channelId;
34065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
34165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
34265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
34365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
34465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getSeriesId()
34565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
34665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setSeriesId(String seriesId) {
34765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mSeriesId = seriesId;
34865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
34965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
35065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
35165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
35265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getStartFromSeason()
35365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
35465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setStartFromSeason(int startFromSeason) {
35565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mStartFromSeason = startFromSeason;
35665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
35765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
35865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
35965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
36065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getChannelOption()
36165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
36265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setChannelOption(@ChannelOption int option) {
36365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mChannelOption = option;
36465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
36565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
36665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
36765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
36865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getStartFromEpisode()
36965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
37065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setStartFromEpisode(int startFromEpisode) {
37165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mStartFromEpisode = startFromEpisode;
37265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
37365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
37465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
37565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
37665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getCanonicalGenreIds()
37765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
37865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setCanonicalGenreIds(String genres) {
37965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mCanonicalGenreIds = Utils.getCanonicalGenreIds(genres);
38065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
38165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
38265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
38365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
38465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getCanonicalGenreIds()
38565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
38665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setCanonicalGenreIds(int[] canonicalGenreIds) {
38765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mCanonicalGenreIds = canonicalGenreIds;
38865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
38965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
39065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
39165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
39265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getPosterUri()
39365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
39465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setPosterUri(String posterUri) {
39565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mPosterUri = posterUri;
39665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
39765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
39865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
39965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
40065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getPhotoUri()
40165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
40265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setPhotoUri(String photoUri) {
40365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mPhotoUri = photoUri;
40465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
40565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
40665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
40765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
40865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * @see #getState()
40965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
41065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public Builder setState(@SeriesState int state) {
41165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            mState = state;
41265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return this;
41365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
41465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
41565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        /**
41665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         * Creates a new {@link SeriesRecording}.
41765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko         */
41865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public SeriesRecording build() {
41965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return new SeriesRecording(mId, mPriority, mTitle, mDescription, mLongDescription,
42065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                    mInputId, mChannelId, mSeriesId, mStartFromSeason, mStartFromEpisode,
42165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                    mChannelOption, mCanonicalGenreIds, mPosterUri, mPhotoUri, mState);
42265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
42365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
42465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
42565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static SeriesRecording fromParcel(Parcel in) {
42665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return new Builder()
42765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setId(in.readLong())
42865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPriority(in.readLong())
42965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setTitle(in.readString())
43065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setDescription(in.readString())
43165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setLongDescription(in.readString())
43265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setInputId(in.readString())
43365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelId(in.readLong())
43465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setSeriesId(in.readString())
43565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setStartFromSeason(in.readInt())
43665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setStartFromEpisode(in.readInt())
43765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setChannelOption(in.readInt())
43865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setCanonicalGenreIds(in.createIntArray())
43965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPosterUri(in.readString())
44065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setPhotoUri(in.readString())
44165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .setState(in.readInt())
44265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                .build();
44365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
44465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
44565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static final Parcelable.Creator<SeriesRecording> CREATOR =
44665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            new Parcelable.Creator<SeriesRecording>() {
44765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
44865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public SeriesRecording createFromParcel(Parcel in) {
44965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko          return SeriesRecording.fromParcel(in);
45065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
45165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
45265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
45365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public SeriesRecording[] newArray(int size) {
45465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko          return new SeriesRecording[size];
45565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
45665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    };
45765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
45865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private long mId;
45965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final long mPriority;
46065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mTitle;
46165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mDescription;
46265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mLongDescription;
46365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mInputId;
46465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final long mChannelId;
46565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mSeriesId;
46665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final int mStartFromSeason;
46765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final int mStartFromEpisode;
46865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @ChannelOption private final int mChannelOption;
46965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final int[] mCanonicalGenreIds;
47065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mPosterUri;
47165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private final String mPhotoUri;
47265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @SeriesState private int mState;
47365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
47465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
47565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The input id of this SeriesRecording.
47665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
47765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getInputId() {
47865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mInputId;
47965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
48065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
48165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
482d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * The channelId to match. The channel ID might not be valid when the channel option is "ALL".
48365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
48465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public long getChannelId() {
48565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mChannelId;
48665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
48765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
48865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
48965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The id of this SeriesRecording.
49065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
49165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public long getId() {
49265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mId;
49365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
49465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
49565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
49665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Sets the ID.
49765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
49865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public void setId(long id) {
49965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        mId = id;
50065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
50165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
50265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
50365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The priority of this recording.
50465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     *
50565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * <p> The highest number is recorded first. If there is a tie in mPriority then the higher mId
50665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * wins.
50765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
50865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public long getPriority() {
50965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mPriority;
51065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
51165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
51265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
51365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The series title.
51465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
51565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getTitle() {
51665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mTitle;
51765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
51865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
51965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
52065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The series description.
52165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
52265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getDescription() {
52365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mDescription;
52465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
52565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
52665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
52765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * The long series description.
52865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
52965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getLongDescription() {
53065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mLongDescription;
53165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
53265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
53365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
53465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * SeriesId when not null is used to match programs instead of using title and channelId.
53565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     *
53665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * <p>SeriesId is an opaque but stable string.
53765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
53865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getSeriesId() {
53965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mSeriesId;
54065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
54165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
54265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
54365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * If not == {@link SeriesRecordings#THE_BEGINNING} and seasonNumber == startFromSeason then
54465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * only record episodes with a episodeNumber >= this
54565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
54665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public int getStartFromEpisode() {
54765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mStartFromEpisode;
54865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
54965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
55065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
55165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * If not == {@link SeriesRecordings#THE_BEGINNING} then only record episodes with a
55265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * seasonNumber >= this
55365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
55465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public int getStartFromSeason() {
55565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mStartFromSeason;
55665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
55765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
55865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
55965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns the channel recording option.
56065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
56165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @ChannelOption public int getChannelOption() {
56265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mChannelOption;
56365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
56465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
56565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
56665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns the canonical genre ID's.
56765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
56865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public int[] getCanonicalGenreIds() {
56965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mCanonicalGenreIds;
57065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
57165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
57265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
57365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns the poster URI.
57465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
57565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getPosterUri() {
57665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mPosterUri;
57765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
57865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
57965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
58065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns the photo URI.
58165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
58265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String getPhotoUri() {
58365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mPhotoUri;
58465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
58565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
58665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
58765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns the state of series recording.
58865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
58965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @SeriesState public int getState() {
59065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mState;
59165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
59265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
593d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    /**
594d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * Checks whether the series recording is stopped or not.
595d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     */
596d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public boolean isStopped() {
597d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        return mState == STATE_SERIES_STOPPED;
598d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    }
599d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
60065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
60165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public boolean equals(Object o) {
60265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        if (this == o) return true;
60365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        if (!(o instanceof SeriesRecording)) return false;
60465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        SeriesRecording that = (SeriesRecording) o;
60565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return mPriority == that.mPriority
60665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && mChannelId == that.mChannelId
60765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && mStartFromSeason == that.mStartFromSeason
60865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && mStartFromEpisode == that.mStartFromEpisode
60965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mId, that.mId)
61065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mTitle, that.mTitle)
61165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mDescription, that.mDescription)
61265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mLongDescription, that.mLongDescription)
61365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mSeriesId, that.mSeriesId)
61465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && mChannelOption == that.mChannelOption
61565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Arrays.equals(mCanonicalGenreIds, that.mCanonicalGenreIds)
61665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mPosterUri, that.mPosterUri)
61765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && Objects.equals(mPhotoUri, that.mPhotoUri)
61865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && mState == that.mState;
61965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
62065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
62165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
62265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public int hashCode() {
62365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return Objects.hash(mPriority, mChannelId, mStartFromSeason, mStartFromEpisode, mId,
62465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                mTitle, mDescription, mLongDescription, mSeriesId, mChannelOption,
62565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                mCanonicalGenreIds, mPosterUri, mPhotoUri, mState);
62665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
62765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
62865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
62965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public String toString() {
63065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return "SeriesRecording{" +
63165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                "inputId=" + mInputId +
63265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", channelId=" + mChannelId +
63365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", id='" + mId + '\'' +
63465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", priority=" + mPriority +
63565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", title='" + mTitle + '\'' +
63665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", description='" + mDescription + '\'' +
63765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", longDescription='" + mLongDescription + '\'' +
63865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", startFromSeason=" + mStartFromSeason +
63965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", startFromEpisode=" + mStartFromEpisode +
64065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", channelOption=" + mChannelOption +
64165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", canonicalGenreIds=" + Arrays.toString(mCanonicalGenreIds) +
64265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", posterUri=" + mPosterUri +
64365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", photoUri=" + mPhotoUri +
64465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                ", state=" + mState +
64565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                '}';
64665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
64765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
64865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private SeriesRecording(long id, long priority, String title, String description,
64965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            String longDescription, String inputId, long channelId, String seriesId,
65065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            int startFromSeason, int startFromEpisode, int channelOption, int[] canonicalGenreIds,
65165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            String posterUri, String photoUri, int state) {
65265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mId = id;
65365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mPriority = priority;
65465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mTitle = title;
65565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mDescription = description;
65665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mLongDescription = longDescription;
65765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mInputId = inputId;
65865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mChannelId = channelId;
65965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mSeriesId = seriesId;
66065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mStartFromSeason = startFromSeason;
66165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mStartFromEpisode = startFromEpisode;
66265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mChannelOption = channelOption;
66365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mCanonicalGenreIds = canonicalGenreIds;
66465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mPosterUri = posterUri;
66565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mPhotoUri = photoUri;
66665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        this.mState = state;
66765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
66865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
66965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
67065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public int describeContents() {
67165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return 0;
67265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
67365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
67465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
67565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public void writeToParcel(Parcel out, int paramInt) {
67665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeLong(mId);
67765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeLong(mPriority);
67865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mTitle);
67965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mDescription);
68065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mLongDescription);
68165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mInputId);
68265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeLong(mChannelId);
68365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mSeriesId);
68465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeInt(mStartFromSeason);
68565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeInt(mStartFromEpisode);
68665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeInt(mChannelOption);
68765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeIntArray(mCanonicalGenreIds);
68865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mPosterUri);
68965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeString(mPhotoUri);
69065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        out.writeInt(mState);
69165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
69265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
69365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
69465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns an array containing all of the elements in the list.
69565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
69665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static SeriesRecording[] toArray(Collection<SeriesRecording> series) {
69765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return series.toArray(new SeriesRecording[series.size()]);
69865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
69965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
70065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
70165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns {@code true} if the {@code program} is part of the series and meets the season and
70265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * episode constraints.
70365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
70465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public boolean matchProgram(Program program) {
705d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        return matchProgram(program, mChannelOption);
70665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
70765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
70865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
70965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Returns {@code true} if the {@code program} is part of the series and meets the season and
71065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * episode constraints. It checks the channel option only if {@code checkChannelOption} is
71165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * {@code true}.
71265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
713d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public boolean matchProgram(Program program, @ChannelOption int channelOption) {
71465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        String seriesId = program.getSeriesId();
71565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        long channelId = program.getChannelId();
71665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        String seasonNumber = program.getSeasonNumber();
71765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        String episodeNumber = program.getEpisodeNumber();
718d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        if (!mSeriesId.equals(seriesId) || (channelOption == SeriesRecording.OPTION_CHANNEL_ONE
71965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                && mChannelId != channelId)) {
72065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return false;
72165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
72265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        // Season number and episode number matches if
72365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        // start_season_number < program_season_number
72465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        // || (start_season_number == program_season_number
72565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        // && start_episode_number <= program_episode_number).
72665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        if (mStartFromSeason == SeriesRecordings.THE_BEGINNING
72765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                || TextUtils.isEmpty(seasonNumber)) {
72865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return true;
72965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        } else {
73065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            int intSeasonNumber;
73165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            try {
73265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                intSeasonNumber = Integer.valueOf(seasonNumber);
73365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            } catch (NumberFormatException e) {
73465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return true;
73565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            }
73665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            if (intSeasonNumber > mStartFromSeason) {
73765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return true;
73865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            } else if (intSeasonNumber < mStartFromSeason) {
73965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return false;
74065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            }
74165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
74265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        if (mStartFromEpisode == SeriesRecordings.THE_BEGINNING
74365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                || TextUtils.isEmpty(episodeNumber)) {
74465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return true;
74565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        } else {
74665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            int intEpisodeNumber;
74765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            try {
74865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                intEpisodeNumber = Integer.valueOf(episodeNumber);
74965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            } catch (NumberFormatException e) {
75065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                return true;
75165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            }
75265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return intEpisodeNumber >= mStartFromEpisode;
75365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
75465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
75565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko}
756