diff options
Diffstat (limited to 'src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java')
-rw-r--r-- | src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java | 375 |
1 files changed, 0 insertions, 375 deletions
diff --git a/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java deleted file mode 100644 index e9e391d4..00000000 --- a/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java +++ /dev/null @@ -1,375 +0,0 @@ -/* - * 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.res.Resources; -import android.graphics.drawable.Drawable; -import android.media.tv.TvInputManager; -import android.os.Bundle; -import android.support.v17.leanback.app.DetailsFragment; -import android.support.v17.leanback.widget.Action; -import android.support.v17.leanback.widget.ArrayObjectAdapter; -import android.support.v17.leanback.widget.ClassPresenterSelector; -import android.support.v17.leanback.widget.DetailsOverviewRow; -import android.support.v17.leanback.widget.DetailsOverviewRowPresenter; -import android.support.v17.leanback.widget.HeaderItem; -import android.support.v17.leanback.widget.ListRow; -import android.support.v17.leanback.widget.ListRowPresenter; -import android.support.v17.leanback.widget.OnActionClickedListener; -import android.support.v17.leanback.widget.PresenterSelector; -import android.support.v17.leanback.widget.SparseArrayObjectAdapter; -import android.text.TextUtils; - -import com.android.tv.R; -import com.android.tv.TvApplication; -import com.android.tv.data.BaseProgram; -import com.android.tv.data.Channel; -import com.android.tv.dvr.DvrDataManager; -import com.android.tv.dvr.DvrManager; -import com.android.tv.dvr.DvrUiHelper; -import com.android.tv.dvr.DvrWatchedPositionManager; -import com.android.tv.dvr.RecordedProgram; -import com.android.tv.dvr.ScheduledRecording; -import com.android.tv.dvr.SeriesRecording; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * {@link DetailsFragment} for series recording in DVR. - */ -public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implements - DvrDataManager.SeriesRecordingListener, DvrDataManager.RecordedProgramListener { - private static final int ACTION_WATCH = 1; - private static final int ACTION_SERIES_SCHEDULES = 2; - private static final int ACTION_DELETE = 3; - - private DvrWatchedPositionManager mDvrWatchedPositionManager; - private DvrDataManager mDvrDataManager; - - private SeriesRecording mSeries; - // NOTICE: mRecordedPrograms should only be used in creating details fragments. - // After fragments are created, it should be cleared to save resources. - private List<RecordedProgram> mRecordedPrograms; - private RecordedProgram mRecommendRecordedProgram; - private DetailsContent mDetailsContent; - private int mSeasonRowCount; - private SparseArrayObjectAdapter mActionsAdapter; - private Action mDeleteAction; - - private boolean mPaused; - private long mInitialPlaybackPositionMs; - private String mWatchLabel; - private String mResumeLabel; - private Drawable mWatchDrawable; - private RecordedProgramPresenter mRecordedProgramPresenter; - - @Override - public void onCreate(Bundle savedInstanceState) { - mDvrDataManager = TvApplication.getSingletons(getActivity()).getDvrDataManager(); - mWatchLabel = getString(R.string.dvr_detail_watch); - mResumeLabel = getString(R.string.dvr_detail_series_resume); - mWatchDrawable = getResources().getDrawable(R.drawable.lb_ic_play, null); - mRecordedProgramPresenter = new RecordedProgramPresenter(getContext(), true); - super.onCreate(savedInstanceState); - } - - @Override - protected void onCreateInternal() { - mDvrWatchedPositionManager = TvApplication.getSingletons(getActivity()) - .getDvrWatchedPositionManager(); - setDetailsOverviewRow(mDetailsContent); - setupRecordedProgramsRow(); - mDvrDataManager.addSeriesRecordingListener(this); - mDvrDataManager.addRecordedProgramListener(this); - mRecordedPrograms = null; - } - - @Override - public void onResume() { - super.onResume(); - if (mPaused) { - updateWatchAction(); - mPaused = false; - } - } - - @Override - public void onPause() { - super.onPause(); - mPaused = true; - } - - private void updateWatchAction() { - List<RecordedProgram> programs = mDvrDataManager.getRecordedPrograms(mSeries.getId()); - Collections.sort(programs, RecordedProgram.EPISODE_COMPARATOR); - mRecommendRecordedProgram = getRecommendProgram(programs); - if (mRecommendRecordedProgram == null) { - mActionsAdapter.clear(ACTION_WATCH); - } else { - String episodeStatus; - if(mDvrWatchedPositionManager.getWatchedStatus(mRecommendRecordedProgram) - == DvrWatchedPositionManager.DVR_WATCHED_STATUS_WATCHING) { - episodeStatus = mResumeLabel; - mInitialPlaybackPositionMs = mDvrWatchedPositionManager - .getWatchedPosition(mRecommendRecordedProgram.getId()); - } else { - episodeStatus = mWatchLabel; - mInitialPlaybackPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME; - } - String episodeDisplayNumber = mRecommendRecordedProgram.getEpisodeDisplayNumber( - getContext()); - mActionsAdapter.set(ACTION_WATCH, new Action(ACTION_WATCH, - episodeStatus, episodeDisplayNumber, mWatchDrawable)); - } - } - - @Override - protected boolean onLoadRecordingDetails(Bundle args) { - long recordId = args.getLong(DvrDetailsActivity.RECORDING_ID); - mSeries = TvApplication.getSingletons(getActivity()).getDvrDataManager() - .getSeriesRecording(recordId); - if (mSeries == null) { - return false; - } - mRecordedPrograms = mDvrDataManager.getRecordedPrograms(mSeries.getId()); - Collections.sort(mRecordedPrograms, RecordedProgram.SEASON_REVERSED_EPISODE_COMPARATOR); - mDetailsContent = createDetailsContent(); - return true; - } - - @Override - protected PresenterSelector onCreatePresenterSelector( - DetailsOverviewRowPresenter rowPresenter) { - ClassPresenterSelector presenterSelector = new ClassPresenterSelector(); - presenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter); - presenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter()); - return presenterSelector; - } - - private DetailsContent createDetailsContent() { - Channel channel = TvApplication.getSingletons(getContext()).getChannelDataManager() - .getChannel(mSeries.getChannelId()); - String description = TextUtils.isEmpty(mSeries.getLongDescription()) - ? mSeries.getDescription() : mSeries.getLongDescription(); - return new DetailsContent.Builder() - .setTitle(mSeries.getTitle()) - .setDescription(description) - .setImageUris(mSeries.getPosterUri(), mSeries.getPhotoUri(), channel) - .build(); - } - - @Override - protected SparseArrayObjectAdapter onCreateActionsAdapter() { - mActionsAdapter = new SparseArrayObjectAdapter(new ActionPresenterSelector()); - Resources res = getResources(); - updateWatchAction(); - mActionsAdapter.set(ACTION_SERIES_SCHEDULES, new Action(ACTION_SERIES_SCHEDULES, - getString(R.string.dvr_detail_view_schedule), null, - res.getDrawable(R.drawable.ic_schedule_32dp, null))); - mDeleteAction = new Action(ACTION_DELETE, - getString(R.string.dvr_detail_series_delete), null, - res.getDrawable(R.drawable.ic_delete_32dp, null)); - if (!mRecordedPrograms.isEmpty()) { - mActionsAdapter.set(ACTION_DELETE, mDeleteAction); - } - return mActionsAdapter; - } - - private void setupRecordedProgramsRow() { - for (RecordedProgram program : mRecordedPrograms) { - addProgram(program); - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - mDvrDataManager.removeSeriesRecordingListener(this); - mDvrDataManager.removeRecordedProgramListener(this); - if (mSeries != null) { - DvrManager dvrManager = TvApplication.getSingletons(getActivity()).getDvrManager(); - if (dvrManager.canRemoveSeriesRecording(mSeries.getId())) { - dvrManager.removeSeriesRecording(mSeries.getId()); - } - } - mRecordedProgramPresenter.unbindAllViewHolders(); - } - - @Override - protected OnActionClickedListener onCreateOnActionClickedListener() { - return new OnActionClickedListener() { - @Override - public void onActionClicked(Action action) { - if (action.getId() == ACTION_WATCH) { - startPlayback(mRecommendRecordedProgram, mInitialPlaybackPositionMs); - } else if (action.getId() == ACTION_SERIES_SCHEDULES) { - DvrUiHelper.startSchedulesActivityForSeries(getContext(), mSeries); - } else if (action.getId() == ACTION_DELETE) { - DvrUiHelper.startSeriesDeletionActivity(getContext(), mSeries.getId()); - } - } - }; - } - - /** - * The programs are sorted by season number and episode number. - */ - private RecordedProgram getRecommendProgram(List<RecordedProgram> programs) { - for (int i = programs.size() - 1 ; i >= 0 ; i--) { - RecordedProgram program = programs.get(i); - int watchedStatus = mDvrWatchedPositionManager.getWatchedStatus(program); - if (watchedStatus == DvrWatchedPositionManager.DVR_WATCHED_STATUS_NEW) { - continue; - } - if (watchedStatus == DvrWatchedPositionManager.DVR_WATCHED_STATUS_WATCHING) { - return program; - } - if (i == programs.size() - 1) { - return program; - } else { - return programs.get(i + 1); - } - } - return programs.isEmpty() ? null : programs.get(0); - } - - @Override - public void onSeriesRecordingAdded(SeriesRecording... seriesRecordings) { } - - @Override - public void onSeriesRecordingChanged(SeriesRecording... seriesRecordings) { - for (SeriesRecording series : seriesRecordings) { - if (mSeries.getId() == series.getId()) { - mSeries = series; - } - } - } - - @Override - public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) { - for (SeriesRecording series : seriesRecordings) { - if (series.getId() == mSeries.getId()) { - mSeries = null; - getActivity().finish(); - return; - } - } - } - - @Override - public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) { - for (RecordedProgram recordedProgram : recordedPrograms) { - if (TextUtils.equals(recordedProgram.getSeriesId(), mSeries.getSeriesId())) { - addProgram(recordedProgram); - if (mActionsAdapter.lookup(ACTION_DELETE) == null) { - mActionsAdapter.set(ACTION_DELETE, mDeleteAction); - } - } - } - } - - @Override - public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) { - // Do nothing - } - - @Override - public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) { - for (RecordedProgram recordedProgram : recordedPrograms) { - if (TextUtils.equals(recordedProgram.getSeriesId(), mSeries.getSeriesId())) { - ListRow row = getSeasonRow(recordedProgram.getSeasonNumber(), false); - if (row != null) { - SeasonRowAdapter adapter = (SeasonRowAdapter) row.getAdapter(); - adapter.remove(recordedProgram); - if (adapter.isEmpty()) { - getRowsAdapter().remove(row); - if (getRowsAdapter().size() == 1) { - // No season rows left. Only DetailsOverviewRow - mActionsAdapter.clear(ACTION_DELETE); - } - } - } - if (recordedProgram.getId() == mRecommendRecordedProgram.getId()) { - updateWatchAction(); - } - } - } - } - - private void addProgram(RecordedProgram program) { - String programSeasonNumber = - TextUtils.isEmpty(program.getSeasonNumber()) ? "" : program.getSeasonNumber(); - getOrCreateSeasonRowAdapter(programSeasonNumber).add(program); - } - - private SeasonRowAdapter getOrCreateSeasonRowAdapter(String seasonNumber) { - ListRow row = getSeasonRow(seasonNumber, true); - return (SeasonRowAdapter) row.getAdapter(); - } - - private ListRow getSeasonRow(String seasonNumber, boolean createNewRow) { - seasonNumber = TextUtils.isEmpty(seasonNumber) ? "" : seasonNumber; - ArrayObjectAdapter rowsAdaptor = getRowsAdapter(); - for (int i = rowsAdaptor.size() - 1; i >= 0; i--) { - Object row = rowsAdaptor.get(i); - if (row instanceof ListRow) { - int compareResult = BaseProgram.numberCompare(seasonNumber, - ((SeasonRowAdapter) ((ListRow) row).getAdapter()).mSeasonNumber); - if (compareResult == 0) { - return (ListRow) row; - } else if (compareResult < 0) { - return createNewRow ? createNewSeasonRow(seasonNumber, i + 1) : null; - } - } - } - return createNewRow ? createNewSeasonRow(seasonNumber, rowsAdaptor.size()) : null; - } - - private ListRow createNewSeasonRow(String seasonNumber, int position) { - String seasonTitle = seasonNumber.isEmpty() ? mSeries.getTitle() - : getString(R.string.dvr_detail_series_season_title, seasonNumber); - HeaderItem header = new HeaderItem(mSeasonRowCount++, seasonTitle); - ClassPresenterSelector selector = new ClassPresenterSelector(); - selector.addClassPresenter(RecordedProgram.class, mRecordedProgramPresenter); - ListRow row = new ListRow(header, new SeasonRowAdapter(selector, - new Comparator<RecordedProgram>() { - @Override - public int compare(RecordedProgram lhs, RecordedProgram rhs) { - return BaseProgram.EPISODE_COMPARATOR.compare(lhs, rhs); - } - }, seasonNumber)); - getRowsAdapter().add(position, row); - return row; - } - - private class SeasonRowAdapter extends SortedArrayAdapter<RecordedProgram> { - private String mSeasonNumber; - - SeasonRowAdapter(PresenterSelector selector, Comparator<RecordedProgram> comparator, - String seasonNumber) { - super(selector, comparator); - mSeasonNumber = seasonNumber; - } - - @Override - public long getId(RecordedProgram program) { - return program.getId(); - } - } -} |