package com.lateensoft.pathfinder.toolkit.views.character;
import android.app.Activity;
import android.content.Intent;
import android.os.Parcelable;
import android.util.Log;
import com.google.inject.internal.Nullable;
import com.lateensoft.pathfinder.toolkit.dao.DataAccessException;
import com.lateensoft.pathfinder.toolkit.dao.Identifiable;
import com.lateensoft.pathfinder.toolkit.dao.IdentifiableGenericDAO;
import com.lateensoft.pathfinder.toolkit.dao.OwnedGenericDAO;
import com.lateensoft.pathfinder.toolkit.views.ParcelableEditorActivity;
import org.jetbrains.annotations.NotNull;
public abstract class ParcelableListFragment<T extends Parcelable & Identifiable,
DAO extends OwnedGenericDAO<Long, ?, T> & IdentifiableGenericDAO<T>>
extends AbstractCharacterSheetFragment {
private static final String TAG = ParcelableListFragment.class.getSimpleName();
protected void showEditorActivityForNewObject() {
showEditorActivity(null);
}
protected void showEditorActivity(T toEdit) {
Intent editorIntent = new Intent(getContext(),
getParcelableEditorActivity());
editorIntent.putExtra(
ParcelableEditorActivity.INTENT_EXTRAS_KEY_EDITABLE_PARCELABLE, toEdit);
addCustomExtrasToEditorActivityIntent(editorIntent, toEdit);
startActivityForResult(editorIntent, ParcelableEditorActivity.DEFAULT_REQUEST_CODE);
}
protected abstract Class<? extends ParcelableEditorActivity> getParcelableEditorActivity();
protected void addCustomExtrasToEditorActivityIntent(Intent intent, T toEdit) { }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ParcelableEditorActivity.DEFAULT_REQUEST_CODE) {
onParcelableEditorActivityResult(resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
private void onParcelableEditorActivityResult(int resultCode, Intent data) {
try {
boolean shouldUpdateUI = false;
if (resultCode == Activity.RESULT_OK) {
T editedParcelable = ParcelableEditorActivity.getParcelableFromIntent(data);
shouldUpdateUI = handleEditedResult(editedParcelable);
} else if (resultCode == FeatEditActivity.RESULT_DELETE) {
T toDelete = getObjectMarkedForDeletion();
shouldUpdateUI = handleResultToDelete(toDelete);
}
if (shouldUpdateUI) {
updateFragmentUI();
}
} catch (DataAccessException e) {
Log.e(TAG, "DAO operation failed", e);
}
}
private boolean handleEditedResult(@Nullable T editedParcelable) throws DataAccessException {
boolean didEditModel = false;
if (editedParcelable != null) {
EditAction action = getActionForResult(editedParcelable);
if (action == EditAction.ADD) {
getDAO().add(getCurrentCharacterID(), editedParcelable);
didEditModel = true;
} else if (action == EditAction.UPDATE) {
getDAO().update(getCurrentCharacterID(), editedParcelable);
didEditModel = true;
}
if (didEditModel) {
updateModel(action, editedParcelable);
}
}
return didEditModel;
}
private boolean handleResultToDelete(@Nullable T toDelete) throws DataAccessException {
if (toDelete != null) {
getDAO().remove(toDelete);
removeFromModel(toDelete);
return true;
}
return false;
}
protected enum EditAction {NONE, ADD, UPDATE}
protected abstract EditAction getActionForResult(@NotNull T result);
protected abstract DAO getDAO();
protected abstract void updateModel(EditAction action, T updatedParcelable);
protected abstract T getObjectMarkedForDeletion();
protected abstract void removeFromModel(T toRemove);
@Override
public void updateDatabase() {
// Done in onActivityResult
}
}