package com.gettingmobile.goodnews.settings;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.util.Log;
import com.gettingmobile.android.app.DialogFactory;
import com.gettingmobile.android.app.actions.AbstractAction;
import com.gettingmobile.android.app.actions.ActionContext;
import com.gettingmobile.goodnews.Application;
import java.text.MessageFormat;
public abstract class PreferenceAction extends AbstractAction<Application> {
protected final int confirmationTitleId;
protected final int confirmationMsgId;
protected final int errorTitleId;
protected final int errorMsgId;
public PreferenceAction(int confirmationTitleId, int confirmationMsgId, int errorTitleId, int errorMsgId) {
this.confirmationTitleId = confirmationTitleId;
this.confirmationMsgId = confirmationMsgId;
this.errorTitleId = errorTitleId;
this.errorMsgId = errorMsgId;
}
public PreferenceAction(int confirmationTitleId, int confirmationMsgId) {
this(confirmationTitleId, confirmationMsgId, 0, 0);
}
public PreferenceAction(int confirmationTitleId, int confirmationMsgId, int errorMsgId) {
this(confirmationTitleId, confirmationMsgId, confirmationTitleId, errorMsgId);
}
public PreferenceAction() {
this(0, 0);
}
@Override
public boolean onFired(final ActionContext<? extends Application> applicationActionContext) {
if (confirmationTitleId != 0 && confirmationMsgId != 0) {
showConfirmationDialog(applicationActionContext);
} else {
perform(applicationActionContext);
}
return true;
}
protected void showConfirmationDialog(final ActionContext<? extends Application> context) {
DialogFactory.buildYesNoDialog(
context.getActivity(), confirmationTitleId,
confirmationMsgId, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
perform(context);
}
}
).show();
}
protected void perform(final ActionContext<? extends Application> context) {
context.showWaitDialog();
//noinspection unchecked
new AsyncTask<Object, Object, Throwable>() {
@Override
protected Throwable doInBackground(Object... objects) {
try {
asyncPerform(context);
return null;
} catch (Throwable error) {
return error;
}
}
@Override
protected void onPostExecute(Throwable error) {
context.dismissWaitDialog();
if (error == null) {
onSuccess(context);
} else {
onError(context, error);
}
super.onPostExecute(error);
}
@Override
protected void onCancelled() {
context.dismissWaitDialog();
super.onCancelled();
}
}.execute();
}
protected void asyncPerform(final ActionContext<? extends Application> context) throws Throwable {
// nothing to be done by default
}
protected void onSuccess(ActionContext<? extends Application> context) {
// nothing to be done by default
}
protected void onError(ActionContext<? extends Application> context, Throwable error) {
showErrorDialog(context, error);
}
protected String getErrorMsg(ActionContext<? extends Application> context, Throwable error) {
return MessageFormat.format(context.getActivity().getString(errorMsgId), error.getLocalizedMessage());
}
protected void showErrorDialog(final ActionContext<? extends Application> context, Throwable error) {
try {
final String errorMsg = getErrorMsg(context, error);
Log.e(getClass().getSimpleName(), errorMsg, error);
if (!context.getActivity().isFinishing()) {
DialogFactory.showErrorDialog(
context.getActivity(), errorTitleId, errorMsg);
}
} catch (Resources.NotFoundException exception) {
Log.e(getClass().getSimpleName(), "Operation failed! (no error message displayed)", error);
}
}
}