1ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/* 2ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Copyright (C) 2006 The Android Open Source Project 3ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 4ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * you may not use this file except in compliance with the License. 6ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * You may obtain a copy of the License at 7ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 8ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 10ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Unless required by applicable law or agreed to in writing, software 11ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * See the License for the specific language governing permissions and 14ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * limitations under the License. 15ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 16ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepackage com.android.internal.telephony.dataconnection; 17ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 18ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yuimport android.content.Context; 191ed331920d5a765da8b926e6aad2cb668203be53Hui Wangimport android.content.res.Resources; 20ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yuimport android.os.PersistableBundle; 21ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yuimport android.telephony.CarrierConfigManager; 22ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 23ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.HashMap; 24ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yuimport java.util.HashSet; 25ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 26ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/** 27ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Returned as the reason for a connection failure as defined 28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * by RIL_DataCallFailCause in ril.h and some local errors. 29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 30ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic enum DcFailCause { 31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville NONE(0), 32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // This series of errors as specified by the standards 34ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // specified in ril.h 352ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville OPERATOR_BARRED(0x08), /* no retry */ 36cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe NAS_SIGNALLING(0x0E), 37cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe LLC_SNDCP(0x19), 38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville INSUFFICIENT_RESOURCES(0x1A), 392ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville MISSING_UNKNOWN_APN(0x1B), /* no retry */ 402ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville UNKNOWN_PDP_ADDRESS_TYPE(0x1C), /* no retry */ 412ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville USER_AUTHENTICATION(0x1D), /* no retry */ 422ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville ACTIVATION_REJECT_GGSN(0x1E), /* no retry */ 43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ACTIVATION_REJECT_UNSPECIFIED(0x1F), 442ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville SERVICE_OPTION_NOT_SUPPORTED(0x20), /* no retry */ 452ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville SERVICE_OPTION_NOT_SUBSCRIBED(0x21), /* no retry */ 46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville SERVICE_OPTION_OUT_OF_ORDER(0x22), 472ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville NSAPI_IN_USE(0x23), /* no retry */ 481ed331920d5a765da8b926e6aad2cb668203be53Hui Wang REGULAR_DEACTIVATION(0x24), /* possibly restart radio, based on config */ 49cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe QOS_NOT_ACCEPTED(0x25), 50cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe NETWORK_FAILURE(0x26), 51cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe UMTS_REACTIVATION_REQ(0x27), 52cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe FEATURE_NOT_SUPP(0x28), 53cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe TFT_SEMANTIC_ERROR(0x29), 54cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe TFT_SYTAX_ERROR(0x2A), 55cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe UNKNOWN_PDP_CONTEXT(0x2B), 56cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe FILTER_SEMANTIC_ERROR(0x2C), 57cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe FILTER_SYTAX_ERROR(0x2D), 58cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe PDP_WITHOUT_ACTIVE_TFT(0x2E), 592ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville ONLY_IPV4_ALLOWED(0x32), /* no retry */ 602ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville ONLY_IPV6_ALLOWED(0x33), /* no retry */ 61ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ONLY_SINGLE_BEARER_ALLOWED(0x34), 62cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe ESM_INFO_NOT_RECEIVED(0x35), 63cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe PDN_CONN_DOES_NOT_EXIST(0x36), 64cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED(0x37), 65cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe MAX_ACTIVE_PDP_CONTEXT_REACHED(0x41), 66cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe UNSUPPORTED_APN_IN_CURRENT_PLMN(0x42), 67cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe INVALID_TRANSACTION_ID(0x51), 68cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe MESSAGE_INCORRECT_SEMANTIC(0x5F), 69cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe INVALID_MANDATORY_INFO(0x60), 70cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe MESSAGE_TYPE_UNSUPPORTED(0x61), 71cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe MSG_TYPE_NONCOMPATIBLE_STATE(0x62), 72cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe UNKNOWN_INFO_ELEMENT(0x63), 73cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe CONDITIONAL_IE_ERROR(0x64), 74cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE(0x65), 752ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville PROTOCOL_ERRORS(0x6F), /* no retry */ 76cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe APN_TYPE_CONFLICT(0x70), 77cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe INVALID_PCSCF_ADDR(0x71), 78cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN(0x72), 79cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe EMM_ACCESS_BARRED(0x73), 80cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe EMERGENCY_IFACE_ONLY(0x74), 81cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe IFACE_MISMATCH(0x75), 82cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe COMPANION_IFACE_IN_USE(0x76), 83cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe IP_ADDRESS_MISMATCH(0x77), 84cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe IFACE_AND_POL_FAMILY_MISMATCH(0x78), 85cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe EMM_ACCESS_BARRED_INFINITE_RETRY(0x79), 86cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe AUTH_FAILURE_ON_EMERGENCY_CALL(0x7A), 87cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe 88cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe // OEM sepecific error codes. To be used by OEMs when they don't 89cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe // want to reveal error code which would be replaced by ERROR_UNSPECIFIED 90cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_1(0x1001), 91cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_2(0x1002), 92cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_3(0x1003), 93cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_4(0x1004), 94cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_5(0x1005), 95cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_6(0x1006), 96cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_7(0x1007), 97cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_8(0x1008), 98cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_9(0x1009), 99cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_10(0x100A), 100cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_11(0x100B), 101cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_12(0x100C), 102cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_13(0x100D), 103cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_14(0x100E), 104cd3800ef6d32f5173e647924620501f7b5fcdb3fSanket Padawe OEM_DCFAILCAUSE_15(0x100F), 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Local errors generated by Vendor RIL 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // specified in ril.h 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville REGISTRATION_FAIL(-1), 109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville GPRS_REGISTRATION_FAIL(-2), 110ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu SIGNAL_LOST(-3), /* no retry */ 111ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu PREF_RADIO_TECH_CHANGED(-4), 1122ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville RADIO_POWER_OFF(-5), /* no retry */ 1132ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville TETHERED_CALL_ACTIVE(-6), /* no retry */ 114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ERROR_UNSPECIFIED(0xFFFF), 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Errors generated by the Framework 117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // specified here 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UNKNOWN(0x10000), 1192ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville RADIO_NOT_AVAILABLE(0x10001), /* no retry */ 1202ae42257ebafdbb0470cedeab41c2f1b418b285cWink Saville UNACCEPTABLE_NETWORK_PARAMETER(0x10002), /* no retry */ 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville CONNECTION_TO_DATACONNECTIONAC_BROKEN(0x10003), 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LOST_CONNECTION(0x10004), 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville RESET_BY_FRAMEWORK(0x10005); 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private final int mErrorCode; 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final HashMap<Integer, DcFailCause> sErrorCodeToFailCauseMap; 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sErrorCodeToFailCauseMap = new HashMap<Integer, DcFailCause>(); 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (DcFailCause fc : values()) { 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sErrorCodeToFailCauseMap.put(fc.getErrorCode(), fc); 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 134ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu /** 135ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu * Map of subId -> set of data call setup permanent failure for the carrier. 136ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu */ 137ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu private static final HashMap<Integer, HashSet<DcFailCause>> sPermanentFailureCache = 138ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu new HashMap<>(); 139ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause(int errorCode) { 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mErrorCode = errorCode; 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getErrorCode() { 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mErrorCode; 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 14831f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu /** 14931f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu * Returns whether or not the radio has failed and also needs to be restarted. 15031f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu * By default, we do not restart radio on REGULAR_DEACTIVATION. 15131f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu * 15231f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu * @param context device context 15331f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu * @param subId subscription id 15431f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu * @return true if the radio has failed and the carrier requres restart, otherwise false 15531f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu */ 15631f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu public boolean isRestartRadioFail(Context context, int subId) { 15731f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu if (this == REGULAR_DEACTIVATION) { 15831f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu CarrierConfigManager configManager = (CarrierConfigManager) 15931f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu context.getSystemService(Context.CARRIER_CONFIG_SERVICE); 16031f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu if (configManager != null) { 16131f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu PersistableBundle b = configManager.getConfigForSubId(subId); 16231f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu if (b != null) { 16331f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu return b.getBoolean(CarrierConfigManager. 16431f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL); 16531f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu } 16631f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu } 16731f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu } 16831f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu return false; 169979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 170979786625e7ceacf4a545a25704ef8a15338a854Wink Saville 171ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu public boolean isPermanentFailure(Context context, int subId) { 172ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 173ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu synchronized (sPermanentFailureCache) { 174ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 175ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu HashSet<DcFailCause> permanentFailureSet = sPermanentFailureCache.get(subId); 176ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 177ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu // In case of cache miss, we need to look up the settings from carrier config. 178ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu if (permanentFailureSet == null) { 179ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu // Retrieve the permanent failure from carrier config 180ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu CarrierConfigManager configManager = (CarrierConfigManager) 181ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu context.getSystemService(Context.CARRIER_CONFIG_SERVICE); 182ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu if (configManager != null) { 183ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu PersistableBundle b = configManager.getConfigForSubId(subId); 184ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu if (b != null) { 185ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu String[] permanentFailureStrings = b.getStringArray(CarrierConfigManager. 186ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS); 187ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 188ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu if (permanentFailureStrings != null) { 189ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu permanentFailureSet = new HashSet<>(); 190ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu for (String failure : permanentFailureStrings) { 191ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu permanentFailureSet.add(DcFailCause.valueOf(failure)); 192ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 193ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 194ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 195ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 196ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 197ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu // If we are not able to find the configuration from carrier config, use the default 198ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu // ones. 199ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu if (permanentFailureSet == null) { 200ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu permanentFailureSet = new HashSet<DcFailCause>() { 201ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu { 202ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(OPERATOR_BARRED); 203ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(MISSING_UNKNOWN_APN); 204ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(UNKNOWN_PDP_ADDRESS_TYPE); 205ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(USER_AUTHENTICATION); 206ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(ACTIVATION_REJECT_GGSN); 207ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(SERVICE_OPTION_NOT_SUPPORTED); 208ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(SERVICE_OPTION_NOT_SUBSCRIBED); 209ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(NSAPI_IN_USE); 210ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(ONLY_IPV4_ALLOWED); 211ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(ONLY_IPV6_ALLOWED); 212ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(PROTOCOL_ERRORS); 213ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(RADIO_POWER_OFF); 214ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(TETHERED_CALL_ACTIVE); 215ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(RADIO_NOT_AVAILABLE); 216ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(UNACCEPTABLE_NETWORK_PARAMETER); 217ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu add(SIGNAL_LOST); 218ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 219ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu }; 220ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 221ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 222ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu sPermanentFailureCache.put(subId, permanentFailureSet); 223ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 224ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu 225ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu return permanentFailureSet.contains(this); 226ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu } 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean isEventLoggable() { 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return (this == OPERATOR_BARRED) || (this == INSUFFICIENT_RESOURCES) || 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) || 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == ACTIVATION_REJECT_GGSN) || (this == ACTIVATION_REJECT_UNSPECIFIED) || 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == SERVICE_OPTION_NOT_SUBSCRIBED) || 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == SERVICE_OPTION_NOT_SUPPORTED) || 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == SERVICE_OPTION_OUT_OF_ORDER) || (this == NSAPI_IN_USE) || 236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == ONLY_IPV4_ALLOWED) || (this == ONLY_IPV6_ALLOWED) || 237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == PROTOCOL_ERRORS) || (this == SIGNAL_LOST) || 238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == RADIO_POWER_OFF) || (this == TETHERED_CALL_ACTIVE) || 239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (this == UNACCEPTABLE_NETWORK_PARAMETER); 240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public static DcFailCause fromInt(int errorCode) { 243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause fc = sErrorCodeToFailCauseMap.get(errorCode); 244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (fc == null) { 245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville fc = UNKNOWN; 246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return fc; 248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville} 250