/* * 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.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import androidx.leanback.widget.GuidanceStylist; import androidx.leanback.widget.GuidedAction; import com.android.tv.R; import com.android.tv.TvSingletons; import com.android.tv.data.ProgramImpl; import com.android.tv.data.api.Program; import com.android.tv.dvr.DvrScheduleManager; import com.android.tv.dvr.data.ScheduledRecording; import com.android.tv.dvr.data.SeriesRecording; import com.android.tv.dvr.ui.list.DvrSchedulesActivity; import com.android.tv.dvr.ui.list.DvrSeriesSchedulesFragment; import java.util.List; public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment { /** * The key for program list which will be passed to {@link DvrSeriesSchedulesFragment}. Type: * List<{@link ProgramImpl}> */ public static final String SERIES_SCHEDULED_KEY_PROGRAMS = "series_scheduled_key_programs"; private static final long SERIES_RECORDING_ID_NOT_SET = -1; private static final int ACTION_VIEW_SCHEDULES = 1; private SeriesRecording mSeriesRecording; private boolean mShowViewScheduleOption; private List mPrograms; private String mSeriesRecordingTitle; private int mSchedulesAddedCount = 0; private boolean mHasConflict = false; private int mInThisSeriesConflictCount = 0; private int mOutThisSeriesConflictCount = 0; @Override public void onAttach(Context context) { super.onAttach(context); long seriesRecordingId = getArguments() .getLong( DvrSeriesScheduledDialogActivity.SERIES_RECORDING_ID, SERIES_RECORDING_ID_NOT_SET); if (seriesRecordingId == SERIES_RECORDING_ID_NOT_SET) { getActivity().finish(); return; } mShowViewScheduleOption = getArguments() .getBoolean(DvrSeriesScheduledDialogActivity.SHOW_VIEW_SCHEDULE_OPTION); mSeriesRecording = TvSingletons.getSingletons(context) .getDvrDataManager() .getSeriesRecording(seriesRecordingId); if (mSeriesRecording == null) { getActivity().finish(); return; } mSeriesRecordingTitle = mSeriesRecording.getTitle(); mPrograms = (List) BigArguments.getArgument(SERIES_SCHEDULED_KEY_PROGRAMS); BigArguments.reset(); mSchedulesAddedCount = TvSingletons.getSingletons(getContext()) .getDvrManager() .getAvailableScheduledRecording(mSeriesRecording.getId()) .size(); DvrScheduleManager dvrScheduleManager = TvSingletons.getSingletons(context).getDvrScheduleManager(); List conflictingRecordings = dvrScheduleManager.getConflictingSchedules(mSeriesRecording); mHasConflict = !conflictingRecordings.isEmpty(); for (ScheduledRecording recording : conflictingRecordings) { if (recording.getSeriesRecordingId() == mSeriesRecording.getId()) { ++mInThisSeriesConflictCount; } else if (recording.getPriority() < mSeriesRecording.getPriority()) { ++mOutThisSeriesConflictCount; } } } @Override public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { String title = getString(R.string.dvr_series_recording_dialog_title); Drawable icon; if (!mHasConflict) { icon = getResources().getDrawable(R.drawable.quantum_ic_check_circle_white_48, null); } else { icon = getResources().getDrawable(R.drawable.quantum_ic_error_white_48, null); } return new GuidanceStylist.Guidance(title, getDescription(), null, icon); } @Override public void onCreateActions(List actions, Bundle savedInstanceState) { Context context = getContext(); actions.add( new GuidedAction.Builder(context).clickAction(GuidedAction.ACTION_ID_OK).build()); if (mShowViewScheduleOption) { actions.add( new GuidedAction.Builder(context) .id(ACTION_VIEW_SCHEDULES) .title(R.string.dvr_action_view_schedules) .build()); } } @Override public void onTrackedGuidedActionClicked(GuidedAction action) { if (action.getId() == ACTION_VIEW_SCHEDULES) { Intent intent = new Intent(getActivity(), DvrSchedulesActivity.class); intent.putExtra( DvrSchedulesActivity.KEY_SCHEDULES_TYPE, DvrSchedulesActivity.TYPE_SERIES_SCHEDULE); intent.putExtra( DvrSeriesSchedulesFragment.SERIES_SCHEDULES_KEY_SERIES_RECORDING, mSeriesRecording); BigArguments.reset(); BigArguments.setArgument( DvrSeriesSchedulesFragment.SERIES_SCHEDULES_KEY_SERIES_PROGRAMS, mPrograms); startActivity(intent); } getActivity().finish(); } @Override public String getTrackerPrefix() { return "DvrMissingStorageErrorFragment"; } @Override public String getTrackerLabelForGuidedAction(GuidedAction action) { long actionId = action.getId(); if (actionId == ACTION_VIEW_SCHEDULES) { return "view-schedules"; } else { return super.getTrackerLabelForGuidedAction(action); } } private String getDescription() { if (!mHasConflict) { return getResources() .getQuantityString( R.plurals.dvr_series_scheduled_no_conflict, mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecordingTitle); } else { // mInThisSeriesConflictCount equals 0 and mOutThisSeriesConflictCount equals 0 means // mHasConflict is false. So we don't need to check that case. if (mInThisSeriesConflictCount != 0 && mOutThisSeriesConflictCount != 0) { return getResources() .getQuantityString( R.plurals.dvr_series_scheduled_this_and_other_series_conflict, mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecordingTitle, mInThisSeriesConflictCount + mOutThisSeriesConflictCount); } else if (mInThisSeriesConflictCount != 0) { return getResources() .getQuantityString( R.plurals.dvr_series_recording_scheduled_only_this_series_conflict, mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecordingTitle, mInThisSeriesConflictCount); } else { if (mOutThisSeriesConflictCount == 1) { return getResources() .getQuantityString( R.plurals.dvr_series_scheduled_only_other_series_one_conflict, mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecordingTitle); } else { return getResources() .getQuantityString( R.plurals.dvr_series_scheduled_only_other_series_many_conflicts, mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecordingTitle, mOutThisSeriesConflictCount); } } } } }