1 /*
2  * Copyright (c) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ims;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 /**
23  * This class enables an application to get details on why a method call failed.
24  *
25  * @hide
26  */
27 public class ImsReasonInfo implements Parcelable {
28     /**
29      * Specific code of each types
30      */
31     public static final int CODE_UNSPECIFIED = 0;
32 
33     /**
34      * LOCAL
35      */
36     // IMS -> Telephony
37     // The passed argument is an invalid
38     public static final int CODE_LOCAL_ILLEGAL_ARGUMENT = 101;
39     // The operation is invoked in invalid call state
40     public static final int CODE_LOCAL_ILLEGAL_STATE = 102;
41     // IMS service internal error
42     public static final int CODE_LOCAL_INTERNAL_ERROR = 103;
43     // IMS service goes down (service connection is lost)
44     public static final int CODE_LOCAL_IMS_SERVICE_DOWN = 106;
45     // No pending incoming call exists
46     public static final int CODE_LOCAL_NO_PENDING_CALL = 107;
47 
48     // IMS -> Telephony
49     // Service unavailable; by power off
50     public static final int CODE_LOCAL_POWER_OFF = 111;
51     // Service unavailable; by low battery
52     public static final int CODE_LOCAL_LOW_BATTERY = 112;
53     // Service unavailable; by out of service (data service state)
54     public static final int CODE_LOCAL_NETWORK_NO_SERVICE = 121;
55     // Service unavailable; by no LTE coverage
56     // (VoLTE is not supported even though IMS is registered)
57     public static final int CODE_LOCAL_NETWORK_NO_LTE_COVERAGE = 122;
58     // Service unavailable; by located in roaming area
59     public static final int CODE_LOCAL_NETWORK_ROAMING = 123;
60     // Service unavailable; by IP changed
61     public static final int CODE_LOCAL_NETWORK_IP_CHANGED = 124;
62     // Service unavailable; other
63     public static final int CODE_LOCAL_SERVICE_UNAVAILABLE = 131;
64     // Service unavailable; IMS connection is lost (IMS is not registered)
65     public static final int CODE_LOCAL_NOT_REGISTERED = 132;
66 
67     // IMS <-> Telephony
68     // Max call exceeded
69     public static final int CODE_LOCAL_CALL_EXCEEDED = 141;
70     // IMS <- Telephony
71     // Call busy
72     public static final int CODE_LOCAL_CALL_BUSY = 142;
73     // Call decline
74     public static final int CODE_LOCAL_CALL_DECLINE = 143;
75     // IMS -> Telephony
76     // SRVCC is in progress
77     public static final int CODE_LOCAL_CALL_VCC_ON_PROGRESSING = 144;
78     // Resource reservation is failed (QoS precondition)
79     public static final int CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED = 145;
80     // Retry CS call; VoLTE service can't be provided by the network or remote end
81     // Resolve the extra code(EXTRA_CODE_CALL_RETRY_*) if the below code is set
82     public static final int CODE_LOCAL_CALL_CS_RETRY_REQUIRED = 146;
83     // Retry VoLTE call; VoLTE service can't be provided by the network temporarily
84     public static final int CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED = 147;
85     // IMS call is already terminated (in TERMINATED state)
86     public static final int CODE_LOCAL_CALL_TERMINATED = 148;
87     // Handover not feasible
88     public static final int CODE_LOCAL_HO_NOT_FEASIBLE = 149;
89 
90     /**
91      * TIMEOUT (IMS -> Telephony)
92      */
93     // 1xx waiting timer is expired after sending INVITE request (MO only)
94     public static final int CODE_TIMEOUT_1XX_WAITING = 201;
95     // User no answer during call setup operation (MO/MT)
96     // MO : 200 OK to INVITE request is not received,
97     // MT : No action from user after alerting the call
98     public static final int CODE_TIMEOUT_NO_ANSWER = 202;
99     // User no answer during call update operation (MO/MT)
100     // MO : 200 OK to re-INVITE request is not received,
101     // MT : No action from user after alerting the call
102     public static final int CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE = 203;
103 
104     //Call failures for FDN
105     public static final int CODE_FDN_BLOCKED = 241;
106 
107     /**
108      * STATUSCODE (SIP response code) (IMS -> Telephony)
109      */
110     // 3xx responses
111     // SIP request is redirected
112     public static final int CODE_SIP_REDIRECTED = 321;
113     // 4xx responses
114     // 400 : Bad Request
115     public static final int CODE_SIP_BAD_REQUEST = 331;
116     // 403 : Forbidden
117     public static final int CODE_SIP_FORBIDDEN = 332;
118     // 404 : Not Found
119     public static final int CODE_SIP_NOT_FOUND = 333;
120     // 415 : Unsupported Media Type
121     // 416 : Unsupported URI Scheme
122     // 420 : Bad Extension
123     public static final int CODE_SIP_NOT_SUPPORTED = 334;
124     // 408 : Request Timeout
125     public static final int CODE_SIP_REQUEST_TIMEOUT = 335;
126     // 480 : Temporarily Unavailable
127     public static final int CODE_SIP_TEMPRARILY_UNAVAILABLE = 336;
128     // 484 : Address Incomplete
129     public static final int CODE_SIP_BAD_ADDRESS = 337;
130     // 486 : Busy Here
131     // 600 : Busy Everywhere
132     public static final int CODE_SIP_BUSY = 338;
133     // 487 : Request Terminated
134     public static final int CODE_SIP_REQUEST_CANCELLED = 339;
135     // 406 : Not Acceptable
136     // 488 : Not Acceptable Here
137     // 606 : Not Acceptable
138     public static final int CODE_SIP_NOT_ACCEPTABLE = 340;
139     // 410 : Gone
140     // 604 : Does Not Exist Anywhere
141     public static final int CODE_SIP_NOT_REACHABLE = 341;
142     // Others
143     public static final int CODE_SIP_CLIENT_ERROR = 342;
144     // 5xx responses
145     // 501 : Server Internal Error
146     public static final int CODE_SIP_SERVER_INTERNAL_ERROR = 351;
147     // 503 : Service Unavailable
148     public static final int CODE_SIP_SERVICE_UNAVAILABLE = 352;
149     // 504 : Server Time-out
150     public static final int CODE_SIP_SERVER_TIMEOUT = 353;
151     // Others
152     public static final int CODE_SIP_SERVER_ERROR = 354;
153     // 6xx responses
154     // 603 : Decline
155     public static final int CODE_SIP_USER_REJECTED = 361;
156     // Others
157     public static final int CODE_SIP_GLOBAL_ERROR = 362;
158     // Emergency failure
159     public static final int CODE_EMERGENCY_TEMP_FAILURE = 363;
160     public static final int CODE_EMERGENCY_PERM_FAILURE = 364;
161 
162     /**
163      * MEDIA (IMS -> Telephony)
164      */
165     // Media resource initialization failed
166     public static final int CODE_MEDIA_INIT_FAILED = 401;
167     // RTP timeout (no audio / video traffic in the session)
168     public static final int CODE_MEDIA_NO_DATA = 402;
169     // Media is not supported; so dropped the call
170     public static final int CODE_MEDIA_NOT_ACCEPTABLE = 403;
171     // Unknown media related errors
172     public static final int CODE_MEDIA_UNSPECIFIED = 404;
173 
174     /**
175      * USER
176      */
177     // Telephony -> IMS
178     // User triggers the call end
179     public static final int CODE_USER_TERMINATED = 501;
180     // No action while an incoming call is ringing
181     public static final int CODE_USER_NOANSWER = 502;
182     // User ignores an incoming call
183     public static final int CODE_USER_IGNORE = 503;
184     // User declines an incoming call
185     public static final int CODE_USER_DECLINE = 504;
186     // Device declines/ends a call due to low battery
187     public static final int CODE_LOW_BATTERY = 505;
188     // Device declines call due to blacklisted call ID
189     public static final int CODE_BLACKLISTED_CALL_ID = 506;
190     // IMS -> Telephony
191     // The call is terminated by the network or remote user
192     public static final int CODE_USER_TERMINATED_BY_REMOTE = 510;
193 
194     /**
195      * Extra codes for the specific code value
196      * This value can be referred when the code is CODE_LOCAL_CALL_CS_RETRY_REQUIRED.
197      */
198     // Try to connect CS call; normal
199     public static final int EXTRA_CODE_CALL_RETRY_NORMAL = 1;
200     // Try to connect CS call without the notification to user
201     public static final int EXTRA_CODE_CALL_RETRY_SILENT_REDIAL = 2;
202     // Try to connect CS call by the settings of the menu
203     public static final int EXTRA_CODE_CALL_RETRY_BY_SETTINGS = 3;
204 
205     /**
206      * UT
207      */
208     public static final int CODE_UT_NOT_SUPPORTED = 801;
209     public static final int CODE_UT_SERVICE_UNAVAILABLE = 802;
210     public static final int CODE_UT_OPERATION_NOT_ALLOWED = 803;
211     public static final int CODE_UT_NETWORK_ERROR = 804;
212     public static final int CODE_UT_CB_PASSWORD_MISMATCH = 821;
213 
214     /**
215      * ECBM
216      */
217     public static final int CODE_ECBM_NOT_SUPPORTED = 901;
218 
219     /**
220      * Fail code used to indicate that Multi-endpoint is not supported by the Ims framework.
221      */
222     public static final int CODE_MULTIENDPOINT_NOT_SUPPORTED = 902;
223 
224     /**
225      * Ims Registration error code
226      */
227     public static final int CODE_REGISTRATION_ERROR = 1000;
228 
229     /**
230      * CALL DROP error codes (Call could drop because of many reasons like Network not available,
231      *  handover, failed, etc)
232      */
233 
234     /**
235      * CALL DROP error code for the case when a device is ePDG capable and when the user is on an
236      * active wifi call and at the edge of coverage and there is no qualified LTE network available
237      * to handover the call to. We get a handover NOT_TRIGERRED message from the modem. This error
238      * code is received as part of the handover message.
239      */
240     public static final int CODE_CALL_DROP_IWLAN_TO_LTE_UNAVAILABLE = 1100;
241 
242     /**
243      * MT call has ended due to a release from the network
244      * because the call was answered elsewhere
245      */
246     public static final int CODE_ANSWERED_ELSEWHERE = 1014;
247 
248     /**
249      * For MultiEndpoint - Call Pull request has failed
250      */
251     public static final int CODE_CALL_PULL_OUT_OF_SYNC = 1015;
252 
253     /**
254      * For MultiEndpoint - Call has been pulled from primary to secondary
255      */
256     public static final int CODE_CALL_END_CAUSE_CALL_PULL = 1016;
257 
258     /**
259      * Supplementary services (HOLD/RESUME) failure error codes.
260      * Values for Supplemetary services failure - Failed, Cancelled and Re-Invite collision.
261      */
262     public static final int CODE_SUPP_SVC_FAILED = 1201;
263     public static final int CODE_SUPP_SVC_CANCELLED = 1202;
264     public static final int CODE_SUPP_SVC_REINVITE_COLLISION = 1203;
265 
266     /**
267      * DPD Procedure received no response or send failed
268      */
269     public static final int CODE_IWLAN_DPD_FAILURE = 1300;
270 
271     /**
272      * Establishment of the ePDG Tunnel Failed
273      */
274     public static final int CODE_EPDG_TUNNEL_ESTABLISH_FAILURE = 1400;
275 
276     /**
277      * Re-keying of the ePDG Tunnel Failed; may not always result in teardown
278      */
279     public static final int CODE_EPDG_TUNNEL_REKEY_FAILURE = 1401;
280 
281     /**
282      * Connection to the packet gateway is lost
283      */
284     public static final int CODE_EPDG_TUNNEL_LOST_CONNECTION = 1402;
285 
286     /**
287      * Network string error messages.
288      * mExtraMessage may have these values.
289      */
290     public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED
291             = "Forbidden. Not Authorized for Service";
292 
293 
294     // For main reason code
295     public int mCode;
296     // For the extra code value; it depends on the code value.
297     public int mExtraCode;
298     // For the additional message of the reason info.
299     public String mExtraMessage;
ImsReasonInfo()300     public ImsReasonInfo() {
301         mCode = CODE_UNSPECIFIED;
302         mExtraCode = CODE_UNSPECIFIED;
303         mExtraMessage = null;
304     }
305 
ImsReasonInfo(Parcel in)306     public ImsReasonInfo(Parcel in) {
307         readFromParcel(in);
308     }
309 
ImsReasonInfo(int code, int extraCode)310     public ImsReasonInfo(int code, int extraCode) {
311         mCode = code;
312         mExtraCode = extraCode;
313         mExtraMessage = null;
314     }
315 
ImsReasonInfo(int code, int extraCode, String extraMessage)316     public ImsReasonInfo(int code, int extraCode, String extraMessage) {
317         mCode = code;
318         mExtraCode = extraCode;
319         mExtraMessage = extraMessage;
320     }
321 
322     /**
323      *
324      */
getCode()325     public int getCode() {
326         return mCode;
327     }
328 
329     /**
330      *
331      */
getExtraCode()332     public int getExtraCode() {
333         return mExtraCode;
334     }
335 
336     /**
337      *
338      */
getExtraMessage()339     public String getExtraMessage() {
340         return mExtraMessage;
341     }
342 
343     /**
344      * Returns the string format of {@link ImsReasonInfo}
345      *
346      * @return the string format of {@link ImsReasonInfo}
347      */
toString()348     public String toString() {
349         return "ImsReasonInfo :: {" + mCode + ", " + mExtraCode + ", " + mExtraMessage + "}";
350     }
351 
352     @Override
describeContents()353     public int describeContents() {
354         return 0;
355     }
356 
357     @Override
writeToParcel(Parcel out, int flags)358     public void writeToParcel(Parcel out, int flags) {
359         out.writeInt(mCode);
360         out.writeInt(mExtraCode);
361         out.writeString(mExtraMessage);
362     }
363 
readFromParcel(Parcel in)364     private void readFromParcel(Parcel in) {
365         mCode = in.readInt();
366         mExtraCode = in.readInt();
367         mExtraMessage = in.readString();
368     }
369 
370     public static final Creator<ImsReasonInfo> CREATOR = new Creator<ImsReasonInfo>() {
371         @Override
372         public ImsReasonInfo createFromParcel(Parcel in) {
373             return new ImsReasonInfo(in);
374         }
375 
376         @Override
377         public ImsReasonInfo[] newArray(int size) {
378             return new ImsReasonInfo[size];
379         }
380     };
381 }
382