1aba04fbe586f159d6625a202f02c815d51b55b2aisaid/* 2aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Copyright 2018 The Android Open Source Project 3aba04fbe586f159d6625a202f02c815d51b55b2aisaid * 4aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Licensed under the Apache License, Version 2.0 (the "License"); 5aba04fbe586f159d6625a202f02c815d51b55b2aisaid * you may not use this file except in compliance with the License. 6aba04fbe586f159d6625a202f02c815d51b55b2aisaid * You may obtain a copy of the License at 7aba04fbe586f159d6625a202f02c815d51b55b2aisaid * 8aba04fbe586f159d6625a202f02c815d51b55b2aisaid * http://www.apache.org/licenses/LICENSE-2.0 9aba04fbe586f159d6625a202f02c815d51b55b2aisaid * 10aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Unless required by applicable law or agreed to in writing, software 11aba04fbe586f159d6625a202f02c815d51b55b2aisaid * distributed under the License is distributed on an "AS IS" BASIS, 12aba04fbe586f159d6625a202f02c815d51b55b2aisaid * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aba04fbe586f159d6625a202f02c815d51b55b2aisaid * See the License for the specific language governing permissions and 14aba04fbe586f159d6625a202f02c815d51b55b2aisaid * limitations under the License. 15aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.tvprovider.media.tv; 17aba04fbe586f159d6625a202f02c815d51b55b2aisaid 18aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport static org.junit.Assert.assertEquals; 19aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport static org.junit.Assert.assertFalse; 20aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport static org.junit.Assert.assertNotNull; 21aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport static org.junit.Assert.assertNull; 22aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport static org.junit.Assert.assertTrue; 23aba04fbe586f159d6625a202f02c815d51b55b2aisaid 24aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.content.Context; 25aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.content.Intent; 26aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.graphics.Bitmap; 27aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.graphics.BitmapFactory; 28aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.media.tv.TvContentRating; 29aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.net.Uri; 30aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.os.Build; 31aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.support.test.InstrumentationRegistry; 32aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.support.test.filters.SdkSuppress; 33aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport android.support.test.filters.SmallTest; 34aba04fbe586f159d6625a202f02c815d51b55b2aisaid 35aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.After; 36aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.Before; 37aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.Rule; 38aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.Test; 39aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.rules.ExpectedException; 40aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.runner.RunWith; 41aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport org.junit.runners.JUnit4; 42aba04fbe586f159d6625a202f02c815d51b55b2aisaid 43aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport java.io.IOException; 44aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport java.util.Arrays; 45aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport java.util.List; 46aba04fbe586f159d6625a202f02c815d51b55b2aisaidimport java.util.Objects; 47aba04fbe586f159d6625a202f02c815d51b55b2aisaid 48aba04fbe586f159d6625a202f02c815d51b55b2aisaid/** 49aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test that {@link PreviewChannelHelper} can perform CRUD operations on 50aba04fbe586f159d6625a202f02c815d51b55b2aisaid * {@link PreviewChannel PreviewChannels} and {@link PreviewProgram PreviewPrograms} correctly. 51aba04fbe586f159d6625a202f02c815d51b55b2aisaid * All of the following tests involve the system content provider. 52aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 53aba04fbe586f159d6625a202f02c815d51b55b2aisaid@SmallTest 54aba04fbe586f159d6625a202f02c815d51b55b2aisaid@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O) 55aba04fbe586f159d6625a202f02c815d51b55b2aisaid@RunWith(JUnit4.class) 56aba04fbe586f159d6625a202f02c815d51b55b2aisaidpublic class PreviewChannelHelperTest { 57aba04fbe586f159d6625a202f02c815d51b55b2aisaid 58aba04fbe586f159d6625a202f02c815d51b55b2aisaid 59aba04fbe586f159d6625a202f02c815d51b55b2aisaid private Context mContext; 60aba04fbe586f159d6625a202f02c815d51b55b2aisaid 61aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Rule 62aba04fbe586f159d6625a202f02c815d51b55b2aisaid public ExpectedException thrown = ExpectedException.none(); 63aba04fbe586f159d6625a202f02c815d51b55b2aisaid 64aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 65aba04fbe586f159d6625a202f02c815d51b55b2aisaid * taken from {@link PreviewProgram} 66aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 67aba04fbe586f159d6625a202f02c815d51b55b2aisaid private static PreviewProgram.Builder createFullyPopulatedPreviewProgram(long channelId) { 68aba04fbe586f159d6625a202f02c815d51b55b2aisaid return new PreviewProgram.Builder() 69aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setTitle("Google") 70aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderId("ID-4321") 71aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setChannelId(channelId) 72aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setWeight(100) 73aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg")) 74aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLastPlaybackPositionMillis(0) 75aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDurationMillis(60 * 1000) 76aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri( 77aba04fbe586f159d6625a202f02c815d51b55b2aisaid Intent.URI_INTENT_SCHEME))) 78aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setTransient(false) 79aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setType(TvContractCompat.PreviewPrograms.TYPE_MOVIE) 80aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setPosterArtAspectRatio(TvContractCompat.PreviewPrograms.ASPECT_RATIO_2_3) 81aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setThumbnailAspectRatio(TvContractCompat.PreviewPrograms.ASPECT_RATIO_16_9) 82aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLogoUri(Uri.parse("http://example.com/program-logo.mpg")) 83aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAvailability(TvContractCompat.PreviewPrograms.AVAILABILITY_AVAILABLE) 84aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setStartingPrice("12.99 USD") 85aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setOfferPrice("4.99 USD") 86aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setReleaseDate("1997") 87aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setItemCount(3) 88aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLive(false) 89aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInteractionType(TvContractCompat.PreviewPrograms.INTERACTION_TYPE_LIKES) 90aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInteractionCount(10200) 91aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAuthor("author_name") 92aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setReviewRatingStyle(TvContractCompat.PreviewPrograms.REVIEW_RATING_STYLE_STARS) 93aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setReviewRating("4.5") 94aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setSearchable(false) 95aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setThumbnailUri(Uri.parse("http://example.com/thumbnail.png")) 96aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAudioLanguages(new String[]{"eng", "kor"}) 97aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setCanonicalGenres(new String[]{TvContractCompat.Programs.Genres.MOVIES}) 98aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setContentRatings(new TvContentRating[]{ 99aba04fbe586f159d6625a202f02c815d51b55b2aisaid TvContentRating.createRating("com.android.tv", "US_TV", "US_TV_Y7")}) 100aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDescription("This is a sample program") 101aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setEpisodeNumber("Pilot", 0) 102aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setEpisodeTitle("Hello World") 103aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLongDescription("This is a longer description than the previous description") 104aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setPosterArtUri(Uri.parse("http://example.com/poster.png")) 105aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setSeasonNumber("The Final Season", 7) 106aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setSeasonTitle("The Final Season") 107aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setVideoHeight(1080) 108aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setVideoWidth(1920) 109aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag1(0x4) 110aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag2(0x3) 111aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag3(0x2) 112aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag4(0x1) 113aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setBrowsable(true) 114aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setContentId("CID-8642"); 115aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 116aba04fbe586f159d6625a202f02c815d51b55b2aisaid 117aba04fbe586f159d6625a202f02c815d51b55b2aisaid private static void compareProgram(PreviewProgram programA, PreviewProgram programB) { 118aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Arrays.equals(programA.getAudioLanguages(), programB.getAudioLanguages())); 119aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Arrays.deepEquals(programA.getCanonicalGenres(), programB.getCanonicalGenres())); 120aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getChannelId(), programB.getChannelId()); 121aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Arrays.deepEquals(programA.getContentRatings(), programB.getContentRatings())); 122aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getDescription(), programB.getDescription()); 123aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getEpisodeNumber(), programB.getEpisodeNumber()); 124aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getEpisodeTitle(), programB.getEpisodeTitle()); 125aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getLongDescription(), programB.getLongDescription()); 126aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getPosterArtUri(), programB.getPosterArtUri()); 127aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getSeasonNumber(), programB.getSeasonNumber()); 128aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getThumbnailUri(), programB.getThumbnailUri()); 129aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getTitle(), programB.getTitle()); 130aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getVideoHeight(), programB.getVideoHeight()); 131aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getVideoWidth(), programB.getVideoWidth()); 132aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.isSearchable(), programB.isSearchable()); 133aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag1(), programB.getInternalProviderFlag1()); 134aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag2(), programB.getInternalProviderFlag2()); 135aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag3(), programB.getInternalProviderFlag3()); 136aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag4(), programB.getInternalProviderFlag4()); 137aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Objects.equals(programA.getSeasonTitle(), programB.getSeasonTitle())); 138aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderId(), programB.getInternalProviderId()); 139aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getPreviewVideoUri(), programB.getPreviewVideoUri()); 140aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getLastPlaybackPositionMillis(), 141aba04fbe586f159d6625a202f02c815d51b55b2aisaid programB.getLastPlaybackPositionMillis()); 142aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getDurationMillis(), programB.getDurationMillis()); 143aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getIntentUri(), programB.getIntentUri()); 144aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getWeight(), programB.getWeight()); 145aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.isTransient(), programB.isTransient()); 146aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getType(), programB.getType()); 147aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getPosterArtAspectRatio(), programB.getPosterArtAspectRatio()); 148aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getThumbnailAspectRatio(), programB.getThumbnailAspectRatio()); 149aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getLogoUri(), programB.getLogoUri()); 150aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getAvailability(), programB.getAvailability()); 151aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getStartingPrice(), programB.getStartingPrice()); 152aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getOfferPrice(), programB.getOfferPrice()); 153aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getReleaseDate(), programB.getReleaseDate()); 154aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getItemCount(), programB.getItemCount()); 155aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.isLive(), programB.isLive()); 156aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInteractionType(), programB.getInteractionType()); 157aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInteractionCount(), programB.getInteractionCount()); 158aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getAuthor(), programB.getAuthor()); 159aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getReviewRatingStyle(), programB.getReviewRatingStyle()); 160aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getReviewRating(), programB.getReviewRating()); 161aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getContentId(), programB.getContentId()); 162aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 163aba04fbe586f159d6625a202f02c815d51b55b2aisaid 164aba04fbe586f159d6625a202f02c815d51b55b2aisaid private static WatchNextProgram.Builder createFullyPopulatedWatchNextProgram() { 165aba04fbe586f159d6625a202f02c815d51b55b2aisaid return new WatchNextProgram.Builder() 166aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setTitle("Google") 167aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderId("ID-4321") 168aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg")) 169aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLastPlaybackPositionMillis(0) 170aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDurationMillis(60 * 1000) 171aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri( 172aba04fbe586f159d6625a202f02c815d51b55b2aisaid Intent.URI_INTENT_SCHEME))) 173aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setTransient(false) 174aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setType(TvContractCompat.WatchNextPrograms.TYPE_MOVIE) 175aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setWatchNextType(TvContractCompat.WatchNextPrograms.WATCH_NEXT_TYPE_CONTINUE) 176aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setPosterArtAspectRatio(TvContractCompat.WatchNextPrograms.ASPECT_RATIO_2_3) 177aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setThumbnailAspectRatio(TvContractCompat.WatchNextPrograms.ASPECT_RATIO_16_9) 178aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLogoUri(Uri.parse("http://example.com/program-logo.mpg")) 179aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAvailability(TvContractCompat.WatchNextPrograms.AVAILABILITY_AVAILABLE) 180aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setStartingPrice("12.99 USD") 181aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setOfferPrice("4.99 USD") 182aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setReleaseDate("1997") 183aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setItemCount(3) 184aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLive(false) 185aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInteractionType(TvContractCompat.WatchNextPrograms.INTERACTION_TYPE_LIKES) 186aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInteractionCount(10200) 187aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAuthor("author_name") 188aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setReviewRatingStyle(TvContractCompat.WatchNextPrograms.REVIEW_RATING_STYLE_STARS) 189aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setReviewRating("4.5") 190aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setSearchable(false) 191aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setThumbnailUri(Uri.parse("http://example.com/thumbnail.png")) 192aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAudioLanguages(new String[]{"eng", "kor"}) 193aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setCanonicalGenres(new String[]{TvContractCompat.Programs.Genres.MOVIES}) 194aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setContentRatings(new TvContentRating[]{ 195aba04fbe586f159d6625a202f02c815d51b55b2aisaid TvContentRating.createRating("com.android.tv", "US_TV", "US_TV_Y7")}) 196aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDescription("This is a sample program") 197aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setEpisodeNumber("Pilot", 0) 198aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setEpisodeTitle("Hello World") 199aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLongDescription("This is a longer description than the previous description") 200aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setPosterArtUri(Uri.parse("http://example.com/poster.png")) 201aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setSeasonNumber("The Final Season", 7) 202aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setSeasonTitle("The Final Season") 203aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setVideoHeight(1080) 204aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setVideoWidth(1920) 205aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag1(0x4) 206aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag2(0x3) 207aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag3(0x2) 208aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag4(0x1) 209aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setBrowsable(true) 210aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setContentId("CID-8442"); 211aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 212aba04fbe586f159d6625a202f02c815d51b55b2aisaid 213aba04fbe586f159d6625a202f02c815d51b55b2aisaid private static void compareProgram(WatchNextProgram programA, WatchNextProgram programB) { 214aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Arrays.equals(programA.getAudioLanguages(), programB.getAudioLanguages())); 215aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Arrays.deepEquals(programA.getCanonicalGenres(), programB.getCanonicalGenres())); 216aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Arrays.deepEquals(programA.getContentRatings(), programB.getContentRatings())); 217aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getDescription(), programB.getDescription()); 218aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getEpisodeNumber(), programB.getEpisodeNumber()); 219aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getEpisodeTitle(), programB.getEpisodeTitle()); 220aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getLongDescription(), programB.getLongDescription()); 221aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getPosterArtUri(), programB.getPosterArtUri()); 222aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getSeasonNumber(), programB.getSeasonNumber()); 223aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getThumbnailUri(), programB.getThumbnailUri()); 224aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getTitle(), programB.getTitle()); 225aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getVideoHeight(), programB.getVideoHeight()); 226aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getVideoWidth(), programB.getVideoWidth()); 227aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.isSearchable(), programB.isSearchable()); 228aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag1(), programB.getInternalProviderFlag1()); 229aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag2(), programB.getInternalProviderFlag2()); 230aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag3(), programB.getInternalProviderFlag3()); 231aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderFlag4(), programB.getInternalProviderFlag4()); 232aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(Objects.equals(programA.getSeasonTitle(), programB.getSeasonTitle())); 233aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInternalProviderId(), programB.getInternalProviderId()); 234aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getPreviewVideoUri(), programB.getPreviewVideoUri()); 235aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getLastPlaybackPositionMillis(), 236aba04fbe586f159d6625a202f02c815d51b55b2aisaid programB.getLastPlaybackPositionMillis()); 237aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getDurationMillis(), programB.getDurationMillis()); 238aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getIntentUri(), programB.getIntentUri()); 239aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.isTransient(), programB.isTransient()); 240aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getType(), programB.getType()); 241aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getWatchNextType(), programB.getWatchNextType()); 242aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getPosterArtAspectRatio(), programB.getPosterArtAspectRatio()); 243aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getThumbnailAspectRatio(), programB.getThumbnailAspectRatio()); 244aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getLogoUri(), programB.getLogoUri()); 245aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getAvailability(), programB.getAvailability()); 246aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getStartingPrice(), programB.getStartingPrice()); 247aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getOfferPrice(), programB.getOfferPrice()); 248aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getReleaseDate(), programB.getReleaseDate()); 249aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getItemCount(), programB.getItemCount()); 250aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.isLive(), programB.isLive()); 251aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInteractionType(), programB.getInteractionType()); 252aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getInteractionCount(), programB.getInteractionCount()); 253aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getAuthor(), programB.getAuthor()); 254aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getReviewRatingStyle(), programB.getReviewRatingStyle()); 255aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getReviewRating(), programB.getReviewRating()); 256aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(programA.getContentId(), programB.getContentId()); 257aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 258aba04fbe586f159d6625a202f02c815d51b55b2aisaid 259aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Before 260aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void setUp() throws Exception { 261aba04fbe586f159d6625a202f02c815d51b55b2aisaid mContext = InstrumentationRegistry.getContext(); 262aba04fbe586f159d6625a202f02c815d51b55b2aisaid 263aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 264aba04fbe586f159d6625a202f02c815d51b55b2aisaid 265aba04fbe586f159d6625a202f02c815d51b55b2aisaid @After 266aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void tearDown() { 2678370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 2688370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 2698370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 270aba04fbe586f159d6625a202f02c815d51b55b2aisaid mContext.getContentResolver().delete( 271aba04fbe586f159d6625a202f02c815d51b55b2aisaid TvContractCompat.Channels.CONTENT_URI, null, null); 272aba04fbe586f159d6625a202f02c815d51b55b2aisaid mContext = null; 273aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 274aba04fbe586f159d6625a202f02c815d51b55b2aisaid 275aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 276aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test CR of CRUD 277aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test that the PreviewChannelHelper can correctly create and read preview channels. 278aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 279aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 280aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testPreviewChannelCreation() throws IOException { 2818370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 2828370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 2838370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 284aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 285aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 286aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishDefaultChannel(builder.build()); 287aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channelFromTvProvider = getPreviewChannel(helper, channelId); 288aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(channelsEqual(builder.build(), channelFromTvProvider)); 289aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 290aba04fbe586f159d6625a202f02c815d51b55b2aisaid 291aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 292aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testLogoRequiredForChannelCreation() throws IOException { 2938370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 2948370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 2958370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 296aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 297aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 298aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setLogo(Uri.parse("bogus")); 299aba04fbe586f159d6625a202f02c815d51b55b2aisaid thrown.expect(IOException.class); 300aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.publishDefaultChannel(builder.build()); 301aba04fbe586f159d6625a202f02c815d51b55b2aisaid List<PreviewChannel> channels = helper.getAllChannels(); 302aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(0, channels.size()); 303aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 304aba04fbe586f159d6625a202f02c815d51b55b2aisaid 305aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 306aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test CR of CRUD 307aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test that the PreviewChannelHelper can correctly create and read preview channels, when 308aba04fbe586f159d6625a202f02c815d51b55b2aisaid * internalProviderId is null. 309aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 310aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 311aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testPreviewChannelCreationWithNullProviderId() throws IOException { 3128370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 3138370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 3148370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 315aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 316aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setInternalProviderId(null); 317aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 318aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(builder.build()); 319aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channelFromTvProvider = getPreviewChannel(helper, channelId); 320aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(channelsEqual(builder.build(), channelFromTvProvider)); 321aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 322aba04fbe586f159d6625a202f02c815d51b55b2aisaid 323aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 324aba04fbe586f159d6625a202f02c815d51b55b2aisaid * All this method is actually doing is 325aba04fbe586f159d6625a202f02c815d51b55b2aisaid * <pre> 326aba04fbe586f159d6625a202f02c815d51b55b2aisaid * 327aba04fbe586f159d6625a202f02c815d51b55b2aisaid * PreviewChannel channelFromTvProvider = helper.getPreviewChannel(channelId); 328aba04fbe586f159d6625a202f02c815d51b55b2aisaid * </pre> 329aba04fbe586f159d6625a202f02c815d51b55b2aisaid * However, due to a known issue, when logo is persisted, the file status is not consistent 330aba04fbe586f159d6625a202f02c815d51b55b2aisaid * between openInputStream and openOutputStream. So as a workaround, a wait period is applied 331aba04fbe586f159d6625a202f02c815d51b55b2aisaid * to make sure that the logo file is written into the disk. 332aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 333aba04fbe586f159d6625a202f02c815d51b55b2aisaid private PreviewChannel getPreviewChannel(PreviewChannelHelper helper, 334aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId) { 335aba04fbe586f159d6625a202f02c815d51b55b2aisaid boolean logoReady = false; 336aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channel = null; 337aba04fbe586f159d6625a202f02c815d51b55b2aisaid while (!logoReady) { 338aba04fbe586f159d6625a202f02c815d51b55b2aisaid try { 339aba04fbe586f159d6625a202f02c815d51b55b2aisaid Thread.sleep(50); 340aba04fbe586f159d6625a202f02c815d51b55b2aisaid } catch (InterruptedException e) { 341aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 342aba04fbe586f159d6625a202f02c815d51b55b2aisaid channel = helper.getPreviewChannel(channelId); 343aba04fbe586f159d6625a202f02c815d51b55b2aisaid logoReady = null != channel.getLogo(mContext); 344aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 345aba04fbe586f159d6625a202f02c815d51b55b2aisaid return channel; 346aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 347aba04fbe586f159d6625a202f02c815d51b55b2aisaid 348aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 349aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test CR of CRUD 350aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test that all published preview channels can be read at once. 351aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 352aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 353aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testAllPublishedChannelsRead() throws IOException { 3548370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 3558370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 3568370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 357aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 358aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 359aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setInternalProviderId("1"); 360aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.publishChannel(builder.build()); 361aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setInternalProviderId("11"); 362aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.publishChannel(builder.build()); 363aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setInternalProviderId("111"); 364aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.publishChannel(builder.build()); 365aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setInternalProviderId("1111"); 366aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.publishChannel(builder.build()); 367aba04fbe586f159d6625a202f02c815d51b55b2aisaid List<PreviewChannel> allChannels = helper.getAllChannels(); 368aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(4, allChannels.size()); 369aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 370aba04fbe586f159d6625a202f02c815d51b55b2aisaid 371aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 372aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test UR of CRUD 373aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Test that the PreviewChannelHelper can correctly update and read preview channels. 374aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 375aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 376aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testPreviewChannelUpdate() throws IOException { 3778370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 3788370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 3798370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 380aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 381aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 382aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(builder.build()); 383aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channelFromTvProvider = getPreviewChannel(helper, channelId); 384aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channel = builder.build(); 385aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(channelsEqual(channel, channelFromTvProvider)); 386aba04fbe586f159d6625a202f02c815d51b55b2aisaid 387aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel patch = new PreviewChannel.Builder() 388aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDisplayName(channel.getDisplayName()) 389aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAppLinkIntentUri(channel.getAppLinkIntentUri()) 390aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDescription("Patch description").build(); 391aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updatePreviewChannel(channelId, patch); 392aba04fbe586f159d6625a202f02c815d51b55b2aisaid channelFromTvProvider = helper.getPreviewChannel(channelId); 393aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertFalse(channelsEqual(channel, channelFromTvProvider)); 394aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(channelFromTvProvider.getDescription(), "Patch description"); 395aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 396aba04fbe586f159d6625a202f02c815d51b55b2aisaid 397aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 398aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Tests that data is not being updated unnecessarily 399aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 400aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 401aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testDefensiveUpdatePreviewChannel() throws IOException { 4028370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 4038370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 4048370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 405aba04fbe586f159d6625a202f02c815d51b55b2aisaid final int[] channelUpdateCount = {0}; 406aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext) { 407aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Override 408aba04fbe586f159d6625a202f02c815d51b55b2aisaid protected void updatePreviewChannelInternal(long channelId, PreviewChannel channel) { 409aba04fbe586f159d6625a202f02c815d51b55b2aisaid channelUpdateCount[0]++; 410aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 411aba04fbe586f159d6625a202f02c815d51b55b2aisaid }; 412aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 413aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(builder.build()); 414aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel fromProvider = helper.getPreviewChannel(channelId); 415aba04fbe586f159d6625a202f02c815d51b55b2aisaid channelsEqual(builder.build(), fromProvider); 416aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updatePreviewChannel(channelId, builder.build()); 417aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(0, channelUpdateCount[0]); 418aba04fbe586f159d6625a202f02c815d51b55b2aisaid 419aba04fbe586f159d6625a202f02c815d51b55b2aisaid final Uri uri = Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(Intent.URI_INTENT_SCHEME)); 420aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channel = new PreviewChannel.Builder() 421aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDisplayName("Test Display Name Udpate") 422aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDescription("Test Preview Channel Description") 423aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAppLinkIntentUri(uri).build(); 424aba04fbe586f159d6625a202f02c815d51b55b2aisaid 425aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updatePreviewChannel(channelId, channel); 426aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(1, channelUpdateCount[0]); 427aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 428aba04fbe586f159d6625a202f02c815d51b55b2aisaid 429aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 430aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testPreviewResolverChannelDeletion() throws IOException { 4318370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 4328370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 4338370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 434aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 435aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder builder = createFullyPopulatedPreviewChannel(); 436aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(builder.build()); 437aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel channelFromTvProvider = getPreviewChannel(helper, channelId); 438aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertTrue(channelsEqual(builder.build(), channelFromTvProvider)); 439aba04fbe586f159d6625a202f02c815d51b55b2aisaid 440aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.deletePreviewChannel(channelId); 441aba04fbe586f159d6625a202f02c815d51b55b2aisaid channelFromTvProvider = helper.getPreviewChannel(channelId); 442aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertNull(channelFromTvProvider); 443aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 444aba04fbe586f159d6625a202f02c815d51b55b2aisaid 445aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 446aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testPreviewProgramCreation() throws IOException { 4478370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 4488370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 4498370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 450aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 451aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder channelBuilder = createFullyPopulatedPreviewChannel(); 452aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(channelBuilder.build()); 453aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram program = createFullyPopulatedPreviewProgram(channelId).build(); 454aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishPreviewProgram(program); 455aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram programFromProvider = helper.getPreviewProgram(programId); 456aba04fbe586f159d6625a202f02c815d51b55b2aisaid compareProgram(program, programFromProvider); 457aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 458aba04fbe586f159d6625a202f02c815d51b55b2aisaid 459aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 460aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testPreviewProgramUpdate() throws IOException { 4618370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 4628370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 4638370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 464aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 465aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder channelBuilder = createFullyPopulatedPreviewChannel(); 466aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(channelBuilder.build()); 467aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram.Builder programBuilder = createFullyPopulatedPreviewProgram(channelId); 468aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishPreviewProgram(programBuilder.build()); 469aba04fbe586f159d6625a202f02c815d51b55b2aisaid 470aba04fbe586f159d6625a202f02c815d51b55b2aisaid programBuilder.setReleaseDate("2000"); 471aba04fbe586f159d6625a202f02c815d51b55b2aisaid 472aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updatePreviewProgram(programId, programBuilder.build()); 473aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram programFromProvider = helper.getPreviewProgram(programId); 474aba04fbe586f159d6625a202f02c815d51b55b2aisaid compareProgram(programBuilder.build(), programFromProvider); 475aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 476aba04fbe586f159d6625a202f02c815d51b55b2aisaid 477aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 478aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Tests that data is not being updated unnecessarily 479aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 480aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 481aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testDefensivePreviewProgramUpdateRequests() throws IOException { 4828370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 4838370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 4848370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 485aba04fbe586f159d6625a202f02c815d51b55b2aisaid final int[] programUpdateCount = {0}; 486aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext) { 487aba04fbe586f159d6625a202f02c815d51b55b2aisaid 488aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Override 489aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void updatePreviewProgramInternal(long programId, PreviewProgram upgrade) { 490aba04fbe586f159d6625a202f02c815d51b55b2aisaid programUpdateCount[0]++; 491aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 492aba04fbe586f159d6625a202f02c815d51b55b2aisaid }; 493aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder channelBuilder = createFullyPopulatedPreviewChannel(); 494aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(channelBuilder.build()); 495aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram.Builder programBuilder = createFullyPopulatedPreviewProgram(channelId); 496aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishPreviewProgram(programBuilder.build()); 497aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram programFromProvider = helper.getPreviewProgram(programId); 498aba04fbe586f159d6625a202f02c815d51b55b2aisaid compareProgram(programBuilder.build(), programFromProvider); 499aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updatePreviewProgram(programId, programBuilder.build()); 500aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(0, programUpdateCount[0]); 501aba04fbe586f159d6625a202f02c815d51b55b2aisaid programBuilder.setDurationMillis(61 * 1000); 502aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updatePreviewProgram(programId, programBuilder.build()); 503aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(1, programUpdateCount[0]); 504aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 505aba04fbe586f159d6625a202f02c815d51b55b2aisaid 506aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 507aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testDeletePreviewProgram() throws IOException { 5088370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 5098370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 5108370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 511aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 512aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannel.Builder channelBuilder = createFullyPopulatedPreviewChannel(); 513aba04fbe586f159d6625a202f02c815d51b55b2aisaid long channelId = helper.publishChannel(channelBuilder.build()); 514aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram.Builder programBuilder = createFullyPopulatedPreviewProgram(channelId); 515aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishPreviewProgram(programBuilder.build()); 516aba04fbe586f159d6625a202f02c815d51b55b2aisaid 517aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.deletePreviewProgram(programId); 518aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewProgram programFromProvider = helper.getPreviewProgram(programId); 519aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertNull(programFromProvider); 520aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 521aba04fbe586f159d6625a202f02c815d51b55b2aisaid 522aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 523aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testWatchNextProgramCreation() { 5248370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 5258370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 5268370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 527aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 528aba04fbe586f159d6625a202f02c815d51b55b2aisaid WatchNextProgram program = createFullyPopulatedWatchNextProgram().build(); 529aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishWatchNextProgram(program); 530aba04fbe586f159d6625a202f02c815d51b55b2aisaid WatchNextProgram programFromProvider = helper.getWatchNextProgram(programId); 531aba04fbe586f159d6625a202f02c815d51b55b2aisaid compareProgram(program, programFromProvider); 532aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 533aba04fbe586f159d6625a202f02c815d51b55b2aisaid 534aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 535aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testUpdateWatchNextProgram() { 5368370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 5378370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 5388370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 539aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext); 540aba04fbe586f159d6625a202f02c815d51b55b2aisaid WatchNextProgram.Builder builder = createFullyPopulatedWatchNextProgram(); 541aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishWatchNextProgram(builder.build()); 542aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setOfferPrice("10.99 USD"); 543aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updateWatchNextProgram(builder.build(), programId); 544aba04fbe586f159d6625a202f02c815d51b55b2aisaid 545aba04fbe586f159d6625a202f02c815d51b55b2aisaid WatchNextProgram fromProvider = helper.getWatchNextProgram(programId); 546aba04fbe586f159d6625a202f02c815d51b55b2aisaid compareProgram(builder.build(), fromProvider); 547aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 548aba04fbe586f159d6625a202f02c815d51b55b2aisaid 549aba04fbe586f159d6625a202f02c815d51b55b2aisaid /** 550aba04fbe586f159d6625a202f02c815d51b55b2aisaid * Tests that data is not being updated unnecessarily 551aba04fbe586f159d6625a202f02c815d51b55b2aisaid */ 552aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Test 553aba04fbe586f159d6625a202f02c815d51b55b2aisaid public void testDefensiveUpdateWatchNextProgram() { 5548370e131b1cc1e5bff91dd7fa375000095f356b4isaid if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) { 5558370e131b1cc1e5bff91dd7fa375000095f356b4isaid return; 5568370e131b1cc1e5bff91dd7fa375000095f356b4isaid } 557aba04fbe586f159d6625a202f02c815d51b55b2aisaid final int[] programUpdateCount = {0}; 558aba04fbe586f159d6625a202f02c815d51b55b2aisaid PreviewChannelHelper helper = new PreviewChannelHelper(mContext) { 559aba04fbe586f159d6625a202f02c815d51b55b2aisaid @Override 560aba04fbe586f159d6625a202f02c815d51b55b2aisaid protected void updateWatchNextProgram(long programId, WatchNextProgram upgrade) { 561aba04fbe586f159d6625a202f02c815d51b55b2aisaid programUpdateCount[0]++; 562aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 563aba04fbe586f159d6625a202f02c815d51b55b2aisaid }; 564aba04fbe586f159d6625a202f02c815d51b55b2aisaid WatchNextProgram.Builder builder = createFullyPopulatedWatchNextProgram(); 565aba04fbe586f159d6625a202f02c815d51b55b2aisaid long programId = helper.publishWatchNextProgram(builder.build()); 566aba04fbe586f159d6625a202f02c815d51b55b2aisaid WatchNextProgram fromProvider = helper.getWatchNextProgram(programId); 567aba04fbe586f159d6625a202f02c815d51b55b2aisaid compareProgram(builder.build(), fromProvider); 568aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updateWatchNextProgram(builder.build(), programId); 569aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(0, programUpdateCount[0]); 570aba04fbe586f159d6625a202f02c815d51b55b2aisaid builder.setReleaseDate("2000"); 571aba04fbe586f159d6625a202f02c815d51b55b2aisaid helper.updateWatchNextProgram(builder.build(), programId); 572aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertEquals(1, programUpdateCount[0]); 573aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 574aba04fbe586f159d6625a202f02c815d51b55b2aisaid 575aba04fbe586f159d6625a202f02c815d51b55b2aisaid private boolean channelsEqual(PreviewChannel channelA, PreviewChannel channelB) { 576aba04fbe586f159d6625a202f02c815d51b55b2aisaid boolean result = channelA.getDisplayName().equals(channelB.getDisplayName()) 577aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getType().equals(channelB.getType()) 578aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getAppLinkIntentUri().equals(channelB.getAppLinkIntentUri()) 579aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getDescription().equals(channelB.getDescription()) 580aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getPackageName().equals(channelB.getPackageName()) 581aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getInternalProviderFlag1() == channelB.getInternalProviderFlag1() 582aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getInternalProviderFlag2() == channelB.getInternalProviderFlag2() 583aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getInternalProviderFlag3() == channelB.getInternalProviderFlag3() 584aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelA.getInternalProviderFlag4() == channelB.getInternalProviderFlag4() 585aba04fbe586f159d6625a202f02c815d51b55b2aisaid && (channelA.getInternalProviderId() == null 586aba04fbe586f159d6625a202f02c815d51b55b2aisaid && channelB.getInternalProviderId() == null 587aba04fbe586f159d6625a202f02c815d51b55b2aisaid || channelA.getInternalProviderId().equals(channelB.getInternalProviderId())) 588aba04fbe586f159d6625a202f02c815d51b55b2aisaid && (null != channelA.getLogo(mContext) && null != channelB.getLogo( 589aba04fbe586f159d6625a202f02c815d51b55b2aisaid mContext)) 590aba04fbe586f159d6625a202f02c815d51b55b2aisaid && Arrays.equals(channelA.getInternalProviderDataByteArray(), 591aba04fbe586f159d6625a202f02c815d51b55b2aisaid channelB.getInternalProviderDataByteArray()); 592aba04fbe586f159d6625a202f02c815d51b55b2aisaid return result; 593aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 594aba04fbe586f159d6625a202f02c815d51b55b2aisaid 595aba04fbe586f159d6625a202f02c815d51b55b2aisaid public PreviewChannel.Builder createFullyPopulatedPreviewChannel() { 596aba04fbe586f159d6625a202f02c815d51b55b2aisaid Bitmap logo = BitmapFactory.decodeResource(mContext.getResources(), 597ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas androidx.tvprovider.test.R.drawable.test_icon); 598aba04fbe586f159d6625a202f02c815d51b55b2aisaid assertNotNull(logo); 599aba04fbe586f159d6625a202f02c815d51b55b2aisaid return new PreviewChannel.Builder() 600aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setAppLinkIntent(new Intent()) 601aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDescription("Test Preview Channel Description") 602aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setDisplayName("Test Display Name") 603ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas .setPackageName("androidx.tvprovider.media.tv.test") 604aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag1(0x1) 605aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag2(0x2) 606aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag3(0x3) 607aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderFlag4(0x4) 608aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderId("Test Internal provider id") 609aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setInternalProviderData("Test byte array".getBytes()) 610aba04fbe586f159d6625a202f02c815d51b55b2aisaid .setLogo(logo); 611aba04fbe586f159d6625a202f02c815d51b55b2aisaid } 612aba04fbe586f159d6625a202f02c815d51b55b2aisaid} 613