/* * Copyright (C) 2018 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.tv.dvr; import android.content.Context; import android.media.PlaybackParams; import android.media.session.PlaybackState; import android.media.tv.TvTrackInfo; import android.media.tv.TvView; import android.net.Uri; import android.support.annotation.Nullable; import com.android.tv.InputSessionManager; import com.android.tv.InputSessionManager.TvViewSession; import com.android.tv.TvSingletons; import com.android.tv.common.compat.TvViewCompat.TvInputCallbackCompat; import com.android.tv.dvr.ui.playback.DvrPlayer; import com.android.tv.ui.AppLayerTvView; import com.android.tv.ui.api.TunableTvViewPlayingApi; import java.util.List; /** * A {@link TvView} wrapper to handle events and TvView session. */ public class DvrTvView implements TunableTvViewPlayingApi { private final AppLayerTvView mTvView; private DvrPlayer mDvrPlayer; private String mInputId; private Uri mRecordedProgramUri; private TvInputCallbackCompat mTvInputCallbackCompat; private InputSessionManager mInputSessionManager; private TvViewSession mSession; public DvrTvView(Context context, AppLayerTvView tvView, DvrPlayer player) { mTvView = tvView; mDvrPlayer = player; mInputSessionManager = TvSingletons.getSingletons(context).getInputSessionManager(); } @Override public boolean isPlaying() { return mDvrPlayer.getPlaybackState() == PlaybackState.STATE_PLAYING; } @Override public void setStreamVolume(float volume) { mTvView.setStreamVolume(volume); } @Override public void setTimeShiftListener(TimeShiftListener listener) { // TimeShiftListener is never called from DvrTvView because TimeShift is always available // and onRecordStartTimeChanged is not called during playback. } @Override public boolean isTimeShiftAvailable() { return true; } @Override public void timeShiftPlay() { if (mInputId != null && mRecordedProgramUri != null) { mTvView.timeShiftPlay(mInputId, mRecordedProgramUri); } } public void timeShiftPlay(String inputId, Uri recordedProgramUri) { mInputId = inputId; mRecordedProgramUri = recordedProgramUri; mSession.timeShiftPlay(inputId, recordedProgramUri); } @Override public void timeShiftPause() { mTvView.timeShiftPause(); } @Override public void timeShiftRewind(int speed) { PlaybackParams params = new PlaybackParams(); params.setSpeed(speed * -1); mTvView.timeShiftSetPlaybackParams(params); } @Override public void timeShiftFastForward(int speed) { PlaybackParams params = new PlaybackParams(); params.setSpeed(speed); mTvView.timeShiftSetPlaybackParams(params); } @Override public void timeShiftSeekTo(long timeMs) { mTvView.timeShiftSeekTo(timeMs); } @Override public long timeShiftGetCurrentPositionMs() { return mDvrPlayer.getPlaybackPosition(); } public void setCaptionEnabled(boolean enabled) { mTvView.setCaptionEnabled(enabled); } public void timeShiftResume() { mTvView.timeShiftResume(); } public void reset() { mSession.reset(); } public List getTracks(int type) { return mTvView.getTracks(type); } public void selectTrack(int type, String trackId) { mTvView.selectTrack(type, trackId); } public void timeShiftSetPlaybackParams(PlaybackParams params) { mTvView.timeShiftSetPlaybackParams(params); } public void setTimeShiftPositionCallback(@Nullable TvView.TimeShiftPositionCallback callback) { mTvView.setTimeShiftPositionCallback(callback); } public void setCallback(@Nullable TvInputCallbackCompat callback) { mTvInputCallbackCompat = callback; mTvView.setCallback(callback); } public void init() { mSession = mInputSessionManager.createTvViewSession(mTvView, this, mTvInputCallbackCompat); } public void release() { mInputSessionManager.releaseTvViewSession(mSession); mInputSessionManager = null; mDvrPlayer = null; } }