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