148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho/* 248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * Copyright (C) 2016 The Android Open Source Project 348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * 448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * Licensed under the Apache License, Version 2.0 (the "License"); 548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * you may not use this file except in compliance with the License. 648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * You may obtain a copy of the License at 748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * 848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * http://www.apache.org/licenses/LICENSE-2.0 948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * 1048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * Unless required by applicable law or agreed to in writing, software 1148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * distributed under the License is distributed on an "AS IS" BASIS, 1248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * See the License for the specific language governing permissions and 1448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * limitations under the License. 1548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho */ 1648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 1748dadb49248271b01997862e1335912a4f2e189fYoungsang Chopackage com.android.tv.dvr.ui; 1848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 1948dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.app.AlertDialog; 2048dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.content.Context; 2148dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.content.DialogInterface; 2248dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.media.tv.TvContract; 2348dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.support.annotation.Nullable; 2448dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.support.v17.leanback.widget.Presenter; 2548dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.view.View; 2648dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.view.ViewGroup; 2748dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.widget.Toast; 2848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 2948dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.ApplicationSingletons; 3048dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.R; 3148dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.TvApplication; 3248dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.data.Channel; 3348dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.data.ChannelDataManager; 3448dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.data.Program; 3548dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.data.ProgramDataManager; 3648dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.dvr.DvrManager; 3748dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.dvr.ScheduledRecording; 3848dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport com.android.tv.util.Utils; 3948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 4048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho/** 4148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho * Presents a {@link ScheduledRecording} in the {@link DvrBrowseFragment}. 4248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho */ 4348dadb49248271b01997862e1335912a4f2e189fYoungsang Chopublic class ScheduledRecordingPresenter extends Presenter { 4448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private final ChannelDataManager mChannelDataManager; 4548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 4648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private static final class ScheduledRecordingViewHolder extends ViewHolder { 4748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private ProgramDataManager.QueryProgramTask mQueryProgramTask; 4848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 4948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho ScheduledRecordingViewHolder(RecordingCardView view) { 5048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho super(view); 5148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 5248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 5348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 5448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public ScheduledRecordingPresenter(Context context) { 5548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho ApplicationSingletons singletons = TvApplication.getSingletons(context); 5648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho mChannelDataManager = singletons.getChannelDataManager(); 5748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 5848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 5948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 6048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public ViewHolder onCreateViewHolder(ViewGroup parent) { 6148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho Context context = parent.getContext(); 6248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho RecordingCardView view = new RecordingCardView(context); 6348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho return new ScheduledRecordingViewHolder(view); 6448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 6548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 6648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 6748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public void onBindViewHolder(ViewHolder baseHolder, Object o) { 6848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder; 6948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho final ScheduledRecording recording = (ScheduledRecording) o; 7048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho final RecordingCardView cardView = (RecordingCardView) viewHolder.view; 7148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho final Context context = viewHolder.view.getContext(); 7248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 7348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho long programId = recording.getProgramId(); 7448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (programId == ScheduledRecording.ID_NOT_SET) { 7548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho setTitleAndImage(cardView, recording, null); 7648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } else { 7748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho viewHolder.mQueryProgramTask = new ProgramDataManager.QueryProgramTask( 7848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho context.getContentResolver(), programId) { 7948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 8048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho protected void onPostExecute(Program program) { 8148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho super.onPostExecute(program); 8248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho setTitleAndImage(cardView, recording, program); 8348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 8448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho }; 8548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho viewHolder.mQueryProgramTask.executeOnDbThread(); 8648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 8748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 8848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.setContent(Utils.getDurationString(context, recording.getStartTimeMs(), 8948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho recording.getEndTimeMs(), true)); 9048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho //TODO: replace with a detail card 9148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho View.OnClickListener clickListener = new View.OnClickListener() { 9248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 9348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public void onClick(View v) { 9448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho switch (recording.getState()) { 9548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho case ScheduledRecording.STATE_RECORDING_NOT_STARTED: { 9648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho showScheduledRecordingDialog(v.getContext(), recording); 9748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho break; 9848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 9948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho case ScheduledRecording.STATE_RECORDING_IN_PROGRESS: { 10048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho showCurrentlyRecordingDialog(v.getContext(), recording); 10148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho break; 10248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 10348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 10448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 10548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho }; 10648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho baseHolder.view.setOnClickListener(clickListener); 10748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 10848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 10948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private void setTitleAndImage(RecordingCardView cardView, ScheduledRecording recording, 11048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Nullable Program program) { 11148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (program != null) { 11248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.setTitle(program.getTitle()); 11348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.setImageUri(program.getPosterArtUri()); 11448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } else { 11548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.setTitle( 11648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.getResources().getString(R.string.dvr_msg_program_title_unknown)); 11748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho Channel channel = mChannelDataManager.getChannel(recording.getChannelId()); 11848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (channel != null) { 11948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.setImageUri(TvContract.buildChannelLogoUri(channel.getId()).toString()); 12048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 12148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 12248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 12348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 12448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 12548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public void onUnbindViewHolder(ViewHolder baseHolder) { 12648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder; 12748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho final RecordingCardView cardView = (RecordingCardView) viewHolder.view; 12848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (viewHolder.mQueryProgramTask != null) { 12948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho viewHolder.mQueryProgramTask.cancel(true); 13048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho viewHolder.mQueryProgramTask = null; 13148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 13248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cardView.reset(); 13348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 13448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 13548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private void showScheduledRecordingDialog(final Context context, 13648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho final ScheduledRecording recording) { 13748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho DialogInterface.OnClickListener removeScheduleListener 13848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho = new DialogInterface.OnClickListener() { 13948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 14048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public void onClick(DialogInterface dialog, int which) { 14148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho // TODO(DVR) handle success/failure. 14248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho DvrManager dvrManager = TvApplication.getSingletons(context) 14348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .getDvrManager(); 14448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho dvrManager.removeScheduledRecording((ScheduledRecording) recording); 14548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 14648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho }; 14748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho new AlertDialog.Builder(context) 14848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .setMessage(R.string.epg_dvr_dialog_message_remove_recording_schedule) 14948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .setNegativeButton(android.R.string.no, null) 15048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .setPositiveButton(android.R.string.yes, removeScheduleListener) 15148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .show(); 15248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 15348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 15448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private void showCurrentlyRecordingDialog(final Context context, 15548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho final ScheduledRecording recording) { 15648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho DialogInterface.OnClickListener stopRecordingListener 15748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho = new DialogInterface.OnClickListener() { 15848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho @Override 15948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public void onClick(DialogInterface dialog, int which) { 16048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho DvrManager dvrManager = TvApplication.getSingletons(context) 16148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .getDvrManager(); 16248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho dvrManager.stopRecording((ScheduledRecording) recording); 16348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 16448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho }; 16548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho new AlertDialog.Builder(context) 16648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .setMessage(R.string.epg_dvr_dialog_message_stop_recording) 16748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .setNegativeButton(android.R.string.no, null) 16848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .setPositiveButton(android.R.string.yes, stopRecordingListener) 16948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .show(); 17048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 17148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho} 172