1 /* 2 * Copyright (C) 2021 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 android.media.tv.interactive.cts; 18 19 import android.content.Context; 20 import android.graphics.Rect; 21 import android.media.PlaybackParams; 22 import android.media.tv.AdBuffer; 23 import android.media.tv.AdRequest; 24 import android.media.tv.AdResponse; 25 import android.media.tv.BroadcastInfoRequest; 26 import android.media.tv.BroadcastInfoResponse; 27 import android.media.tv.TvContentRating; 28 import android.media.tv.TvRecordingInfo; 29 import android.media.tv.TvTrackInfo; 30 import android.media.tv.interactive.AppLinkInfo; 31 import android.media.tv.interactive.TvInteractiveAppManager; 32 import android.media.tv.interactive.TvInteractiveAppService; 33 import android.net.Uri; 34 import android.os.Bundle; 35 import android.view.KeyEvent; 36 import android.view.MotionEvent; 37 import android.view.Surface; 38 import android.view.View; 39 40 import java.util.List; 41 42 /** 43 * Stub implementation of (@link android.media.tv.interactive.TvInteractiveAppService}. 44 */ 45 public class StubTvInteractiveAppService extends TvInteractiveAppService { 46 47 public static StubSessionImpl sSession; 48 public static int sType; 49 public static Bundle sAppLinkCommand = null; 50 public static AppLinkInfo sAppLinkInfo = null; 51 52 @Override onCreateSession(String iAppServiceId, int type)53 public Session onCreateSession(String iAppServiceId, int type) { 54 sSession = new StubSessionImpl(this); 55 return sSession; 56 } 57 58 @Override onAppLinkCommand(Bundle command)59 public void onAppLinkCommand(Bundle command) { 60 super.onAppLinkCommand(command); 61 sAppLinkCommand = command; 62 } 63 64 @Override onRegisterAppLinkInfo(AppLinkInfo bundle)65 public void onRegisterAppLinkInfo(AppLinkInfo bundle) { 66 super.onRegisterAppLinkInfo(bundle); 67 sAppLinkInfo = bundle; 68 } 69 70 @Override onUnregisterAppLinkInfo(AppLinkInfo bundle)71 public void onUnregisterAppLinkInfo(AppLinkInfo bundle) { 72 super.onUnregisterAppLinkInfo(bundle); 73 sAppLinkInfo = null; 74 } 75 76 public static class StubSessionImpl extends Session { 77 public int mSetSurfaceCount; 78 public int mSurfaceChangedCount; 79 public int mStartInteractiveAppCount; 80 public int mStopInteractiveAppCount; 81 public int mKeyDownCount; 82 public int mKeyUpCount; 83 public int mKeyMultipleCount; 84 public int mVideoAvailableCount; 85 public int mTunedCount; 86 public int mCreateBiIAppCount; 87 public int mDestroyBiIAppCount; 88 public int mAdResponseCount; 89 public int mAdBufferConsumedCount; 90 public int mBroadcastInfoResponseCount; 91 public int mSigningResultCount; 92 public int mErrorCount; 93 public int mRecordingStartedCount; 94 public int mRecordingStoppedCount; 95 public int mRecordingScheduledCount; 96 public int mPlaybackParamCount; 97 public int mTimeShiftModeCount; 98 public int mAvailableSpeedsCount; 99 public int mTimeShiftStatusCount; 100 public int mTimeShiftStartPositionCount; 101 public int mTimeShiftCurrentPositionCount; 102 public int mTvMessageCount; 103 public int mSendTvRecordingInfoCount; 104 public int mSendTvRecordingInfoListCount; 105 public int mCurrentVideoBoundsCount; 106 public int mRecordingTunedCount; 107 public int mRecordingConnectionFailedCount; 108 public int mRecordingDisconnected; 109 public int mRecordingErrorCount; 110 111 public Integer mKeyDownCode; 112 public Integer mKeyUpCode; 113 public Integer mKeyMultipleCode; 114 public KeyEvent mKeyDownEvent; 115 public KeyEvent mKeyUpEvent; 116 public KeyEvent mKeyMultipleEvent; 117 public Uri mTunedUri; 118 public Uri mCreateBiIAppUri; 119 public Bundle mCreateBiIAppParams; 120 public String mDestroyBiIAppId; 121 public AdResponse mAdResponse; 122 public BroadcastInfoResponse mBroadcastInfoResponse; 123 public String mRecordingId; 124 public String mRequestId; 125 public PlaybackParams mPlaybackParams; 126 public Integer mTimeShiftMode; 127 public float[] mAvailableSpeeds; 128 public Integer mTimeShiftStatus; 129 public String mInputId; 130 public Long mTimeShiftStartPosition; 131 public Long mTimeShiftCurrentPosition; 132 public Integer mTvMessageType; 133 public Bundle mTvMessageData; 134 public AdBuffer mAdBuffer; 135 public TvRecordingInfo mTvRecordingInfo; 136 public List<TvRecordingInfo> mTvRecordingInfoList; 137 public Rect mCurrentVideoBounds; 138 public Integer mRecordingError; 139 StubSessionImpl(Context context)140 StubSessionImpl(Context context) { 141 super(context); 142 } 143 resetValues()144 public void resetValues() { 145 mSetSurfaceCount = 0; 146 mSurfaceChangedCount = 0; 147 mStartInteractiveAppCount = 0; 148 mStopInteractiveAppCount = 0; 149 mKeyDownCount = 0; 150 mKeyUpCount = 0; 151 mKeyMultipleCount = 0; 152 mVideoAvailableCount = 0; 153 mTunedCount = 0; 154 mCreateBiIAppCount = 0; 155 mDestroyBiIAppCount = 0; 156 mAdResponseCount = 0; 157 mBroadcastInfoResponseCount = 0; 158 mSigningResultCount = 0; 159 mErrorCount = 0; 160 mRecordingStartedCount = 0; 161 mRecordingStoppedCount = 0; 162 mRecordingScheduledCount = 0; 163 mPlaybackParamCount = 0; 164 mTimeShiftModeCount = 0; 165 mAvailableSpeedsCount = 0; 166 mTimeShiftStatusCount = 0; 167 mTimeShiftCurrentPositionCount = 0; 168 mTimeShiftStartPositionCount = 0; 169 mTvMessageCount = 0; 170 mAdBufferConsumedCount = 0; 171 mSendTvRecordingInfoCount = 0; 172 mSendTvRecordingInfoListCount = 0; 173 mCurrentVideoBoundsCount = 0; 174 mRecordingTunedCount = 0; 175 mRecordingConnectionFailedCount = 0; 176 mRecordingDisconnected = 0; 177 mRecordingErrorCount = 0; 178 179 mKeyDownCode = null; 180 mKeyUpCode = null; 181 mKeyMultipleCode = null; 182 mKeyDownEvent = null; 183 mKeyUpEvent = null; 184 mKeyMultipleEvent = null; 185 mTunedUri = null; 186 mCreateBiIAppUri = null; 187 mCreateBiIAppParams = null; 188 mDestroyBiIAppId = null; 189 mAdResponse = null; 190 mBroadcastInfoResponse = null; 191 mRecordingId = null; 192 mRequestId = null; 193 mPlaybackParams = null; 194 mTimeShiftMode = null; 195 mAvailableSpeeds = new float[]{}; 196 mTimeShiftStatus = null; 197 mInputId = null; 198 mTimeShiftCurrentPosition = null; 199 mTimeShiftStartPosition = null; 200 mTvMessageData = null; 201 mTvMessageType = null; 202 mAdBuffer = null; 203 mTvRecordingInfo = null; 204 mTvRecordingInfoList = null; 205 mCurrentVideoBounds = null; 206 mRecordingError = null; 207 } 208 209 @Override layoutSurface(int left, int top, int right, int bottom)210 public void layoutSurface(int left, int top, int right, int bottom) { 211 super.layoutSurface(left, top, right, bottom); 212 } 213 214 @Override notifySessionStateChanged(int state, int err)215 public void notifySessionStateChanged(int state, int err) { 216 super.notifySessionStateChanged(state, err); 217 } 218 219 @Override removeBroadcastInfo(int requestId)220 public void removeBroadcastInfo(int requestId) { 221 super.removeBroadcastInfo(requestId); 222 } 223 224 @Override requestAd(AdRequest request)225 public void requestAd(AdRequest request) { 226 super.requestAd(request); 227 } 228 229 @Override requestBroadcastInfo(BroadcastInfoRequest request)230 public void requestBroadcastInfo(BroadcastInfoRequest request) { 231 super.requestBroadcastInfo(request); 232 } 233 234 @Override requestCurrentChannelLcn()235 public void requestCurrentChannelLcn() { 236 super.requestCurrentChannelLcn(); 237 } 238 239 @Override requestCurrentChannelUri()240 public void requestCurrentChannelUri() { 241 super.requestCurrentChannelUri(); 242 } 243 244 @Override requestCurrentTvInputId()245 public void requestCurrentTvInputId() { 246 super.requestCurrentTvInputId(); 247 } 248 249 @Override requestStreamVolume()250 public void requestStreamVolume() { 251 super.requestStreamVolume(); 252 } 253 254 @Override requestTrackInfoList()255 public void requestTrackInfoList() { 256 super.requestTrackInfoList(); 257 } 258 259 @Override requestScheduleRecording(String requestId, String inputId, Uri channelUri, Uri programUri, Bundle params)260 public void requestScheduleRecording(String requestId, String inputId, Uri channelUri, 261 Uri programUri, Bundle params) { 262 super.requestScheduleRecording(requestId, inputId, channelUri, programUri, params); 263 } 264 265 @Override requestScheduleRecording(String requestId, String inputId, Uri channelUri, long startTime, long duration, int repeatedDays, Bundle params)266 public void requestScheduleRecording(String requestId, String inputId, Uri channelUri, 267 long startTime, long duration, int repeatedDays, Bundle params) { 268 super.requestScheduleRecording( 269 requestId, inputId, channelUri, startTime, duration, repeatedDays, params); 270 } 271 272 @Override requestAvailableSpeeds()273 public void requestAvailableSpeeds() { 274 super.requestAvailableSpeeds(); 275 } 276 277 @Override requestTimeShiftMode()278 public void requestTimeShiftMode() { 279 super.requestTimeShiftMode(); 280 } 281 282 @Override sendPlaybackCommandRequest(String cmdType, Bundle parameters)283 public void sendPlaybackCommandRequest(String cmdType, Bundle parameters) { 284 super.sendPlaybackCommandRequest(cmdType, parameters); 285 } 286 287 @Override sendTimeShiftCommandRequest(String cmdType, Bundle parameters)288 public void sendTimeShiftCommandRequest(String cmdType, Bundle parameters) { 289 super.sendTimeShiftCommandRequest(cmdType, parameters); 290 } 291 292 @Override setMediaViewEnabled(boolean enable)293 public void setMediaViewEnabled(boolean enable) { 294 super.setMediaViewEnabled(enable); 295 } 296 297 @Override setVideoBounds(Rect rect)298 public void setVideoBounds(Rect rect) { 299 super.setVideoBounds(rect); 300 } 301 302 @Override onStartInteractiveApp()303 public void onStartInteractiveApp() { 304 super.onStartInteractiveApp(); 305 mStartInteractiveAppCount++; 306 notifySessionStateChanged( 307 TvInteractiveAppManager.INTERACTIVE_APP_STATE_RUNNING, 308 TvInteractiveAppManager.ERROR_NONE); 309 } 310 311 @Override onStopInteractiveApp()312 public void onStopInteractiveApp() { 313 super.onStopInteractiveApp(); 314 mStopInteractiveAppCount++; 315 } 316 317 @Override onRelease()318 public void onRelease() { 319 } 320 321 @Override onSetSurface(Surface surface)322 public boolean onSetSurface(Surface surface) { 323 mSetSurfaceCount++; 324 return false; 325 } 326 327 @Override onSurfaceChanged(int format, int width, int height)328 public void onSurfaceChanged(int format, int width, int height) { 329 super.onSurfaceChanged(format, width, height); 330 mSurfaceChangedCount++; 331 } 332 333 @Override onKeyDown(int keyCode, KeyEvent event)334 public boolean onKeyDown(int keyCode, KeyEvent event) { 335 super.onKeyDown(keyCode, event); 336 mKeyDownCount++; 337 mKeyDownCode = keyCode; 338 mKeyDownEvent = event; 339 return false; 340 } 341 342 @Override onKeyLongPress(int keyCode, KeyEvent event)343 public boolean onKeyLongPress(int keyCode, KeyEvent event) { 344 super.onKeyLongPress(keyCode, event); 345 return false; 346 } 347 348 @Override onKeyUp(int keyCode, KeyEvent event)349 public boolean onKeyUp(int keyCode, KeyEvent event) { 350 super.onKeyUp(keyCode, event); 351 mKeyUpCount++; 352 mKeyUpCode = keyCode; 353 mKeyUpEvent = event; 354 return false; 355 } 356 357 @Override onKeyMultiple(int keyCode, int count, KeyEvent event)358 public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 359 super.onKeyMultiple(keyCode, count, event); 360 mKeyMultipleCount++; 361 mKeyMultipleCode = keyCode; 362 mKeyMultipleEvent = event; 363 return false; 364 } 365 366 @Override onCreateBiInteractiveAppRequest(Uri biIAppUri, Bundle params)367 public void onCreateBiInteractiveAppRequest(Uri biIAppUri, Bundle params) { 368 super.onCreateBiInteractiveAppRequest(biIAppUri, params); 369 mCreateBiIAppCount++; 370 mCreateBiIAppUri = biIAppUri; 371 mCreateBiIAppParams = params; 372 notifyBiInteractiveAppCreated(biIAppUri, "biIAppId"); 373 } 374 375 @Override onDestroyBiInteractiveAppRequest(String biIAppId)376 public void onDestroyBiInteractiveAppRequest(String biIAppId) { 377 super.onDestroyBiInteractiveAppRequest(biIAppId); 378 mDestroyBiIAppCount++; 379 mDestroyBiIAppId = biIAppId; 380 } 381 382 @Override onTuned(Uri uri)383 public void onTuned(Uri uri) { 384 super.onTuned(uri); 385 mTunedCount++; 386 mTunedUri = uri; 387 } 388 389 @Override onVideoAvailable()390 public void onVideoAvailable() { 391 super.onVideoAvailable(); 392 mVideoAvailableCount++; 393 } 394 395 @Override onAdResponse(AdResponse response)396 public void onAdResponse(AdResponse response) { 397 super.onAdResponse(response); 398 mAdResponseCount++; 399 mAdResponse = response; 400 } 401 402 @Override onBroadcastInfoResponse(BroadcastInfoResponse response)403 public void onBroadcastInfoResponse(BroadcastInfoResponse response) { 404 super.onBroadcastInfoResponse(response); 405 mBroadcastInfoResponseCount++; 406 mBroadcastInfoResponse = response; 407 } 408 409 @Override onContentAllowed()410 public void onContentAllowed() { 411 super.onContentAllowed(); 412 } 413 414 @Override onContentBlocked(TvContentRating rating)415 public void onContentBlocked(TvContentRating rating) { 416 super.onContentBlocked(rating); 417 } 418 419 @Override onCreateMediaView()420 public View onCreateMediaView() { 421 super.onCreateMediaView(); 422 return null; 423 } 424 425 @Override onCurrentChannelLcn(int lcn)426 public void onCurrentChannelLcn(int lcn) { 427 super.onCurrentChannelLcn(lcn); 428 } 429 430 @Override onCurrentChannelUri(Uri uri)431 public void onCurrentChannelUri(Uri uri) { 432 super.onCurrentChannelUri(uri); 433 } 434 435 @Override onCurrentTvInputId(String id)436 public void onCurrentTvInputId(String id) { 437 super.onCurrentTvInputId(id); 438 } 439 440 @Override onCurrentVideoBounds(Rect rect)441 public void onCurrentVideoBounds(Rect rect) { 442 super.onCurrentVideoBounds(rect); 443 mCurrentVideoBoundsCount++; 444 mCurrentVideoBounds = rect; 445 } 446 447 @Override onGenericMotionEvent(MotionEvent event)448 public boolean onGenericMotionEvent(MotionEvent event) { 449 super.onGenericMotionEvent(event); 450 return false; 451 } 452 453 @Override onMediaViewSizeChanged(int w, int h)454 public void onMediaViewSizeChanged(int w, int h) { 455 super.onMediaViewSizeChanged(w, h); 456 } 457 458 @Override onResetInteractiveApp()459 public void onResetInteractiveApp() { 460 super.onResetInteractiveApp(); 461 } 462 463 @Override onSetTeletextAppEnabled(boolean enable)464 public void onSetTeletextAppEnabled(boolean enable) { 465 super.onSetTeletextAppEnabled(enable); 466 } 467 468 @Override onSignalStrength(int strength)469 public void onSignalStrength(int strength) { 470 super.onSignalStrength(strength); 471 } 472 473 @Override onStreamVolume(float v)474 public void onStreamVolume(float v) { 475 super.onStreamVolume(v); 476 } 477 478 @Override onTouchEvent(MotionEvent event)479 public boolean onTouchEvent(MotionEvent event) { 480 super.onTouchEvent(event); 481 return false; 482 } 483 484 @Override onTrackInfoList(List<TvTrackInfo> infos)485 public void onTrackInfoList(List<TvTrackInfo> infos) { 486 super.onTrackInfoList(infos); 487 } 488 489 @Override onTrackSelected(int type, String id)490 public void onTrackSelected(int type, String id) { 491 super.onTrackSelected(type, id); 492 } 493 494 @Override onTrackballEvent(MotionEvent event)495 public boolean onTrackballEvent(MotionEvent event) { 496 super.onTrackballEvent(event); 497 return false; 498 } 499 500 @Override onTracksChanged(List<TvTrackInfo> infos)501 public void onTracksChanged(List<TvTrackInfo> infos) { 502 super.onTracksChanged(infos); 503 } 504 505 @Override onVideoUnavailable(int reason)506 public void onVideoUnavailable(int reason) { 507 super.onVideoUnavailable(reason); 508 } 509 510 @Override onSigningResult(String signingId, byte[] result)511 public void onSigningResult(String signingId, byte[] result) { 512 super.onSigningResult(signingId, result); 513 mSigningResultCount++; 514 } 515 516 @Override onError(String errMsg, Bundle params)517 public void onError(String errMsg, Bundle params) { 518 super.onError(errMsg, params); 519 mErrorCount++; 520 } 521 522 @Override onRecordingStarted(String recordingId, String requestId)523 public void onRecordingStarted(String recordingId, String requestId) { 524 super.onRecordingStarted(recordingId, requestId); 525 mRecordingStartedCount++; 526 mRecordingId = recordingId; 527 mRequestId = requestId; 528 } 529 530 @Override onRecordingStopped(String recordingId)531 public void onRecordingStopped(String recordingId) { 532 super.onRecordingStopped(recordingId); 533 mRecordingStoppedCount++; 534 mRecordingId = recordingId; 535 } 536 537 @Override onRecordingScheduled(String recordingId, String requestId)538 public void onRecordingScheduled(String recordingId, String requestId) { 539 super.onRecordingScheduled(recordingId, requestId); 540 mRecordingScheduledCount++; 541 mRecordingId = recordingId; 542 mRequestId = requestId; 543 } 544 545 @Override onTimeShiftPlaybackParams(PlaybackParams params)546 public void onTimeShiftPlaybackParams(PlaybackParams params) { 547 super.onTimeShiftPlaybackParams(params); 548 mPlaybackParamCount++; 549 mPlaybackParams = params; 550 } 551 552 @Override onTimeShiftMode(int mode)553 public void onTimeShiftMode(int mode) { 554 super.onTimeShiftMode(mode); 555 mTimeShiftMode = mode; 556 mTimeShiftModeCount++; 557 } 558 559 @Override onAvailableSpeeds(float[] availableSpeeds)560 public void onAvailableSpeeds(float[] availableSpeeds) { 561 super.onAvailableSpeeds(availableSpeeds); 562 mAvailableSpeedsCount++; 563 mAvailableSpeeds = availableSpeeds; 564 } 565 566 @Override onTimeShiftStartPositionChanged(String inputId, long timeMs)567 public void onTimeShiftStartPositionChanged(String inputId, long timeMs) { 568 super.onTimeShiftStartPositionChanged(inputId, timeMs); 569 mTimeShiftStartPosition = timeMs; 570 mInputId = inputId; 571 mTimeShiftStartPositionCount++; 572 } 573 574 @Override onTimeShiftCurrentPositionChanged(String inputId, long timeMs)575 public void onTimeShiftCurrentPositionChanged(String inputId, long timeMs) { 576 super.onTimeShiftCurrentPositionChanged(inputId, timeMs); 577 mTimeShiftCurrentPosition = timeMs; 578 mTimeShiftCurrentPositionCount++; 579 mInputId = inputId; 580 } 581 582 @Override onTimeShiftStatusChanged(String inputId, int status)583 public void onTimeShiftStatusChanged(String inputId, int status) { 584 super.onTimeShiftStatusChanged(inputId, status); 585 mTimeShiftStatusCount++; 586 mTimeShiftStatus = status; 587 mInputId = inputId; 588 } 589 590 @Override onTvMessage(int type, Bundle data)591 public void onTvMessage(int type, Bundle data) { 592 super.onTvMessage(type, data); 593 mTvMessageCount++; 594 mTvMessageType = type; 595 mTvMessageData = data; 596 } 597 598 @Override onAdBufferConsumed(AdBuffer adBuffer)599 public void onAdBufferConsumed(AdBuffer adBuffer) { 600 super.onAdBufferConsumed(adBuffer); 601 mAdBufferConsumedCount++; 602 mAdBuffer = adBuffer; 603 } 604 605 @Override onTvRecordingInfo(TvRecordingInfo tvRecordingInfo)606 public void onTvRecordingInfo(TvRecordingInfo tvRecordingInfo) { 607 super.onTvRecordingInfo(tvRecordingInfo); 608 mSendTvRecordingInfoCount++; 609 mTvRecordingInfo = tvRecordingInfo; 610 } 611 612 @Override onTvRecordingInfoList(List<TvRecordingInfo> recordingInfoList)613 public void onTvRecordingInfoList(List<TvRecordingInfo> recordingInfoList) { 614 super.onTvRecordingInfoList(recordingInfoList); 615 mSendTvRecordingInfoListCount++; 616 mTvRecordingInfoList = recordingInfoList; 617 } 618 619 @Override onRecordingTuned(String recordingId, Uri channelUri)620 public void onRecordingTuned(String recordingId, Uri channelUri) { 621 mRecordingTunedCount++; 622 mRecordingId = recordingId; 623 mTunedUri = channelUri; 624 } 625 626 @Override onRecordingConnectionFailed(String recordingId, String inputId)627 public void onRecordingConnectionFailed(String recordingId, String inputId) { 628 super.onRecordingConnectionFailed(recordingId, inputId); 629 mRecordingConnectionFailedCount++; 630 mRecordingId = recordingId; 631 mInputId = inputId; 632 } 633 634 @Override onRecordingDisconnected(String recordingId, String inputId)635 public void onRecordingDisconnected(String recordingId, String inputId) { 636 super.onRecordingDisconnected(recordingId, inputId); 637 mRecordingDisconnected++; 638 mRecordingId = recordingId; 639 mInputId = inputId; 640 } 641 642 @Override onRecordingError(String recordingId, int err)643 public void onRecordingError(String recordingId, int err) { 644 super.onRecordingError(recordingId, err); 645 mRecordingErrorCount++; 646 mRecordingId = recordingId; 647 mRecordingError = err; 648 } 649 } 650 } 651