blob: 533a48824705fb0c7774de9b3101be8d0d0c6d93 [file] [log] [blame]
/*
* 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();
}
}