aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/data/BaseProgram.java
blob: 4e36c80a061e230cd981a9f707330c0d246dd4ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.tv.data;

import android.content.Context;
import android.media.tv.TvContentRating;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import com.android.tv.R;

import java.util.Comparator;

/**
 * Base class for {@link com.android.tv.data.Program} and
 * {@link com.android.tv.dvr.data.RecordedProgram}.
 */
public abstract class BaseProgram {
    /**
     * Comparator used to compare {@link BaseProgram} according to its season and episodes number.
     * If a program's season or episode number is null, it will be consider "smaller" than programs
     * with season or episode numbers.
     */
    public static final Comparator<BaseProgram> EPISODE_COMPARATOR =
            new EpisodeComparator(false);

    /**
     * Comparator used to compare {@link BaseProgram} according to its season and episodes number
     * with season numbers in a reversed order. If a program's season or episode number is null, it
     * will be consider "smaller" than programs with season or episode numbers.
     */
    public static final Comparator<BaseProgram> SEASON_REVERSED_EPISODE_COMPARATOR =
            new EpisodeComparator(true);

    private static class EpisodeComparator implements Comparator<BaseProgram> {
        private final boolean mReversedSeason;

        EpisodeComparator(boolean reversedSeason) {
            mReversedSeason = reversedSeason;
        }

        @Override
        public int compare(BaseProgram lhs, BaseProgram rhs) {
            if (lhs == rhs) {
                return 0;
            }
            int seasonNumberCompare =
                    numberCompare(lhs.getSeasonNumber(), rhs.getSeasonNumber());
            if (seasonNumberCompare != 0) {
                return mReversedSeason ? -seasonNumberCompare : seasonNumberCompare;
            } else {
                return numberCompare(lhs.getEpisodeNumber(), rhs.getEpisodeNumber());
            }
        }
    }

    /**
     * Compares two strings represent season numbers or episode numbers of programs.
     */
    public static int numberCompare(String s1, String s2) {
        if (s1 == s2) {
            return 0;
        } else if (s1 == null) {
            return -1;
        } else if (s2 == null) {
            return 1;
        } else if (s1.equals(s2)) {
            return 0;
        }
        try {
            return Integer.compare(Integer.parseInt(s1), Integer.parseInt(s2));
        } catch (NumberFormatException e) {
            return s1.compareTo(s2);
        }
    }

    /**
     * Returns ID of the program.
     */
    abstract public long getId();

    /**
     * Returns the title of the program.
     */
    abstract public String getTitle();

    /**
     * Returns the episode title.
     */
    abstract public String getEpisodeTitle();

    /**
     * Returns the displayed title of the program episode.
     */
    public String getEpisodeDisplayTitle(Context context) {
        if (!TextUtils.isEmpty(getEpisodeNumber())) {
            String episodeTitle = getEpisodeTitle() == null ? "" : getEpisodeTitle();
            if (TextUtils.equals(getSeasonNumber(), "0")) {
                // Do not show "S0: ".
                return String.format(context.getResources().getString(
                        R.string.display_episode_title_format_no_season_number),
                        getEpisodeNumber(), episodeTitle);
            } else {
                return String.format(context.getResources().getString(
                        R.string.display_episode_title_format),
                        getSeasonNumber(), getEpisodeNumber(), episodeTitle);
            }
        }
        return getEpisodeTitle();
    }

    /**
     * Returns the description of the program.
     */
    abstract public String getDescription();

    /**
     * Returns the long description of the program.
     */
    abstract public String getLongDescription();

    /**
     * Returns the start time of the program in Milliseconds.
     */
    abstract public long getStartTimeUtcMillis();

    /**
     * Returns the end time of the program in Milliseconds.
     */
    abstract public long getEndTimeUtcMillis();

    /**
     * Returns the duration of the program in Milliseconds.
     */
    abstract public long getDurationMillis();

    /**
     * Returns the series ID.
     */
    abstract public String getSeriesId();

    /**
     * Returns the season number.
     */
    abstract public String getSeasonNumber();

    /**
     * Returns the episode number.
     */
    abstract public String getEpisodeNumber();

    /**
     * Returns URI of the program's poster.
     */
    abstract public String getPosterArtUri();

    /**
     * Returns URI of the program's thumbnail.
     */
    abstract public String getThumbnailUri();

    /**
     * Returns the array of the ID's of the canonical genres.
     */
    abstract public int[] getCanonicalGenreIds();

    /** Returns the array of content ratings. */
    @Nullable
    abstract public TvContentRating[] getContentRatings();

    /**
     * Returns channel's ID of the program.
     */
    abstract public long getChannelId();

    /**
     * Returns if the program is valid.
     */
    abstract public boolean isValid();

    /**
     * Checks whether the program is episodic or not.
     */
    public boolean isEpisodic() {
        return getSeriesId() != null;
    }

    /**
     * Generates the series ID for the other inputs than the tuner TV input.
     */
    public static String generateSeriesId(String packageName, String title) {
        return packageName + "/" + title;
    }
}