package net.reichholf.dreamdroid.tv.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.Loader;
import android.widget.Toast;
import net.reichholf.dreamdroid.DreamDroid;
import net.reichholf.dreamdroid.R;
import net.reichholf.dreamdroid.helpers.ExtendedHashMap;
import net.reichholf.dreamdroid.helpers.NameValuePair;
import net.reichholf.dreamdroid.helpers.enigma2.Event;
import net.reichholf.dreamdroid.helpers.enigma2.Service;
import net.reichholf.dreamdroid.helpers.enigma2.URIStore;
import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.AbstractListRequestHandler;
import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.EpgNowNextListRequestHandler;
import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.EventListRequestHandler;
import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.ServiceListRequestHandler;
import net.reichholf.dreamdroid.intents.IntentFactory;
import net.reichholf.dreamdroid.loader.AsyncListLoader;
import net.reichholf.dreamdroid.loader.LoaderResult;
import net.reichholf.dreamdroid.tv.activities.PreferenceActivity;
import net.reichholf.dreamdroid.tv.fragment.abs.BaseHttpBrowseFragment;
import net.reichholf.dreamdroid.tv.presenter.CardPresenter;
import java.util.ArrayList;
import java.util.Collections;
/**
* Created by Stephan on 16.10.2016.
*/
public class RootBrowseFragment extends BaseHttpBrowseFragment {
public static int LOADER_BOUQUETLIST_ID = 1;
public static int REQUEST_CODE_PROFILE;
public static int ROW_SETTINGS_ID = 65535;
public static String BOUQUETS_TV = "1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) FROM BOUQUET \\\"bouquets.tv\\\" ORDER BY bouquet";
ArrayList<ArrayObjectAdapter> mListRowAdapters = new ArrayList<>();
ArrayList<ExtendedHashMap> mBouquets = null;
ArrayList<ExtendedHashMap> mBouquetQueue = null;
ExtendedHashMap mLoadingBouquet;
ExtendedHashMap mSelectedBouquet;
ExtendedHashMap mSelectedService;
public RootBrowseFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
setRetainInstance(false);
super.onCreate(savedInstanceState);
setOnItemViewClickedListener(this);
setOnItemViewSelectedListener(this);
if (mBouquets == null)
mBouquets = new ArrayList<>();
if (mBouquetQueue == null)
mBouquetQueue = new ArrayList<>();
setHeadersState(HEADERS_ENABLED);
setBrandColor(ContextCompat.getColor(getContext(), R.color.primary_dreamdroid));
setBadgeDrawable(ContextCompat.getDrawable(getContext(), R.drawable.dreamdroid_banner));
addSettingsRow();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
load();
}
@Override
public void onPause() {
super.onPause();
getLoaderManager().destroyLoader(LOADER_DEFAULT_ID);
getLoaderManager().destroyLoader(LOADER_BOUQUETLIST_ID);
}
@Override
public Loader<LoaderResult<ArrayList<ExtendedHashMap>>> onCreateLoader(int id, Bundle args) {
AbstractListRequestHandler handler;
if (id == LOADER_BOUQUETLIST_ID) {
handler = new ServiceListRequestHandler();
} else {
if (DreamDroid.featureNowNext())
handler = new EpgNowNextListRequestHandler();
else
handler = new EventListRequestHandler(URIStore.EPG_NOW);
}
return new AsyncListLoader(getActivity(), handler, true, args);
}
@Override
public void onLoadFinished(Loader<LoaderResult<ArrayList<ExtendedHashMap>>> loader, LoaderResult<ArrayList<ExtendedHashMap>> data) {
if (data.isError()) {
Toast.makeText(getContext(), data.getErrorText(), Toast.LENGTH_LONG).show();
return;
}
if (loader.getId() == LOADER_BOUQUETLIST_ID) {
onLoadBouquetsFinished(data.getResult());
} else
onLoadServicesFinished(data.getResult());
}
protected void resetRows() {
//Remove everything but settings
mRowsAdapter.removeItems(0, mRowsAdapter.size() - 1);
}
protected void addSettingsRow() {
ExtendedHashMap settings = new ExtendedHashMap();
settings.put("title", getString(R.string.settings));
settings.put("icon", R.drawable.ic_settings_badge);
settings.put(SettingsFragment.KEY_PREFS_TYPE, SettingsFragment.PREFS_TYPE_GENERIC);
ExtendedHashMap profile = new ExtendedHashMap();
profile.put("title", getString(R.string.profile));
profile.put("icon", R.drawable.ic_profiles_badge);
profile.put(SettingsFragment.KEY_PREFS_TYPE, SettingsFragment.PREFS_TYPE_PROFILE);
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(true));
listRowAdapter.add(settings);
listRowAdapter.add(profile);
HeaderItem header = new HeaderItem(ROW_SETTINGS_ID, getString(R.string.preferences));
mRowsAdapter.add(new ListRow(header, listRowAdapter));
}
protected void load() {
resetRows();
Toast.makeText(getContext(), R.string.loading, Toast.LENGTH_LONG).show();
mBouquetQueue.clear();
mBouquets.clear();
mListRowAdapters.clear();
mLoadingBouquet = null;
ArrayList<NameValuePair> params = new ArrayList<>();
params.add(new NameValuePair("bRef", BOUQUETS_TV));
Bundle args = new Bundle();
args.putSerializable("params", params);
load(LOADER_BOUQUETLIST_ID, args);
}
protected void load(int loader, Bundle args) {
getLoaderManager().restartLoader(loader, args, this);
}
public void onLoadBouquetsFinished(ArrayList<ExtendedHashMap> bouquets) {
mBouquets.addAll(bouquets);
mBouquetQueue.addAll(bouquets);
Collections.reverse(mBouquetQueue);
loadNextBouquet();
}
public void loadNextBouquet() {
if (mBouquetQueue.isEmpty()) {
setSelectedPosition(0);
return;
}
mLoadingBouquet = mBouquetQueue.get(0);
mBouquetQueue.remove(0);
ArrayList<NameValuePair> params = new ArrayList<>();
String ref = mLoadingBouquet.getString(Service.KEY_REFERENCE);
params.add(new NameValuePair("bRef", ref));
Bundle args = new Bundle();
args.putSerializable("params", params);
load(LOADER_DEFAULT_ID, args);
}
public void onLoadServicesFinished(ArrayList<ExtendedHashMap> services) {
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
for (ExtendedHashMap service : services) {
listRowAdapter.add(service);
}
HeaderItem header = new HeaderItem(mRowsAdapter.size(), mLoadingBouquet.getString(Service.KEY_NAME));
mRowsAdapter.add(0, new ListRow(header, listRowAdapter));
mListRowAdapters.add(listRowAdapter);
loadNextBouquet();
}
protected boolean isSettingsRow(Row row) {
return row.getHeaderItem().getId() == ROW_SETTINGS_ID;
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) {
if (isSettingsRow(row)) {
ExtendedHashMap it = (ExtendedHashMap) item;
String type = it.getString(SettingsFragment.KEY_PREFS_TYPE);
Intent intent = new Intent(getContext(), PreferenceActivity.class);
intent.putExtra(SettingsFragment.KEY_PREFS_TYPE, type);
startActivityForResult(intent, REQUEST_CODE_PROFILE);
return;
}
ExtendedHashMap event = (ExtendedHashMap) item;
String ref = event.getString(Event.KEY_SERVICE_REFERENCE);
String name = event.getString(Event.KEY_EVENT_TITLE);
startActivity(IntentFactory.getStreamServiceIntent(getActivity(), ref, name, mSelectedBouquet.getString(Event.KEY_SERVICE_REFERENCE, null), event));
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (REQUEST_CODE_PROFILE == requestCode)
load();
else
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) {
if (isSettingsRow(row)) {
mSelectedService = null;
mSelectedBouquet = null;
return;
}
mSelectedService = (ExtendedHashMap) item;
long index = row.getHeaderItem().getId();
if (index >= 0 && index < mBouquets.size())
mSelectedBouquet = mBouquets.get((int) index);
else
mSelectedBouquet = new ExtendedHashMap();
}
}