diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-02-15 23:33:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-02-15 23:33:19 +0000 |
commit | 602eaad8056a646878d921ed9313e7c2dfc764a9 (patch) | |
tree | d70fc0dd83205e1e9a85b74b51fffb8788398c57 | |
parent | 7bba4a3bbd7540e687e8ce98b6a128cb2bb506b5 (diff) | |
parent | a4902090d0672e6f058096fa0bc29de1f8b31d3b (diff) | |
download | TV-602eaad8056a646878d921ed9313e7c2dfc764a9.tar.gz |
Merge changes Icd87d0d6,If2348387,I484eb107,I069034b3
* changes:
Add getEpisodeContentDescription to BaseProgram.
Test and handle null series numbers on Program.getEpisodeDisplayTitle
Move GenreItemTest from unit test to robolectric test
Convert ProgramTest to Robolectric
-rw-r--r-- | common/res/values/strings.xml | 8 | ||||
-rw-r--r-- | src/com/android/tv/data/BaseProgram.java | 61 | ||||
-rw-r--r-- | tests/unit/src/com/android/tv/data/GenreItemTest.java | 92 | ||||
-rw-r--r-- | tests/unit/src/com/android/tv/data/ProgramTest.java | 178 |
4 files changed, 55 insertions, 284 deletions
diff --git a/common/res/values/strings.xml b/common/res/values/strings.xml index aa7adac4..1c8a990c 100644 --- a/common/res/values/strings.xml +++ b/common/res/values/strings.xml @@ -35,6 +35,14 @@ "Ep." is an abbreviation for episode. For example, "Ep. 1807 Headline News". --> <string name="display_episode_title_format_no_season_number">Ep. <xliff:g id="episode_number" example="1807">%1$s</xliff:g> <xliff:g id="episode_title" example="Headline News">%2$s</xliff:g></string> + + <!-- The content description for an episode. It will be spoken by accessibility service when needed. + For example, "Season 1 Episode 1 Winter is coming". --> + <string name="content_description_episode_format">Season <xliff:g id="season_number" example="1">%1$s</xliff:g> Episode <xliff:g id="episode_number" example="1">%2$s</xliff:g> <xliff:g id="episode_title" example="Winter is Coming">%3$s</xliff:g></string> + <!-- The content description for an episode. It will be spoken by accessibility service when needed. + For example, "Episode 1807 Headline News". --> + <string name="content_description_episode_format_no_season_number">Episode <xliff:g id="episode_number" example="1807">%1$s</xliff:g> <xliff:g id="episode_title" example="Headline News">%2$s</xliff:g></string> + <!-- Program title with season and episode number used in DVR card views. HTML tag <i> is a placeholder for styling episode number part. "S" is an abbreviation for Season and "Ep." is an abbreviation for episode. ":" is used as a separator. diff --git a/src/com/android/tv/data/BaseProgram.java b/src/com/android/tv/data/BaseProgram.java index 6cb682b8..0fb1e58d 100644 --- a/src/com/android/tv/data/BaseProgram.java +++ b/src/com/android/tv/data/BaseProgram.java @@ -93,24 +93,57 @@ public abstract class BaseProgram { /** 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")) { + String episodeNumber = getEpisodeNumber(); + String episodeTitle = getEpisodeTitle(); + if (!TextUtils.isEmpty(episodeNumber)) { + episodeTitle = episodeTitle == null ? "" : episodeTitle; + String seasonNumber = getSeasonNumber(); + if (TextUtils.isEmpty(seasonNumber) || TextUtils.equals(seasonNumber, "0")) { // Do not show "S0: ". - return String.format( - context.getResources() - .getString(R.string.display_episode_title_format_no_season_number), - getEpisodeNumber(), - episodeTitle); + return context.getResources() + .getString( + R.string.display_episode_title_format_no_season_number, + episodeNumber, + episodeTitle); } else { - return String.format( - context.getResources().getString(R.string.display_episode_title_format), - getSeasonNumber(), - getEpisodeNumber(), - episodeTitle); + return context.getResources() + .getString( + R.string.display_episode_title_format, + seasonNumber, + episodeNumber, + episodeTitle); } } - return getEpisodeTitle(); + return episodeTitle; + } + + /** + * Returns the content description of the program episode, suitable for being spoken by an + * accessibility service. + */ + public String getEpisodeContentDescription(Context context) { + String episodeNumber = getEpisodeNumber(); + String episodeTitle = getEpisodeTitle(); + if (!TextUtils.isEmpty(episodeNumber)) { + episodeTitle = episodeTitle == null ? "" : episodeTitle; + String seasonNumber = getSeasonNumber(); + if (TextUtils.isEmpty(seasonNumber) || TextUtils.equals(seasonNumber, "0")) { + // Do not list season if it is empty or 0 + return context.getResources() + .getString( + R.string.content_description_episode_format_no_season_number, + episodeNumber, + episodeTitle); + } else { + return context.getResources() + .getString( + R.string.content_description_episode_format, + seasonNumber, + episodeNumber, + episodeTitle); + } + } + return episodeTitle; } /** Returns the description of the program. */ diff --git a/tests/unit/src/com/android/tv/data/GenreItemTest.java b/tests/unit/src/com/android/tv/data/GenreItemTest.java deleted file mode 100644 index 02bf4b30..00000000 --- a/tests/unit/src/com/android/tv/data/GenreItemTest.java +++ /dev/null @@ -1,92 +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.data; - -import static android.support.test.InstrumentationRegistry.getTargetContext; -import static com.google.common.truth.Truth.assertThat; - -import android.media.tv.TvContract.Programs.Genres; -import android.os.Build; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** Tests for {@link Channel}. */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class GenreItemTest { - private static final String INVALID_GENRE = "INVALID GENRE"; - - @Test - public void testGetLabels() { - // Checks if no exception is thrown. - GenreItems.getLabels(getTargetContext()); - } - - @Test - public void testGetCanonicalGenre() { - int count = GenreItems.getGenreCount(); - assertThat(GenreItems.getCanonicalGenre(GenreItems.ID_ALL_CHANNELS)).isNull(); - for (int i = 1; i < count; ++i) { - assertThat(GenreItems.getCanonicalGenre(i)).isNotNull(); - } - } - - @Test - public void testGetId_base() { - int count = GenreItems.getGenreCount(); - assertThat(GenreItems.getId(null)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertThat(GenreItems.getId(INVALID_GENRE)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertInRange(GenreItems.getId(Genres.FAMILY_KIDS), 1, count - 1); - assertInRange(GenreItems.getId(Genres.SPORTS), 1, count - 1); - assertInRange(GenreItems.getId(Genres.SHOPPING), 1, count - 1); - assertInRange(GenreItems.getId(Genres.MOVIES), 1, count - 1); - assertInRange(GenreItems.getId(Genres.COMEDY), 1, count - 1); - assertInRange(GenreItems.getId(Genres.TRAVEL), 1, count - 1); - assertInRange(GenreItems.getId(Genres.DRAMA), 1, count - 1); - assertInRange(GenreItems.getId(Genres.EDUCATION), 1, count - 1); - assertInRange(GenreItems.getId(Genres.ANIMAL_WILDLIFE), 1, count - 1); - assertInRange(GenreItems.getId(Genres.NEWS), 1, count - 1); - assertInRange(GenreItems.getId(Genres.GAMING), 1, count - 1); - } - - @Test - public void testGetId_lmp_mr1() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) { - assertThat(GenreItems.getId(Genres.ARTS)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertThat(GenreItems.getId(Genres.ENTERTAINMENT)) - .isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertThat(GenreItems.getId(Genres.LIFE_STYLE)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertThat(GenreItems.getId(Genres.MUSIC)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertThat(GenreItems.getId(Genres.PREMIER)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - assertThat(GenreItems.getId(Genres.TECH_SCIENCE)).isEqualTo(GenreItems.ID_ALL_CHANNELS); - } else { - int count = GenreItems.getGenreCount(); - assertInRange(GenreItems.getId(Genres.ARTS), 1, count - 1); - assertInRange(GenreItems.getId(Genres.ENTERTAINMENT), 1, count - 1); - assertInRange(GenreItems.getId(Genres.LIFE_STYLE), 1, count - 1); - assertInRange(GenreItems.getId(Genres.MUSIC), 1, count - 1); - assertInRange(GenreItems.getId(Genres.PREMIER), 1, count - 1); - assertInRange(GenreItems.getId(Genres.TECH_SCIENCE), 1, count - 1); - } - } - - private void assertInRange(int value, int lower, int upper) { - assertThat(value >= lower && value <= upper).isTrue(); - } -} diff --git a/tests/unit/src/com/android/tv/data/ProgramTest.java b/tests/unit/src/com/android/tv/data/ProgramTest.java deleted file mode 100644 index 3f2a9f26..00000000 --- a/tests/unit/src/com/android/tv/data/ProgramTest.java +++ /dev/null @@ -1,178 +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.data; - -import static android.media.tv.TvContract.Programs.Genres.COMEDY; -import static android.media.tv.TvContract.Programs.Genres.FAMILY_KIDS; -import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; - -import android.media.tv.TvContentRating; -import android.media.tv.TvContract.Programs.Genres; -import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import com.android.tv.data.Program.CriticScore; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** Tests for {@link Program}. */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class ProgramTest { - private static final int NOT_FOUND_GENRE = 987; - - private static final int FAMILY_GENRE_ID = GenreItems.getId(FAMILY_KIDS); - - private static final int COMEDY_GENRE_ID = GenreItems.getId(COMEDY); - - @Test - public void testBuild() { - Program program = new Program.Builder().build(); - assertWithMessage("isValid").that(program.isValid()).isFalse(); - } - - @Test - public void testNoGenres() { - Program program = new Program.Builder().setCanonicalGenres("").build(); - assertNullCanonicalGenres(program); - assertHasGenre(program, NOT_FOUND_GENRE, false); - assertHasGenre(program, FAMILY_GENRE_ID, false); - assertHasGenre(program, COMEDY_GENRE_ID, false); - assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); - } - - @Test - public void testFamilyGenre() { - Program program = new Program.Builder().setCanonicalGenres(FAMILY_KIDS).build(); - assertCanonicalGenres(program, FAMILY_KIDS); - assertHasGenre(program, NOT_FOUND_GENRE, false); - assertHasGenre(program, FAMILY_GENRE_ID, true); - assertHasGenre(program, COMEDY_GENRE_ID, false); - assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); - } - - @Test - public void testFamilyComedyGenre() { - Program program = - new Program.Builder().setCanonicalGenres(FAMILY_KIDS + ", " + COMEDY).build(); - assertCanonicalGenres(program, FAMILY_KIDS, COMEDY); - assertHasGenre(program, NOT_FOUND_GENRE, false); - assertHasGenre(program, FAMILY_GENRE_ID, true); - assertHasGenre(program, COMEDY_GENRE_ID, true); - assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); - } - - @Test - public void testOtherGenre() { - Program program = new Program.Builder().setCanonicalGenres("other").build(); - assertCanonicalGenres(program); - assertHasGenre(program, NOT_FOUND_GENRE, false); - assertHasGenre(program, FAMILY_GENRE_ID, false); - assertHasGenre(program, COMEDY_GENRE_ID, false); - assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); - } - - @Test - public void testParcelable() { - List<CriticScore> criticScores = new ArrayList<>(); - criticScores.add(new CriticScore("1", "2", "3")); - criticScores.add(new CriticScore("4", "5", "6")); - TvContentRating[] ratings = new TvContentRating[2]; - ratings[0] = TvContentRating.unflattenFromString("1/2/3"); - ratings[1] = TvContentRating.unflattenFromString("4/5/6"); - Program p = - new Program.Builder() - .setId(1) - .setPackageName("2") - .setChannelId(3) - .setTitle("4") - .setSeriesId("5") - .setEpisodeTitle("6") - .setSeasonNumber("7") - .setSeasonTitle("8") - .setEpisodeNumber("9") - .setStartTimeUtcMillis(10) - .setEndTimeUtcMillis(11) - .setDescription("12") - .setLongDescription("12-long") - .setVideoWidth(13) - .setVideoHeight(14) - .setCriticScores(criticScores) - .setPosterArtUri("15") - .setThumbnailUri("16") - .setCanonicalGenres(Genres.encode(Genres.SPORTS, Genres.SHOPPING)) - .setContentRatings(ratings) - .setRecordingProhibited(true) - .build(); - Parcel p1 = Parcel.obtain(); - Parcel p2 = Parcel.obtain(); - try { - p.writeToParcel(p1, 0); - byte[] bytes = p1.marshall(); - p2.unmarshall(bytes, 0, bytes.length); - p2.setDataPosition(0); - Program r2 = Program.fromParcel(p2); - assertThat(r2).isEqualTo(p); - } finally { - p1.recycle(); - p2.recycle(); - } - } - - @Test - public void testParcelableWithCriticScore() { - Program program = - new Program.Builder() - .setTitle("MyTitle") - .addCriticScore( - new CriticScore( - "default source", "5/10", "http://testurl/testimage.jpg")) - .build(); - Parcel parcel = Parcel.obtain(); - program.writeToParcel(parcel, 0); - parcel.setDataPosition(0); - Program programFromParcel = Program.CREATOR.createFromParcel(parcel); - - assertThat(programFromParcel.getCriticScores()).isNotNull(); - assertThat(programFromParcel.getCriticScores().get(0).source).isEqualTo("default source"); - assertThat(programFromParcel.getCriticScores().get(0).score).isEqualTo("5/10"); - assertThat(programFromParcel.getCriticScores().get(0).logoUrl) - .isEqualTo("http://testurl/testimage.jpg"); - } - - private static void assertNullCanonicalGenres(Program program) { - String[] actual = program.getCanonicalGenres(); - assertWithMessage("Expected null canonical genres but was " + Arrays.toString(actual)) - .that(actual) - .isNull(); - } - - private static void assertCanonicalGenres(Program program, String... expected) { - assertWithMessage("canonical genres") - .that(Arrays.asList(program.getCanonicalGenres())) - .isEqualTo(Arrays.asList(expected)); - } - - private static void assertHasGenre(Program program, int genreId, boolean expected) { - assertWithMessage("hasGenre(" + genreId + ")") - .that(program.hasGenre(genreId)) - .isEqualTo(expected); - } -} |