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