12e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko/* 22e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Copyright (C) 2015 The Android Open Source Project 32e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 42e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 52e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * you may not use this file except in compliance with the License. 62e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * You may obtain a copy of the License at 72e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 82e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 92e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 102e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Unless required by applicable law or agreed to in writing, software 112e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 122e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * See the License for the specific language governing permissions and 142e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * limitations under the License. 152e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko */ 162e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 1765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopackage com.android.tv.tuner.tvinput; 182e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 192e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.content.Context; 202e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.media.tv.TvInputManager; 212e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.media.tv.TvInputService; 222e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.net.Uri; 232e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.support.annotation.MainThread; 242e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.support.annotation.Nullable; 252e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.support.annotation.WorkerThread; 262e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.util.Log; 272e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 282e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko/** 292e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Processes DVR recordings, and deletes the previously recorded contents. 302e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko */ 312e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkopublic class TunerRecordingSession extends TvInputService.RecordingSession { 3265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String TAG = "TunerRecordingSession"; 3365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final boolean DEBUG = false; 342e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 352e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko private final TunerRecordingSessionWorker mSessionWorker; 362e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 372e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko public TunerRecordingSession(Context context, String inputId, 382e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko ChannelDataManager channelDataManager) { 392e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko super(context); 402e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko mSessionWorker = new TunerRecordingSessionWorker(context, inputId, channelDataManager, 412e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko this); 422e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 432e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 442e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko // RecordingSession 452e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @MainThread 462e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @Override 472e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko public void onTune(Uri channelUri) { 482e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko // TODO(dvr): support calling more than once, http://b/27171225 492e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (DEBUG) { 502e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko Log.d(TAG, "Requesting recording session tune: " + channelUri); 512e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mSessionWorker.tune(channelUri); 532e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 542e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 552e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @MainThread 562e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @Override 572e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko public void onRelease() { 582e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (DEBUG) { 592e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko Log.d(TAG, "Requesting recording session release."); 602e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 612e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko mSessionWorker.release(); 622e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 632e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 642e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @MainThread 652e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @Override 6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void onStartRecording(@Nullable Uri programUri) { 672e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (DEBUG) { 682e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko Log.d(TAG, "Requesting start recording."); 692e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mSessionWorker.startRecording(programUri); 712e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 722e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 732e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @MainThread 742e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @Override 752e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko public void onStopRecording() { 762e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (DEBUG) { 772e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko Log.d(TAG, "Requesting stop recording."); 782e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 792e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko mSessionWorker.stopRecording(); 802e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 812e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 822e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko // Called from TunerRecordingSessionImpl in a worker thread. 832e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @WorkerThread 842e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko public void onTuned(Uri channelUri) { 852e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (DEBUG) { 862e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko Log.d(TAG, "Notifying recording session tuned."); 872e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 882e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko notifyTuned(channelUri); 892e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 902e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 912e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @WorkerThread 922e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko public void onRecordFinished(final Uri recordedProgramUri) { 932e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (DEBUG) { 942e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko Log.d(TAG, "Notifying record successfully finished."); 952e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 962e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko notifyRecordingStopped(recordedProgramUri); 972e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 982e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 992e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @WorkerThread 10065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void onError(int reason) { 10165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Log.w(TAG, "Notifying recording error: " + reason); 1022e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko notifyError(reason); 1032e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 1042e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko} 105