package tv.emby.embyatv.ui;
import android.app.Fragment;
import android.content.ClipData;
import android.os.Bundle;
import android.support.v17.leanback.widget.ObjectAdapter;
import android.support.v17.leanback.widget.OnItemViewClickedListener;
import android.support.v17.leanback.widget.OnItemViewSelectedListener;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;
import mediabrowser.model.entities.SortOrder;
import tv.emby.embyatv.R;
import tv.emby.embyatv.TvApp;
import tv.emby.embyatv.itemhandling.BaseRowItem;
import tv.emby.embyatv.itemhandling.ItemRowAdapter;
import tv.emby.embyatv.model.FilterOptions;
import tv.emby.embyatv.presentation.HorizontalGridPresenter;
import tv.emby.embyatv.util.InfoLayoutHelper;
import tv.emby.embyatv.util.Utils;
/**
* Created by Eric on 8/17/2015.
*/
public class HorizontalGridFragment extends Fragment {
private static final String TAG = "HorizontalGridFragment";
private static boolean DEBUG = false;
protected TextView mTitleView;
private TextView mStatusText;
private TextView mCounter;
protected FrameLayout mSpinner;
protected ViewGroup mGridDock;
protected LinearLayout mInfoRow;
protected LinearLayout mToolBar;
private ItemRowAdapter mAdapter;
private HorizontalGridPresenter mGridPresenter;
private HorizontalGridPresenter.ViewHolder mGridViewHolder;
private OnItemViewSelectedListener mOnItemViewSelectedListener;
private OnItemViewClickedListener mOnItemViewClickedListener;
private int mSelectedPosition = -1;
protected int SMALL_CARD = Utils.convertDpToPixel(TvApp.getApplication(), 116);
protected int MED_CARD = Utils.convertDpToPixel(TvApp.getApplication(), 175);
protected int LARGE_CARD = Utils.convertDpToPixel(TvApp.getApplication(), 210);
protected int SMALL_BANNER = Utils.convertDpToPixel(TvApp.getApplication(), 58);
protected int MED_BANNER = Utils.convertDpToPixel(TvApp.getApplication(), 88);
protected int LARGE_BANNER = Utils.convertDpToPixel(TvApp.getApplication(), 105);
/**
* Sets the grid presenter.
*/
public void setGridPresenter(HorizontalGridPresenter gridPresenter) {
if (gridPresenter == null) {
throw new IllegalArgumentException("Grid presenter may not be null");
}
mGridPresenter = gridPresenter;
mGridPresenter.setOnItemViewSelectedListener(mRowSelectedListener);
if (mOnItemViewClickedListener != null) {
mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
}
}
/**
* Returns the grid presenter.
*/
public HorizontalGridPresenter getGridPresenter() {
return mGridPresenter;
}
/**
* Sets the object adapter for the fragment.
*/
public void setAdapter(ItemRowAdapter adapter) {
mAdapter = adapter;
updateAdapter();
}
/**
* Returns the object adapter.
*/
public ObjectAdapter getAdapter() {
return mAdapter;
}
public int getGridHeight() {
return Utils.convertDpToPixel(TvApp.getApplication(), 400);
}
public void setItem(BaseRowItem item) {
if (item != null) {
mTitleView.setText(item.getFullName());
InfoLayoutHelper.addInfoRow(getActivity(), item, mInfoRow, true, true);
} else {
mTitleView.setText("");
mInfoRow.removeAllViews();
}
}
public class SortOption {
public String name;
public String value;
public SortOrder order;
public SortOption(String name, String value, SortOrder order) {
this.name = name;
this.value = value;
this.order = order;
}
}
protected Map<Integer, SortOption> sortOptions = new HashMap<>();
{
sortOptions.put(0, new SortOption(TvApp.getApplication().getString(R.string.lbl_name), "SortName", SortOrder.Ascending));
sortOptions.put(1, new SortOption(TvApp.getApplication().getString(R.string.lbl_date_added), "DateLastContentAdded", SortOrder.Descending));
sortOptions.put(2, new SortOption(TvApp.getApplication().getString(R.string.lbl_premier_date), "PremiereDate", SortOrder.Descending));
sortOptions.put(3,new SortOption(TvApp.getApplication().getString(R.string.lbl_rating), "OfficialRating", SortOrder.Ascending));
sortOptions.put(4,new SortOption(TvApp.getApplication().getString(R.string.lbl_critic_rating), "CriticRating", SortOrder.Descending));
sortOptions.put(5,new SortOption(TvApp.getApplication().getString(R.string.lbl_last_played), "DatePlayed", SortOrder.Descending));
}
protected String getSortFriendlyName(String value) {
return getSortOption(value).name;
}
protected SortOption getSortOption(String value) {
for (Integer key : sortOptions.keySet()) {
SortOption option = sortOptions.get(key);
if (option.value.equals(value)) return option;
}
return new SortOption("Unknown","",SortOrder.Ascending);
}
public void setTitle(String text) {
mTitleView.setText(text);
}
public void setStatusText(String folderName) {
String text = TvApp.getApplication().getResources().getString(R.string.lbl_showing) + " ";
FilterOptions filters = mAdapter.getFilters();
if (filters == null || (!filters.isFavoriteOnly() && !filters.isUnwatchedOnly())) {
text += TvApp.getApplication().getResources().getString(R.string.lbl_all_items);
} else {
text += (filters.isUnwatchedOnly() ? TvApp.getApplication().getResources().getString(R.string.lbl_unwatched) : "") + " " +
(filters.isFavoriteOnly() ? TvApp.getApplication().getResources().getString(R.string.lbl_favorites) : "");
}
if (mAdapter.getStartLetter() != null) {
text += " " + TvApp.getApplication().getResources().getString(R.string.lbl_starting_with) + " " + mAdapter.getStartLetter();
}
text += " " + TvApp.getApplication().getString(R.string.lbl_from) + " '" + folderName + "' " + TvApp.getApplication().getString(R.string.lbl_sorted_by) + " " + getSortFriendlyName(mAdapter.getSortBy());
mStatusText.setText(text);
}
public LinearLayout getToolBar() { return mToolBar; }
final private OnItemViewSelectedListener mRowSelectedListener =
new OnItemViewSelectedListener() {
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
int position = mGridViewHolder.getGridView().getSelectedPosition();
if (DEBUG) Log.v(TAG, "row selected position " + position);
onRowSelected(position);
if (mOnItemViewSelectedListener != null && position >= 0) {
mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
rowViewHolder, row);
}
}
};
/**
* Sets an item selection listener.
*/
public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
mOnItemViewSelectedListener = listener;
}
private void onRowSelected(int position) {
if (position != mSelectedPosition) {
mSelectedPosition = position;
}
// Update the counter
updateCounter(position+1);
}
public void updateCounter(int position) {
if (mAdapter != null) {
mCounter.setText((position)+" | "+ mAdapter.getTotalItems());
}
}
/**
* Sets an item clicked listener.
*/
public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
mOnItemViewClickedListener = listener;
if (mGridPresenter != null) {
mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
}
}
/**
* Returns the item clicked listener.
*/
public OnItemViewClickedListener getOnItemViewClickedListener() {
return mOnItemViewClickedListener;
}
public void showSpinner() {
if (getActivity() == null || getActivity().isFinishing() || mSpinner == null) return;
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mSpinner.setVisibility(View.VISIBLE);
}
});
}
public void hideSpinner() {
if (getActivity() == null || getActivity().isFinishing() || mSpinner == null) return;
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mSpinner.setVisibility(View.GONE);
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.horizontal_grid_browse,
container, false);
mTitleView = (TextView) root.findViewById(R.id.title);
mTitleView.setTypeface(TvApp.getApplication().getDefaultFont());
mStatusText = (TextView) root.findViewById(R.id.statusText);
mStatusText.setTypeface(TvApp.getApplication().getDefaultFont());
mInfoRow = (LinearLayout) root.findViewById(R.id.infoRow);
mToolBar = (LinearLayout) root.findViewById(R.id.toolBar);
mCounter = (TextView) root.findViewById(R.id.counter);
mCounter.setTypeface(TvApp.getApplication().getDefaultFont());
mSpinner = (FrameLayout) root.findViewById(R.id.spinner);
mGridDock = (ViewGroup) root.findViewById(R.id.rowsFragment);
// Hide the description because we don't have room for it
((NowPlayingBug)root.findViewById(R.id.npBug)).showDescription(false);
return root;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
createGrid();
}
protected void createGrid() {
mGridViewHolder = mGridPresenter.onCreateViewHolder(mGridDock);
mGridViewHolder.getGridView().setFocusable(true);
mGridDock.removeAllViews();
mGridViewHolder.getGridView().setGravity(Gravity.CENTER_VERTICAL);
mGridDock.addView(mGridViewHolder.view);
updateAdapter();
}
@Override
public void onStart() {
super.onStart();
}
public void focusGrid() {
if (mGridViewHolder != null && mGridViewHolder.getGridView() != null) mGridViewHolder.getGridView().requestFocus();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mGridViewHolder = null;
}
/**
* Sets the selected item position.
*/
public void setSelectedPosition(int position) {
mSelectedPosition = position;
if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
}
}
private void updateAdapter() {
if (mGridViewHolder != null) {
mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
if (mSelectedPosition != -1) {
mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
}
}
}
}