1aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee/**
2aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * Copyright (C) 2014 The Android Open Source Project
3aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee *
4aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * Licensed under the Apache License, Version 2.0 (the "License");
5aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * you may not use this file except in compliance with the License.
6aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * You may obtain a copy of the License at
7aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee *
8aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee *      http://www.apache.org/licenses/LICENSE-2.0
9aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee *
10aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * Unless required by applicable law or agreed to in writing, software
11aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * distributed under the License is distributed on an "AS IS" BASIS,
12aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * See the License for the specific language governing permissions and
14aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee * limitations under the License.
15aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee */
16aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
17aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leepackage com.android.services.telephony;
18aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
19aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport android.content.Context;
20aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport android.media.ToneGenerator;
21aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport android.telecom.DisconnectCause;
22aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
231d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiongimport com.android.internal.telephony.CallFailCause;
242880ad7c1f17ff21e4517d857c1928fce1b5be28Brad Ebingerimport com.android.phone.ImsUtil;
25aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport com.android.phone.PhoneGlobals;
26aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport com.android.phone.common.R;
27aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
28aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leepublic class DisconnectCauseUtil {
29aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
30aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee   /**
3123913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
3223913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    * generic {@link android.telecom.DisconnectCause} object, possibly populated with a localized
3323913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    * message and tone.
34aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    *
35aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    * @param telephonyDisconnectCause The code for the reason for the disconnect.
36aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    */
37aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    public static DisconnectCause toTelecomDisconnectCause(int telephonyDisconnectCause) {
381d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        return toTelecomDisconnectCause(telephonyDisconnectCause,
391d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                CallFailCause.NOT_VALID, null /* reason */);
40aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    }
41aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
42aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee   /**
4323913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
4423913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    * generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
4523913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    * message and tone.
46aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    *
47aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    * @param telephonyDisconnectCause The code for the reason for the disconnect.
48aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    * @param reason Description of the reason for the disconnect, not intended for the user to see..
49aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    */
50aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    public static DisconnectCause toTelecomDisconnectCause(
51aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            int telephonyDisconnectCause, String reason) {
521d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        return toTelecomDisconnectCause(telephonyDisconnectCause, CallFailCause.NOT_VALID, reason);
531d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    }
541d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong
551d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong   /**
561d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
571d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    * generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
581d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    * message and tone.
591d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    *
601d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    * @param telephonyDisconnectCause The code for the reason for the disconnect.
611d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    * @param telephonyPerciseDisconnectCause The code for the percise reason for the disconnect.
621d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    * @param reason Description of the reason for the disconnect, not intended for the user to see..
631d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    */
641d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    public static DisconnectCause toTelecomDisconnectCause(
651d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            int telephonyDisconnectCause, int telephonyPerciseDisconnectCause, String reason) {
66aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        Context context = PhoneGlobals.getInstance();
67aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        return new DisconnectCause(
68aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                toTelecomDisconnectCauseCode(telephonyDisconnectCause),
691d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause,
701d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        telephonyPerciseDisconnectCause),
71aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                toTelecomDisconnectCauseDescription(context, telephonyDisconnectCause),
7223913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                toTelecomDisconnectReason(context,telephonyDisconnectCause, reason),
73aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                toTelecomDisconnectCauseTone(telephonyDisconnectCause));
74aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    }
75aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
76aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    /**
77aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     * Convert the {@link android.telephony.DisconnectCause} disconnect code into a
78aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     * {@link android.telecom.DisconnectCause} disconnect code.
79aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     * @return The disconnect code as defined in {@link android.telecom.DisconnectCause}.
80aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     */
81aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    private static int toTelecomDisconnectCauseCode(int telephonyDisconnectCause) {
82aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        switch (telephonyDisconnectCause) {
83aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.LOCAL:
84aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.LOCAL;
85aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
86aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NORMAL:
877280a6ae12d2f66da1cd74f119002437394095a9qingbiao.meng            case android.telephony.DisconnectCause.NORMAL_UNSPECIFIED:
88aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.REMOTE;
89aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
90aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUTGOING_CANCELED:
91aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.CANCELED;
92aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
93aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.INCOMING_MISSED:
94aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.MISSED;
95aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
96aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.INCOMING_REJECTED:
97aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.REJECTED;
98aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
99aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.BUSY:
100aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.BUSY;
101aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
102aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CALL_BARRED:
10392c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_ACCESS_BLOCKED:
10492c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_NOT_EMERGENCY:
105aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CS_RESTRICTED:
106aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CS_RESTRICTED_EMERGENCY:
10792c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CS_RESTRICTED_NORMAL:
10892c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.EMERGENCY_ONLY:
10992c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.FDN_BLOCKED:
11092c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.LIMIT_EXCEEDED:
1112d6dc18f9cb17c4f35fdb594eb90003764bb9336Tyler Gunn            case android.telephony.DisconnectCause.VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED:
112aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.RESTRICTED;
113aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
11492c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_ACCESS_FAILURE:
1158fb4b652b3607f0063806c29138840102a5bba05Andrew Lee            case android.telephony.DisconnectCause.CDMA_ALREADY_ACTIVATED:
11692c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_CALL_LOST:
11792c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_DROP:
11892c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_INTERCEPT:
11992c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_LOCKED_UNTIL_POWER_CYCLE:
12092c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_PREEMPTED:
12192c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_REORDER:
12292c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_RETRY_ORDER:
12392c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.CDMA_SO_REJECT:
124aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CONGESTION:
12592c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.ICC_ERROR:
12692c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.INVALID_CREDENTIALS:
127aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.INVALID_NUMBER:
12892c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.LOST_SIGNAL:
12992c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.NO_PHONE_NUMBER_SUPPLIED:
130aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NUMBER_UNREACHABLE:
13192c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.OUTGOING_FAILURE:
13292c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.OUT_OF_NETWORK:
13392c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.OUT_OF_SERVICE:
13492c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.POWER_OFF:
135cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn            case android.telephony.DisconnectCause.LOW_BATTERY:
136cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn            case android.telephony.DisconnectCause.DIAL_LOW_BATTERY:
137aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.SERVER_ERROR:
13892c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.SERVER_UNREACHABLE:
139aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.TIMED_OUT:
140aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.UNOBTAINABLE_NUMBER:
141aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.VOICEMAIL_NUMBER_MISSING:
14225f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_USSD:
14325f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_SS:
14425f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL:
14507fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL_VIDEO:
14607fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_SS:
14707fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_USSD:
14807fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL:
14907fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO:
15092c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.ERROR_UNSPECIFIED:
151a449435441faf39559fce7719fee75c320c103feTyler Gunn            case android.telephony.DisconnectCause.MAXIMUM_NUMBER_OF_CALLS_REACHED:
15292a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn            case android.telephony.DisconnectCause.DATA_DISABLED:
15392a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn            case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
15402dfc68b6b5714ddab5f4d7bbfc984798fd67c04Brad Ebinger            case android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING:
1550ded16620513aff3e7e1c6f75c2b534514658fe0Johan Redestig            case android.telephony.DisconnectCause.IMEI_NOT_ACCEPTED:
1560380b3c26461a07b9b185efd9fa7b3d17f78efe2Tyler Gunn            case android.telephony.DisconnectCause.WIFI_LOST:
1572880ad7c1f17ff21e4517d857c1928fce1b5be28Brad Ebinger            case android.telephony.DisconnectCause.IMS_ACCESS_BLOCKED:
1585ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn            case android.telephony.DisconnectCause.IMS_SIP_ALTERNATE_EMERGENCY_CALL:
159aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.ERROR;
160aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
16192c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.DIALED_MMI:
162aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.EXITED_ECM:
16392c9a12485bddda1195f0a5b92f7e3cdcf690de9Andrew Lee            case android.telephony.DisconnectCause.MMI:
1646a2bfed2a70c68e8aea054f7eb31d102d0ec898fAndrew Lee            case android.telephony.DisconnectCause.IMS_MERGED_SUCCESSFULLY:
165aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.OTHER;
166aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
167aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NOT_VALID:
168aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NOT_DISCONNECTED:
169aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return DisconnectCause.UNKNOWN;
170aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
171269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn            case android.telephony.DisconnectCause.CALL_PULLED:
172269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn                return DisconnectCause.CALL_PULLED;
173269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn
174372d9b02d94cdf5e04420c1e7c5955edaf5fbb35Tyler Gunn            case android.telephony.DisconnectCause.ANSWERED_ELSEWHERE:
175372d9b02d94cdf5e04420c1e7c5955edaf5fbb35Tyler Gunn                return DisconnectCause.ANSWERED_ELSEWHERE;
176372d9b02d94cdf5e04420c1e7c5955edaf5fbb35Tyler Gunn
177aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            default:
178483feb58d223acc3ab589214bd4714c52c971491Etan Cohen                Log.w("DisconnectCauseUtil.toTelecomDisconnectCauseCode",
179483feb58d223acc3ab589214bd4714c52c971491Etan Cohen                        "Unrecognized Telephony DisconnectCause "
180483feb58d223acc3ab589214bd4714c52c971491Etan Cohen                        + telephonyDisconnectCause);
181483feb58d223acc3ab589214bd4714c52c971491Etan Cohen                return DisconnectCause.UNKNOWN;
182aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        }
183aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    }
184aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
185aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    /**
186aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     * Returns a label for to the disconnect cause to be shown to the user.
187aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     */
188aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    private static CharSequence toTelecomDisconnectCauseLabel(
1891d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            Context context, int telephonyDisconnectCause, int telephonyPerciseDisconnectCause) {
1901d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        CharSequence label;
1911d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        if (telephonyPerciseDisconnectCause != CallFailCause.NOT_VALID) {
1921d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            label = getLabelFromPreciseDisconnectCause(context, telephonyPerciseDisconnectCause,
1931d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                    telephonyDisconnectCause);
1941d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        } else {
1951d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            label = getLabelFromDisconnectCause(context, telephonyDisconnectCause);
1961d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        }
1971d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        return label;
1981d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    }
1991d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong
2001d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    /**
2011d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong     * Returns a label for to the generic disconnect cause to be shown to the user.
2021d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong     */
2031d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    private static CharSequence getLabelFromDisconnectCause(
204aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            Context context, int telephonyDisconnectCause) {
2051d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        if (context == null) {
206aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            return "";
207aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        }
208aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
209aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        Integer resourceId = null;
210aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        switch (telephonyDisconnectCause) {
211aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.BUSY:
212aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_userBusy;
213aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
214aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
215aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CONGESTION:
216aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_congestion;
217aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
218aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
219aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.TIMED_OUT:
220aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_timedOut;
221aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
222aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
223aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.SERVER_UNREACHABLE:
224aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_server_unreachable;
225aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
226aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
227aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NUMBER_UNREACHABLE:
228aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_number_unreachable;
229aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
230aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
231aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.INVALID_CREDENTIALS:
232aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_invalid_credentials;
233aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
234aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
235aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.SERVER_ERROR:
236aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_server_error;
237aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
238aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
239aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUT_OF_NETWORK:
240aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_out_of_network;
241aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
242aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
243aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.LOST_SIGNAL:
244aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CDMA_DROP:
245aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_noSignal;
246aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
247aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
248aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.LIMIT_EXCEEDED:
249aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_limitExceeded;
250aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
251aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
252aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.POWER_OFF:
253aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_powerOff;
254aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
255aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
256cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn            case android.telephony.DisconnectCause.LOW_BATTERY:
257cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                resourceId = R.string.callFailed_low_battery;
258cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                break;
259cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn
260cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn            case android.telephony.DisconnectCause.DIAL_LOW_BATTERY:
261cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                resourceId = R.string.dialFailed_low_battery;
262cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                break;
263cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn
264aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.ICC_ERROR:
265aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_simError;
266aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
267aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
268aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUT_OF_SERVICE:
269aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_outOfService;
270aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
271aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
272aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.INVALID_NUMBER:
273aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.UNOBTAINABLE_NUMBER:
274aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_unobtainable_number;
275aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
276aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
277269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn            case android.telephony.DisconnectCause.CALL_PULLED:
278269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn                resourceId = R.string.callEnded_pulled;
279f719bedc51f8b7337460cace1c776b0aaa31b055Tyler Gunn                break;
280269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn
281a449435441faf39559fce7719fee75c320c103feTyler Gunn            case android.telephony.DisconnectCause.MAXIMUM_NUMBER_OF_CALLS_REACHED:
282a449435441faf39559fce7719fee75c320c103feTyler Gunn                resourceId = R.string.callFailed_maximum_reached;
283f719bedc51f8b7337460cace1c776b0aaa31b055Tyler Gunn                break;
284a449435441faf39559fce7719fee75c320c103feTyler Gunn
28592a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn            case android.telephony.DisconnectCause.DATA_DISABLED:
28692a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                resourceId = R.string.callFailed_data_disabled;
28792a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                break;
28892a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn
28992a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn            case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
29092a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                resourceId = R.string.callFailed_data_limit_reached;
29192a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                break;
29292a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn
2935ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn            case android.telephony.DisconnectCause.IMS_SIP_ALTERNATE_EMERGENCY_CALL:
2945ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn                resourceId = R.string.incall_error_power_off;
2955ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn                break;
2965ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn
297aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            default:
298aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
299aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        }
300aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        return resourceId == null ? "" : context.getResources().getString(resourceId);
301aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    }
302aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
303aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    /**
3041d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong     * Returns a label for to the precise disconnect cause to be shown to the user.
3051d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong     */
3061d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    private static CharSequence getLabelFromPreciseDisconnectCause(
3071d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            Context context, int telephonyPreciseDisconnectCause, int telephonyDisconnectCause) {
3081d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        if (context == null) {
3091d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            return "";
3101d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        }
3111d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong
3121d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        Integer resourceId = null;
3131d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        switch (telephonyPreciseDisconnectCause) {
3141d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.UNOBTAINABLE_NUMBER:
3151d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_unassigned_number_txt;
3161d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3171d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NO_ROUTE_TO_DEST:
3181d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_no_route_to_destination_txt;
3191d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3201d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.CHANNEL_UNACCEPTABLE:
3211d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_channel_unacceptable_txt;
3221d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3231d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.OPERATOR_DETERMINED_BARRING:
3241d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_operator_determined_barring_txt;
3251d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3261d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NORMAL_CLEARING:
3271d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_normal_call_clearing_txt;
3281d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3291d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.USER_BUSY:
3301d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_user_busy_txt;
3311d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3321d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NO_USER_RESPONDING:
3331d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_no_user_responding_txt;
3341d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3351d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.USER_ALERTING_NO_ANSWER:
3361d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_user_alerting_txt;
3371d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3381d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.CALL_REJECTED:
3391d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_call_rejected_txt;
3401d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3411d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NUMBER_CHANGED:
3421d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_number_changed_txt;
3431d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3441d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.PRE_EMPTION:
3451d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_pre_emption_txt;
3461d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3471d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NON_SELECTED_USER_CLEARING:
3481d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_non_selected_user_clearing_txt;
3491d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3501d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.DESTINATION_OUT_OF_ORDER:
3511d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_destination_out_of_order_txt;
3521d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3531d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INVALID_NUMBER_FORMAT:
3541d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_invalid_number_format_txt;
3551d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3561d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.FACILITY_REJECTED:
3571d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_facility_rejected_txt;
3581d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3591d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.STATUS_ENQUIRY:
3601d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_response_to_STATUS_ENQUIRY_txt;
3611d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3621d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NORMAL_UNSPECIFIED:
3631d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_normal_unspecified_txt;
3641d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3651d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NO_CIRCUIT_AVAIL:
3661d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_no_circuit_available_txt;
3671d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3681d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.NETWORK_OUT_OF_ORDER:
3691d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_network_out_of_order_txt;
3701d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3711d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.TEMPORARY_FAILURE:
3721d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_temporary_failure_txt;
3731d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3741d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.SWITCHING_CONGESTION:
3751d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_switching_equipment_congestion_txt;
3761d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3771d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.ACCESS_INFORMATION_DISCARDED:
3781d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_access_information_discarded_txt;
3791d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3801d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.CHANNEL_NOT_AVAIL:
3811d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_requested_circuit_txt;
3821d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3831d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.RESOURCES_UNAVAILABLE_UNSPECIFIED:
3841d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_resources_unavailable_unspecified_txt;
3851d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3861d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.QOS_NOT_AVAIL:
3871d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_quality_of_service_unavailable_txt;
3881d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3891d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.REQUESTED_FACILITY_NOT_SUBSCRIBED:
3901d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_requested_facility_not_subscribed_txt;
3911d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3921d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INCOMING_CALL_BARRED_WITHIN_CUG:
3931d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_incoming_calls_barred_within_the_CUG_txt;
3941d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3951d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.BEARER_CAPABILITY_NOT_AUTHORISED:
3961d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_bearer_capability_not_authorized_txt;
3971d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
3981d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.BEARER_NOT_AVAIL:
3991d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_bearer_capability_not_presently_available_txt;
4001d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4011d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.SERVICE_OR_OPTION_NOT_AVAILABLE:
4021d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId =
4031d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        R.string.clh_callFailed_service_or_option_not_available_unspecified_txt;
4041d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4051d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.BEARER_SERVICE_NOT_IMPLEMENTED:
4061d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_bearer_service_not_implemented_txt;
4071d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4081d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.ACM_LIMIT_EXCEEDED:
4091d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt;
4101d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4111d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.REQUESTED_FACILITY_NOT_IMPLEMENTED:
4121d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_requested_facility_not_implemented_txt;
4131d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4141d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE:
4151d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string
4161d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        .clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt;
4171d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4181d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.SERVICE_OR_OPTION_NOT_IMPLEMENTED:
4191d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId =
4201d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        R.string.clh_callFailed_service_or_option_not_implemented_unspecified_txt;
4211d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4221d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INVALID_TRANSACTION_ID_VALUE:
4231d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_invalid_transaction_identifier_value_txt;
4241d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4251d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.USER_NOT_MEMBER_OF_CUG:
4261d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_user_not_member_of_CUG_txt;
4271d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4281d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INCOMPATIBLE_DESTINATION:
4291d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_incompatible_destination_txt;
4301d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4311d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INVALID_TRANSIT_NETWORK_SELECTION:
4321d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_invalid_transit_network_selection_txt;
4331d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4341d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.SEMANTICALLY_INCORRECT_MESSAGE:
4351d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_semantically_incorrect_message_txt;
4361d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4371d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INVALID_MANDATORY_INFORMATION:
4381d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_invalid_mandatory_information_txt;
4391d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4401d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.MESSAGE_TYPE_NON_EXISTENT:
4411d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId =
4421d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        R.string.clh_callFailed_message_type_non_existent_or_not_implemented_txt;
4431d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4441d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE:
4451d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string
4461d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        .clh_callFailed_message_type_not_compatible_with_protocol_state_txt;
4471d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4481d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.IE_NON_EXISTENT_OR_NOT_IMPLEMENTED:
4491d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string
4501d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        .clh_callFailed_information_element_non_existent_or_not_implemented_txt;
4511d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4521d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.CONDITIONAL_IE_ERROR:
4531d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_conditional_IE_error_txt;
4541d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4551d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE:
4561d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_message_not_compatible_with_protocol_state_txt;
4571d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4581d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.RECOVERY_ON_TIMER_EXPIRY:
4591d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_recovery_on_timer_expiry_txt;
4601d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4611d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.PROTOCOL_ERROR_UNSPECIFIED:
4621d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_protocol_Error_unspecified_txt;
4631d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4641d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            case CallFailCause.INTERWORKING_UNSPECIFIED:
4651d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                resourceId = R.string.clh_callFailed_interworking_unspecified_txt;
4661d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4671d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong            default:
4681d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                switch (telephonyDisconnectCause) {
4691d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                    case android.telephony.DisconnectCause.POWER_OFF:
4701d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        resourceId = R.string.clh_callFailed_powerOff_txt;
4711d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        break;
4721d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                    case android.telephony.DisconnectCause.ICC_ERROR:
4731d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        resourceId = R.string.clh_callFailed_simError_txt;
4741d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        break;
4751d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                    case android.telephony.DisconnectCause.OUT_OF_SERVICE:
4761d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        resourceId = R.string.clh_incall_error_out_of_service_txt;
4771d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        break;
4781d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                    default:
4791d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        resourceId = R.string.clh_card_title_call_ended_txt;
4801d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                        break;
4811d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                }
4821d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong                break;
4831d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        }
4841d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong        return context.getResources().getString(resourceId);
4851d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    }
4861d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong
4871d9d338e36d33eb39f1be46e48075e92a94abe7fWenting Xiong    /**
488aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     * Returns a description of the disconnect cause to be shown to the user.
489aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     */
490aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    private static CharSequence toTelecomDisconnectCauseDescription(
491aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            Context context, int telephonyDisconnectCause) {
492aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        if (context == null ) {
493aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            return "";
494aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        }
495aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
496aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        Integer resourceId = null;
497aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        switch (telephonyDisconnectCause) {
498aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CALL_BARRED:
499aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_cb_enabled;
500aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
501aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
5028fb4b652b3607f0063806c29138840102a5bba05Andrew Lee            case android.telephony.DisconnectCause.CDMA_ALREADY_ACTIVATED:
5038fb4b652b3607f0063806c29138840102a5bba05Andrew Lee                resourceId = R.string.callFailed_cdma_activation;
5048fb4b652b3607f0063806c29138840102a5bba05Andrew Lee                break;
5058fb4b652b3607f0063806c29138840102a5bba05Andrew Lee
506aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.FDN_BLOCKED:
507aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_fdn_only;
508aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
509aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
510aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CS_RESTRICTED:
511aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_dsac_restricted;
512aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
513aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
514aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CS_RESTRICTED_EMERGENCY:
515aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_dsac_restricted_emergency;
516aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
517aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
518aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CS_RESTRICTED_NORMAL:
519aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.callFailed_dsac_restricted_normal;
520aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
521aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
52225f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_USSD:
52325f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla                resourceId = R.string.callFailed_dialToUssd;
52425f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla                break;
52525f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla
52625f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_SS:
52725f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla                resourceId = R.string.callFailed_dialToSs;
52825f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla                break;
52925f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla
53025f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL:
53125f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla                resourceId = R.string.callFailed_dialToDial;
53225f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla                break;
53325f8056617836d5b0e1b2b7128691244e0331b02Rakesh Pallerla
53407fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL_VIDEO:
53507fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                resourceId = R.string.callFailed_dialToDialVideo;
53607fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                break;
53707fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti
53807fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_SS:
53907fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                resourceId = R.string.callFailed_dialVideoToSs;
54007fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                break;
54107fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti
54207fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_USSD:
54307fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                resourceId = R.string.callFailed_dialVideoToUssd;
54407fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                break;
54507fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti
54607fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL:
54707fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                resourceId = R.string.callFailed_dialVideoToDial;
54807fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                break;
54907fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti
55007fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO:
55107fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                resourceId = R.string.callFailed_dialVideoToDialVideo;
55207fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti                break;
55307fb05c7e661e77f3477426128057a2b32bc6f71Suresh Koleti
554aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUTGOING_FAILURE:
555aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // We couldn't successfully place the call; there was some
556aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // failure in the telephony layer.
557aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // TODO: Need UI spec for this failure case; for now just
558aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // show a generic error.
559aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.incall_error_call_failed;
560aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
561aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
562aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.POWER_OFF:
563a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                // Radio is explictly powered off because the device is in airplane mode.
564a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee
565a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                // TODO: Offer the option to turn the radio on, and automatically retry the call
566a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                // once network registration is complete.
567a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee
5680bb4d30ea2c50bf53acefc4514452c4945f297b6Tyler Gunn                if (ImsUtil.shouldPromoteWfc(context)) {
5690bb4d30ea2c50bf53acefc4514452c4945f297b6Tyler Gunn                    resourceId = R.string.incall_error_promote_wfc;
5700bb4d30ea2c50bf53acefc4514452c4945f297b6Tyler Gunn                } else if (ImsUtil.isWfcModeWifiOnly(context)) {
571a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                    resourceId = R.string.incall_error_wfc_only_no_wireless_network;
572a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                } else if (ImsUtil.isWfcEnabled(context)) {
573a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                    resourceId = R.string.incall_error_power_off_wfc;
574a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                } else {
575a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                    resourceId = R.string.incall_error_power_off;
576a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                }
577aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
578aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
579cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn            case android.telephony.DisconnectCause.LOW_BATTERY:
580cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                resourceId = R.string.callFailed_low_battery;
581cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                break;
582cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn
583cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn            case android.telephony.DisconnectCause.DIAL_LOW_BATTERY:
584cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                resourceId = R.string.dialFailed_low_battery;
585cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn                break;
586cf5c6eaa42f41fd60ce86a8c02c79b9ec1efa71aTyler Gunn
58792462cfafde010ce492420ab9c1e91e73d9cc57aTyler Gunn            case android.telephony.DisconnectCause.CDMA_NOT_EMERGENCY:
58892462cfafde010ce492420ab9c1e91e73d9cc57aTyler Gunn                // Only emergency calls are allowed when in emergency callback mode.
58992462cfafde010ce492420ab9c1e91e73d9cc57aTyler Gunn                resourceId = R.string.incall_error_ecm_emergency_only;
59092462cfafde010ce492420ab9c1e91e73d9cc57aTyler Gunn                break;
59192462cfafde010ce492420ab9c1e91e73d9cc57aTyler Gunn
592aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.EMERGENCY_ONLY:
593aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // Only emergency numbers are allowed, but we tried to dial
594aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // a non-emergency number.
595aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.incall_error_emergency_only;
596aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
597aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
598aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUT_OF_SERVICE:
599aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // No network connection.
6000bb4d30ea2c50bf53acefc4514452c4945f297b6Tyler Gunn                if (ImsUtil.shouldPromoteWfc(context)) {
6010bb4d30ea2c50bf53acefc4514452c4945f297b6Tyler Gunn                    resourceId = R.string.incall_error_promote_wfc;
6020bb4d30ea2c50bf53acefc4514452c4945f297b6Tyler Gunn                } else if (ImsUtil.isWfcModeWifiOnly(context)) {
603a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                    resourceId = R.string.incall_error_wfc_only_no_wireless_network;
604a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                } else if (ImsUtil.isWfcEnabled(context)) {
605a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                    resourceId = R.string.incall_error_out_of_service_wfc;
606a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                } else {
607a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                    resourceId = R.string.incall_error_out_of_service;
608a6bc312966b7d1c6b46e99f4c1be9b20188684abAndrew Lee                }
609aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
610aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
611aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NO_PHONE_NUMBER_SUPPLIED:
612aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // The supplied Intent didn't contain a valid phone number.
613aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // (This is rare and should only ever happen with broken
614aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // 3rd-party apps.) For now just show a generic error.
615aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.incall_error_no_phone_number_supplied;
616aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
617aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
618aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.VOICEMAIL_NUMBER_MISSING:
619aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // TODO: Need to bring up the "Missing Voicemail Number" dialog, which
620aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // will ultimately take us to the Call Settings.
621aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                resourceId = R.string.incall_error_missing_voicemail_number;
622aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
623aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
6242d6dc18f9cb17c4f35fdb594eb90003764bb9336Tyler Gunn            case android.telephony.DisconnectCause.VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED:
6252d6dc18f9cb17c4f35fdb594eb90003764bb9336Tyler Gunn                resourceId = R.string.callFailed_video_call_tty_enabled;
6262d6dc18f9cb17c4f35fdb594eb90003764bb9336Tyler Gunn                break;
6272d6dc18f9cb17c4f35fdb594eb90003764bb9336Tyler Gunn
628269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn            case android.telephony.DisconnectCause.CALL_PULLED:
629269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn                resourceId = R.string.callEnded_pulled;
630269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn                break;
631269142e46e65114db3a97f4960e0386ee5ce1a9cTyler Gunn
632a449435441faf39559fce7719fee75c320c103feTyler Gunn            case android.telephony.DisconnectCause.MAXIMUM_NUMBER_OF_CALLS_REACHED:
633a449435441faf39559fce7719fee75c320c103feTyler Gunn                resourceId = R.string.callFailed_maximum_reached;
634a449435441faf39559fce7719fee75c320c103feTyler Gunn
635aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUTGOING_CANCELED:
636aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // We don't want to show any dialog for the canceled case since the call was
637aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // either canceled by the user explicitly (end-call button pushed immediately)
638aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // or some other app canceled the call and immediately issued a new CALL to
639aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                // replace it.
64092a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                break;
64192a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn
64292a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn            case android.telephony.DisconnectCause.DATA_DISABLED:
64392a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                resourceId = R.string.callFailed_data_disabled;
64492a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                break;
64592a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn
64692a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn            case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
647656439f81b154d9133c5ba5e4524c5f44124b96dTyler Gunn                resourceId = R.string.callFailed_data_limit_reached_description;
64892a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn                break;
64902dfc68b6b5714ddab5f4d7bbfc984798fd67c04Brad Ebinger            case android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING:
65002dfc68b6b5714ddab5f4d7bbfc984798fd67c04Brad Ebinger                resourceId = com.android.internal.R.string.mmiErrorWhileRoaming;
65102dfc68b6b5714ddab5f4d7bbfc984798fd67c04Brad Ebinger                break;
65292a5905f53c2498b63220ba5d00b8804b46f054dTyler Gunn
6530ded16620513aff3e7e1c6f75c2b534514658fe0Johan Redestig            case android.telephony.DisconnectCause.IMEI_NOT_ACCEPTED:
6540ded16620513aff3e7e1c6f75c2b534514658fe0Johan Redestig                resourceId = R.string.callFailed_imei_not_accepted;
6550ded16620513aff3e7e1c6f75c2b534514658fe0Johan Redestig                break;
6560ded16620513aff3e7e1c6f75c2b534514658fe0Johan Redestig
6570380b3c26461a07b9b185efd9fa7b3d17f78efe2Tyler Gunn            case android.telephony.DisconnectCause.WIFI_LOST:
6580380b3c26461a07b9b185efd9fa7b3d17f78efe2Tyler Gunn                resourceId = R.string.callFailed_wifi_lost;
6590380b3c26461a07b9b185efd9fa7b3d17f78efe2Tyler Gunn                break;
6600380b3c26461a07b9b185efd9fa7b3d17f78efe2Tyler Gunn
6615ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn            case android.telephony.DisconnectCause.IMS_SIP_ALTERNATE_EMERGENCY_CALL:
6625ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn                resourceId = R.string.incall_error_power_off;
6635ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn                break;
6645ee70fe0c3b1cb997b0f5e134982f4565ac7772aTyler Gunn
665aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            default:
666aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                break;
667aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        }
668aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        return resourceId == null ? "" : context.getResources().getString(resourceId);
669aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    }
670aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
67123913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    /**
67223913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     * Maps the telephony {@link android.telephony.DisconnectCause} into a reason string which is
67323913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     * returned in the Telecom {@link DisconnectCause#getReason()}.
67423913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     *
67523913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     * @param context The current context.
67623913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     * @param telephonyDisconnectCause The {@link android.telephony.DisconnectCause} code.
67723913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     * @param reason A reason provided by the caller; only used if a more specific reason cannot
67823913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     *               be determined here.
67923913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     * @return The disconnect reason.
68023913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn     */
68123913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn    private static String toTelecomDisconnectReason(Context context, int telephonyDisconnectCause,
68223913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn            String reason) {
68323913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn
68423913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn        if (context == null) {
68523913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn            return "";
68623913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn        }
68723913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn
68823913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn        switch (telephonyDisconnectCause) {
68923913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn            case android.telephony.DisconnectCause.POWER_OFF:
69023913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                // Airplane mode (radio off)
69123913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                // intentional fall-through
69223913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn            case android.telephony.DisconnectCause.OUT_OF_SERVICE:
69323913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                // No network connection.
69423913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                if (ImsUtil.shouldPromoteWfc(context)) {
69523913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                    return android.telecom.DisconnectCause.REASON_WIFI_ON_BUT_WFC_OFF;
69623913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                }
69723913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn                break;
698549f236f824c50f9164760adb567305bb55ffaf4Brad Ebinger            case android.telephony.DisconnectCause.IMS_ACCESS_BLOCKED:
699549f236f824c50f9164760adb567305bb55ffaf4Brad Ebinger                return DisconnectCause.REASON_IMS_ACCESS_BLOCKED;
70023913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn        }
70123913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn
70223913d126cd473ceb21d2b94f0702ce53b2de8dcTyler Gunn        // If no specific code-mapping found, then fall back to using the reason.
703c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal        String causeAsString = android.telephony.DisconnectCause.toString(telephonyDisconnectCause);
704c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal        if (reason == null) {
705c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal            return causeAsString;
706c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal        } else {
707c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal            return reason + ", " + causeAsString;
708c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal        }
709c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal    }
710c3840b2f0ff26cae980256caf48c103a64a3b89eSailesh Nepal
711aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    /**
712aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     * Returns the tone to play for the disconnect cause, or UNKNOWN if none should be played.
713aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee     */
714aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    private static int toTelecomDisconnectCauseTone(int telephonyDisconnectCause) {
715aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        switch (telephonyDisconnectCause) {
716aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.BUSY:
717aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_SUP_BUSY;
718aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
719aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CONGESTION:
720aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_SUP_CONGESTION;
721aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
722aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CDMA_REORDER:
723aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_CDMA_REORDER;
724aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
725aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CDMA_INTERCEPT:
726aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_CDMA_ABBR_INTERCEPT;
727aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
728aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.CDMA_DROP:
729aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.OUT_OF_SERVICE:
730aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_CDMA_CALLDROP_LITE;
731aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
732aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.UNOBTAINABLE_NUMBER:
733aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_SUP_ERROR;
734aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
735aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.ERROR_UNSPECIFIED:
736aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.LOCAL:
737aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            case android.telephony.DisconnectCause.NORMAL:
738189e5d0724579e2ca510f7d5a9d105c4e62369bfzoey chen            case android.telephony.DisconnectCause.NORMAL_UNSPECIFIED:
7392d6dc18f9cb17c4f35fdb594eb90003764bb9336Tyler Gunn            case android.telephony.DisconnectCause.VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED:
740aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_PROP_PROMPT;
741aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee
7426a2bfed2a70c68e8aea054f7eb31d102d0ec898fAndrew Lee            case android.telephony.DisconnectCause.IMS_MERGED_SUCCESSFULLY:
7436a2bfed2a70c68e8aea054f7eb31d102d0ec898fAndrew Lee                // Do not play any tones if disconnected because of a successful merge.
744aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee            default:
745aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                return ToneGenerator.TONE_UNKNOWN;
746aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee        }
747aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee    }
748aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee}
749