package com.ronakmanglani.watchlist.ui.fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.ronakmanglani.watchlist.R;
import com.ronakmanglani.watchlist.WatchlistApp;
import com.ronakmanglani.watchlist.ui.activity.MovieActivity;
import com.ronakmanglani.watchlist.ui.activity.MovieDetailActivity;
import com.ronakmanglani.watchlist.ui.adapter.MovieCursorAdapter;
import com.ronakmanglani.watchlist.ui.adapter.MovieCursorAdapter.OnMovieClickListener;
import com.ronakmanglani.watchlist.data.MovieColumns;
import com.ronakmanglani.watchlist.data.MovieProvider;
import com.ronakmanglani.watchlist.ui.view.PaddingDecorationView;
import butterknife.BindView;
import butterknife.BindBool;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public class MovieSavedFragment extends Fragment implements OnMovieClickListener, LoaderCallbacks<Cursor> {
private static final int CURSOR_LOADER_ID = 42;
private Context context;
private Unbinder unbinder;
private MovieCursorAdapter adapter;
private GridLayoutManager layoutManager;
private int viewType;
@BindBool(R.bool.is_tablet) boolean isTablet;
@BindView(R.id.no_results) View noResults;
@BindView(R.id.no_results_message) TextView noResultsMessage;
@BindView(R.id.progress_circle) View progressCircle;
@BindView(R.id.movie_grid) RecyclerView recyclerView;
// Fragment life cycle
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_movie_saved, container, false);
unbinder = ButterKnife.bind(this, v);
setRetainInstance(true);
// Initialize variable
context = getContext();
viewType = getArguments().getInt(WatchlistApp.VIEW_TYPE);
// Setup RecyclerView
adapter = new MovieCursorAdapter(context, this, null);
layoutManager = new GridLayoutManager(context, getNumberOfColumns());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addItemDecoration(new PaddingDecorationView(context, R.dimen.recycler_item_padding));
recyclerView.setAdapter(adapter);
// Load movies from database
getLoaderManager().initLoader(CURSOR_LOADER_ID, null, this);
return v;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
// Cursor Loader
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle args) {
switch (loaderID) {
case CURSOR_LOADER_ID:
// Returns a new CursorLoader
Uri contentUri;
if (viewType == WatchlistApp.VIEW_TYPE_WATCHED) {
contentUri = MovieProvider.Watched.CONTENT_URI;
} else {
contentUri = MovieProvider.ToSee.CONTENT_URI;
}
return new CursorLoader(context, contentUri,
new String[]{ MovieColumns._ID, MovieColumns.TMDB_ID, MovieColumns.TITLE, MovieColumns.YEAR,
MovieColumns.OVERVIEW, MovieColumns.RATING, MovieColumns.POSTER, MovieColumns.BACKDROP},
null, null, null);
default:
// An invalid id was passed in
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data.getCount() == 0) {
progressCircle.setVisibility(View.GONE);
noResults.setVisibility(View.VISIBLE);
noResultsMessage.setText(R.string.saved_empty);
} else {
progressCircle.setVisibility(View.GONE);
noResults.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
adapter.swapCursor(data);
}
// Load detail fragment if in tablet mode
if (isTablet) {
if (data.getCount() > 0) {
data.moveToFirst();
loadDetailFragmentWith(data.getString(data.getColumnIndex(MovieColumns.TMDB_ID)));
} else {
loadDetailFragmentWith("null");
}
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
// Helper methods
public int getNumberOfColumns() {
// Get screen width
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float widthPx = displayMetrics.widthPixels;
if (isTablet) {
widthPx = widthPx / 3;
}
// Calculate desired width
SharedPreferences preferences = context.getSharedPreferences(WatchlistApp.TABLE_USER, Context.MODE_PRIVATE);
if (preferences.getInt(WatchlistApp.VIEW_MODE, WatchlistApp.VIEW_MODE_GRID) == WatchlistApp.VIEW_MODE_GRID) {
float desiredPx = getResources().getDimensionPixelSize(R.dimen.movie_card_width);
int columns = Math.round(widthPx / desiredPx);
return columns > 2 ? columns : 2;
} else {
float desiredPx = getResources().getDimensionPixelSize(R.dimen.movie_list_card_width);
int columns = Math.round(widthPx / desiredPx);
return columns > 1 ? columns : 1;
}
}
public void refreshLayout() {
Parcelable state = layoutManager.onSaveInstanceState();
layoutManager = new GridLayoutManager(getContext(), getNumberOfColumns());
recyclerView.setLayoutManager(layoutManager);
layoutManager.onRestoreInstanceState(state);
}
public void loadDetailFragmentWith(final String id) {
new Handler().post(new Runnable() {
@Override
public void run() {
((MovieActivity)getActivity()).loadDetailFragmentWith(id);
}
});
}
// Click events
@Override
public void onMovieClicked(int position) {
Cursor cursor = adapter.getCursor();
cursor.moveToPosition(position);
if (isTablet) {
loadDetailFragmentWith(cursor.getString(cursor.getColumnIndex(MovieColumns.TMDB_ID)));
} else {
Intent intent = new Intent(context, MovieDetailActivity.class);
intent.putExtra(WatchlistApp.MOVIE_ID, cursor.getString(cursor.getColumnIndex(MovieColumns.TMDB_ID)));
startActivity(intent);
}
}
}