diff options
| -rw-r--r-- | telephony/java/android/telephony/DataFailCause.java | 496 |
1 files changed, 370 insertions, 126 deletions
diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java index c6f7d0e458db..c53b37d8ae6a 100644 --- a/telephony/java/android/telephony/DataFailCause.java +++ b/telephony/java/android/telephony/DataFailCause.java @@ -15,151 +15,383 @@ */ package android.telephony; +import android.annotation.IntDef; +import android.annotation.NonNull; import android.content.Context; import android.os.PersistableBundle; +import com.android.internal.util.ArrayUtils; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; +import java.util.Set; /** - * Returned as the reason for a connection failure as defined - * by RIL_DataCallFailCause in ril.h and some local errors. + * Returned as the reason for a data connection failure as defined by modem and some local errors. * @hide */ -public enum DataFailCause { - NONE(0), +public final class DataFailCause { + /** There is no failure */ + public static final int NONE = 0; // This series of errors as specified by the standards // specified in ril.h - OPERATOR_BARRED(0x08), /* no retry */ - NAS_SIGNALLING(0x0E), - LLC_SNDCP(0x19), - INSUFFICIENT_RESOURCES(0x1A), - MISSING_UNKNOWN_APN(0x1B), /* no retry */ - UNKNOWN_PDP_ADDRESS_TYPE(0x1C), /* no retry */ - USER_AUTHENTICATION(0x1D), /* no retry */ - ACTIVATION_REJECT_GGSN(0x1E), /* no retry */ - ACTIVATION_REJECT_UNSPECIFIED(0x1F), - SERVICE_OPTION_NOT_SUPPORTED(0x20), /* no retry */ - SERVICE_OPTION_NOT_SUBSCRIBED(0x21), /* no retry */ - SERVICE_OPTION_OUT_OF_ORDER(0x22), - NSAPI_IN_USE(0x23), /* no retry */ - REGULAR_DEACTIVATION(0x24), /* possibly restart radio, based on config */ - QOS_NOT_ACCEPTED(0x25), - NETWORK_FAILURE(0x26), - UMTS_REACTIVATION_REQ(0x27), - FEATURE_NOT_SUPP(0x28), - TFT_SEMANTIC_ERROR(0x29), - TFT_SYTAX_ERROR(0x2A), - UNKNOWN_PDP_CONTEXT(0x2B), - FILTER_SEMANTIC_ERROR(0x2C), - FILTER_SYTAX_ERROR(0x2D), - PDP_WITHOUT_ACTIVE_TFT(0x2E), - ONLY_IPV4_ALLOWED(0x32), /* no retry */ - ONLY_IPV6_ALLOWED(0x33), /* no retry */ - ONLY_SINGLE_BEARER_ALLOWED(0x34), - ESM_INFO_NOT_RECEIVED(0x35), - PDN_CONN_DOES_NOT_EXIST(0x36), - MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED(0x37), - MAX_ACTIVE_PDP_CONTEXT_REACHED(0x41), - UNSUPPORTED_APN_IN_CURRENT_PLMN(0x42), - INVALID_TRANSACTION_ID(0x51), - MESSAGE_INCORRECT_SEMANTIC(0x5F), - INVALID_MANDATORY_INFO(0x60), - MESSAGE_TYPE_UNSUPPORTED(0x61), - MSG_TYPE_NONCOMPATIBLE_STATE(0x62), - UNKNOWN_INFO_ELEMENT(0x63), - CONDITIONAL_IE_ERROR(0x64), - MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE(0x65), - PROTOCOL_ERRORS(0x6F), /* no retry */ - APN_TYPE_CONFLICT(0x70), - INVALID_PCSCF_ADDR(0x71), - INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN(0x72), - EMM_ACCESS_BARRED(0x73), - EMERGENCY_IFACE_ONLY(0x74), - IFACE_MISMATCH(0x75), - COMPANION_IFACE_IN_USE(0x76), - IP_ADDRESS_MISMATCH(0x77), - IFACE_AND_POL_FAMILY_MISMATCH(0x78), - EMM_ACCESS_BARRED_INFINITE_RETRY(0x79), - AUTH_FAILURE_ON_EMERGENCY_CALL(0x7A), + /** Operator determined barring. */ + public static final int OPERATOR_BARRED = 0x08; + /** NAS signalling. */ + public static final int NAS_SIGNALLING = 0x0E; + /** Logical Link Control (LLC) Sub Network Dependent Convergence Protocol (SNDCP). */ + public static final int LLC_SNDCP = 0x19; + /** Insufficient resources. */ + public static final int INSUFFICIENT_RESOURCES = 0x1A; + /** Missing or unknown APN. */ + public static final int MISSING_UNKNOWN_APN = 0x1B; /* no retry */ + /** Unknown Packet Data Protocol (PDP) address type. */ + public static final int UNKNOWN_PDP_ADDRESS_TYPE = 0x1C; /* no retry */ + /** User authentication. */ + public static final int USER_AUTHENTICATION = 0x1D; /* no retry */ + /** Activation rejected by Gateway GPRS Support Node (GGSN), Serving Gateway or PDN Gateway. */ + public static final int ACTIVATION_REJECT_GGSN = 0x1E; /* no retry */ + /** Activation rejected, unspecified. */ + public static final int ACTIVATION_REJECT_UNSPECIFIED = 0x1F; + /** Service option not supported. */ + public static final int SERVICE_OPTION_NOT_SUPPORTED = 0x20; /* no retry */ + /** Requested service option not subscribed. */ + public static final int SERVICE_OPTION_NOT_SUBSCRIBED = 0x21; /* no retry */ + /** Service option temporarily out of order. */ + public static final int SERVICE_OPTION_OUT_OF_ORDER = 0x22; + /** The Network Service Access Point Identifier (NSAPI) is in use. */ + public static final int NSAPI_IN_USE = 0x23; /* no retry */ + /* possibly restart radio, based on config */ + /** Regular deactivation. */ + public static final int REGULAR_DEACTIVATION = 0x24; + /** Quality of service (QoS) is not accepted. */ + public static final int QOS_NOT_ACCEPTED = 0x25; + /** Network Failure. */ + public static final int NETWORK_FAILURE = 0x26; + /** Universal Mobile Telecommunications System (UMTS) reactivation request. */ + public static final int UMTS_REACTIVATION_REQ = 0x27; + /** Feature not supported. */ + public static final int FEATURE_NOT_SUPP = 0x28; + /** Semantic error in the Traffic flow templates (TFT) operation. */ + public static final int TFT_SEMANTIC_ERROR = 0x29; + /** Syntactical error in the Traffic flow templates (TFT) operation. */ + public static final int TFT_SYTAX_ERROR = 0x2A; + /** Unknown Packet Data Protocol (PDP) context. */ + public static final int UNKNOWN_PDP_CONTEXT = 0x2B; + /** Semantic errors in packet filter. */ + public static final int FILTER_SEMANTIC_ERROR = 0x2C; + /** Syntactical errors in packet filter(s). */ + public static final int FILTER_SYTAX_ERROR = 0x2D; + /** Packet Data Protocol (PDP) without active traffic flow template (TFT). */ + public static final int PDP_WITHOUT_ACTIVE_TFT = 0x2E; + /** Packet Data Protocol (PDP) type IPv4 only allowed. */ + public static final int ONLY_IPV4_ALLOWED = 0x32; /* no retry */ + /** Packet Data Protocol (PDP) type IPv6 only allowed. */ + public static final int ONLY_IPV6_ALLOWED = 0x33; /* no retry */ + /** Single address bearers only allowed. */ + public static final int ONLY_SINGLE_BEARER_ALLOWED = 0x34; + /** EPS Session Management (ESM) information is not received. */ + public static final int ESM_INFO_NOT_RECEIVED = 0x35; + /** PDN connection does not exist. */ + public static final int PDN_CONN_DOES_NOT_EXIST = 0x36; + /** Multiple connections to a same PDN is not allowed. */ + public static final int MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 0x37; + /** Packet Data Protocol (PDP) */ + public static final int MAX_ACTIVE_PDP_CONTEXT_REACHED = 0x41; + /** Unsupported APN in current public land mobile network (PLMN). */ + public static final int UNSUPPORTED_APN_IN_CURRENT_PLMN = 0x42; + /** Invalid transaction id. */ + public static final int INVALID_TRANSACTION_ID = 0x51; + /** Incorrect message semantic. */ + public static final int MESSAGE_INCORRECT_SEMANTIC = 0x5F; + /** Invalid mandatory information. */ + public static final int INVALID_MANDATORY_INFO = 0x60; + /** Unsupported message type. */ + public static final int MESSAGE_TYPE_UNSUPPORTED = 0x61; + /** Message type uncompatible. */ + public static final int MSG_TYPE_NONCOMPATIBLE_STATE = 0x62; + /** Unknown info element. */ + public static final int UNKNOWN_INFO_ELEMENT = 0x63; + /** Conditional Information Element (IE) error. */ + public static final int CONDITIONAL_IE_ERROR = 0x64; + /** Message and protocol state uncompatible. */ + public static final int MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 0x65; + /** Protocol errors. */ + public static final int PROTOCOL_ERRORS = 0x6F; /* no retry */ + /** APN type conflict. */ + public static final int APN_TYPE_CONFLICT = 0x70; + /** Invalid Proxy-Call Session Control Function (P-CSCF) address. */ + public static final int INVALID_PCSCF_ADDR = 0x71; + /** Internal data call preempt by high priority APN. */ + public static final int INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN = 0x72; + /** EPS (Evolved Packet System) Mobility Management (EMM) access barred. */ + public static final int EMM_ACCESS_BARRED = 0x73; + /** Emergency interface only. */ + public static final int EMERGENCY_IFACE_ONLY = 0x74; + /** Interface mismatch. */ + public static final int IFACE_MISMATCH = 0x75; + /** Companion interface in use. */ + public static final int COMPANION_IFACE_IN_USE = 0x76; + /** IP address mismatch. */ + public static final int IP_ADDRESS_MISMATCH = 0x77; + public static final int IFACE_AND_POL_FAMILY_MISMATCH = 0x78; + /** EPS (Evolved Packet System) Mobility Management (EMM) access barred infinity retry. **/ + public static final int EMM_ACCESS_BARRED_INFINITE_RETRY = 0x79; + /** Authentication failure on emergency call. */ + public static final int AUTH_FAILURE_ON_EMERGENCY_CALL = 0x7A; // OEM sepecific error codes. To be used by OEMs when they don't // want to reveal error code which would be replaced by ERROR_UNSPECIFIED - OEM_DCFAILCAUSE_1(0x1001), - OEM_DCFAILCAUSE_2(0x1002), - OEM_DCFAILCAUSE_3(0x1003), - OEM_DCFAILCAUSE_4(0x1004), - OEM_DCFAILCAUSE_5(0x1005), - OEM_DCFAILCAUSE_6(0x1006), - OEM_DCFAILCAUSE_7(0x1007), - OEM_DCFAILCAUSE_8(0x1008), - OEM_DCFAILCAUSE_9(0x1009), - OEM_DCFAILCAUSE_10(0x100A), - OEM_DCFAILCAUSE_11(0x100B), - OEM_DCFAILCAUSE_12(0x100C), - OEM_DCFAILCAUSE_13(0x100D), - OEM_DCFAILCAUSE_14(0x100E), - OEM_DCFAILCAUSE_15(0x100F), + public static final int OEM_DCFAILCAUSE_1 = 0x1001; + public static final int OEM_DCFAILCAUSE_2 = 0x1002; + public static final int OEM_DCFAILCAUSE_3 = 0x1003; + public static final int OEM_DCFAILCAUSE_4 = 0x1004; + public static final int OEM_DCFAILCAUSE_5 = 0x1005; + public static final int OEM_DCFAILCAUSE_6 = 0x1006; + public static final int OEM_DCFAILCAUSE_7 = 0x1007; + public static final int OEM_DCFAILCAUSE_8 = 0x1008; + public static final int OEM_DCFAILCAUSE_9 = 0x1009; + public static final int OEM_DCFAILCAUSE_10 = 0x100A; + public static final int OEM_DCFAILCAUSE_11 = 0x100B; + public static final int OEM_DCFAILCAUSE_12 = 0x100C; + public static final int OEM_DCFAILCAUSE_13 = 0x100D; + public static final int OEM_DCFAILCAUSE_14 = 0x100E; + public static final int OEM_DCFAILCAUSE_15 = 0x100F; // Local errors generated by Vendor RIL // specified in ril.h - REGISTRATION_FAIL(-1), - GPRS_REGISTRATION_FAIL(-2), - SIGNAL_LOST(-3), /* no retry */ - PREF_RADIO_TECH_CHANGED(-4), - RADIO_POWER_OFF(-5), /* no retry */ - TETHERED_CALL_ACTIVE(-6), /* no retry */ - ERROR_UNSPECIFIED(0xFFFF), + public static final int REGISTRATION_FAIL = -1; + public static final int GPRS_REGISTRATION_FAIL = -2; + public static final int SIGNAL_LOST = -3; /* no retry */ + public static final int PREF_RADIO_TECH_CHANGED = -4; + public static final int RADIO_POWER_OFF = -5; /* no retry */ + public static final int TETHERED_CALL_ACTIVE = -6; /* no retry */ + public static final int ERROR_UNSPECIFIED = 0xFFFF; // Errors generated by the Framework // specified here - UNKNOWN(0x10000), - RADIO_NOT_AVAILABLE(0x10001), /* no retry */ - UNACCEPTABLE_NETWORK_PARAMETER(0x10002), /* no retry */ - CONNECTION_TO_DATACONNECTIONAC_BROKEN(0x10003), - LOST_CONNECTION(0x10004), - RESET_BY_FRAMEWORK(0x10005); + public static final int UNKNOWN = 0x10000; + public static final int RADIO_NOT_AVAILABLE = 0x10001; /* no retry */ + public static final int UNACCEPTABLE_NETWORK_PARAMETER = 0x10002; /* no retry */ + public static final int CONNECTION_TO_DATACONNECTIONAC_BROKEN = 0x10003; + public static final int LOST_CONNECTION = 0x10004; + /** Data was reset by framework. */ + public static final int RESET_BY_FRAMEWORK = 0x10005; + + /** @hide */ + @IntDef(value = { + NONE, + OPERATOR_BARRED, + NAS_SIGNALLING, + LLC_SNDCP, + INSUFFICIENT_RESOURCES, + MISSING_UNKNOWN_APN, + UNKNOWN_PDP_ADDRESS_TYPE, + USER_AUTHENTICATION, + ACTIVATION_REJECT_GGSN, + ACTIVATION_REJECT_UNSPECIFIED, + SERVICE_OPTION_NOT_SUPPORTED, + SERVICE_OPTION_NOT_SUBSCRIBED, + SERVICE_OPTION_OUT_OF_ORDER, + NSAPI_IN_USE, + REGULAR_DEACTIVATION, + QOS_NOT_ACCEPTED, + NETWORK_FAILURE, + UMTS_REACTIVATION_REQ, + FEATURE_NOT_SUPP, + TFT_SEMANTIC_ERROR, + TFT_SYTAX_ERROR, + UNKNOWN_PDP_CONTEXT, + FILTER_SEMANTIC_ERROR, + FILTER_SYTAX_ERROR, + PDP_WITHOUT_ACTIVE_TFT, + ONLY_IPV4_ALLOWED, + ONLY_IPV6_ALLOWED, + ONLY_SINGLE_BEARER_ALLOWED, + ESM_INFO_NOT_RECEIVED, + PDN_CONN_DOES_NOT_EXIST, + MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED, + MAX_ACTIVE_PDP_CONTEXT_REACHED, + UNSUPPORTED_APN_IN_CURRENT_PLMN, + INVALID_TRANSACTION_ID, + MESSAGE_INCORRECT_SEMANTIC, + INVALID_MANDATORY_INFO, + MESSAGE_TYPE_UNSUPPORTED, + MSG_TYPE_NONCOMPATIBLE_STATE, + UNKNOWN_INFO_ELEMENT, + CONDITIONAL_IE_ERROR, + MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE, + PROTOCOL_ERRORS, /* no retry */ + APN_TYPE_CONFLICT, + INVALID_PCSCF_ADDR, + INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN, + EMM_ACCESS_BARRED, + EMERGENCY_IFACE_ONLY, + IFACE_MISMATCH, + COMPANION_IFACE_IN_USE, + IP_ADDRESS_MISMATCH, + IFACE_AND_POL_FAMILY_MISMATCH, + EMM_ACCESS_BARRED_INFINITE_RETRY, + AUTH_FAILURE_ON_EMERGENCY_CALL, + OEM_DCFAILCAUSE_1, + OEM_DCFAILCAUSE_2, + OEM_DCFAILCAUSE_3, + OEM_DCFAILCAUSE_4, + OEM_DCFAILCAUSE_5, + OEM_DCFAILCAUSE_6, + OEM_DCFAILCAUSE_7, + OEM_DCFAILCAUSE_8, + OEM_DCFAILCAUSE_9, + OEM_DCFAILCAUSE_10, + OEM_DCFAILCAUSE_11, + OEM_DCFAILCAUSE_12, + OEM_DCFAILCAUSE_13, + OEM_DCFAILCAUSE_14, + OEM_DCFAILCAUSE_15, + REGISTRATION_FAIL, + GPRS_REGISTRATION_FAIL, + SIGNAL_LOST, + PREF_RADIO_TECH_CHANGED, + RADIO_POWER_OFF, + TETHERED_CALL_ACTIVE, + ERROR_UNSPECIFIED, + UNKNOWN, + RADIO_NOT_AVAILABLE, + UNACCEPTABLE_NETWORK_PARAMETER, + CONNECTION_TO_DATACONNECTIONAC_BROKEN, + LOST_CONNECTION, + RESET_BY_FRAMEWORK + }) + @Retention(RetentionPolicy.SOURCE) + public @interface FailCause{} - private final int mErrorCode; - private static final HashMap<Integer, DataFailCause> sErrorCodeToFailCauseMap; + private static final Map<Integer, String> sFailCauseMap; static { - sErrorCodeToFailCauseMap = new HashMap<Integer, DataFailCause>(); - for (DataFailCause fc : values()) { - sErrorCodeToFailCauseMap.put(fc.getErrorCode(), fc); - } + sFailCauseMap = new HashMap<>(); + sFailCauseMap.put(NONE, "NONE"); + sFailCauseMap.put(OPERATOR_BARRED, "OPERATOR_BARRED"); + sFailCauseMap.put(NAS_SIGNALLING, "NAS_SIGNALLING"); + sFailCauseMap.put(LLC_SNDCP, "LLC_SNDCP"); + sFailCauseMap.put(INSUFFICIENT_RESOURCES, "INSUFFICIENT_RESOURCES"); + sFailCauseMap.put(MISSING_UNKNOWN_APN, "MISSING_UNKNOWN_APN"); + sFailCauseMap.put(UNKNOWN_PDP_ADDRESS_TYPE, "UNKNOWN_PDP_ADDRESS_TYPE"); + sFailCauseMap.put(USER_AUTHENTICATION, "USER_AUTHENTICATION"); + sFailCauseMap.put(ACTIVATION_REJECT_GGSN, "ACTIVATION_REJECT_GGSN"); + sFailCauseMap.put(ACTIVATION_REJECT_UNSPECIFIED, + "ACTIVATION_REJECT_UNSPECIFIED"); + sFailCauseMap.put(SERVICE_OPTION_NOT_SUPPORTED, + "SERVICE_OPTION_NOT_SUPPORTED"); + sFailCauseMap.put(SERVICE_OPTION_NOT_SUBSCRIBED, + "SERVICE_OPTION_NOT_SUBSCRIBED"); + sFailCauseMap.put(SERVICE_OPTION_OUT_OF_ORDER, "SERVICE_OPTION_OUT_OF_ORDER"); + sFailCauseMap.put(NSAPI_IN_USE, "NSAPI_IN_USE"); + sFailCauseMap.put(REGULAR_DEACTIVATION, "REGULAR_DEACTIVATION"); + sFailCauseMap.put(QOS_NOT_ACCEPTED, "QOS_NOT_ACCEPTED"); + sFailCauseMap.put(NETWORK_FAILURE, "NETWORK_FAILURE"); + sFailCauseMap.put(UMTS_REACTIVATION_REQ, "UMTS_REACTIVATION_REQ"); + sFailCauseMap.put(FEATURE_NOT_SUPP, "FEATURE_NOT_SUPP"); + sFailCauseMap.put(TFT_SEMANTIC_ERROR, "TFT_SEMANTIC_ERROR"); + sFailCauseMap.put(TFT_SYTAX_ERROR, "TFT_SYTAX_ERROR"); + sFailCauseMap.put(UNKNOWN_PDP_CONTEXT, "UNKNOWN_PDP_CONTEXT"); + sFailCauseMap.put(FILTER_SEMANTIC_ERROR, "FILTER_SEMANTIC_ERROR"); + sFailCauseMap.put(FILTER_SYTAX_ERROR, "FILTER_SYTAX_ERROR"); + sFailCauseMap.put(PDP_WITHOUT_ACTIVE_TFT, "PDP_WITHOUT_ACTIVE_TFT"); + sFailCauseMap.put(ONLY_IPV4_ALLOWED, "ONLY_IPV4_ALLOWED"); + sFailCauseMap.put(ONLY_IPV6_ALLOWED, "ONLY_IPV6_ALLOWED"); + sFailCauseMap.put(ONLY_SINGLE_BEARER_ALLOWED, "ONLY_SINGLE_BEARER_ALLOWED"); + sFailCauseMap.put(ESM_INFO_NOT_RECEIVED, "ESM_INFO_NOT_RECEIVED"); + sFailCauseMap.put(PDN_CONN_DOES_NOT_EXIST, "PDN_CONN_DOES_NOT_EXIST"); + sFailCauseMap.put(MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED, + "MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED"); + sFailCauseMap.put(MAX_ACTIVE_PDP_CONTEXT_REACHED, + "MAX_ACTIVE_PDP_CONTEXT_REACHED"); + sFailCauseMap.put(UNSUPPORTED_APN_IN_CURRENT_PLMN, + "UNSUPPORTED_APN_IN_CURRENT_PLMN"); + sFailCauseMap.put(INVALID_TRANSACTION_ID, "INVALID_TRANSACTION_ID"); + sFailCauseMap.put(MESSAGE_INCORRECT_SEMANTIC, "MESSAGE_INCORRECT_SEMANTIC"); + sFailCauseMap.put(INVALID_MANDATORY_INFO, "INVALID_MANDATORY_INFO"); + sFailCauseMap.put(MESSAGE_TYPE_UNSUPPORTED, "MESSAGE_TYPE_UNSUPPORTED"); + sFailCauseMap.put(MSG_TYPE_NONCOMPATIBLE_STATE, "MSG_TYPE_NONCOMPATIBLE_STATE"); + sFailCauseMap.put(UNKNOWN_INFO_ELEMENT, "UNKNOWN_INFO_ELEMENT"); + sFailCauseMap.put(CONDITIONAL_IE_ERROR, "CONDITIONAL_IE_ERROR"); + sFailCauseMap.put(MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE, + "MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE"); + sFailCauseMap.put(PROTOCOL_ERRORS, "PROTOCOL_ERRORS"); + sFailCauseMap.put(APN_TYPE_CONFLICT, "APN_TYPE_CONFLICT"); + sFailCauseMap.put(INVALID_PCSCF_ADDR, "INVALID_PCSCF_ADDR"); + sFailCauseMap.put(INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN, + "INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN"); + sFailCauseMap.put(EMM_ACCESS_BARRED, "EMM_ACCESS_BARRED"); + sFailCauseMap.put(EMERGENCY_IFACE_ONLY, "EMERGENCY_IFACE_ONLY"); + sFailCauseMap.put(IFACE_MISMATCH, "IFACE_MISMATCH"); + sFailCauseMap.put(COMPANION_IFACE_IN_USE, "COMPANION_IFACE_IN_USE"); + sFailCauseMap.put(IP_ADDRESS_MISMATCH, "IP_ADDRESS_MISMATCH"); + sFailCauseMap.put(IFACE_AND_POL_FAMILY_MISMATCH, + "IFACE_AND_POL_FAMILY_MISMATCH"); + sFailCauseMap.put(EMM_ACCESS_BARRED_INFINITE_RETRY, + "EMM_ACCESS_BARRED_INFINITE_RETRY"); + sFailCauseMap.put(AUTH_FAILURE_ON_EMERGENCY_CALL, + "AUTH_FAILURE_ON_EMERGENCY_CALL"); + sFailCauseMap.put(OEM_DCFAILCAUSE_1, "OEM_DCFAILCAUSE_1"); + sFailCauseMap.put(OEM_DCFAILCAUSE_2, "OEM_DCFAILCAUSE_2"); + sFailCauseMap.put(OEM_DCFAILCAUSE_3, "OEM_DCFAILCAUSE_3"); + sFailCauseMap.put(OEM_DCFAILCAUSE_4, "OEM_DCFAILCAUSE_4"); + sFailCauseMap.put(OEM_DCFAILCAUSE_5, "OEM_DCFAILCAUSE_5"); + sFailCauseMap.put(OEM_DCFAILCAUSE_6, "OEM_DCFAILCAUSE_6"); + sFailCauseMap.put(OEM_DCFAILCAUSE_7, "OEM_DCFAILCAUSE_7"); + sFailCauseMap.put(OEM_DCFAILCAUSE_8, "OEM_DCFAILCAUSE_8"); + sFailCauseMap.put(OEM_DCFAILCAUSE_9, "OEM_DCFAILCAUSE_9"); + sFailCauseMap.put(OEM_DCFAILCAUSE_10, "OEM_DCFAILCAUSE_10"); + sFailCauseMap.put(OEM_DCFAILCAUSE_11, "OEM_DCFAILCAUSE_11"); + sFailCauseMap.put(OEM_DCFAILCAUSE_12, "OEM_DCFAILCAUSE_12"); + sFailCauseMap.put(OEM_DCFAILCAUSE_13, "OEM_DCFAILCAUSE_13"); + sFailCauseMap.put(OEM_DCFAILCAUSE_14, "OEM_DCFAILCAUSE_14"); + sFailCauseMap.put(OEM_DCFAILCAUSE_15, "OEM_DCFAILCAUSE_15"); + sFailCauseMap.put(REGISTRATION_FAIL, "REGISTRATION_FAIL"); + sFailCauseMap.put(GPRS_REGISTRATION_FAIL, "GPRS_REGISTRATION_FAIL"); + sFailCauseMap.put(SIGNAL_LOST, "SIGNAL_LOST"); + sFailCauseMap.put(PREF_RADIO_TECH_CHANGED, "PREF_RADIO_TECH_CHANGED"); + sFailCauseMap.put(RADIO_POWER_OFF, "RADIO_POWER_OFF"); + sFailCauseMap.put(TETHERED_CALL_ACTIVE, "TETHERED_CALL_ACTIVE"); + sFailCauseMap.put(ERROR_UNSPECIFIED, "ERROR_UNSPECIFIED"); + sFailCauseMap.put(UNKNOWN, "UNKNOWN"); + sFailCauseMap.put(RADIO_NOT_AVAILABLE, "RADIO_NOT_AVAILABLE"); + sFailCauseMap.put(UNACCEPTABLE_NETWORK_PARAMETER, + "UNACCEPTABLE_NETWORK_PARAMETER"); + sFailCauseMap.put(CONNECTION_TO_DATACONNECTIONAC_BROKEN, + "CONNECTION_TO_DATACONNECTIONAC_BROKEN"); + sFailCauseMap.put(LOST_CONNECTION, "LOST_CONNECTION"); + sFailCauseMap.put(RESET_BY_FRAMEWORK, "RESET_BY_FRAMEWORK"); } /** * Map of subId -> set of data call setup permanent failure for the carrier. */ - private static final HashMap<Integer, HashSet<DataFailCause>> sPermanentFailureCache = + private static final HashMap<Integer, Set<Integer>> sPermanentFailureCache = new HashMap<>(); - DataFailCause(int errorCode) { - mErrorCode = errorCode; - } - - public int getErrorCode() { - return mErrorCode; - } - /** * Returns whether or not the fail cause is a failure that requires a modem restart * * @param context device context + * @param cause data disconnect cause * @param subId subscription index * @return true if the fail cause code needs platform to trigger a modem restart. */ - public boolean isRadioRestartFailure(Context context, int subId) { + public static boolean isRadioRestartFailure(@NonNull Context context, @FailCause int cause, + int subId) { CarrierConfigManager configManager = (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE); if (configManager != null) { PersistableBundle b = configManager.getConfigForSubId(subId); if (b != null) { - if (this == REGULAR_DEACTIVATION + if (cause == REGULAR_DEACTIVATION && b.getBoolean(CarrierConfigManager .KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL)) { // This is for backward compatibility support. We need to continue support this @@ -170,7 +402,7 @@ public enum DataFailCause { int[] causeCodes = b.getIntArray(CarrierConfigManager .KEY_RADIO_RESTART_FAILURE_CAUSES_INT_ARRAY); if (causeCodes != null) { - return Arrays.stream(causeCodes).anyMatch(i -> i == getErrorCode()); + return Arrays.stream(causeCodes).anyMatch(i -> i == cause); } } } @@ -178,11 +410,11 @@ public enum DataFailCause { return false; } - public boolean isPermanentFailure(Context context, int subId) { - + public static boolean isPermanentFailure(@NonNull Context context, @FailCause int failCause, + int subId) { synchronized (sPermanentFailureCache) { - HashSet<DataFailCause> permanentFailureSet = sPermanentFailureCache.get(subId); + Set<Integer> permanentFailureSet = sPermanentFailureCache.get(subId); // In case of cache miss, we need to look up the settings from carrier config. if (permanentFailureSet == null) { @@ -194,11 +426,12 @@ public enum DataFailCause { if (b != null) { String[] permanentFailureStrings = b.getStringArray(CarrierConfigManager. KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS); - if (permanentFailureStrings != null) { permanentFailureSet = new HashSet<>(); - for (String failure : permanentFailureStrings) { - permanentFailureSet.add(DataFailCause.valueOf(failure)); + for (Map.Entry<Integer, String> e : sFailCauseMap.entrySet()) { + if (ArrayUtils.contains(permanentFailureStrings, e.getValue())) { + permanentFailureSet.add(e.getKey()); + } } } } @@ -207,7 +440,7 @@ public enum DataFailCause { // If we are not able to find the configuration from carrier config, use the default // ones. if (permanentFailureSet == null) { - permanentFailureSet = new HashSet<DataFailCause>() { + permanentFailureSet = new HashSet<Integer>() { { add(OPERATOR_BARRED); add(MISSING_UNKNOWN_APN); @@ -232,28 +465,39 @@ public enum DataFailCause { sPermanentFailureCache.put(subId, permanentFailureSet); } - return permanentFailureSet.contains(this); + return permanentFailureSet.contains(failCause); } } - public boolean isEventLoggable() { - return (this == OPERATOR_BARRED) || (this == INSUFFICIENT_RESOURCES) || - (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) || - (this == ACTIVATION_REJECT_GGSN) || (this == ACTIVATION_REJECT_UNSPECIFIED) || - (this == SERVICE_OPTION_NOT_SUBSCRIBED) || - (this == SERVICE_OPTION_NOT_SUPPORTED) || - (this == SERVICE_OPTION_OUT_OF_ORDER) || (this == NSAPI_IN_USE) || - (this == ONLY_IPV4_ALLOWED) || (this == ONLY_IPV6_ALLOWED) || - (this == PROTOCOL_ERRORS) || (this == SIGNAL_LOST) || - (this == RADIO_POWER_OFF) || (this == TETHERED_CALL_ACTIVE) || - (this == UNACCEPTABLE_NETWORK_PARAMETER); + public static boolean isEventLoggable(@FailCause int dataFailCause) { + return (dataFailCause == OPERATOR_BARRED) || (dataFailCause == INSUFFICIENT_RESOURCES) + || (dataFailCause == UNKNOWN_PDP_ADDRESS_TYPE) + || (dataFailCause == USER_AUTHENTICATION) + || (dataFailCause == ACTIVATION_REJECT_GGSN) + || (dataFailCause == ACTIVATION_REJECT_UNSPECIFIED) + || (dataFailCause == SERVICE_OPTION_NOT_SUBSCRIBED) + || (dataFailCause == SERVICE_OPTION_NOT_SUPPORTED) + || (dataFailCause == SERVICE_OPTION_OUT_OF_ORDER) + || (dataFailCause == NSAPI_IN_USE) + || (dataFailCause == ONLY_IPV4_ALLOWED) + || (dataFailCause == ONLY_IPV6_ALLOWED) + || (dataFailCause == PROTOCOL_ERRORS) + || (dataFailCause == SIGNAL_LOST) + || (dataFailCause == RADIO_POWER_OFF) + || (dataFailCause == TETHERED_CALL_ACTIVE) + || (dataFailCause == UNACCEPTABLE_NETWORK_PARAMETER); + } + + public static String toString(@FailCause int dataFailCause) { + int cause = getFailCause(dataFailCause); + return (cause == UNKNOWN) ? "UNKNOWN(" + dataFailCause + ")" : sFailCauseMap.get(cause); } - public static DataFailCause fromInt(int errorCode) { - DataFailCause fc = sErrorCodeToFailCauseMap.get(errorCode); - if (fc == null) { - fc = UNKNOWN; + public static int getFailCause(@FailCause int failCause) { + if (sFailCauseMap.containsKey(failCause)) { + return failCause; + } else { + return UNKNOWN; } - return fc; } } |