1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.tv.dvr.ui;
18
19import android.content.Context;
20import android.content.Intent;
21import android.graphics.drawable.Drawable;
22import android.os.Bundle;
23import android.support.v17.leanback.widget.GuidanceStylist;
24import android.support.v17.leanback.widget.GuidedAction;
25
26import com.android.tv.R;
27import com.android.tv.TvApplication;
28import com.android.tv.data.Program;
29import com.android.tv.dvr.DvrScheduleManager;
30import com.android.tv.dvr.data.ScheduledRecording;
31import com.android.tv.dvr.data.SeriesRecording;
32import com.android.tv.dvr.ui.list.DvrSchedulesActivity;
33import com.android.tv.dvr.ui.list.DvrSeriesSchedulesFragment;
34
35import java.util.List;
36
37public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment {
38    /**
39     * The key for program list which will be passed to {@link DvrSeriesSchedulesFragment}.
40     * Type: List<{@link Program}>
41     */
42    public static final String SERIES_SCHEDULED_KEY_PROGRAMS = "series_scheduled_key_programs";
43
44    private final static long SERIES_RECORDING_ID_NOT_SET = -1;
45
46    private final static int ACTION_VIEW_SCHEDULES = 1;
47
48    private SeriesRecording mSeriesRecording;
49    private boolean mShowViewScheduleOption;
50    private List<Program> mPrograms;
51
52    private int mSchedulesAddedCount = 0;
53    private boolean mHasConflict = false;
54    private int mInThisSeriesConflictCount = 0;
55    private int mOutThisSeriesConflictCount = 0;
56
57    @Override
58    public void onAttach(Context context) {
59        super.onAttach(context);
60        long seriesRecordingId = getArguments().getLong(
61                DvrSeriesScheduledDialogActivity.SERIES_RECORDING_ID, SERIES_RECORDING_ID_NOT_SET);
62        if (seriesRecordingId == SERIES_RECORDING_ID_NOT_SET) {
63            getActivity().finish();
64            return;
65        }
66        mShowViewScheduleOption = getArguments().getBoolean(
67                DvrSeriesScheduledDialogActivity.SHOW_VIEW_SCHEDULE_OPTION);
68        mSeriesRecording = TvApplication.getSingletons(context).getDvrDataManager()
69                .getSeriesRecording(seriesRecordingId);
70        if (mSeriesRecording == null) {
71            getActivity().finish();
72            return;
73        }
74        mPrograms = (List<Program>) BigArguments.getArgument(SERIES_SCHEDULED_KEY_PROGRAMS);
75        BigArguments.reset();
76        mSchedulesAddedCount = TvApplication.getSingletons(getContext()).getDvrManager()
77                .getAvailableScheduledRecording(mSeriesRecording.getId()).size();
78        DvrScheduleManager dvrScheduleManager =
79                TvApplication.getSingletons(context).getDvrScheduleManager();
80        List<ScheduledRecording> conflictingRecordings =
81                dvrScheduleManager.getConflictingSchedules(mSeriesRecording);
82        mHasConflict = !conflictingRecordings.isEmpty();
83        for (ScheduledRecording recording : conflictingRecordings) {
84            if (recording.getSeriesRecordingId() == mSeriesRecording.getId()) {
85                ++mInThisSeriesConflictCount;
86            } else if (recording.getPriority() < mSeriesRecording.getPriority()) {
87                ++mOutThisSeriesConflictCount;
88            }
89        }
90     }
91
92    @Override
93    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
94        String title = getString(R.string.dvr_series_recording_dialog_title);
95        Drawable icon;
96        if (!mHasConflict) {
97            icon = getResources().getDrawable(R.drawable.ic_check_circle_white_48dp, null);
98        } else {
99            icon = getResources().getDrawable(R.drawable.ic_error_white_48dp, null);
100        }
101        return new GuidanceStylist.Guidance(title, getDescription(), null, icon);
102    }
103
104    @Override
105    public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
106        Context context = getContext();
107        actions.add(new GuidedAction.Builder(context)
108                .clickAction(GuidedAction.ACTION_ID_OK)
109                .build());
110        if (mShowViewScheduleOption) {
111            actions.add(new GuidedAction.Builder(context)
112                    .id(ACTION_VIEW_SCHEDULES)
113                    .title(R.string.dvr_action_view_schedules)
114                    .build());
115        }
116    }
117
118    @Override
119    public void onTrackedGuidedActionClicked(GuidedAction action) {
120        if (action.getId() == ACTION_VIEW_SCHEDULES) {
121            Intent intent = new Intent(getActivity(), DvrSchedulesActivity.class);
122            intent.putExtra(DvrSchedulesActivity.KEY_SCHEDULES_TYPE, DvrSchedulesActivity
123                    .TYPE_SERIES_SCHEDULE);
124            intent.putExtra(DvrSeriesSchedulesFragment.SERIES_SCHEDULES_KEY_SERIES_RECORDING,
125                    mSeriesRecording);
126            BigArguments.reset();
127            BigArguments.setArgument(DvrSeriesSchedulesFragment
128                    .SERIES_SCHEDULES_KEY_SERIES_PROGRAMS, mPrograms);
129            startActivity(intent);
130        }
131        getActivity().finish();
132    }
133
134    @Override
135    public String getTrackerPrefix() {
136        return "DvrMissingStorageErrorFragment";
137    }
138
139    @Override
140    public String getTrackerLabelForGuidedAction(GuidedAction action) {
141        long actionId = action.getId();
142        if (actionId == ACTION_VIEW_SCHEDULES) {
143            return "view-schedules";
144        } else {
145            return super.getTrackerLabelForGuidedAction(action);
146        }
147    }
148
149    private String getDescription() {
150        if (!mHasConflict) {
151            return getResources().getQuantityString(
152                    R.plurals.dvr_series_scheduled_no_conflict, mSchedulesAddedCount,
153                    mSchedulesAddedCount, mSeriesRecording.getTitle());
154        } else {
155            // mInThisSeriesConflictCount equals 0 and mOutThisSeriesConflictCount equals 0 means
156            // mHasConflict is false. So we don't need to check that case.
157            if (mInThisSeriesConflictCount != 0 && mOutThisSeriesConflictCount != 0) {
158                return getResources().getQuantityString(
159                        R.plurals.dvr_series_scheduled_this_and_other_series_conflict,
160                        mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
161                        mInThisSeriesConflictCount + mOutThisSeriesConflictCount);
162            } else if (mInThisSeriesConflictCount != 0) {
163                return getResources().getQuantityString(
164                        R.plurals.dvr_series_recording_scheduled_only_this_series_conflict,
165                        mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
166                        mInThisSeriesConflictCount);
167            } else {
168                if (mOutThisSeriesConflictCount == 1) {
169                    return getResources().getQuantityString(
170                            R.plurals.dvr_series_scheduled_only_other_series_one_conflict,
171                            mSchedulesAddedCount, mSchedulesAddedCount,
172                            mSeriesRecording.getTitle());
173                } else {
174                    return getResources().getQuantityString(
175                            R.plurals.dvr_series_scheduled_only_other_series_many_conflicts,
176                            mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
177                            mOutThisSeriesConflictCount);
178                }
179            }
180        }
181    }
182}
183