package com.esoxjem.movieguide.listing; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.esoxjem.movieguide.BaseApplication; import com.esoxjem.movieguide.Movie; import com.esoxjem.movieguide.R; import com.esoxjem.movieguide.listing.sorting.SortingDialogFragment; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import butterknife.Bind; import butterknife.ButterKnife; public class MoviesListingFragment extends Fragment implements MoviesListingView { @Inject MoviesListingPresenter moviesPresenter; @Bind(R.id.movies_listing) RecyclerView moviesListing; private RecyclerView.Adapter adapter; private List<Movie> movies = new ArrayList<>(20); private Callback callback; public MoviesListingFragment() { // Required empty public constructor } @Override public void onAttach(Context context) { super.onAttach(context); callback = (Callback) context; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); setRetainInstance(true); ((BaseApplication) getActivity().getApplication()).createListingComponent().inject(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_movies, container, false); ButterKnife.bind(this, rootView); initLayoutReferences(); return rootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); moviesPresenter.setView(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_sort: displaySortingOptions(); } return super.onOptionsItemSelected(item); } private void displaySortingOptions() { DialogFragment sortingDialogFragment = SortingDialogFragment.newInstance(moviesPresenter); sortingDialogFragment.show(getFragmentManager(), "Select Quantity"); } private void initLayoutReferences() { moviesListing.setHasFixedSize(true); int columns; if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { columns = 2; } else { columns = getResources().getInteger(R.integer.no_of_columns); } RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), columns); moviesListing.setLayoutManager(layoutManager); adapter = new MoviesListingAdapter(movies, this); moviesListing.setAdapter(adapter); } @Override public void showMovies(List<Movie> movies) { this.movies.clear(); this.movies.addAll(movies); moviesListing.setVisibility(View.VISIBLE); adapter.notifyDataSetChanged(); callback.onMoviesLoaded(movies.get(0)); } @Override public void loadingStarted() { Snackbar.make(moviesListing, R.string.loading_movies, Snackbar.LENGTH_SHORT).show(); } @Override public void loadingFailed(String errorMessage) { Snackbar.make(moviesListing, errorMessage, Snackbar.LENGTH_INDEFINITE).show(); } @Override public void onMovieClicked(Movie movie) { callback.onMovieClicked(movie); } @Override public void onDestroyView() { super.onDestroyView(); moviesPresenter.destroy(); ButterKnife.unbind(this); } @Override public void onDetach() { callback = null; super.onDetach(); } @Override public void onDestroy() { super.onDestroy(); ((BaseApplication) getActivity().getApplication()).releaseListingComponent(); } public interface Callback { void onMoviesLoaded(Movie movie); void onMovieClicked(Movie movie); } }