1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.cts.verifier.tv;
18 
19 import android.content.Intent;
20 import android.database.Cursor;
21 import android.media.tv.TvContract;
22 import android.view.View;
23 import android.widget.Toast;
24 
25 import com.android.cts.verifier.R;
26 
27 import java.util.concurrent.TimeUnit;
28 
29 /**
30  * Tests for verifying TV app behavior on time shift.
31  */
32 public class TimeShiftTestActivity extends TvAppVerifierActivity
33         implements View.OnClickListener {
34     private static final long TIMEOUT_MS = TimeUnit.MINUTES.toMillis(5);
35     private static final boolean NOT_PASSED = false;
36     private static final boolean PASSED = true;
37 
38     private View mPauseResumeItem;
39     private View mVerifyResumeAfterPauseItem;
40     private View mVerifyPositionTrackingItem;
41 
42     private View mSetPlaybackParamsItem;
43     private View mVerifyRewindItem;
44     private View mVerifyFastForwardItem;
45 
46     private View mSeekToItem;
47     private View mVerifySeekToPreviousItem;
48     private View mVerifySeekToNextItem;
49 
50     private View mSupportThirdPartyInputYesItem;
51     private View mSupportThirdPartyInputNoItem;
52 
53     private Intent mTvAppIntent = null;
54 
55     @Override
onClick(View v)56     public void onClick(View v) {
57         final View postTarget = getPostTarget();
58 
59         if (containsButton(mSupportThirdPartyInputYesItem, v)) {
60             setPassState(mSupportThirdPartyInputYesItem, true);
61             setButtonEnabled(mSupportThirdPartyInputNoItem, false);
62             setButtonEnabled(mPauseResumeItem, true);
63             return;
64         } else if (containsButton(mSupportThirdPartyInputNoItem, v)){
65             setPassState(mSupportThirdPartyInputYesItem, true);
66             setButtonEnabled(mSupportThirdPartyInputNoItem, false);
67             getPassButton().setEnabled(true);
68             return;
69         } else if (containsButton(mPauseResumeItem, v)) {
70             mVerifyResumeAfterPauseItem.setTag(NOT_PASSED);
71             mVerifyPositionTrackingItem.setTag(NOT_PASSED);
72 
73             final Runnable failCallback = new Runnable() {
74                 @Override
75                 public void run() {
76                     setPassState(mVerifyResumeAfterPauseItem, false);
77                     setPassState(mVerifyPositionTrackingItem, false);
78                 }
79             };
80             postTarget.postDelayed(failCallback, TIMEOUT_MS);
81             MockTvInputService.expectResumeAfterPause(postTarget, new Runnable() {
82                 @Override
83                 public void run() {
84                     postTarget.removeCallbacks(failCallback);
85                     setPassState(mPauseResumeItem, true);
86                     setPassState(mVerifyResumeAfterPauseItem, true);
87                     mVerifyResumeAfterPauseItem.setTag(PASSED);
88                     if (isPassedState(mVerifyResumeAfterPauseItem)
89                             && isPassedState(mVerifyPositionTrackingItem)) {
90                         setButtonEnabled(mSetPlaybackParamsItem, true);
91                     }
92                 }
93             });
94             MockTvInputService.expectPositionTracking(postTarget, new Runnable() {
95                 @Override
96                 public void run() {
97                     postTarget.removeCallbacks(failCallback);
98                     setPassState(mPauseResumeItem, true);
99                     setPassState(mVerifyPositionTrackingItem, true);
100                     mVerifyPositionTrackingItem.setTag(PASSED);
101                     if (isPassedState(mVerifyResumeAfterPauseItem)
102                             && isPassedState(mVerifyPositionTrackingItem)) {
103                         setButtonEnabled(mSetPlaybackParamsItem, true);
104                     }
105                 }
106             });
107         } else if (containsButton(mSetPlaybackParamsItem, v)) {
108             mVerifyRewindItem.setTag(NOT_PASSED);
109             mVerifyFastForwardItem.setTag(NOT_PASSED);
110 
111             final Runnable failCallback = new Runnable() {
112                 @Override
113                 public void run() {
114                     setPassState(mVerifyRewindItem, false);
115                     setPassState(mVerifyFastForwardItem, false);
116                 }
117             };
118             postTarget.postDelayed(failCallback, TIMEOUT_MS);
119             MockTvInputService.expectRewind(postTarget, new Runnable() {
120                 @Override
121                 public void run() {
122                     postTarget.removeCallbacks(failCallback);
123                     setPassState(mSetPlaybackParamsItem, true);
124                     setPassState(mVerifyRewindItem, true);
125                     mVerifyRewindItem.setTag(PASSED);
126                     if (isPassedState(mVerifyRewindItem) && isPassedState(mVerifyFastForwardItem)) {
127                         setButtonEnabled(mSeekToItem, true);
128                     }
129                 }
130             });
131             MockTvInputService.expectFastForward(postTarget, new Runnable() {
132                 @Override
133                 public void run() {
134                     postTarget.removeCallbacks(failCallback);
135                     setPassState(mSetPlaybackParamsItem, true);
136                     setPassState(mVerifyFastForwardItem, true);
137                     mVerifyFastForwardItem.setTag(PASSED);
138                     if (isPassedState(mVerifyRewindItem) && isPassedState(mVerifyFastForwardItem)) {
139                         setButtonEnabled(mSeekToItem, true);
140                     }
141                 }
142             });
143         } else if (containsButton(mSeekToItem, v)) {
144             mVerifySeekToPreviousItem.setTag(NOT_PASSED);
145             mVerifySeekToNextItem.setTag(NOT_PASSED);
146 
147             final Runnable failCallback = new Runnable() {
148                 @Override
149                 public void run() {
150                     setPassState(mVerifySeekToPreviousItem, false);
151                     setPassState(mVerifySeekToNextItem, false);
152                 }
153             };
154             postTarget.postDelayed(failCallback, TIMEOUT_MS);
155             MockTvInputService.expectSeekToPrevious(postTarget, new Runnable() {
156                 @Override
157                 public void run() {
158                     postTarget.removeCallbacks(failCallback);
159                     setPassState(mSeekToItem, true);
160                     setPassState(mVerifySeekToPreviousItem, true);
161                     mVerifySeekToPreviousItem.setTag(PASSED);
162                     if (isPassedState(mVerifySeekToPreviousItem)
163                             && isPassedState(mVerifySeekToNextItem)) {
164                         getPassButton().setEnabled(true);
165                     }
166                 }
167             });
168             MockTvInputService.expectSeekToNext(postTarget, new Runnable() {
169                 @Override
170                 public void run() {
171                     postTarget.removeCallbacks(failCallback);
172                     setPassState(mSeekToItem, true);
173                     setPassState(mVerifySeekToNextItem, true);
174                     mVerifySeekToNextItem.setTag(PASSED);
175                     if (isPassedState(mVerifySeekToPreviousItem)
176                             && isPassedState(mVerifySeekToNextItem)) {
177                         getPassButton().setEnabled(true);
178                     }
179                 }
180             });
181         }
182         if (mTvAppIntent == null) {
183             String[] projection = { TvContract.Channels._ID };
184             try (Cursor cursor = getContentResolver().query(
185                     TvContract.buildChannelsUriForInput(MockTvInputService.getInputId(this)),
186                     projection, null, null, null)) {
187                 if (cursor != null && cursor.moveToNext()) {
188                     mTvAppIntent = new Intent(Intent.ACTION_VIEW,
189                             TvContract.buildChannelUri(cursor.getLong(0)));
190                 }
191             }
192             if (mTvAppIntent == null) {
193                 Toast.makeText(this, R.string.tv_channel_not_found, Toast.LENGTH_SHORT).show();
194                 return;
195             }
196         }
197         startActivity(mTvAppIntent);
198     }
199 
200     @Override
createTestItems()201     protected void createTestItems() {
202         mSupportThirdPartyInputYesItem = createAndAttachUserItem(
203                 R.string.tv_input_discover_test_third_party_tif_input_support,
204                 R.string.tv_yes, this);
205         setButtonEnabled(mSupportThirdPartyInputYesItem, true);
206         mSupportThirdPartyInputNoItem = createAndAttachButtonItem(R.string.tv_no, this);
207         setButtonEnabled(mSupportThirdPartyInputNoItem, true);
208         mPauseResumeItem = createAndAttachUserItem(
209                 R.string.tv_time_shift_test_pause_resume,
210                 R.string.tv_launch_tv_app, this);
211         mVerifyResumeAfterPauseItem = createAndAttachAutoItem(
212                 R.string.tv_time_shift_test_verify_resume_after_pause);
213         mVerifyPositionTrackingItem = createAndAttachAutoItem(
214                 R.string.tv_time_shift_test_verify_position_tracking);
215         mSetPlaybackParamsItem = createAndAttachUserItem(
216                 R.string.tv_time_shift_test_speed_rate,
217                 R.string.tv_launch_tv_app, this);
218         mVerifyRewindItem = createAndAttachAutoItem(
219                 R.string.tv_time_shift_test_verify_rewind);
220         mVerifyFastForwardItem = createAndAttachAutoItem(
221                 R.string.tv_time_shift_test_verify_fast_forward);
222         mSeekToItem = createAndAttachUserItem(
223                 R.string.tv_time_shift_test_seek,
224                 R.string.tv_launch_tv_app, this);
225         mVerifySeekToPreviousItem = createAndAttachAutoItem(
226                 R.string.tv_time_shift_test_verify_seek_to_previous);
227         mVerifySeekToNextItem = createAndAttachAutoItem(
228                 R.string.tv_time_shift_test_verify_seek_to_next);
229     }
230 
231     @Override
setInfoResources()232     protected void setInfoResources() {
233         setInfoResources(R.string.tv_time_shift_test,
234                 R.string.tv_time_shift_test_info, -1);
235     }
236 
isPassedState(View view)237     private boolean isPassedState(View view) {
238         return ((Boolean) view.getTag()) == PASSED;
239     }
240 }
241