package com.hitherejoe.bourbon.ui.browse;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.support.v17.leanback.app.BackgroundManager;
import android.support.v17.leanback.app.VerticalGridFragment;
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.support.v17.leanback.widget.VerticalGridPresenter;
import android.support.v4.content.ContextCompat;
import android.util.DisplayMetrics;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.hitherejoe.bourbon.R;
import com.hitherejoe.bourboncorecommon.data.DataManager;
import com.hitherejoe.bourboncorecommon.data.model.Shot;
import com.hitherejoe.bourboncorecommon.ui.browse.BrowseMvpView;
import com.hitherejoe.bourboncorecommon.ui.browse.BrowsePresenter;
import com.hitherejoe.bourbon.ui.base.BaseActivity;
import com.hitherejoe.bourbon.ui.message.MessageFragment;
import com.hitherejoe.bourbon.ui.shot.ShotActivity;
import java.net.URI;
import java.util.List;
import javax.inject.Inject;
public class BrowseFragment extends VerticalGridFragment implements BrowseMvpView {
@Inject
BrowsePresenter mBrowsePresenter;
@Inject DataManager mDataManager;
private static final int NUM_COLUMNS = 5;
private static final int BACKGROUND_UPDATE_DELAY = 300;
private BackgroundManager mBackgroundManager;
private DisplayMetrics mMetrics;
private Drawable mDefaultBackground;
private Handler mHandler;
private Runnable mBackgroundRunnable;
private BrowseAdapter mBrowseAdapter;
private ProgressDialog mProgressDialog;
public static BrowseFragment newInstance() {
return new BrowseFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseActivity) getActivity()).activityComponent().inject(this);
mBrowsePresenter.attachView(this);
setupFragment();
prepareBackgroundManager();
setSearchAffordanceColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));
mBrowseAdapter = new BrowseAdapter();
setAdapter(mBrowseAdapter);
setOnItemViewSelectedListener(mOnItemViewSelectedListener);
setOnItemViewClickedListener(mOnItemViewClickedListener);
mBrowsePresenter.getShots(BrowsePresenter.SHOT_COUNT, BrowsePresenter.SHOT_PAGE);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mBackgroundRunnable != null) {
mHandler.removeCallbacks(mBackgroundRunnable);
mBackgroundRunnable = null;
}
mBackgroundManager = null;
}
@Override
public void onStop() {
super.onStop();
mBackgroundManager.release();
}
private void prepareBackgroundManager() {
mBackgroundManager = BackgroundManager.getInstance(getActivity());
mBackgroundManager.attach(getActivity().getWindow());
mDefaultBackground =
new ColorDrawable(ContextCompat.getColor(getActivity(),
R.color.mid_gray));
mMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
}
private void setupFragment() {
VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
gridPresenter.setNumberOfColumns(NUM_COLUMNS);
setGridPresenter(gridPresenter);
setBadgeDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.badge));
mHandler = new Handler();
}
private void startBackgroundTimer(final URI backgroundURI) {
if (mBackgroundRunnable != null) mHandler.removeCallbacks(mBackgroundRunnable);
mBackgroundRunnable = new Runnable() {
@Override
public void run() {
if (backgroundURI != null) updateBackground(backgroundURI.toString());
}
};
mHandler.postDelayed(mBackgroundRunnable, BACKGROUND_UPDATE_DELAY);
}
protected void updateBackground(String uri) {
int width = mMetrics.widthPixels;
int height = mMetrics.heightPixels;
Glide.with(getActivity())
.load(uri)
.asBitmap()
.centerCrop()
.error(mDefaultBackground)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override
public void onResourceReady(Bitmap resource,
GlideAnimation<? super Bitmap>
glideAnimation) {
mBackgroundManager.setBitmap(resource);
}
});
if (mBackgroundRunnable != null) mHandler.removeCallbacks(mBackgroundRunnable);
}
private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() {
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
if (item instanceof Shot) {
startActivity(ShotActivity.newStartIntent(getActivity(), (Shot) item));
}
}
};
private OnItemViewSelectedListener mOnItemViewSelectedListener = new OnItemViewSelectedListener() {
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
if (item instanceof Shot) {
String backgroundUrl = ((Shot) item).images.getImage();
if (backgroundUrl != null) startBackgroundTimer(URI.create(backgroundUrl));
}
}
};
/** Browse MVP View method implementation **/
@Override
public void showProgress() {
if (mProgressDialog == null) {
mProgressDialog = ProgressDialog.show(getActivity(), getString(R.string.dialog_loading_title),
getString(R.string.dialog_loading_shots), true);
}
mProgressDialog.show();
}
@Override
public void hideProgress() {
mProgressDialog.hide();
}
@Override
public void showShots(List<Shot> shots) {
mBrowseAdapter.addAll(0, shots);
}
@Override
public void showError() {
((BrowseActivity) getActivity()).showMessageFragment(MessageFragment.TYPE_ERROR);
}
@Override
public void showEmpty() {
((BrowseActivity) getActivity()).showMessageFragment(MessageFragment.TYPE_EMPTY);
}
@Override
public void showMessageLayout(boolean show) {
}
}