package com.code44.finance.ui;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.util.Pair;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.code44.finance.R;
import com.code44.finance.data.model.Model;
import com.code44.finance.ui.dialogs.DeleteDialogFragment;
public abstract class ModelFragment<T extends Model> extends BaseFragment implements LoaderManager.LoaderCallbacks<Cursor> {
public static final int REQUEST_DELETE = 6666;
protected static final String ARG_MODEL_SERVER_ID = "ARG_MODEL_SERVER_ID";
protected static final String FRAGMENT_DELETE = "FRAGMENT_DELETE";
protected static final int LOADER_MODEL = 1000;
protected String modelId;
protected T model;
public static Bundle makeArgs(String modelServerId) {
final Bundle args = new Bundle();
args.putString(ARG_MODEL_SERVER_ID, modelServerId);
return args;
}
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
// Get arguments
modelId = getArguments().getString(ARG_MODEL_SERVER_ID, "0");
}
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Loader
getLoaderManager().initLoader(LOADER_MODEL, null, this);
}
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.model, menu);
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_edit:
startModelEdit(getActivity(), modelId);
return true;
case R.id.action_delete:
final Uri deleteUri = getDeleteUri();
final Pair<String, String[]> deleteSelection = getDeleteSelection();
DeleteDialogFragment.newInstance(getActivity(), REQUEST_DELETE, deleteUri, deleteSelection.first, deleteSelection.second).show(getFragmentManager(), FRAGMENT_DELETE);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (id == LOADER_MODEL) {
return getModelCursorLoader(getActivity(), modelId);
}
return null;
}
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (loader.getId() == LOADER_MODEL) {
model = getModelFrom(data);
onModelLoaded(model);
}
}
@Override public void onLoaderReset(Loader<Cursor> loader) {
}
protected abstract CursorLoader getModelCursorLoader(Context context, String modelServerId);
protected abstract T getModelFrom(Cursor cursor);
protected abstract void onModelLoaded(T model);
protected abstract Uri getDeleteUri();
protected abstract Pair<String, String[]> getDeleteSelection();
protected abstract void startModelEdit(Context context, String modelServerId);
}