diff options
Diffstat (limited to 'src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java')
-rw-r--r-- | src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java b/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java new file mode 100644 index 00000000..533a4882 --- /dev/null +++ b/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2016 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.ui; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.media.tv.TvContract; +import android.support.annotation.Nullable; +import android.support.v17.leanback.widget.Presenter; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import com.android.tv.ApplicationSingletons; +import com.android.tv.R; +import com.android.tv.TvApplication; +import com.android.tv.data.Channel; +import com.android.tv.data.ChannelDataManager; +import com.android.tv.data.Program; +import com.android.tv.data.ProgramDataManager; +import com.android.tv.dvr.DvrManager; +import com.android.tv.dvr.ScheduledRecording; +import com.android.tv.util.Utils; + +/** + * Presents a {@link ScheduledRecording} in the {@link DvrBrowseFragment}. + */ +public class ScheduledRecordingPresenter extends Presenter { + private final ChannelDataManager mChannelDataManager; + + private static final class ScheduledRecordingViewHolder extends ViewHolder { + private ProgramDataManager.QueryProgramTask mQueryProgramTask; + + ScheduledRecordingViewHolder(RecordingCardView view) { + super(view); + } + } + + public ScheduledRecordingPresenter(Context context) { + ApplicationSingletons singletons = TvApplication.getSingletons(context); + mChannelDataManager = singletons.getChannelDataManager(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent) { + Context context = parent.getContext(); + RecordingCardView view = new RecordingCardView(context); + return new ScheduledRecordingViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder baseHolder, Object o) { + ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder; + final ScheduledRecording recording = (ScheduledRecording) o; + final RecordingCardView cardView = (RecordingCardView) viewHolder.view; + final Context context = viewHolder.view.getContext(); + + long programId = recording.getProgramId(); + if (programId == ScheduledRecording.ID_NOT_SET) { + setTitleAndImage(cardView, recording, null); + } else { + viewHolder.mQueryProgramTask = new ProgramDataManager.QueryProgramTask( + context.getContentResolver(), programId) { + @Override + protected void onPostExecute(Program program) { + super.onPostExecute(program); + setTitleAndImage(cardView, recording, program); + } + }; + viewHolder.mQueryProgramTask.executeOnDbThread(); + + } + cardView.setContent(Utils.getDurationString(context, recording.getStartTimeMs(), + recording.getEndTimeMs(), true)); + //TODO: replace with a detail card + View.OnClickListener clickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + switch (recording.getState()) { + case ScheduledRecording.STATE_RECORDING_NOT_STARTED: { + showScheduledRecordingDialog(v.getContext(), recording); + break; + } + case ScheduledRecording.STATE_RECORDING_IN_PROGRESS: { + showCurrentlyRecordingDialog(v.getContext(), recording); + break; + } + } + } + }; + baseHolder.view.setOnClickListener(clickListener); + } + + private void setTitleAndImage(RecordingCardView cardView, ScheduledRecording recording, + @Nullable Program program) { + if (program != null) { + cardView.setTitle(program.getTitle()); + cardView.setImageUri(program.getPosterArtUri()); + } else { + cardView.setTitle( + cardView.getResources().getString(R.string.dvr_msg_program_title_unknown)); + Channel channel = mChannelDataManager.getChannel(recording.getChannelId()); + if (channel != null) { + cardView.setImageUri(TvContract.buildChannelLogoUri(channel.getId()).toString()); + } + } + } + + @Override + public void onUnbindViewHolder(ViewHolder baseHolder) { + ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder; + final RecordingCardView cardView = (RecordingCardView) viewHolder.view; + if (viewHolder.mQueryProgramTask != null) { + viewHolder.mQueryProgramTask.cancel(true); + viewHolder.mQueryProgramTask = null; + } + cardView.reset(); + } + + private void showScheduledRecordingDialog(final Context context, + final ScheduledRecording recording) { + DialogInterface.OnClickListener removeScheduleListener + = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // TODO(DVR) handle success/failure. + DvrManager dvrManager = TvApplication.getSingletons(context) + .getDvrManager(); + dvrManager.removeScheduledRecording((ScheduledRecording) recording); + } + }; + new AlertDialog.Builder(context) + .setMessage(R.string.epg_dvr_dialog_message_remove_recording_schedule) + .setNegativeButton(android.R.string.no, null) + .setPositiveButton(android.R.string.yes, removeScheduleListener) + .show(); + } + + private void showCurrentlyRecordingDialog(final Context context, + final ScheduledRecording recording) { + DialogInterface.OnClickListener stopRecordingListener + = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + DvrManager dvrManager = TvApplication.getSingletons(context) + .getDvrManager(); + dvrManager.stopRecording((ScheduledRecording) recording); + } + }; + new AlertDialog.Builder(context) + .setMessage(R.string.epg_dvr_dialog_message_stop_recording) + .setNegativeButton(android.R.string.no, null) + .setPositiveButton(android.R.string.yes, stopRecordingListener) + .show(); + } +} |