TunerRecordingSession.java revision 2e1279b8bbe0603fb4399b25b73121bed5953c46
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
172e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkopackage com.android.usbtuner.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 {
322e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private static String TAG = "TunerRecordingSession";
332e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private static boolean DEBUG = false;
342e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
352e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private final TunerRecordingSessionWorker mSessionWorker;
362e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private final String mInputId;
372e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
382e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public TunerRecordingSession(Context context, String inputId,
392e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            ChannelDataManager channelDataManager) {
402e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        super(context);
412e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mInputId = inputId;
422e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mSessionWorker = new TunerRecordingSessionWorker(context, inputId, channelDataManager,
432e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                this);
442e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
452e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
462e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    // RecordingSession
472e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @MainThread
482e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
492e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onTune(Uri channelUri) {
502e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        // TODO(dvr): support calling more than once, http://b/27171225
512e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
522e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Requesting recording session tune: " + channelUri);
532e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
542e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mSessionWorker.connect(channelUri);
552e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
562e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
572e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @MainThread
582e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
592e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onRelease() {
602e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
612e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Requesting recording session release.");
622e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
632e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mSessionWorker.release();
642e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
652e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
662e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @MainThread
672e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
682e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onStartRecording(@Nullable Uri programHint) {
692e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
702e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Requesting start recording.");
712e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
722e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mSessionWorker.startRecording();
732e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
742e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
752e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @MainThread
762e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
772e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onStopRecording() {
782e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
792e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Requesting stop recording.");
802e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
812e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mSessionWorker.stopRecording();
822e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
832e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
842e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    // Called from TunerRecordingSessionImpl in a worker thread.
852e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @WorkerThread
862e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onTuned(Uri channelUri) {
872e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
882e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Notifying recording session tuned.");
892e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
902e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        notifyTuned(channelUri);
912e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
922e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
932e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @WorkerThread
942e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onConnectFailed() {
952e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
962e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Notifying recording session connection failed.");
972e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
982e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        notifyError(TvInputManager.RECORDING_ERROR_UNKNOWN);
992e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
1002e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
1012e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @WorkerThread
1022e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onRecordFinished(final Uri recordedProgramUri) {
1032e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (DEBUG) {
1042e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Log.d(TAG, "Notifying record successfully finished.");
1052e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
1062e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        notifyRecordingStopped(recordedProgramUri);
1072e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
1082e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
1092e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @WorkerThread
1102e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public void onRecordUnexpectedlyStopped(int reason) {
1112e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        Log.w(TAG, "Notifying record failed: " + reason);
1122e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        notifyError(reason);
1132e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
1142e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko}
115