aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2018-02-15 23:33:19 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-02-15 23:33:19 +0000
commit602eaad8056a646878d921ed9313e7c2dfc764a9 (patch)
treed70fc0dd83205e1e9a85b74b51fffb8788398c57
parent7bba4a3bbd7540e687e8ce98b6a128cb2bb506b5 (diff)
parenta4902090d0672e6f058096fa0bc29de1f8b31d3b (diff)
downloadTV-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.xml8
-rw-r--r--src/com/android/tv/data/BaseProgram.java61
-rw-r--r--tests/unit/src/com/android/tv/data/GenreItemTest.java92
-rw-r--r--tests/unit/src/com/android/tv/data/ProgramTest.java178
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);
- }
-}