blob: 5e4036c1d74515e64000ced27a7e98507fba08d4 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.cts.verifier.tv;
import android.content.Intent;
import android.database.Cursor;
import android.media.tv.TvContract;
import android.view.View;
import android.widget.Toast;
import com.android.cts.verifier.R;
import java.util.concurrent.TimeUnit;
/**
* Tests for verifying TV app behavior on time shift.
*/
public class TimeShiftTestActivity extends TvAppVerifierActivity
implements View.OnClickListener {
private static final long TIMEOUT_MS = TimeUnit.MINUTES.toMillis(5);
private static final boolean NOT_PASSED = false;
private static final boolean PASSED = true;
private View mPauseResumeItem;
private View mVerifyResumeAfterPauseItem;
private View mVerifyPositionTrackingItem;
private View mSetPlaybackParamsItem;
private View mVerifyRewindItem;
private View mVerifyFastForwardItem;
private View mSeekToItem;
private View mVerifySeekToPreviousItem;
private View mVerifySeekToNextItem;
private Intent mTvAppIntent = null;
@Override
public void onClick(View v) {
final View postTarget = getPostTarget();
if (containsButton(mPauseResumeItem, v)) {
mVerifyResumeAfterPauseItem.setTag(NOT_PASSED);
mVerifyPositionTrackingItem.setTag(NOT_PASSED);
final Runnable failCallback = new Runnable() {
@Override
public void run() {
setPassState(mVerifyResumeAfterPauseItem, false);
setPassState(mVerifyPositionTrackingItem, false);
}
};
postTarget.postDelayed(failCallback, TIMEOUT_MS);
MockTvInputService.expectResumeAfterPause(postTarget, new Runnable() {
@Override
public void run() {
postTarget.removeCallbacks(failCallback);
setPassState(mPauseResumeItem, true);
setPassState(mVerifyResumeAfterPauseItem, true);
mVerifyResumeAfterPauseItem.setTag(PASSED);
if (isPassedState(mVerifyResumeAfterPauseItem)
&& isPassedState(mVerifyPositionTrackingItem)) {
setButtonEnabled(mSetPlaybackParamsItem, true);
}
}
});
MockTvInputService.expectPositionTracking(postTarget, new Runnable() {
@Override
public void run() {
postTarget.removeCallbacks(failCallback);
setPassState(mPauseResumeItem, true);
setPassState(mVerifyPositionTrackingItem, true);
mVerifyPositionTrackingItem.setTag(PASSED);
if (isPassedState(mVerifyResumeAfterPauseItem)
&& isPassedState(mVerifyPositionTrackingItem)) {
setButtonEnabled(mSetPlaybackParamsItem, true);
}
}
});
} else if (containsButton(mSetPlaybackParamsItem, v)) {
mVerifyRewindItem.setTag(NOT_PASSED);
mVerifyFastForwardItem.setTag(NOT_PASSED);
final Runnable failCallback = new Runnable() {
@Override
public void run() {
setPassState(mVerifyRewindItem, false);
setPassState(mVerifyFastForwardItem, false);
}
};
postTarget.postDelayed(failCallback, TIMEOUT_MS);
MockTvInputService.expectRewind(postTarget, new Runnable() {
@Override
public void run() {
postTarget.removeCallbacks(failCallback);
setPassState(mSetPlaybackParamsItem, true);
setPassState(mVerifyRewindItem, true);
mVerifyRewindItem.setTag(PASSED);
if (isPassedState(mVerifyRewindItem) && isPassedState(mVerifyFastForwardItem)) {
setButtonEnabled(mSeekToItem, true);
}
}
});
MockTvInputService.expectFastForward(postTarget, new Runnable() {
@Override
public void run() {
postTarget.removeCallbacks(failCallback);
setPassState(mSetPlaybackParamsItem, true);
setPassState(mVerifyFastForwardItem, true);
mVerifyFastForwardItem.setTag(PASSED);
if (isPassedState(mVerifyRewindItem) && isPassedState(mVerifyFastForwardItem)) {
setButtonEnabled(mSeekToItem, true);
}
}
});
} else if (containsButton(mSeekToItem, v)) {
mVerifySeekToPreviousItem.setTag(NOT_PASSED);
mVerifySeekToNextItem.setTag(NOT_PASSED);
final Runnable failCallback = new Runnable() {
@Override
public void run() {
setPassState(mVerifySeekToPreviousItem, false);
setPassState(mVerifySeekToNextItem, false);
}
};
postTarget.postDelayed(failCallback, TIMEOUT_MS);
MockTvInputService.expectSeekToPrevious(postTarget, new Runnable() {
@Override
public void run() {
postTarget.removeCallbacks(failCallback);
setPassState(mSeekToItem, true);
setPassState(mVerifySeekToPreviousItem, true);
mVerifySeekToPreviousItem.setTag(PASSED);
if (isPassedState(mVerifySeekToPreviousItem)
&& isPassedState(mVerifySeekToNextItem)) {
getPassButton().setEnabled(true);
}
}
});
MockTvInputService.expectSeekToNext(postTarget, new Runnable() {
@Override
public void run() {
postTarget.removeCallbacks(failCallback);
setPassState(mSeekToItem, true);
setPassState(mVerifySeekToNextItem, true);
mVerifySeekToNextItem.setTag(PASSED);
if (isPassedState(mVerifySeekToPreviousItem)
&& isPassedState(mVerifySeekToNextItem)) {
getPassButton().setEnabled(true);
}
}
});
}
if (mTvAppIntent == null) {
String[] projection = { TvContract.Channels._ID };
try (Cursor cursor = getContentResolver().query(
TvContract.buildChannelsUriForInput(MockTvInputService.getInputId(this)),
projection, null, null, null)) {
if (cursor != null && cursor.moveToNext()) {
mTvAppIntent = new Intent(Intent.ACTION_VIEW,
TvContract.buildChannelUri(cursor.getLong(0)));
}
}
if (mTvAppIntent == null) {
Toast.makeText(this, R.string.tv_channel_not_found, Toast.LENGTH_SHORT).show();
return;
}
}
startActivity(mTvAppIntent);
}
@Override
protected void createTestItems() {
mPauseResumeItem = createUserItem(
R.string.tv_time_shift_test_pause_resume,
R.string.tv_launch_tv_app, this);
setButtonEnabled(mPauseResumeItem, true);
mVerifyResumeAfterPauseItem = createAutoItem(
R.string.tv_time_shift_test_verify_resume_after_pause);
mVerifyPositionTrackingItem = createAutoItem(
R.string.tv_time_shift_test_verify_position_tracking);
mSetPlaybackParamsItem = createUserItem(
R.string.tv_time_shift_test_speed_rate,
R.string.tv_launch_tv_app, this);
mVerifyRewindItem = createAutoItem(
R.string.tv_time_shift_test_verify_rewind);
mVerifyFastForwardItem = createAutoItem(
R.string.tv_time_shift_test_verify_fast_forward);
mSeekToItem = createUserItem(
R.string.tv_time_shift_test_seek,
R.string.tv_launch_tv_app, this);
mVerifySeekToPreviousItem = createAutoItem(
R.string.tv_time_shift_test_verify_seek_to_previous);
mVerifySeekToNextItem = createAutoItem(
R.string.tv_time_shift_test_verify_seek_to_next);
}
@Override
protected void setInfoResources() {
setInfoResources(R.string.tv_time_shift_test,
R.string.tv_time_shift_test_info, -1);
}
private boolean isPassedState(View view) {
return ((Boolean) view.getTag()) == PASSED;
}
}