package com.robotoworks.example.movies.ui; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.widget.Toast; import com.robotoworks.example.movies.R; import com.robotoworks.example.movies.db.MovieDBContract.Movies; import com.robotoworks.example.movies.ops.GetMoviesOperation; import com.robotoworks.mechanoid.db.SQuery; import com.robotoworks.mechanoid.ops.OperationExecutor; import com.robotoworks.mechanoid.ops.OperationExecutorCallbacks; import com.robotoworks.mechanoid.ops.OperationResult; public class MovieListFragment extends ListFragment { private static final String OP_GET_MOVIES = "OP_GET_MOVIES"; private static final int LOADER_MOVIES = 1; private static String[] PROJECTION = { Movies._ID, Movies.TITLE, Movies.DESCRIPTION, Movies.YEAR }; private OperationExecutor mGetMoviesOperationExecutor; private MoviesAdapter mAdapter; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mGetMoviesOperationExecutor = new OperationExecutor(OP_GET_MOVIES, savedInstanceState, mOperationExecutorCallbacks); if(mGetMoviesOperationExecutor.isComplete()) { getLoaderManager().initLoader(LOADER_MOVIES, null, mLoaderCallbacks); } else { mGetMoviesOperationExecutor.execute(GetMoviesOperation.newIntent(), OperationExecutor.MODE_ONCE); } mAdapter = new MoviesAdapter(getActivity()); setListAdapter(mAdapter); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mGetMoviesOperationExecutor.saveState(outState); } private OperationExecutorCallbacks mOperationExecutorCallbacks = new OperationExecutorCallbacks() { @Override public boolean onOperationComplete(String key, OperationResult result) { if(!isAdded()) { return false; } if(OP_GET_MOVIES.equals(key)) { if(result.isOk()) { getLoaderManager().initLoader(LOADER_MOVIES, null, mLoaderCallbacks); } else { Throwable error = result.getError(); Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show(); } return true; } return false; } @Override public void onOperationPending(String key) { if(OP_GET_MOVIES.equals(key)) { setListShown(false); } } }; LoaderManager.LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { if(id == LOADER_MOVIES) { return SQuery.newQuery() .createSupportLoader(Movies.CONTENT_URI, PROJECTION); } return null; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { mAdapter.swapCursor(cursor); setListShown(true); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }; class MoviesAdapter extends SimpleCursorAdapter { public MoviesAdapter(Context context) { super(context, R.layout.item_movies, null, new String[] { Movies.TITLE, Movies.YEAR, Movies.DESCRIPTION }, new int[] { R.id.movie_title, R.id.movie_year, R.id.movie_description }, 0); } } }