package com.kickstarter.services.apiresponses; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringDef; import com.kickstarter.libs.qualifiers.AutoGson; import com.kickstarter.libs.utils.ListUtils; import com.kickstarter.services.ApiException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; import auto.parcel.AutoParcel; @AutoGson @AutoParcel public abstract class ErrorEnvelope implements Parcelable { public abstract @Nullable List<String> errorMessages(); public abstract int httpCode(); public abstract @Nullable String ksrCode(); public abstract @Nullable FacebookUser facebookUser(); @AutoGson @AutoParcel public static abstract class FacebookUser implements Parcelable { public abstract long id(); public abstract String name(); public abstract String email(); @AutoParcel.Builder public static abstract class Builder { public abstract Builder id(long __); public abstract Builder name(String __); public abstract Builder email(String __); public abstract FacebookUser build(); } public static Builder builder() { return new AutoParcel_ErrorEnvelope_FacebookUser.Builder(); } public abstract Builder toBuilder(); } @AutoParcel.Builder public abstract static class Builder { public abstract Builder errorMessages(List<String> __); public abstract Builder httpCode(int __); public abstract Builder ksrCode(String __); public abstract Builder facebookUser(FacebookUser __); public abstract ErrorEnvelope build(); } public static Builder builder() { return new AutoParcel_ErrorEnvelope.Builder(); } public abstract Builder toBuilder(); public static final String CONFIRM_FACEBOOK_SIGNUP = "confirm_facebook_signup"; public static final String INVALID_XAUTH_LOGIN = "invalid_xauth_login"; public static final String TFA_FAILED = "tfa_failed"; public static final String TFA_REQUIRED = "tfa_required"; public static final String MISSING_FACEBOOK_EMAIL = "missing_facebook_email"; public static final String FACEBOOK_INVALID_ACCESS_TOKEN = "facebook_invalid_access_token"; public static final String UNAUTHORIZED = "unauthorized"; @StringDef({INVALID_XAUTH_LOGIN, TFA_FAILED, TFA_REQUIRED}) @Retention(RetentionPolicy.SOURCE) public @interface ErrorCode {} /** * Tries to extract an {@link ErrorEnvelope} from an exception, and if it * can't returns null. */ public static @Nullable ErrorEnvelope fromThrowable(final @NonNull Throwable t) { if (t instanceof ApiException) { final ApiException exception = (ApiException) t; return exception.errorEnvelope(); } return null; } public boolean isConfirmFacebookSignupError() { return CONFIRM_FACEBOOK_SIGNUP.equals(ksrCode()); } public boolean isInvalidLoginError() { return INVALID_XAUTH_LOGIN.equals(ksrCode()); } public boolean isTfaRequiredError() { return TFA_REQUIRED.equals(ksrCode()); } public boolean isTfaFailedError() { return TFA_FAILED.equals(ksrCode()); } public boolean isMissingFacebookEmailError() { return MISSING_FACEBOOK_EMAIL.equals(ksrCode()); } public boolean isFacebookInvalidAccessTokenError() { return FACEBOOK_INVALID_ACCESS_TOKEN.equals(ksrCode()); } public boolean isUnauthorizedError() { return UNAUTHORIZED.equals(ksrCode()); } /* When logging in the only two possible errors are INVALID_XAUTH_LOGIN and TFA_REQUIRED, so we consider anything else an unknown error. */ public boolean isGenericLoginError() { return !INVALID_XAUTH_LOGIN.equals(ksrCode()) && !TFA_REQUIRED.equals(ksrCode()); } /** * Returns the first error message available, or `null` if there are none. */ public @Nullable String errorMessage() { if (errorMessages() == null) { return null; } else { return ListUtils.first(errorMessages()); } } }