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