Java tutorial
/* * Copyright 2015 Archie David * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.droidcodin.popularmdb; /** * Created by Archie David on 23/12/15. */ import android.content.Context; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; 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.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.GridView; import android.widget.Toast; import com.example.droidcodin.popularmdb.data.MovieColumns; import com.example.droidcodin.popularmdb.data.MovieContentProvider; import com.example.droidcodin.popularmdb.model.Movie; import com.example.droidcodin.popularmdb.model.MoviesResponse; import com.example.droidcodin.popularmdb.service.RestClient; import java.util.ArrayList; import java.util.List; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; public class MovieFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, MovieCursorAdapter.RecyclerViewClickListener { private static final String LOG_TAG = MovieFragment.class.getSimpleName(); private GridView mGridView; private MovieCursorAdapter mMovieCursorAdapter; private List<Movie> movieList; private RestClient restclient; private String apiKey = BuildConfig.PIMDB_API_KEY; private static final int CURSOR_LOADER_ID = 0; String preferredSortBy; private Context mContext; // Variable to get the cursor data - its value will be assign in onLoadFinished() method. // It will be use to get the rowID in recyclerViewListClicked() private Cursor mCursor; // check network connectivity public boolean isOnline(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); return isConnected; } public MovieFragment() { } public interface CallbackTwoPane { /** * DetailFragmentCallback for when an item has been selected. */ public void onItemSelected(Uri movieUri); } @Override public void onActivityCreated(Bundle savedInstanceState) { Cursor c = getActivity().getContentResolver().query(MovieContentProvider.Movie.CONTENT_URI, new String[] { MovieColumns._ID }, null, null, null); if (isOnline(getActivity())) { fetchMoviesData(); } // initialize loader getLoaderManager().initLoader(CURSOR_LOADER_ID, null, this); super.onActivityCreated(savedInstanceState); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null || !savedInstanceState.containsKey("movies")) { movieList = new ArrayList<Movie>(); } else { movieList = savedInstanceState.getParcelableArrayList("movie"); } setHasOptionsMenu(true); } @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelableArrayList("movies", (ArrayList) movieList); super.onSaveInstanceState(outState); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { Log.d(LOG_TAG, "onCreateOptionsMenu"); inflater.inflate(R.menu.movie_fragment, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_refresh) { fetchMoviesData(); return true; } return super.onOptionsItemSelected(item); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_main, container, false); RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.movie_recycler_view); recyclerView.setLayoutManager(new GridLayoutManager(recyclerView.getContext(), 2)); mMovieCursorAdapter = new MovieCursorAdapter(mContext, null, this); recyclerView.setAdapter(mMovieCursorAdapter); return rootView; } @Override public void recyclerViewListClicked(View v, int position) { mCursor.moveToPosition(position); if (mCursor != null) { ((CallbackTwoPane) getActivity()).onItemSelected(MovieContentProvider.Movie.withId(mCursor.getLong(0))); // getlong(0) gets the row ID } } // Attach loader to our movies database query // run when loader is initialized @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (preferredSortBy) { case "popularity.desc": return new CursorLoader(getActivity(), MovieContentProvider.Movie.CONTENT_URI, null, null, null, MovieColumns.COLUMN_POPULARITY + " DESC"); case "vote_count.desc": return new CursorLoader(getActivity(), MovieContentProvider.Movie.CONTENT_URI, null, null, null, MovieColumns.COLUMN_VOTECOUNT + " DESC"); case "favorited": return new CursorLoader(getActivity(), MovieContentProvider.Movie.CONTENT_URI, null, MovieColumns.COLUMN_FAVFLAG + " = ?", new String[] { "1" }, null); default: return null; } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } // Set the cursor in our CursorAdapter once the Cursor is loaded @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mCursor = data; mMovieCursorAdapter.swapCursor(data); } // reset CursorAdapter on Loader Reset @Override public void onLoaderReset(Loader<Cursor> loader) { mMovieCursorAdapter.swapCursor(null); } private void fetchMoviesData() { preferredSortBy = Utility.getPreferredSortBy(getActivity()); restclient = new RestClient(); //Note when troubleshooting check preferences values in Stetho if (preferredSortBy.equals("popularity.desc")) { getData(restclient.getApiService(), "popularity.desc", apiKey); } else if (preferredSortBy.equals("vote_count.desc")) { getData(restclient.getApiService(), "vote_count.desc", apiKey); } else if (preferredSortBy.equals("favorited")) { preferredSortBy = "favorited"; } } //get datafrom server and fill the customer adapter public void getData(MovieApiService get, String sort, String apiKey) { get.getMovie(sort, apiKey, new Callback<MoviesResponse>() { @Override public void success(MoviesResponse movies, Response response) { movieList = movies.getMovies(); if (movieList != null) { //bulkInsert arraylist of movies Utility.storeMovieList(getActivity(), movieList); } } @Override public void failure(RetrofitError error) { Toast.makeText(getActivity(), "Your Request have Problem", Toast.LENGTH_LONG).show(); } }); } // since we read the movie when we create the loader, all we need to do is restart things void onSortByChange() { fetchMoviesData(); getLoaderManager().restartLoader(CURSOR_LOADER_ID, null, this); } }