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