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