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     /**
30      * Reason types, defines the error category.
31      *    UNSPECIFIED - unknown error reason
32      *    LOCAL - indicates the local/device error reason
33      *    LOCAL_TIMEOUT - indicates the local error reason when a specific timer is expired
34      *    STATUSCODE - indicates the interworking error reason by SIP status code received
35      *        from the network
36      *    MEDIA - indicates the media error reason (local resource, SDP parameter, etc.)
37      *    USER - indicates the error reason by the local or remote user
38      *    UT - indicates the error reason for the supplementary service configuration
39      */
40     public static final int TYPE_UNSPECIFIED = 0;
41     public static final int TYPE_LOCAL = 1;
42     public static final int TYPE_TIMEOUT = 2;
43     public static final int TYPE_STATUSCODE = 3;
44     public static final int TYPE_MEDIA = 4;
45     public static final int TYPE_USER = 5;
46     public static final int TYPE_UT = 8;
47 
48     /**
49      * Specific code of each types
50      */
51     public static final int CODE_UNSPECIFIED = 0;
52 
53     /**
54      * LOCAL
55      */
56     // IMS -> Telephony
57     // The passed argument is an invalid
58     public static final int CODE_LOCAL_ILLEGAL_ARGUMENT = 101;
59     // The operation is invoked in invalid call state
60     public static final int CODE_LOCAL_ILLEGAL_STATE = 102;
61     // IMS service internal error
62     public static final int CODE_LOCAL_INTERNAL_ERROR = 103;
63     // IMS service goes down (service connection is lost)
64     public static final int CODE_LOCAL_IMS_SERVICE_DOWN = 106;
65     // No pending incoming call exists
66     public static final int CODE_LOCAL_NO_PENDING_CALL = 107;
67 
68     // IMS -> Telephony
69     // Service unavailable; by power off
70     public static final int CODE_LOCAL_POWER_OFF = 111;
71     // Service unavailable; by low battery
72     public static final int CODE_LOCAL_LOW_BATTERY = 112;
73     // Service unavailable; by out of service (data service state)
74     public static final int CODE_LOCAL_NETWORK_NO_SERVICE = 121;
75     // Service unavailable; by no LTE coverage
76     // (VoLTE is not supported even though IMS is registered)
77     public static final int CODE_LOCAL_NETWORK_NO_LTE_COVERAGE = 122;
78     // Service unavailable; by located in roaming area
79     public static final int CODE_LOCAL_NETWORK_ROAMING = 123;
80     // Service unavailable; by IP changed
81     public static final int CODE_LOCAL_NETWORK_IP_CHANGED = 124;
82     // Service unavailable; other
83     public static final int CODE_LOCAL_SERVICE_UNAVAILABLE = 131;
84     // Service unavailable; IMS connection is lost (IMS is not registered)
85     public static final int CODE_LOCAL_NOT_REGISTERED = 132;
86 
87     // IMS <-> Telephony
88     // Max call exceeded
89     public static final int CODE_LOCAL_CALL_EXCEEDED = 141;
90     // IMS <- Telephony
91     // Call busy
92     public static final int CODE_LOCAL_CALL_BUSY = 142;
93     // Call decline
94     public static final int CODE_LOCAL_CALL_DECLINE = 143;
95     // IMS -> Telephony
96     // SRVCC is in progress
97     public static final int CODE_LOCAL_CALL_VCC_ON_PROGRESSING = 144;
98     // Resource reservation is failed (QoS precondition)
99     public static final int CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED = 145;
100     // Retry CS call; VoLTE service can't be provided by the network or remote end
101     // Resolve the extra code(EXTRA_CODE_CALL_RETRY_*) if the below code is set
102     public static final int CODE_LOCAL_CALL_CS_RETRY_REQUIRED = 146;
103     // Retry VoLTE call; VoLTE service can't be provided by the network temporarily
104     public static final int CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED = 147;
105     // IMS call is already terminated (in TERMINATED state)
106     public static final int CODE_LOCAL_CALL_TERMINATED = 148;
107 
108     /**
109      * TIMEOUT (IMS -> Telephony)
110      */
111     // 1xx waiting timer is expired after sending INVITE request (MO only)
112     public static final int CODE_TIMEOUT_1XX_WAITING = 201;
113     // User no answer during call setup operation (MO/MT)
114     // MO : 200 OK to INVITE request is not received,
115     // MT : No action from user after alerting the call
116     public static final int CODE_TIMEOUT_NO_ANSWER = 202;
117     // User no answer during call update operation (MO/MT)
118     // MO : 200 OK to re-INVITE request is not received,
119     // MT : No action from user after alerting the call
120     public static final int CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE = 203;
121 
122     /**
123      * STATUSCODE (SIP response code) (IMS -> Telephony)
124      */
125     // 3xx responses
126     // SIP request is redirected
127     public static final int CODE_SIP_REDIRECTED = 321;
128     // 4xx responses
129     // 400 : Bad Request
130     public static final int CODE_SIP_BAD_REQUEST = 331;
131     // 403 : Forbidden
132     public static final int CODE_SIP_FORBIDDEN = 332;
133     // 404 : Not Found
134     public static final int CODE_SIP_NOT_FOUND = 333;
135     // 415 : Unsupported Media Type
136     // 416 : Unsupported URI Scheme
137     // 420 : Bad Extension
138     public static final int CODE_SIP_NOT_SUPPORTED = 334;
139     // 408 : Request Timeout
140     public static final int CODE_SIP_REQUEST_TIMEOUT = 335;
141     // 480 : Temporarily Unavailable
142     public static final int CODE_SIP_TEMPRARILY_UNAVAILABLE = 336;
143     // 484 : Address Incomplete
144     public static final int CODE_SIP_BAD_ADDRESS = 337;
145     // 486 : Busy Here
146     // 600 : Busy Everywhere
147     public static final int CODE_SIP_BUSY = 338;
148     // 487 : Request Terminated
149     public static final int CODE_SIP_REQUEST_CANCELLED = 339;
150     // 406 : Not Acceptable
151     // 488 : Not Acceptable Here
152     // 606 : Not Acceptable
153     public static final int CODE_SIP_NOT_ACCEPTABLE = 340;
154     // 410 : Gone
155     // 604 : Does Not Exist Anywhere
156     public static final int CODE_SIP_NOT_REACHABLE = 341;
157     // Others
158     public static final int CODE_SIP_CLIENT_ERROR = 342;
159     // 5xx responses
160     // 501 : Server Internal Error
161     public static final int CODE_SIP_SERVER_INTERNAL_ERROR = 351;
162     // 503 : Service Unavailable
163     public static final int CODE_SIP_SERVICE_UNAVAILABLE = 352;
164     // 504 : Server Time-out
165     public static final int CODE_SIP_SERVER_TIMEOUT = 353;
166     // Others
167     public static final int CODE_SIP_SERVER_ERROR = 354;
168     // 6xx responses
169     // 603 : Decline
170     public static final int CODE_SIP_USER_REJECTED = 361;
171     // Others
172     public static final int CODE_SIP_GLOBAL_ERROR = 362;
173 
174     /**
175      * MEDIA (IMS -> Telephony)
176      */
177     // Media resource initialization failed
178     public static final int CODE_MEDIA_INIT_FAILED = 401;
179     // RTP timeout (no audio / video traffic in the session)
180     public static final int CODE_MEDIA_NO_DATA = 402;
181     // Media is not supported; so dropped the call
182     public static final int CODE_MEDIA_NOT_ACCEPTABLE = 403;
183     // Unknown media related errors
184     public static final int CODE_MEDIA_UNSPECIFIED = 404;
185 
186     /**
187      * USER
188      */
189     // Telephony -> IMS
190     // User triggers the call end
191     public static final int CODE_USER_TERMINATED = 501;
192     // No action while an incoming call is ringing
193     public static final int CODE_USER_NOANSWER = 502;
194     // User ignores an incoming call
195     public static final int CODE_USER_IGNORE = 503;
196     // User declines an incoming call
197     public static final int CODE_USER_DECLINE = 504;
198     // Device declines/ends a call due to low battery
199     public static final int CODE_LOW_BATTERY = 505;
200     // Device declines call due to blacklisted call ID
201     public static final int CODE_BLACKLISTED_CALL_ID = 506;
202     // IMS -> Telephony
203     // The call is terminated by the network or remote user
204     public static final int CODE_USER_TERMINATED_BY_REMOTE = 510;
205 
206     /**
207      * Extra codes for the specific code value
208      * This value can be referred when the code is CODE_LOCAL_CALL_CS_RETRY_REQUIRED.
209      */
210     // Try to connect CS call; normal
211     public static final int EXTRA_CODE_CALL_RETRY_NORMAL = 1;
212     // Try to connect CS call without the notification to user
213     public static final int EXTRA_CODE_CALL_RETRY_SILENT_REDIAL = 2;
214     // Try to connect CS call by the settings of the menu
215     public static final int EXTRA_CODE_CALL_RETRY_BY_SETTINGS = 3;
216 
217     /**
218      * UT
219      */
220     public static final int CODE_UT_NOT_SUPPORTED = 801;
221     public static final int CODE_UT_SERVICE_UNAVAILABLE = 802;
222     public static final int CODE_UT_OPERATION_NOT_ALLOWED = 803;
223     public static final int CODE_UT_NETWORK_ERROR = 804;
224     public static final int CODE_UT_CB_PASSWORD_MISMATCH = 821;
225 
226     /**
227      * ECBM
228      */
229     public static final int CODE_ECBM_NOT_SUPPORTED = 901;
230 
231     /**
232      * Network string error messages.
233      * mExtraMessage may have these values.
234      */
235     public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED
236             = "Forbidden. Not Authorized for Service";
237 
238     // For reason type
239     public int mReasonType;
240     // For main reason code
241     public int mCode;
242     // For the extra code value; it depends on the code value.
243     public int mExtraCode;
244     // For the additional message of the reason info.
245     public String mExtraMessage;
246 
ImsReasonInfo()247     public ImsReasonInfo() {
248         mReasonType = TYPE_UNSPECIFIED;
249         mCode = CODE_UNSPECIFIED;
250         mExtraCode = CODE_UNSPECIFIED;
251         mExtraMessage = null;
252     }
253 
ImsReasonInfo(Parcel in)254     public ImsReasonInfo(Parcel in) {
255         readFromParcel(in);
256     }
257 
ImsReasonInfo(int code, int extraCode)258     public ImsReasonInfo(int code, int extraCode) {
259         mReasonType = (int) (code / 100);
260         mCode = code;
261         mExtraCode = extraCode;
262         mExtraMessage = null;
263     }
264 
ImsReasonInfo(int code, int extraCode, String extraMessage)265     public ImsReasonInfo(int code, int extraCode, String extraMessage) {
266         mReasonType = (int) (code / 100);
267         mCode = code;
268         mExtraCode = extraCode;
269         mExtraMessage = extraMessage;
270     }
271 
272     /**
273      *
274      */
getCode()275     public int getCode() {
276         return mCode;
277     }
278 
279     /**
280      *
281      */
getExtraCode()282     public int getExtraCode() {
283         return mExtraCode;
284     }
285 
286     /**
287      *
288      */
getExtraMessage()289     public String getExtraMessage() {
290         return mExtraMessage;
291     }
292 
293     /**
294      *
295      */
getReasonType()296     public int getReasonType() {
297         return mReasonType;
298     }
299 
300     /**
301      * Returns the string format of {@link ImsReasonInfo}
302      *
303      * @return the string format of {@link ImsReasonInfo}
304      */
toString()305     public String toString() {
306         return "ImsReasonInfo :: {" + mReasonType + ", "
307                 + mCode + ", " + mExtraCode + ", " + mExtraMessage + "}";
308     }
309 
310     @Override
describeContents()311     public int describeContents() {
312         return 0;
313     }
314 
315     @Override
writeToParcel(Parcel out, int flags)316     public void writeToParcel(Parcel out, int flags) {
317         out.writeInt(mReasonType);
318         out.writeInt(mCode);
319         out.writeInt(mExtraCode);
320         out.writeString(mExtraMessage);
321     }
322 
readFromParcel(Parcel in)323     private void readFromParcel(Parcel in) {
324         mReasonType = in.readInt();
325         mCode = in.readInt();
326         mExtraCode = in.readInt();
327         mExtraMessage = in.readString();
328     }
329 
330     public static final Creator<ImsReasonInfo> CREATOR = new Creator<ImsReasonInfo>() {
331         @Override
332         public ImsReasonInfo createFromParcel(Parcel in) {
333             return new ImsReasonInfo(in);
334         }
335 
336         @Override
337         public ImsReasonInfo[] newArray(int size) {
338             return new ImsReasonInfo[size];
339         }
340     };
341 }
342