package com.zegoggles.smssync.service.state;
import android.content.res.Resources;
import android.text.TextUtils;
import com.fsck.k9.mail.AuthenticationFailedException;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.store.imap.XOAuth2AuthenticationFailedException;
import com.zegoggles.smssync.R;
import com.zegoggles.smssync.mail.DataType;
import com.zegoggles.smssync.service.exception.ConnectivityException;
import com.zegoggles.smssync.service.exception.LocalizableException;
import com.zegoggles.smssync.service.exception.RequiresLoginException;
import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
public abstract class State {
public final SmsSyncState state;
public final Exception exception;
public final @Nullable DataType dataType;
public State(SmsSyncState state, @Nullable DataType dataType, Exception exception) {
this.state = state;
this.exception = exception;
this.dataType = dataType;
}
public String getErrorMessage(Resources resources) {
if (exception == null) return null;
if (exception instanceof MessagingException &&
"Unable to get IMAP prefix".equals(exception.getMessage())) {
return resources.getString(R.string.status_gmail_temp_error);
} else if (exception instanceof LocalizableException) {
return resources.getString(((LocalizableException) exception).errorResourceId());
} else {
return exception.getLocalizedMessage();
}
}
public String getDetailedErrorMessage(Resources resources) {
final String msg = getErrorMessage(resources);
if (msg != null && exception != null) {
final String underlying = exception.getCause() != null ? exception.getCause().toString() : null;
final StringBuilder message = new StringBuilder().append(msg)
.append(" (exception: ")
.append(exception.toString());
if (!TextUtils.isEmpty(underlying)) {
message.append(", underlying=").append(underlying);
}
return message.append(")").toString();
} else {
return null;
}
}
public boolean isInitialState() {
return state == SmsSyncState.INITIAL;
}
public boolean isRunning() {
return EnumSet.of(
SmsSyncState.LOGIN,
SmsSyncState.CALC,
SmsSyncState.BACKUP,
SmsSyncState.RESTORE,
SmsSyncState.UPDATING_THREADS).contains(state);
}
public boolean isFinished() {
return !isInitialState() && !isRunning();
}
public abstract State transition(SmsSyncState newState, Exception exception);
public boolean isAuthException() {
return exception instanceof XOAuth2AuthenticationFailedException ||
exception instanceof AuthenticationFailedException ||
exception instanceof RequiresLoginException;
}
public boolean isConnectivityError() {
return exception instanceof ConnectivityException;
}
public boolean isError() {
return state == SmsSyncState.ERROR;
}
public boolean isCanceled() {
return state == SmsSyncState.CANCELED_BACKUP || state == SmsSyncState.CANCELED_RESTORE;
}
public String getNotificationLabel(Resources resources) {
switch (state) {
case LOGIN: return resources.getString(R.string.status_login_details);
case CALC: return resources.getString(R.string.status_calc_details);
case ERROR: return getErrorMessage(resources);
default: return null;
}
}
}