package com.androideasyapps.phoenix;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v17.leanback.app.SearchFragment;
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.ListRowPresenter;
import android.support.v17.leanback.widget.ObjectAdapter;
import android.support.v17.leanback.widget.OnItemClickedListener;
import android.support.v17.leanback.widget.Row;
import android.text.TextUtils;
import com.androideasyapps.phoenix.dao.MediaFile;
import com.androideasyapps.phoenix.shared.AppInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
import rx.Observable;
import rx.functions.Action1;
/**
* Created by seans on 18/12/14.
*/
public class SageTVSearchFragment extends SearchFragment
implements SearchFragment.SearchResultProvider {
static final Logger log = LoggerFactory.getLogger(SageTVSearchFragment.class);
private static final int SEARCH_DELAY_MS = 300;
private ArrayObjectAdapter mRowsAdapter;
private Handler mHandler = new Handler();
private SearchRunnable mDelayedLoad;
public class SearchRunnable implements Runnable {
private String searchQuery;
@Override
public void run() {
loadRows(searchQuery);
}
public void setSearchQuery(String searchQuery) {
this.searchQuery = searchQuery;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
setSearchResultProvider(this);
setOnItemClickedListener(getDefaultItemClickedListener());
mDelayedLoad = new SearchRunnable();
}
@Override
public ObjectAdapter getResultsAdapter() {
return mRowsAdapter;
}
@Override
public boolean onQueryTextChange(String newQuery) {
mRowsAdapter.clear();
if (!TextUtils.isEmpty(newQuery)) {
mDelayedLoad.setSearchQuery(newQuery);
mHandler.removeCallbacks(mDelayedLoad);
mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
}
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
mRowsAdapter.clear();
if (!TextUtils.isEmpty(query)) {
mDelayedLoad.setSearchQuery(query);
mHandler.removeCallbacks(mDelayedLoad);
mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
}
return true;
}
private void loadRows(String searchQuery) {
log.info("Searching {}", searchQuery);
if (searchQuery != null && searchQuery.trim().length() > 1) {
String query = "%" + searchQuery + "%";
Collection<MediaFile> mediafiles = null;
try {
mediafiles = AppInstance.getInstance(SageTVSearchFragment.this.getActivity()).getDAOManager().get().getMediaFileDAO().query("lower(title) like ? order by title, season, episode limit 100", query);
if (mediafiles!=null) {
ArrayObjectAdapter moviesRowAdapter = new ArrayObjectAdapter(new CardPresenter());
HeaderItem header = new HeaderItem(0, getResources().getString(R.string.search_results_movies), null);
mRowsAdapter.add(new ListRow(header, moviesRowAdapter));
ArrayObjectAdapter tvRowAdapter = new ArrayObjectAdapter(new CardPresenter());
HeaderItem tvHeader = new HeaderItem(1, getResources().getString(R.string.search_results_tv), null);
mRowsAdapter.add(new ListRow(tvHeader, tvRowAdapter));
for (MediaFile mf: mediafiles) {
if ("tv".equalsIgnoreCase(mf.getMediaType())) {
tvRowAdapter.add(mf);
} else if ("movie".equalsIgnoreCase(mf.getMediaType())) {
moviesRowAdapter.add(mf);
}
}
}
} catch (Exception e) {
log.error("Search Failed for " + searchQuery, e);
}
}
}
protected OnItemClickedListener getDefaultItemClickedListener() {
return new OnItemClickedListener() {
@Override
public void onItemClicked(Object item, Row row) {
if (item instanceof MediaFile) {
MediaFile mf = (MediaFile) item;
Intent intent = new Intent(getActivity(), DetailsActivity.class);
AppInstance.getInstance(getActivity()).setSelectedMediaFile(mf);
startActivity(intent);
}
}
};
}
}