• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 package android.telephony.ims;
17 
18 import android.annotation.IntDef;
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SystemApi;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 
25 import com.android.telephony.Rlog;
26 
27 import java.lang.annotation.Retention;
28 import java.lang.annotation.RetentionPolicy;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.List;
32 
33 /**
34  * Provides STK Call Control Supplementary Service information.
35  *
36  * {@hide}
37  */
38 @SystemApi
39 public final class ImsSsData implements Parcelable {
40 
41     private static final String TAG = ImsSsData.class.getCanonicalName();
42 
43     // Supplementary Service Type
44     // Call Forwarding
45     public static final int SS_CFU = 0;
46     public static final int SS_CF_BUSY = 1;
47     public static final int SS_CF_NO_REPLY = 2;
48     public static final int SS_CF_NOT_REACHABLE = 3;
49     public static final int SS_CF_ALL = 4;
50     public static final int SS_CF_ALL_CONDITIONAL = 5;
51     public static final int SS_CFUT = 6;
52     // Called Line Presentation
53     public static final int SS_CLIP = 7;
54     public static final int SS_CLIR = 8;
55     public static final int SS_COLP = 9;
56     public static final int SS_COLR = 10;
57     // Calling Name Presentation
58     public static final int SS_CNAP = 11;
59     // Call Waiting
60     public static final int SS_WAIT = 12;
61     // Call Barring
62     public static final int SS_BAOC = 13;
63     public static final int SS_BAOIC = 14;
64     public static final int SS_BAOIC_EXC_HOME = 15;
65     public static final int SS_BAIC = 16;
66     public static final int SS_BAIC_ROAMING = 17;
67     public static final int SS_ALL_BARRING = 18;
68     public static final int SS_OUTGOING_BARRING = 19;
69     public static final int SS_INCOMING_BARRING = 20;
70     public static final int SS_INCOMING_BARRING_DN = 21;
71     public static final int SS_INCOMING_BARRING_ANONYMOUS = 22;
72 
73 
74     /**@hide*/
75     @IntDef(prefix = {"SS_"}, value = {
76             SS_ACTIVATION,
77             SS_DEACTIVATION,
78             SS_INTERROGATION,
79             SS_REGISTRATION,
80             SS_ERASURE})
81     @Retention(RetentionPolicy.SOURCE)
82     public @interface RequestType{}
83 
84     //Supplementary Service Request Types
85     public static final int SS_ACTIVATION = 0;
86     public static final int SS_DEACTIVATION = 1;
87     public static final int SS_INTERROGATION = 2;
88     public static final int SS_REGISTRATION = 3;
89     public static final int SS_ERASURE = 4;
90 
91     /**@hide*/
92     @IntDef(prefix = {"SS_"}, value = {
93             SS_ALL_TELE_AND_BEARER_SERVICES,
94             SS_ALL_TELESEVICES,
95             SS_TELEPHONY,
96             SS_ALL_DATA_TELESERVICES,
97             SS_SMS_SERVICES,
98             SS_ALL_TELESERVICES_EXCEPT_SMS})
99     @Retention(RetentionPolicy.SOURCE)
100     public @interface TeleserviceType{}
101 
102     // Supplementary Service Teleservice Type
103     public static final int SS_ALL_TELE_AND_BEARER_SERVICES = 0;
104     public static final int SS_ALL_TELESEVICES = 1;
105     public static final int SS_TELEPHONY = 2;
106     public static final int SS_ALL_DATA_TELESERVICES = 3;
107     public static final int SS_SMS_SERVICES = 4;
108     public static final int SS_ALL_TELESERVICES_EXCEPT_SMS = 5;
109 
110     /**
111      * No call forwarding service class defined.
112      *
113      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
114      */
115     public static final int SERVICE_CLASS_NONE = 0;
116 
117     /**
118      * Service class flag for voice telephony.
119      *
120      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
121      */
122     public static final int SERVICE_CLASS_VOICE = 1;
123 
124     /**
125      * Service class flag for all data bearers (including
126      * {@link #SERVICE_CLASS_DATA_CIRCUIT_SYNC,
127      * {@link #SERVICE_CLASS_DATA_CIRCUIT_ASYNC}, {@link #SERVICE_CLASS_PACKET_ACCESS},
128      * {@link #SERVICE_CLASS_PAD}}) if supported by the carrier.
129      *
130      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
131      */
132     public static final int SERVICE_CLASS_DATA = (1 << 1);
133     /**
134      * Service class flag for fax services.
135      *
136      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
137      */
138     public static final int SERVICE_CLASS_FAX = (1 << 2);
139     /**
140      * Service class flag for SMS services.
141      *
142      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
143      */
144     public static final int SERVICE_CLASS_SMS = (1 << 3);
145     /**
146      * Service class flag for the synchronous bearer service.
147      *
148      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
149      */
150     public static final int SERVICE_CLASS_DATA_CIRCUIT_SYNC = (1 << 4);
151 
152     /**
153      * Service class flag for the asynchronous bearer service.
154      *
155      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
156      */
157     public static final int SERVICE_CLASS_DATA_CIRCUIT_ASYNC = (1 << 5);
158 
159     /**
160      * Service class flag for the packet access bearer service.
161      *
162      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
163      */
164     public static final int SERVICE_CLASS_DATA_PACKET_ACCESS = (1 << 6);
165 
166     /**
167      * Service class flag for the Packet Assembly/Disassembly bearer service.
168      *
169      * See TS 27.007 7.11 (+CCFC) and 7.4 (CLCK)
170      */
171     public static final int SERVICE_CLASS_DATA_PAD = (1 << 7);
172 
173     /**@hide*/
174     @IntDef(flag = true, prefix = {"SERVICE_CLASS_"}, value = {
175             SERVICE_CLASS_NONE,
176             SERVICE_CLASS_VOICE,
177             SERVICE_CLASS_DATA,
178             SERVICE_CLASS_FAX,
179             SERVICE_CLASS_SMS,
180             SERVICE_CLASS_DATA_CIRCUIT_SYNC,
181             SERVICE_CLASS_DATA_CIRCUIT_ASYNC,
182             SERVICE_CLASS_DATA_PACKET_ACCESS,
183             SERVICE_CLASS_DATA_PAD})
184     @Retention(RetentionPolicy.SOURCE)
185     public @interface ServiceClassFlags{}
186 
187     /**
188      * Result code used if the operation was successful. See {@link #getResult()}.
189      */
190     public static final int RESULT_SUCCESS = 0;
191 
192     /** @hide */
193     @IntDef(prefix = { "SS_" }, value = {
194             SS_CFU,
195             SS_CF_BUSY,
196             SS_CF_NO_REPLY,
197             SS_CF_NOT_REACHABLE,
198             SS_CF_ALL,
199             SS_CF_ALL_CONDITIONAL,
200             SS_CFUT,
201             SS_CLIP,
202             SS_CLIR,
203             SS_COLP,
204             SS_COLR,
205             SS_CNAP,
206             SS_WAIT,
207             SS_BAOC,
208             SS_BAOIC,
209             SS_BAOIC_EXC_HOME,
210             SS_BAIC,
211             SS_BAIC_ROAMING,
212             SS_ALL_BARRING,
213             SS_OUTGOING_BARRING,
214             SS_INCOMING_BARRING,
215             SS_INCOMING_BARRING_DN,
216             SS_INCOMING_BARRING_ANONYMOUS
217     })
218     @Retention(RetentionPolicy.SOURCE)
219     public @interface ServiceType{}
220 
221     /**
222      * The Service type of this Supplementary service.
223      * @hide
224      */
225     public final @ServiceType int serviceType;
226 
227     /**
228      * Supplementary Service request Type:
229      *     {@link #SS_ACTIVATION),
230      *     {@link #SS_DEACTIVATION},
231      *     {@link #SS_INTERROGATION},
232      *     {@link #SS_REGISTRATION},
233      *     {@link #SS_ERASURE}
234      * @hide
235      */
236     public final @RequestType int requestType;
237 
238     /**
239      * Supplementary Service teleservice type:
240      *     {@link #SS_ALL_TELE_AND_BEARER_SERVICES},
241      *     {@link #SS_ALL_TELESEVICES},
242      *     {@link #SS_TELEPHONY},
243      *     {@link #SS_ALL_DATA_TELESERVICES},
244      *     {@link #SS_SMS_SERVICES},
245      *     {@link #SS_ALL_TELESERVICES_EXCEPT_SMS}
246      *
247      * @hide
248      */
249     public final @TeleserviceType int teleserviceType;
250 
251     /**
252      * Supplementary Service service class.
253      *
254      * @hide
255      */
256     public final @ServiceClassFlags int serviceClass;
257 
258     /**
259      * Result of Supplementary Service operation. Valid values are:
260      *     {@link #RESULT_SUCCESS} if the result is success, or
261      *     ImsReasonInfo code if the result is a failure.
262      *
263      * @hide
264      */
265     public final int result;
266 
267     private int[] mSsInfo;
268     private List<ImsCallForwardInfo> mCfInfo;
269     private List<ImsSsInfo> mImsSsInfo;
270 
271     /**
272      * Builder for optional ImsSsData parameters.
273      */
274     public static final class Builder {
275         private ImsSsData mImsSsData;
276 
277         /**
278          * Generate IMS Supplementary Service information.
279          * @param serviceType The Supplementary Service type.
280          * @param requestType Supplementary Service request Type:
281          *     {@link #SS_ACTIVATION},
282          *     {@link #SS_DEACTIVATION},
283          *     {@link #SS_INTERROGATION},
284          *     {@link #SS_REGISTRATION},
285          *     {@link #SS_ERASURE}
286          * @param teleserviceType Supplementary Service teleservice type:
287          *     {@link #SS_ALL_TELE_AND_BEARER_SERVICES},
288          *     {@link #SS_ALL_TELESEVICES},
289          *     {@link #SS_TELEPHONY},
290          *     {@link #SS_ALL_DATA_TELESERVICES},
291          *     {@link #SS_SMS_SERVICES},
292          *     {@link #SS_ALL_TELESERVICES_EXCEPT_SMS}
293          * @param serviceClass Supplementary Service service class. See See 27.007 +CCFC or +CLCK.
294          * @param result Result of Supplementary Service operation. Valid values are 0 if the result
295          *               is success, or {@link ImsReasonInfo} code if the result is a failure.
296          * @return this Builder instance for further constructing.
297          * @see #build()
298          */
Builder(@erviceType int serviceType, int requestType, int teleserviceType, @ServiceClassFlags int serviceClass, int result)299         public Builder(@ServiceType int serviceType, int requestType, int teleserviceType,
300                 @ServiceClassFlags int serviceClass, int result) {
301             mImsSsData = new ImsSsData(serviceType, requestType, teleserviceType, serviceClass,
302                     result);
303         }
304 
305         /**
306          * Set the array of {@link ImsSsInfo}s that are associated with this supplementary service
307          * data.
308          */
setSuppServiceInfo(@onNull List<ImsSsInfo> imsSsInfos)309         public @NonNull Builder setSuppServiceInfo(@NonNull List<ImsSsInfo> imsSsInfos) {
310             mImsSsData.mImsSsInfo = imsSsInfos;
311             return this;
312         }
313 
314         /**
315          * Set the array of {@link ImsCallForwardInfo}s that are associated with this supplementary
316          * service data.
317          */
setCallForwardingInfo( @onNull List<ImsCallForwardInfo> imsCallForwardInfos)318         public @NonNull Builder setCallForwardingInfo(
319                 @NonNull List<ImsCallForwardInfo> imsCallForwardInfos) {
320             mImsSsData.mCfInfo = imsCallForwardInfos;
321             return this;
322         }
323 
324         /**
325          * @return an {@link ImsSsData} containing optional parameters.
326          */
build()327         public @NonNull ImsSsData build() {
328             return mImsSsData;
329         }
330     }
331 
332     /**
333      * Generate IMS Supplementary Service information.
334      * @param serviceType The Supplementary Service type.
335      * @param requestType Supplementary Service request Type. Valid values are:
336      *     {@link #SS_ACTIVATION},
337      *     {@link #SS_DEACTIVATION},
338      *     {@link #SS_INTERROGATION},
339      *     {@link #SS_REGISTRATION},
340      *     {@link #SS_ERASURE}
341      * @param teleserviceType Supplementary Service teleservice type:
342      *     {@link #SS_ALL_TELE_AND_BEARER_SERVICES},
343      *     {@link #SS_ALL_TELESEVICES},
344      *     {@link #SS_TELEPHONY},
345      *     {@link #SS_ALL_DATA_TELESERVICES},
346      *     {@link #SS_SMS_SERVICES},
347      *     {@link #SS_ALL_TELESERVICES_EXCEPT_SMS}
348      * @param serviceClass Supplementary Service service class. See See 27.007 +CCFC or +CLCK.
349      * @param result Result of Supplementary Service operation. Valid values are 0 if the result is
350      *               success, or ImsReasonInfo code if the result is a failure.
351      */
ImsSsData(@erviceType int serviceType, int requestType, int teleserviceType, @ServiceClassFlags int serviceClass, int result)352     public ImsSsData(@ServiceType int serviceType, int requestType, int teleserviceType,
353             @ServiceClassFlags int serviceClass, int result) {
354         this.serviceType = serviceType;
355         this.requestType = requestType;
356         this.teleserviceType = teleserviceType;
357         this.serviceClass = serviceClass;
358         this.result = result;
359     }
360 
ImsSsData(Parcel in)361     private ImsSsData(Parcel in) {
362         serviceType = in.readInt();
363         requestType = in.readInt();
364         teleserviceType = in.readInt();
365         serviceClass = in.readInt();
366         result = in.readInt();
367         mSsInfo = in.createIntArray();
368         mCfInfo = in.readParcelableList(new ArrayList<>(), this.getClass().getClassLoader());
369         mImsSsInfo = in.readParcelableList(new ArrayList<>(), this.getClass().getClassLoader());
370     }
371 
372     public static final @android.annotation.NonNull Creator<ImsSsData> CREATOR = new Creator<ImsSsData>() {
373         @Override
374         public ImsSsData createFromParcel(Parcel in) {
375             return new ImsSsData(in);
376         }
377 
378         @Override
379         public ImsSsData[] newArray(int size) {
380             return new ImsSsData[size];
381         }
382     };
383 
384     @Override
writeToParcel(Parcel out, int flags)385     public void writeToParcel(Parcel out, int flags) {
386         out.writeInt(getServiceType());
387         out.writeInt(getRequestType());
388         out.writeInt(getTeleserviceType());
389         out.writeInt(getServiceClass());
390         out.writeInt(getResult());
391         out.writeIntArray(mSsInfo);
392         out.writeParcelableList(mCfInfo, 0);
393         out.writeParcelableList(mImsSsInfo, 0);
394     }
395 
396     @Override
describeContents()397     public int describeContents() {
398         return 0;
399     }
400 
401     /**
402      * Old method, kept for compatibility. See {@link #isTypeCf()}
403      * @hide
404      */
isTypeCF()405     public boolean isTypeCF() {
406         return (getServiceType() == SS_CFU || getServiceType() == SS_CF_BUSY
407                 || getServiceType() == SS_CF_NO_REPLY || getServiceType() == SS_CF_NOT_REACHABLE
408                 || getServiceType() == SS_CF_ALL || getServiceType() == SS_CF_ALL_CONDITIONAL);
409     }
410 
isTypeCf()411     public boolean isTypeCf() {
412         return isTypeCF();
413     }
414 
isTypeUnConditional()415     public boolean isTypeUnConditional() {
416         return (getServiceType() == SS_CFU || getServiceType() == SS_CF_ALL);
417     }
418 
419     /**
420      * Old method, kept for compatibility. See {@link #isTypeCf()}
421      * @hide
422      */
isTypeCW()423     public boolean isTypeCW() {
424         return (getServiceType() == SS_WAIT);
425     }
426 
isTypeCw()427     public boolean isTypeCw() {
428         return isTypeCW();
429     }
430 
isTypeClip()431     public boolean isTypeClip() {
432         return (getServiceType() == SS_CLIP);
433     }
434 
isTypeColr()435     public boolean isTypeColr() {
436         return (getServiceType() == SS_COLR);
437     }
438 
isTypeColp()439     public boolean isTypeColp() {
440         return (getServiceType() == SS_COLP);
441     }
442 
isTypeClir()443     public boolean isTypeClir() {
444         return (getServiceType() == SS_CLIR);
445     }
446 
isTypeIcb()447     public boolean isTypeIcb() {
448         return (getServiceType() == SS_INCOMING_BARRING_DN
449                 || getServiceType() == SS_INCOMING_BARRING_ANONYMOUS);
450     }
451 
isTypeBarring()452     public boolean isTypeBarring() {
453         return (getServiceType() == SS_BAOC || getServiceType() == SS_BAOIC
454                 || getServiceType() == SS_BAOIC_EXC_HOME || getServiceType() == SS_BAIC
455                 || getServiceType() == SS_BAIC_ROAMING || getServiceType() == SS_ALL_BARRING
456                 || getServiceType() == SS_OUTGOING_BARRING
457                 || getServiceType() == SS_INCOMING_BARRING);
458     }
459 
isTypeInterrogation()460     public boolean isTypeInterrogation() {
461         return (getRequestType() == SS_INTERROGATION);
462     }
463 
464     /**
465      * Supplementary Service request Type.
466      */
getRequestType()467     public @RequestType int getRequestType() {
468         return requestType;
469     }
470 
471     /**
472      * The Service type of this Supplementary service.
473      */
getServiceType()474     public @ServiceType int getServiceType() {
475         return serviceType;
476     }
477 
478     /**
479      * Supplementary Service teleservice type.
480      */
getTeleserviceType()481     public @TeleserviceType int getTeleserviceType() {
482         return teleserviceType;
483     }
484 
485     /**
486      * Supplementary Service service class.
487      */
getServiceClass()488     public @ServiceClassFlags int getServiceClass() {
489         return serviceClass;
490     }
491 
492     /**
493      * Result of Supplementary Service operation. Valid values are:
494      *     {@link #RESULT_SUCCESS} if the result is success, or
495      *     {@link ImsReasonInfo.UtReason} code if the result is a failure.
496      */
getResult()497     public @ImsReasonInfo.UtReason int getResult() {
498         return result;
499     }
500 
501     /** @hide */
setSuppServiceInfo(int[] ssInfo)502     public void setSuppServiceInfo(int[] ssInfo) {
503         mSsInfo = ssInfo;
504     }
505 
506     /** @hide */
setImsSpecificSuppServiceInfo(ImsSsInfo[] imsSsInfo)507     public void setImsSpecificSuppServiceInfo(ImsSsInfo[] imsSsInfo) {
508         mImsSsInfo = Arrays.asList(imsSsInfo);
509     }
510 
511     /** @hide */
setCallForwardingInfo(ImsCallForwardInfo[] cfInfo)512     public void setCallForwardingInfo(ImsCallForwardInfo[] cfInfo) {
513         mCfInfo = Arrays.asList(cfInfo);
514     }
515 
516     /**
517      * This is a compatibility function to transform the public API to a form that can be processed
518      * by telephony.
519      *
520      * @hide
521      */
522     //TODO: Refactor Telephony to use well defined classes instead of an int[] to process SS.
getSuppServiceInfoCompat()523     public int[] getSuppServiceInfoCompat() {
524         if (mSsInfo != null) {
525             // Something has set the ssInfo using hidden APIs, so for compatibility just return that
526             // structure directly.
527             return mSsInfo;
528         }
529 
530 
531         int[] result = new int[2];
532         if (mImsSsInfo == null || mImsSsInfo.size() == 0) {
533             Rlog.e(TAG, "getSuppServiceInfoCompat: Could not parse mImsSsInfo, returning empty "
534                     + "int[]");
535             return result;
536         }
537 
538         // Convert ImsSsInfo into a form that telephony can read (as per 3GPP 27.007)
539         // CLIR (section 7.7)
540         if (isTypeClir()) {
541             // Assume there will only be one ImsSsInfo.
542             // contains {"n","m"} parameters
543             result[0] = mImsSsInfo.get(0).getClirOutgoingState();
544             result[1] = mImsSsInfo.get(0).getClirInterrogationStatus();
545             return result;
546         }
547         // COLR 7.31
548         if (isTypeColr()) {
549             result[0] = mImsSsInfo.get(0).getProvisionStatus();
550         }
551         // Facility Lock CLCK 7.4 (for call barring), CLIP 7.6, COLP 7.8, as well as any
552         // other result, just return the status for the "n" parameter and provisioning status for
553         // "m" as the default.
554         result[0] = mImsSsInfo.get(0).getStatus();
555         result[1] = mImsSsInfo.get(0).getProvisionStatus();
556         return result;
557     }
558 
559     /**
560      * @return an array of {@link ImsSsInfo}s associated with this supplementary service data.
561      */
getSuppServiceInfo()562     public @NonNull List<ImsSsInfo> getSuppServiceInfo() {
563         return mImsSsInfo;
564     }
565 
566     /**
567      * @return an array of {@link ImsCallForwardInfo}s associated with this supplementary service
568      * data.
569      **/
getCallForwardInfo()570     public @Nullable List<ImsCallForwardInfo> getCallForwardInfo() {
571         return mCfInfo;
572     }
573 
574     @NonNull
575     @Override
toString()576     public String toString() {
577         return "[ImsSsData] " + "ServiceType: " + getServiceType()
578             + " RequestType: " + getRequestType()
579             + " TeleserviceType: " + getTeleserviceType()
580             + " ServiceClass: " + getServiceClass()
581             + " Result: " + getResult();
582     }
583 }
584