/*
* *
* Copyright (C) 2014 Open Whisper Systems
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* /
*/
package org.anhonesteffort.flock;
import android.content.Context;
import android.content.OperationApplicationException;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
import com.stripe.exception.APIConnectionException;
import com.stripe.exception.CardException;
import com.stripe.exception.StripeException;
import org.anhonesteffort.flock.crypto.InvalidMacException;
import org.anhonesteffort.flock.registration.AuthorizationException;
import org.anhonesteffort.flock.registration.PaymentRequiredException;
import org.anhonesteffort.flock.registration.RegistrationApiParseException;
import org.anhonesteffort.flock.registration.RegistrationApiException;
import org.anhonesteffort.flock.sync.InvalidRemoteComponentException;
import org.anhonesteffort.flock.sync.OwsWebDav;
import org.anhonesteffort.flock.webdav.InvalidComponentException;
import org.anhonesteffort.flock.webdav.PropertyParseException;
import org.anhonesteffort.flock.webdav.WebDavConstants;
import org.apache.jackrabbit.webdav.DavException;
import java.io.IOException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.security.GeneralSecurityException;
import javax.net.ssl.SSLException;
/**
* Programmer: rhodey
*/
public class ErrorToaster {
private static final String TAG = "org.anhonesteffort.flock.ErrorToaster";
protected static final String KEY_STATUS_CODE = "ErrorToaster.KEY_STATUS_CODE";
protected static final int CODE_SUCCESS = 0;
protected static final int CODE_UNAUTHORIZED = 1;
protected static final int CODE_REGISTRATION_API_SERVER_ERROR = 2;
protected static final int CODE_REGISTRATION_API_CLIENT_ERROR = 3;
protected static final int CODE_DAV_SERVER_ERROR = 4;
protected static final int CODE_DAV_CLIENT_ERROR = 5;
protected static final int CODE_CONNECTION_ERROR = 6;
protected static final int CODE_CERTIFICATE_ERROR = 7;
protected static final int CODE_UNKNOWN_IO_ERROR = 8;
protected static final int CODE_INVALID_CIPHER_PASSPHRASE = 9;
protected static final int CODE_INVALID_MAC_ERROR = 10;
protected static final int CODE_CRYPTO_ERROR = 11;
protected static final int CODE_EMPTY_DAV_URL = 12;
protected static final int CODE_EMPTY_ACCOUNT_ID = 13;
protected static final int CODE_SPACES_IN_USERNAME = 14;
protected static final int CODE_ILLEGAL_ACCOUNT_ID = 15;
protected static final int CODE_ACCOUNT_ID_TAKEN = 16;
protected static final int CODE_SHORT_PASSWORD = 17;
protected static final int CODE_PASSWORDS_DO_NOT_MATCH = 18;
protected static final int CODE_CARD_NUMBER_INVALID = 19;
protected static final int CODE_CARD_EXPIRATION_INVALID = 20;
protected static final int CODE_CARD_CVC_INVALID = 21;
protected static final int CODE_STRIPE_REJECTED_CARD = 22;
protected static final int CODE_STRIPE_CONNECTION_ERROR = 23;
protected static final int CODE_STRIPE_API_ERROR = 24;
protected static final int CODE_SUBSCRIPTION_EXPIRED = 25;
protected static final int CODE_ACCOUNT_MANAGER_ERROR = 26;
protected static final int CODE_GOOGLE_PLAY_ERROR = 27;
protected static void handleBundleError(Exception e, Bundle bundle) {
Log.e(TAG, "handleBundleError() - ", e);
if (e instanceof AuthorizationException)
bundle.putInt(KEY_STATUS_CODE, CODE_UNAUTHORIZED);
else if (e instanceof RegistrationApiParseException)
bundle.putInt(KEY_STATUS_CODE, CODE_REGISTRATION_API_CLIENT_ERROR);
else if (e instanceof PaymentRequiredException)
bundle.putInt(KEY_STATUS_CODE, CODE_STRIPE_REJECTED_CARD);
else if (e instanceof RegistrationApiException)
bundle.putInt(KEY_STATUS_CODE, CODE_REGISTRATION_API_SERVER_ERROR);
else if (e instanceof DavException) {
DavException ex = (DavException) e;
if (ex.getErrorCode() == WebDavConstants.SC_UNAUTHORIZED)
bundle.putInt(KEY_STATUS_CODE, CODE_UNAUTHORIZED);
else if (ex.getErrorCode() == OwsWebDav.STATUS_PAYMENT_REQUIRED)
bundle.putInt(KEY_STATUS_CODE, CODE_SUBSCRIPTION_EXPIRED);
else
bundle.putInt(KEY_STATUS_CODE, CODE_DAV_SERVER_ERROR);
}
else if (e instanceof PropertyParseException) {
PropertyParseException ex = (PropertyParseException) e;
bundle.putInt(KEY_STATUS_CODE, CODE_DAV_SERVER_ERROR);
}
else if (e instanceof InvalidComponentException) {
InvalidComponentException ex = (InvalidComponentException) e;
if (ex instanceof InvalidRemoteComponentException)
bundle.putInt(KEY_STATUS_CODE, CODE_DAV_SERVER_ERROR);
else
bundle.putInt(KEY_STATUS_CODE, CODE_DAV_CLIENT_ERROR);
}
else if (e instanceof RemoteException || e instanceof OperationApplicationException)
bundle.putInt(KEY_STATUS_CODE, CODE_DAV_CLIENT_ERROR);
else if (e instanceof SSLException)
bundle.putInt(KEY_STATUS_CODE, CODE_CERTIFICATE_ERROR);
else if (e instanceof IOException) {
IOException ex = (IOException) e;
if (ex instanceof SocketException ||
ex instanceof UnknownHostException ||
ex instanceof SocketTimeoutException)
bundle.putInt(KEY_STATUS_CODE, CODE_CONNECTION_ERROR);
else
bundle.putInt(KEY_STATUS_CODE, CODE_UNKNOWN_IO_ERROR);
}
else if (e instanceof InvalidMacException)
bundle.putInt(KEY_STATUS_CODE, CODE_INVALID_MAC_ERROR);
else if (e instanceof GeneralSecurityException)
bundle.putInt(KEY_STATUS_CODE, CODE_CRYPTO_ERROR);
else if (e instanceof CardException) {
final String CODE_INVALID_CARD_NUMBER = "incorrect_number";
final String CODE_INVALID_EXPIRATION_MONTH = "invalid_expiry_month";
final String CODE_INVALID_EXPIRATION_YEAR = "invalid_expiry_year";
final String CODE_INVALID_CVC = "invalid_cvc";
if (((CardException) e).getCode().equals(CODE_INVALID_CARD_NUMBER))
bundle.putInt(KEY_STATUS_CODE, CODE_CARD_NUMBER_INVALID);
else if (((CardException) e).getCode().equals(CODE_INVALID_EXPIRATION_MONTH))
bundle.putInt(KEY_STATUS_CODE, CODE_CARD_EXPIRATION_INVALID);
else if (((CardException) e).getCode().equals(CODE_INVALID_EXPIRATION_YEAR))
bundle.putInt(KEY_STATUS_CODE, CODE_CARD_EXPIRATION_INVALID);
else if (((CardException) e).getCode().equals(CODE_INVALID_CVC))
bundle.putInt(KEY_STATUS_CODE, CODE_CARD_CVC_INVALID);
else
bundle.putInt(KEY_STATUS_CODE, CODE_STRIPE_REJECTED_CARD);
}
else if (e instanceof APIConnectionException)
bundle.putInt(KEY_STATUS_CODE, CODE_STRIPE_CONNECTION_ERROR);
else if (e instanceof StripeException)
bundle.putInt(KEY_STATUS_CODE, CODE_STRIPE_API_ERROR);
else
Log.e(TAG, "DID NOT HANDLE THIS EXCEPTION :(", e);
}
protected static void handleDisplayToastBundledError(Context context, Bundle bundle) {
final int ERROR_CODE = bundle.getInt(KEY_STATUS_CODE, -1);
switch (ERROR_CODE) {
case CODE_UNAUTHORIZED:
handleShowUnauthorizedError(context);
break;
case CODE_REGISTRATION_API_SERVER_ERROR:
handleShowRegistrationApiServerError(context);
break;
case CODE_REGISTRATION_API_CLIENT_ERROR:
handleShowRegistrationApiClientError(context);
break;
case CODE_DAV_SERVER_ERROR:
handleShowDavServerError(context);
break;
case CODE_DAV_CLIENT_ERROR:
handleShowDavClientError(context);
break;
case CODE_CONNECTION_ERROR:
handleShowConnectionError(context);
break;
case CODE_CERTIFICATE_ERROR:
handleShowCertificateError(context);
break;
case CODE_UNKNOWN_IO_ERROR:
handleShowUnknownIoError(context);
break;
case CODE_INVALID_CIPHER_PASSPHRASE:
handleShowInvalidCipherPassphraseError(context);
break;
case CODE_INVALID_MAC_ERROR:
handleShowInvalidMacErrorError(context);
break;
case CODE_CRYPTO_ERROR:
handleShowCryptoError(context);
break;
case CODE_EMPTY_DAV_URL:
handleShowDavUrlEmpty(context);
break;
case CODE_EMPTY_ACCOUNT_ID:
handleShowAccountIdEmpty(context);
break;
case CODE_SPACES_IN_USERNAME:
handleShowSpacesInAccountId(context);
break;
case CODE_ILLEGAL_ACCOUNT_ID:
handleShowIllegalAccountId(context);
break;
case CODE_ACCOUNT_ID_TAKEN:
handleShowAccountIdTaken(context);
break;
case CODE_SHORT_PASSWORD:
handleShowAccountPasswordTooShort(context);
break;
case CODE_PASSWORDS_DO_NOT_MATCH:
handleShowPasswordsDoNotMatch(context);
break;
case CODE_CARD_NUMBER_INVALID:
handleShowCardNumberInvalid(context);
break;
case CODE_CARD_EXPIRATION_INVALID:
handleShowCardExpirationInvalid(context);
break;
case CODE_CARD_CVC_INVALID:
handleShowCardCVCInvalid(context);
break;
case CODE_STRIPE_REJECTED_CARD:
handleShowStripeRejectedCard(context);
break;
case CODE_STRIPE_CONNECTION_ERROR:
handleShowStripeConnectionError(context);
break;
case CODE_STRIPE_API_ERROR:
handleShowStripeApiError(context);
break;
case CODE_SUBSCRIPTION_EXPIRED:
handleShowSubscriptionExpired(context);
break;
case CODE_ACCOUNT_MANAGER_ERROR:
handleShowAccountManagerError(context);
break;
case CODE_GOOGLE_PLAY_ERROR:
handleShowGooglePlayError(context);
break;
}
}
public static void handleShowError(Context context, Exception e) {
Bundle bundle = new Bundle();
handleBundleError(e, bundle);
handleDisplayToastBundledError(context, bundle);
}
private static void handleShowError(Context context, int stringId) {
Toast.makeText(context, stringId, Toast.LENGTH_LONG).show();
}
private static void handleShowErrorQuick(Context context, int stringId) {
Toast.makeText(context, stringId, Toast.LENGTH_SHORT).show();
}
private static void handleShowUnauthorizedError(Context context) {
handleShowError(context, R.string.error_login_unauthorized);
DavAccountHelper.invalidateAccountPassword(context);
}
private static void handleShowRegistrationApiServerError(Context context) {
handleShowError(context, R.string.error_registration_api_server_error);
}
private static void handleShowRegistrationApiClientError(Context context) {
handleShowError(context, R.string.error_registration_api_client_error);
}
private static void handleShowDavServerError(Context context) {
if (DavAccountHelper.isUsingOurServers(context))
handleShowError(context, R.string.error_our_dav_server_error);
else
handleShowError(context, R.string.error_their_dav_server_error);
}
private static void handleShowDavClientError(Context context) {
handleShowError(context, R.string.error_dav_client_error);
}
private static void handleShowConnectionError(Context context) {
handleShowError(context, R.string.error_connection_error);
}
private static void handleShowCertificateError(Context context) {
if (DavAccountHelper.isUsingOurServers(context))
handleShowError(context, R.string.error_our_certificate_validation);
else
handleShowError(context, R.string.error_their_certificate_validation);
}
private static void handleShowUnknownIoError(Context context) {
handleShowError(context, R.string.error_unknown_io_error);
}
private static void handleShowInvalidCipherPassphraseError(Context context) {
handleShowErrorQuick(context, R.string.error_invalid_encryption_password);
}
private static void handleShowInvalidMacErrorError(Context context) {
handleShowError(context, R.string.error_invalid_mac_error);
}
private static void handleShowCryptoError(Context context) {
handleShowError(context, R.string.error_unknown_crypto_error);
}
private static void handleShowDavUrlEmpty(Context context) {
handleShowErrorQuick(context, R.string.error_url_cannot_be_empty);
}
private static void handleShowAccountIdEmpty(Context context) {
handleShowErrorQuick(context, R.string.error_username_empty);
}
private static void handleShowSpacesInAccountId(Context context) {
handleShowErrorQuick(context, R.string.error_spaces_in_username);
}
private static void handleShowIllegalAccountId(Context context) {
handleShowErrorQuick(context, R.string.error_username_illegal);
}
private static void handleShowAccountIdTaken(Context context) {
handleShowErrorQuick(context, R.string.error_username_already_registered);
}
private static void handleShowAccountPasswordTooShort(Context context) {
handleShowErrorQuick(context, R.string.error_password_too_short);
}
private static void handleShowPasswordsDoNotMatch(Context context) {
handleShowErrorQuick(context, R.string.error_passwords_do_not_match);
}
private static void handleShowCardNumberInvalid(Context context) {
handleShowErrorQuick(context, R.string.error_card_number_could_not_be_verified);
}
private static void handleShowCardExpirationInvalid(Context context) {
handleShowErrorQuick(context, R.string.error_card_expiration_could_not_be_verified);
}
private static void handleShowCardCVCInvalid(Context context) {
handleShowErrorQuick(context, R.string.error_card_security_code_could_not_be_verified);
}
private static void handleShowStripeRejectedCard(Context context) {
handleShowErrorQuick(context, R.string.error_your_card_could_not_be_verified);
}
private static void handleShowStripeConnectionError(Context context) {
handleShowError(context, R.string.error_connection_error);
}
private static void handleShowStripeApiError(Context context) {
handleShowError(context, R.string.error_stripe_api_error);
}
private static void handleShowSubscriptionExpired(Context context) {
handleShowErrorQuick(context, R.string.notification_flock_subscription_expired);
}
private static void handleShowAccountManagerError(Context context) {
handleShowError(context, R.string.error_android_account_manager_error);
}
private static void handleShowGooglePlayError(Context context) {
handleShowError(context, R.string.google_play_error_please_update_google_play_services);
}
}