blob: b9407b1571a5ca4751517f42596bc4b93b388497 [file] [log] [blame]
/*
* 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.list;
import android.os.Bundle;
import android.support.v17.leanback.app.DetailsFragment;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.android.tv.ApplicationSingletons;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrScheduleManager;
import com.android.tv.dvr.data.ScheduledRecording;
/**
* A base fragment to show the list of schedule recordings.
*/
public abstract class BaseDvrSchedulesFragment extends DetailsFragment
implements DvrDataManager.ScheduledRecordingListener,
DvrScheduleManager.OnConflictStateChangeListener {
/**
* The key for scheduled recording which has be selected in the list.
*/
public static final String SCHEDULES_KEY_SCHEDULED_RECORDING =
"schedules_key_scheduled_recording";
private ScheduleRowAdapter mRowsAdapter;
private TextView mEmptyInfoScreenView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ClassPresenterSelector presenterSelector = new ClassPresenterSelector();
presenterSelector.addClassPresenter(SchedulesHeaderRow.class, onCreateHeaderRowPresenter());
presenterSelector.addClassPresenter(ScheduleRow.class, onCreateRowPresenter());
mRowsAdapter = onCreateRowsAdapter(presenterSelector);
setAdapter(mRowsAdapter);
mRowsAdapter.start();
ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
singletons.getDvrDataManager().addScheduledRecordingListener(this);
singletons.getDvrScheduleManager().addOnConflictStateChangeListener(this);
mEmptyInfoScreenView = (TextView) getActivity().findViewById(R.id.empty_info_screen);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
int firstItemPosition = getFirstItemPosition();
if (firstItemPosition != -1) {
getRowsFragment().setSelectedPosition(firstItemPosition, false);
}
return view;
}
/**
* Returns rows adapter.
*/
protected ScheduleRowAdapter getRowsAdapter() {
return mRowsAdapter;
}
/**
* Shows the empty message.
*/
void showEmptyMessage(int messageId) {
mEmptyInfoScreenView.setText(messageId);
if (mEmptyInfoScreenView.getVisibility() != View.VISIBLE) {
mEmptyInfoScreenView.setVisibility(View.VISIBLE);
}
}
/**
* Hides the empty message.
*/
void hideEmptyMessage() {
if (mEmptyInfoScreenView.getVisibility() == View.VISIBLE) {
mEmptyInfoScreenView.setVisibility(View.GONE);
}
}
@Override
public View onInflateTitleView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
// Workaround of b/31046014
return null;
}
@Override
public void onDestroy() {
ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
singletons.getDvrScheduleManager().removeOnConflictStateChangeListener(this);
singletons.getDvrDataManager().removeScheduledRecordingListener(this);
mRowsAdapter.stop();
super.onDestroy();
}
/**
* Creates header row presenter.
*/
public abstract SchedulesHeaderRowPresenter onCreateHeaderRowPresenter();
/**
* Creates rows presenter.
*/
public abstract ScheduleRowPresenter onCreateRowPresenter();
/**
* Creates rows adapter.
*/
public abstract ScheduleRowAdapter onCreateRowsAdapter(ClassPresenterSelector presenterSelecor);
/**
* Gets the first focus position in schedules list.
*/
protected int getFirstItemPosition() {
for (int i = 0; i < mRowsAdapter.size(); i++) {
if (mRowsAdapter.get(i) instanceof ScheduleRow) {
return i;
}
}
return -1;
}
@Override
public void onScheduledRecordingAdded(ScheduledRecording... scheduledRecordings) {
if (mRowsAdapter != null) {
for (ScheduledRecording recording : scheduledRecordings) {
mRowsAdapter.onScheduledRecordingAdded(recording);
}
}
}
@Override
public void onScheduledRecordingRemoved(ScheduledRecording... scheduledRecordings) {
if (mRowsAdapter != null) {
for (ScheduledRecording recording : scheduledRecordings) {
mRowsAdapter.onScheduledRecordingRemoved(recording);
}
}
}
@Override
public void onScheduledRecordingStatusChanged(ScheduledRecording... scheduledRecordings) {
if (mRowsAdapter != null) {
for (ScheduledRecording recording : scheduledRecordings) {
mRowsAdapter.onScheduledRecordingUpdated(recording, false);
}
}
}
@Override
public void onConflictStateChange(boolean conflict, ScheduledRecording... schedules) {
if (mRowsAdapter != null) {
for (ScheduledRecording recording : schedules) {
mRowsAdapter.onScheduledRecordingUpdated(recording, true);
}
}
}
}