/* * 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.app.FragmentManager; import android.content.Context; import android.graphics.Typeface; import android.os.Bundle; import android.support.v17.leanback.widget.GuidanceStylist.Guidance; import android.support.v17.leanback.widget.GuidedAction; import android.support.v17.leanback.widget.GuidedActionsStylist; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.android.tv.R; import com.android.tv.TvApplication; import com.android.tv.dvr.DvrDataManager; import com.android.tv.dvr.DvrManager; import com.android.tv.dvr.DvrScheduleManager; import com.android.tv.dvr.data.SeriesRecording; import java.util.ArrayList; import java.util.List; /** Fragment for DVR series recording settings. */ public class DvrPrioritySettingsFragment extends TrackedGuidedStepFragment { /** * Name of series recording id starting the fragment. * Type: Long */ public static final String COME_FROM_SERIES_RECORDING_ID = "series_recording_id"; private static final int ONE_TIME_RECORDING_ID = 0; // button action's IDs are negative. private static final long ACTION_ID_SAVE = -100L; private final List mSeriesRecordings = new ArrayList<>(); private SeriesRecording mSelectedRecording; private SeriesRecording mComeFromSeriesRecording; private float mSelectedActionElevation; private int mActionColor; private int mSelectedActionColor; @Override public void onAttach(Context context) { super.onAttach(context); mSeriesRecordings.clear(); mSeriesRecordings.add(new SeriesRecording.Builder() .setTitle(getString(R.string.dvr_priority_action_one_time_recording)) .setPriority(Long.MAX_VALUE) .setId(ONE_TIME_RECORDING_ID) .build()); DvrDataManager dvrDataManager = TvApplication.getSingletons(context).getDvrDataManager(); long comeFromSeriesRecordingId = getArguments().getLong(COME_FROM_SERIES_RECORDING_ID, -1); for (SeriesRecording series : dvrDataManager.getSeriesRecordings()) { if (series.getState() == SeriesRecording.STATE_SERIES_NORMAL || series.getId() == comeFromSeriesRecordingId) { mSeriesRecordings.add(series); } } mSeriesRecordings.sort(SeriesRecording.PRIORITY_COMPARATOR); mComeFromSeriesRecording = dvrDataManager.getSeriesRecording(comeFromSeriesRecordingId); mSelectedActionElevation = getResources().getDimension(R.dimen.card_elevation_normal); mActionColor = getResources().getColor(R.color.dvr_guided_step_action_text_color, null); mSelectedActionColor = getResources().getColor(R.color.dvr_guided_step_action_text_color_selected, null); } @Override public void onResume() { super.onResume(); setSelectedActionPosition(mComeFromSeriesRecording == null ? 1 : mSeriesRecordings.indexOf(mComeFromSeriesRecording)); } @Override public Guidance onCreateGuidance(Bundle savedInstanceState) { String breadcrumb = mComeFromSeriesRecording == null ? null : mComeFromSeriesRecording.getTitle(); return new Guidance(getString(R.string.dvr_priority_title), getString(R.string.dvr_priority_description), breadcrumb, null); } @Override public void onCreateActions(List actions, Bundle savedInstanceState) { int position = 0; for (SeriesRecording seriesRecording : mSeriesRecordings) { actions.add(new GuidedAction.Builder(getActivity()) .id(position++) .title(seriesRecording.getTitle()) .build()); } } @Override public void onCreateButtonActions(List actions, Bundle savedInstanceState) { actions.add(new GuidedAction.Builder(getActivity()) .id(ACTION_ID_SAVE) .title(getString(R.string.dvr_priority_button_action_save)) .build()); actions.add(new GuidedAction.Builder(getActivity()) .clickAction(GuidedAction.ACTION_ID_CANCEL) .build()); } @Override public void onTrackedGuidedActionClicked(GuidedAction action) { long actionId = action.getId(); if (actionId == ACTION_ID_SAVE) { DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager(); int size = mSeriesRecordings.size(); for (int i = 1; i < size; ++i) { long priority = DvrScheduleManager.suggestSeriesPriority(size - i); SeriesRecording seriesRecording = mSeriesRecordings.get(i); if (seriesRecording.getPriority() != priority) { dvrManager.updateSeriesRecording(SeriesRecording.buildFrom(seriesRecording) .setPriority(priority).build()); } } FragmentManager fragmentManager = getFragmentManager(); fragmentManager.popBackStack(); } else if (actionId == GuidedAction.ACTION_ID_CANCEL) { FragmentManager fragmentManager = getFragmentManager(); fragmentManager.popBackStack(); } else if (mSelectedRecording == null) { mSelectedRecording = mSeriesRecordings.get((int) actionId); for (int i = 0; i < mSeriesRecordings.size(); ++i) { updateItem(i); } } else { mSelectedRecording = null; for (int i = 0; i < mSeriesRecordings.size(); ++i) { updateItem(i); } } } @Override public String getTrackerPrefix() { return "DvrPrioritySettingsFragment"; } @Override public String getTrackerLabelForGuidedAction(GuidedAction action) { long actionId = action.getId(); if (actionId == ACTION_ID_SAVE) { return "save"; } else { return super.getTrackerLabelForGuidedAction(action); } } @Override public void onGuidedActionFocused(GuidedAction action) { super.onGuidedActionFocused(action); if (mSelectedRecording == null) { return; } if (action.getId() < 0) { mSelectedRecording = null; for (int i = 0; i < mSeriesRecordings.size(); ++i) { updateItem(i); } return; } int position = (int) action.getId(); int previousPosition = mSeriesRecordings.indexOf(mSelectedRecording); mSeriesRecordings.remove(mSelectedRecording); mSeriesRecordings.add(position, mSelectedRecording); updateItem(previousPosition); updateItem(position); notifyActionChanged(previousPosition); notifyActionChanged(position); } @Override public GuidedActionsStylist onCreateButtonActionsStylist() { return new DvrGuidedActionsStylist(true); } @Override public GuidedActionsStylist onCreateActionsStylist() { return new DvrGuidedActionsStylist(false) { @Override public void onBindViewHolder(ViewHolder vh, GuidedAction action) { super.onBindViewHolder(vh, action); updateItem(vh.itemView, (int) action.getId()); } @Override public int onProvideItemLayoutId() { return R.layout.priority_settings_action_item; } }; } private void updateItem(int position) { View itemView = getActionItemView(position); if (itemView == null) { return; } updateItem(itemView, position); } private void updateItem(View itemView, int position) { GuidedAction action = getActions().get(position); action.setTitle(mSeriesRecordings.get(position).getTitle()); boolean selected = mSelectedRecording != null && mSeriesRecordings.indexOf(mSelectedRecording) == position; TextView titleView = (TextView) itemView.findViewById(R.id.guidedactions_item_title); ImageView imageView = (ImageView) itemView.findViewById(R.id.guidedactions_item_tail_image); if (position == 0) { // one-time recording itemView.setBackgroundResource(R.drawable.setup_selector_background); imageView.setVisibility(View.GONE); itemView.setFocusable(false); itemView.setElevation(0); // strings.xml tag doesn't work. titleView.setTypeface(titleView.getTypeface(), Typeface.ITALIC); } else if (mSelectedRecording == null) { titleView.setTextColor(mActionColor); itemView.setBackgroundResource(R.drawable.setup_selector_background); imageView.setImageResource(R.drawable.ic_draggable_white); imageView.setVisibility(View.VISIBLE); itemView.setFocusable(true); itemView.setElevation(0); titleView.setTypeface(titleView.getTypeface(), Typeface.NORMAL); } else if (selected) { titleView.setTextColor(mSelectedActionColor); itemView.setBackgroundResource(R.drawable.priority_settings_action_item_selected); imageView.setImageResource(R.drawable.ic_dragging_grey); imageView.setVisibility(View.VISIBLE); itemView.setFocusable(true); itemView.setElevation(mSelectedActionElevation); titleView.setTypeface(titleView.getTypeface(), Typeface.NORMAL); } else { titleView.setTextColor(mActionColor); itemView.setBackgroundResource(R.drawable.setup_selector_background); imageView.setVisibility(View.INVISIBLE); itemView.setFocusable(true); itemView.setElevation(0); titleView.setTypeface(titleView.getTypeface(), Typeface.NORMAL); } } }