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