package com.code44.finance.ui.common; import android.content.Context; import android.content.Intent; 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.MenuItem; import com.code44.finance.R; import com.code44.finance.common.utils.StringUtils; import com.code44.finance.data.model.Model; import com.code44.finance.ui.DrawerActivity; import com.code44.finance.ui.ModelFragment; import com.code44.finance.ui.dialogs.DeleteDialogFragment; import com.squareup.otto.Subscribe; public abstract class ModelActivity<M extends Model> extends DrawerActivity implements LoaderManager.LoaderCallbacks<Cursor> { protected static final String EXTRA_MODEL_ID = "EXTRA_MODEL_ID"; protected static final int REQUEST_DELETE = 6666; protected static final String FRAGMENT_DELETE = "FRAGMENT_DELETE"; protected static final int LOADER_MODEL = 1000; private final Object eventHandler = new Object() { @Subscribe public void onItemDeleted(DeleteDialogFragment.DeleteDialogEvent event) { if (event.getRequestCode() == ModelFragment.REQUEST_DELETE && event.isPositiveClicked()) { finish(); } } }; protected String modelId; protected M model; protected static Intent makeIntent(Context context, Class<? extends ModelActivity> activityClass, String modelId) { final Intent intent = makeIntentForActivity(context, activityClass); intent.putExtra(EXTRA_MODEL_ID, modelId); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); onExtras(getIntent()); onViewCreated(savedInstanceState); getEventBus().register(eventHandler); getSupportLoaderManager().initLoader(LOADER_MODEL, null, this); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.model, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_edit: startModelEdit(modelId); return true; case R.id.action_delete: final Uri deleteUri = getDeleteUri(); final Pair<String, String[]> deleteSelection = getDeleteSelection(); DeleteDialogFragment.newInstance(this, REQUEST_DELETE, deleteUri, deleteSelection.first, deleteSelection.second).show(getSupportFragmentManager(), FRAGMENT_DELETE); return true; } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { super.onDestroy(); getEventBus().unregister(eventHandler); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { if (id == LOADER_MODEL) { return getModelCursorLoader(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 int getLayoutId(); protected abstract CursorLoader getModelCursorLoader(String modelId); protected abstract M getModelFrom(Cursor cursor); protected abstract void onModelLoaded(M model); protected abstract Uri getDeleteUri(); protected abstract Pair<String, String[]> getDeleteSelection(); protected abstract void startModelEdit(String modelId); protected void onExtras(Intent extras) { modelId = extras.getStringExtra(EXTRA_MODEL_ID); if (StringUtils.isEmpty(modelId)) { modelId = "0"; } } protected void onViewCreated(Bundle savedInstanceState) { } }