1 package com.android.tv.data.api; 2 3 import android.content.Context; 4 import android.media.tv.TvContentRating; 5 import android.support.annotation.Nullable; 6 import com.google.common.collect.ImmutableList; 7 import java.util.Comparator; 8 import java.util.Objects; 9 10 /** 11 * Base class for {@link com.android.tv.data.Program} and {@link 12 * com.android.tv.dvr.data.RecordedProgram}. 13 */ 14 public interface BaseProgram { 15 16 /** 17 * Comparator used to compare {@link BaseProgram} according to its season and episodes number. 18 * If a program's season or episode number is null, it will be consider "smaller" than programs 19 * with season or episode numbers. 20 */ 21 Comparator<BaseProgram> EPISODE_COMPARATOR = new EpisodeComparator(false); 22 /** 23 * Comparator used to compare {@link BaseProgram} according to its season and episodes number 24 * with season numbers in a reversed order. If a program's season or episode number is null, it 25 * will be consider "smaller" than programs with season or episode numbers. 26 */ 27 Comparator<BaseProgram> SEASON_REVERSED_EPISODE_COMPARATOR = new EpisodeComparator(true); 28 29 String COLUMN_SERIES_ID = "series_id"; 30 String COLUMN_STATE = "state"; 31 32 /** Compares two strings represent season numbers or episode numbers of programs. */ numberCompare(String s1, String s2)33 static int numberCompare(String s1, String s2) { 34 if (Objects.equals(s1, s2)) { 35 return 0; 36 } else if (s1 == null) { 37 return -1; 38 } else if (s2 == null) { 39 return 1; 40 } else if (s1.equals(s2)) { 41 return 0; 42 } 43 try { 44 return Integer.compare(Integer.parseInt(s1), Integer.parseInt(s2)); 45 } catch (NumberFormatException e) { 46 return s1.compareTo(s2); 47 } 48 } 49 50 /** Generates the series ID for the other inputs than the tuner TV input. */ generateSeriesId(String packageName, String title)51 static String generateSeriesId(String packageName, String title) { 52 return packageName + "/" + title; 53 } 54 55 /** Returns ID of the program. */ getId()56 long getId(); 57 58 /** Returns the title of the program. */ getTitle()59 String getTitle(); 60 61 /** Returns the episode title. */ getEpisodeTitle()62 String getEpisodeTitle(); 63 64 /** Returns the displayed title of the program episode. */ 65 @Nullable getEpisodeDisplayTitle(Context context)66 String getEpisodeDisplayTitle(Context context); 67 68 /** 69 * Returns the content description of the program episode, suitable for being spoken by an 70 * accessibility service. 71 */ getEpisodeContentDescription(Context context)72 String getEpisodeContentDescription(Context context); 73 74 /** Returns the description of the program. */ getDescription()75 String getDescription(); 76 77 /** Returns the long description of the program. */ getLongDescription()78 String getLongDescription(); 79 80 /** Returns the start time of the program in Milliseconds. */ getStartTimeUtcMillis()81 long getStartTimeUtcMillis(); 82 83 /** Returns the end time of the program in Milliseconds. */ getEndTimeUtcMillis()84 long getEndTimeUtcMillis(); 85 86 /** Returns the duration of the program in Milliseconds. */ getDurationMillis()87 long getDurationMillis(); 88 89 /** Returns the series ID. */ 90 @Nullable getSeriesId()91 String getSeriesId(); 92 93 /** Returns the season number. */ getSeasonNumber()94 String getSeasonNumber(); 95 96 /** Returns the episode number. */ getEpisodeNumber()97 String getEpisodeNumber(); 98 99 /** Returns URI of the program's poster. */ getPosterArtUri()100 String getPosterArtUri(); 101 102 /** Returns URI of the program's thumbnail. */ getThumbnailUri()103 String getThumbnailUri(); 104 105 /** Returns the array of the ID's of the canonical genres. */ getCanonicalGenreIds()106 int[] getCanonicalGenreIds(); 107 108 /** Returns the array of content ratings. */ getContentRatings()109 ImmutableList<TvContentRating> getContentRatings(); 110 111 /** Returns channel's ID of the program. */ getChannelId()112 long getChannelId(); 113 114 /** Returns if the program is valid. */ isValid()115 boolean isValid(); 116 117 /** Checks whether the program is episodic or not. */ isEpisodic()118 boolean isEpisodic(); 119 120 /** Generates the series ID for the other inputs than the tuner TV input. */ 121 class EpisodeComparator implements Comparator<BaseProgram> { 122 private final boolean mReversedSeason; 123 EpisodeComparator(boolean reversedSeason)124 EpisodeComparator(boolean reversedSeason) { 125 mReversedSeason = reversedSeason; 126 } 127 128 @Override compare(BaseProgram lhs, BaseProgram rhs)129 public int compare(BaseProgram lhs, BaseProgram rhs) { 130 if (lhs == rhs) { 131 return 0; 132 } 133 int seasonNumberCompare = numberCompare(lhs.getSeasonNumber(), rhs.getSeasonNumber()); 134 if (seasonNumberCompare != 0) { 135 return mReversedSeason ? -seasonNumberCompare : seasonNumberCompare; 136 } else { 137 return numberCompare(lhs.getEpisodeNumber(), rhs.getEpisodeNumber()); 138 } 139 } 140 } 141 } 142