package com.robotoworks.example.ghissues.ui; import com.robotoworks.example.ghissues.R; import com.robotoworks.example.ghissues.db.GithubDBContract.Issues; import com.robotoworks.example.ghissues.ops.GetIssuesForRepositoryOperation; import com.robotoworks.mechanoid.db.SQuery; import com.robotoworks.mechanoid.ops.OperationExecutor; import com.robotoworks.mechanoid.ops.OperationExecutorCallbacks; import com.robotoworks.mechanoid.ops.OperationResult; import android.app.ListFragment; import android.app.LoaderManager.LoaderCallbacks; import android.content.Context; import android.content.Loader; import android.database.Cursor; import android.os.Bundle; import android.widget.SimpleCursorAdapter; import android.widget.Toast; public class IssuesFragment extends ListFragment { private static final String OP_GET_ISSUES = "OP_GET_ISSUES"; private static final int LOADER_ISSUES = 1; private OperationExecutor mGetIssuesOpExecutor; private IssueListAdapter mAdapter; private static final String[] ISSUES_PROJECTION = { Issues._ID, Issues.NUMBER, Issues.TITLE, Issues.BODY }; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new IssueListAdapter(getActivity()); setListAdapter(mAdapter); mGetIssuesOpExecutor = new OperationExecutor(OP_GET_ISSUES, savedInstanceState, mOpExecutorCallbacks); if(mGetIssuesOpExecutor.isOk()) { getLoaderManager().restartLoader(LOADER_ISSUES, null, mLoaderCallbacks); } else { mGetIssuesOpExecutor.execute(GetIssuesForRepositoryOperation.newIntent("robotoworks", "mechanoid"), OperationExecutor.MODE_ON_ERROR); } } private OperationExecutorCallbacks mOpExecutorCallbacks = new OperationExecutorCallbacks() { @Override public void onOperationPending(String key) { if(OP_GET_ISSUES.equals(key)) { setListShown(false); } } @Override public boolean onOperationComplete(String key, OperationResult result) { if(!isAdded()) { return false; } if(OP_GET_ISSUES.equals(key)) { setListShown(true); if(result.isOk()) { getLoaderManager().restartLoader(LOADER_ISSUES, null, mLoaderCallbacks); } else { Toast.makeText(getActivity(), result.getError().getMessage(), Toast.LENGTH_LONG).show(); } return true; } return false; } }; private LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() { @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { mAdapter.swapCursor(cursor); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return SQuery.newQuery().createLoader(Issues.CONTENT_URI, ISSUES_PROJECTION); } }; public static class IssueListAdapter extends SimpleCursorAdapter { private static final String[] FROM = { Issues.NUMBER, Issues.TITLE, Issues.BODY }; private static final int[] TO = { R.id.issue_number, R.id.issue_title, R.id.issue_body }; public IssueListAdapter(Context context) { super(context, R.layout.item_issue, null, FROM, TO, 0); } } }