package it.demo.twitterlike.android.ui;
import it.demo.twitterlike.android.application.MainApplication;
import it.demo.twitterlike.android.service.TwitterLikeService;
import it.demo.twitterlike.android.tasks.AbstractRemoteInvocationTask;
import it.demo.twitterlike.android.tasks.DelayedTask;
import it.demo.twitterlike.android.ui.fragments.CallbackDialogFragment.YesNoListener;
import it.demo.twitterlike.rest.api.MessageOperations;
import it.demo.twitterlike.rest.api.UserOperations;
import it.demo.twitterlike.rest.api.UserProfile;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;
import com.telly.groundy.CallbacksManager;
import com.telly.groundy.Groundy;
import com.telly.groundy.GroundyManager;
import com.telly.groundy.annotations.OnFailure;
import com.telly.groundy.annotations.OnSuccess;
import com.telly.groundy.annotations.Param;
public abstract class AbstractAsyncActivity extends Activity implements
YesNoListener {
private static final int GROUP_ID = 146;
public static final int RESULT_SYNCRONIZE = 78;
private static final String PROGRESSBAR_MESSAGE = "progressBarMessage";
protected static final String TAG = AbstractAsyncActivity.class
.getSimpleName();
private Bundle savedInstanceState;
private ProgressDialog progressDialog;
protected CallbacksManager callbacksManager;
private boolean destroyed = false;
private CharSequence progressBarMessage = null;
public CallbacksManager getCallbacksManager() {
return callbacksManager;
}
protected Bundle getSavedInstanceState() {
return savedInstanceState;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
callbacksManager = CallbacksManager.init(savedInstanceState, this);
showProgressDialog(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
callbacksManager.onSaveInstanceState(savedInstanceState);
if (progressBarMessage != null) {
savedInstanceState.putCharSequence(PROGRESSBAR_MESSAGE,
progressBarMessage);
}
}
protected UserOperations getUserOperations() {
return getApplicationContext().getUserOperations();
}
protected MessageOperations getMessageOperations() {
return getApplicationContext().getMessageOperations();
}
protected void disconnect() {
getApplicationContext().disconnect();
}
protected boolean isConnected() {
return getApplicationContext().isAuthenticated();
}
protected TwitterLikeService getTwitterLikeService() {
return getApplicationContext().getTwitterLikeService();
}
protected UserProfile getAuthenticatedUser() {
return getApplicationContext().getAuthenticatedUser();
}
@OnFailure(AbstractRemoteInvocationTask.class)
public void onError(
@Param(AbstractRemoteInvocationTask.CONNECTION_ERROR) Boolean connectionError,
@Param(AbstractRemoteInvocationTask.AUTENTICATION_ERROR) Boolean authenticationError) {
dismissProgressDialog();
if (!doOnError(connectionError, authenticationError)) {
if (authenticationError != null && authenticationError) {
makeToastText(R.string.login_message_authentication_failed_wrongusername);
requestLogin();
} else {
if (connectionError != null && connectionError) {
makeToastText(R.string.login_message_authentication_noconnection);
} else {
makeToastText(R.string.message_async_operation_failed);
}
}
}
}
protected void requestLogin() {
disconnect();
if (!(this instanceof LoginActivity)) {
finish();
LoginActivity.show(this, true);
}
}
protected boolean doOnError(Boolean connectionError,
Boolean authenticationError) {
return false;
}
@Override
protected void onDestroy() {
super.onDestroy();
this.savedInstanceState = null;
callbacksManager.onDestroy();
destroyed = true;
if (progressDialog != null) {
progressDialog.dismiss();
}
}
@Override
public MainApplication getApplicationContext() {
return (MainApplication) super.getApplicationContext();
}
public void showLoadingProgressDialog() {
showProgressDialog("Loading. Please wait...");
}
protected void makeToastText(String messageString) {
Toast.makeText(this, messageString, Toast.LENGTH_LONG).show();
}
protected void makeToastText(int messageId) {
Toast.makeText(this, messageId, Toast.LENGTH_LONG).show();
}
protected void showProgressDialog(Bundle savedInstanceState) {
if (savedInstanceState != null) {
showProgressDialog(savedInstanceState
.getCharSequence(PROGRESSBAR_MESSAGE));
}
}
@OnSuccess(DelayedTask.class)
public void showProgressDialog(
@Param(PROGRESSBAR_MESSAGE) CharSequence message) {
showProgressDialog(message, 0);
}
public void showProgressDialog(CharSequence message, long delay) {
if (message != null) {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(true);
}
progressDialog.setMessage(message);
progressDialog.show();
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
progressBarMessage = message;
if (delay > 0) {
Groundy.create(DelayedTask.class).callback(this)
.group(GROUP_ID)
.arg(DelayedTask.DELAY_MILLIS_PARAMETER, delay)
.arg(PROGRESSBAR_MESSAGE, message)
.callbackManager(callbacksManager).executeUsing(this);
}
}
}
public void dismissProgressDialog() {
progressBarMessage = null;
GroundyManager.cancelTasksByGroup(this, GROUP_ID, null);
if (progressDialog != null && !destroyed) {
progressDialog.dismiss();
}
}
@Override
public void onYes(int code, Object... args) {
}
@Override
public void onNo(int code, Object... args) {
}
@Override
public void onNeutral(int code, Object... args) {
}
}