1 /*
2  * Copyright 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 
17 package android.telephony;
18 
19 import android.annotation.IntDef;
20 import android.annotation.NonNull;
21 import android.annotation.Nullable;
22 import android.annotation.SystemApi;
23 import android.os.Parcel;
24 import android.os.Parcelable;
25 
26 import com.android.internal.annotations.VisibleForTesting;
27 
28 import java.lang.annotation.Retention;
29 import java.lang.annotation.RetentionPolicy;
30 import java.util.Objects;
31 
32 
33 /**
34  * Class that stores information specific to data network registration.
35  * @hide
36  */
37 @SystemApi
38 public final class DataSpecificRegistrationInfo implements Parcelable {
39 
40     /** @hide */
41     @Retention(RetentionPolicy.SOURCE)
42     @IntDef(
43         prefix = "LTE_ATTACH_TYPE_",
44         value = {
45             LTE_ATTACH_TYPE_UNKNOWN,
46             LTE_ATTACH_TYPE_EPS_ONLY,
47             LTE_ATTACH_TYPE_COMBINED,
48         })
49     public @interface LteAttachResultType {}
50 
51     /**
52      * Default value.
53      * Attach type is unknown.
54      */
55     public static final int LTE_ATTACH_TYPE_UNKNOWN = 0;
56 
57     /**
58      * LTE is attached with EPS only.
59      *
60      * Reference: 3GPP TS 24.301 9.9.3 EMM information elements.
61      */
62     public static final int LTE_ATTACH_TYPE_EPS_ONLY = 1;
63 
64     /**
65      * LTE combined EPS and IMSI attach.
66      *
67      * Reference: 3GPP TS 24.301 9.9.3 EMM information elements.
68      */
69     public static final int LTE_ATTACH_TYPE_COMBINED = 2;
70 
71     /** @hide */
72     @Retention(RetentionPolicy.SOURCE)
73     @IntDef(flag = true, prefix = {"LTE_ATTACH_EXTRA_INFO_"},
74             value = {
75                     LTE_ATTACH_EXTRA_INFO_NONE,
76                     LTE_ATTACH_EXTRA_INFO_CSFB_NOT_PREFERRED,
77                     LTE_ATTACH_EXTRA_INFO_SMS_ONLY
78             })
79     public @interface LteAttachExtraInfo {}
80 
81     /**
82      * Default value.
83      */
84     public static final int LTE_ATTACH_EXTRA_INFO_NONE = 0;
85 
86     /**
87      * CSFB is not preferred.
88      * Applicable for LTE only.
89      *
90      * Reference: 3GPP TS 24.301 9.9.3 EMM information elements.
91      */
92     public static final int LTE_ATTACH_EXTRA_INFO_CSFB_NOT_PREFERRED = 1 << 0;
93 
94     /**
95      * Attached for SMS only.
96      * Applicable for LTE only.
97      *
98      * Reference: 3GPP TS 24.301 9.9.3 EMM information elements.
99      */
100     public static final int LTE_ATTACH_EXTRA_INFO_SMS_ONLY = 1 << 1;
101 
102     /**
103      * @hide
104      * The maximum number of simultaneous Data Calls that
105      * must be established using setupDataCall().
106      */
107     public final int maxDataCalls;
108 
109     /**
110      * @hide
111      * Indicates if the use of dual connectivity with NR is restricted.
112      * Reference: 3GPP TS 24.301 v15.03 section 9.3.3.12A.
113      */
114     public final boolean isDcNrRestricted;
115 
116     /**
117      * Indicates if NR is supported by the selected PLMN.
118      * @hide
119      * {@code true} if the bit N is in the PLMN-InfoList-r15 is true and the selected PLMN is
120      * present in plmn-IdentityList at position N.
121      * Reference: 3GPP TS 36.331 v15.2.2 section 6.3.1 PLMN-InfoList-r15.
122      *            3GPP TS 36.331 v15.2.2 section 6.2.2 SystemInformationBlockType1 message.
123      */
124     public final boolean isNrAvailable;
125 
126     /**
127      * @hide
128      * Indicates that if E-UTRA-NR Dual Connectivity (EN-DC) is supported by the primary serving
129      * cell.
130      *
131      * True the primary serving cell is LTE cell and the plmn-InfoList-r15 is present in SIB2 and
132      * at least one bit in this list is true, otherwise this value should be false.
133      *
134      * Reference: 3GPP TS 36.331 v15.2.2 6.3.1 System information blocks.
135      */
136     public final boolean isEnDcAvailable;
137 
138     /**
139      * Provides network support info for VoPS and Emergency bearer support
140      */
141     @Nullable
142     private final VopsSupportInfo mVopsSupportInfo;
143 
144     /** The type of network attachment */
145     private final @LteAttachResultType int mLteAttachResultType;
146 
147     /** LTE attach extra info */
148     private final @LteAttachExtraInfo int mLteAttachExtraInfo;
149 
DataSpecificRegistrationInfo(Builder builder)150     private DataSpecificRegistrationInfo(Builder builder) {
151         this.maxDataCalls = builder.mMaxDataCalls;
152         this.isDcNrRestricted = builder.mIsDcNrRestricted;
153         this.isNrAvailable = builder.mIsNrAvailable;
154         this.isEnDcAvailable = builder.mIsEnDcAvailable;
155         this.mVopsSupportInfo = builder.mVopsSupportInfo;
156         this.mLteAttachResultType = builder.mLteAttachResultType;
157         this.mLteAttachExtraInfo = builder.mLteAttachExtraInfo;
158     }
159 
160     /**
161      * @hide
162      */
163     @VisibleForTesting
DataSpecificRegistrationInfo( int maxDataCalls, boolean isDcNrRestricted, boolean isNrAvailable, boolean isEnDcAvailable, @Nullable VopsSupportInfo vops)164     public DataSpecificRegistrationInfo(
165             int maxDataCalls, boolean isDcNrRestricted, boolean isNrAvailable,
166             boolean isEnDcAvailable, @Nullable VopsSupportInfo vops) {
167         this.maxDataCalls = maxDataCalls;
168         this.isDcNrRestricted = isDcNrRestricted;
169         this.isNrAvailable = isNrAvailable;
170         this.isEnDcAvailable = isEnDcAvailable;
171         this.mVopsSupportInfo = vops;
172         this.mLteAttachResultType = LTE_ATTACH_TYPE_UNKNOWN;
173         this.mLteAttachExtraInfo = LTE_ATTACH_EXTRA_INFO_NONE;
174     }
175 
176     /**
177      * Constructor from another data specific registration info
178      *
179      * @param dsri another data specific registration info
180      * @hide
181      */
DataSpecificRegistrationInfo(@onNull DataSpecificRegistrationInfo dsri)182     DataSpecificRegistrationInfo(@NonNull DataSpecificRegistrationInfo dsri) {
183         maxDataCalls = dsri.maxDataCalls;
184         isDcNrRestricted = dsri.isDcNrRestricted;
185         isNrAvailable = dsri.isNrAvailable;
186         isEnDcAvailable = dsri.isEnDcAvailable;
187         mVopsSupportInfo = dsri.mVopsSupportInfo;
188         mLteAttachResultType = dsri.mLteAttachResultType;
189         mLteAttachExtraInfo = dsri.mLteAttachExtraInfo;
190     }
191 
DataSpecificRegistrationInfo( Parcel source)192     private DataSpecificRegistrationInfo(/* @NonNull */ Parcel source) {
193         maxDataCalls = source.readInt();
194         isDcNrRestricted = source.readBoolean();
195         isNrAvailable = source.readBoolean();
196         isEnDcAvailable = source.readBoolean();
197         mVopsSupportInfo = source.readParcelable(VopsSupportInfo.class.getClassLoader(), android.telephony.VopsSupportInfo.class);
198         mLteAttachResultType = source.readInt();
199         mLteAttachExtraInfo = source.readInt();
200     }
201 
202     @Override
writeToParcel( Parcel dest, int flags)203     public void writeToParcel(/* @NonNull */ Parcel dest, int flags) {
204         dest.writeInt(maxDataCalls);
205         dest.writeBoolean(isDcNrRestricted);
206         dest.writeBoolean(isNrAvailable);
207         dest.writeBoolean(isEnDcAvailable);
208         dest.writeParcelable(mVopsSupportInfo, flags);
209         dest.writeInt(mLteAttachResultType);
210         dest.writeInt(mLteAttachExtraInfo);
211     }
212 
213     @Override
describeContents()214     public int describeContents() {
215         return 0;
216     }
217 
218     @NonNull
219     @Override
toString()220     public String toString() {
221         return new StringBuilder().append(this.getClass().getName())
222                 .append(" :{")
223                 .append(" maxDataCalls = " + maxDataCalls)
224                 .append(" isDcNrRestricted = " + isDcNrRestricted)
225                 .append(" isNrAvailable = " + isNrAvailable)
226                 .append(" isEnDcAvailable = " + isEnDcAvailable)
227                 .append(" mLteAttachResultType = " + mLteAttachResultType)
228                 .append(" mLteAttachExtraInfo = " + mLteAttachExtraInfo)
229                 .append(" " + mVopsSupportInfo)
230                 .append(" }")
231                 .toString();
232     }
233 
234     @Override
hashCode()235     public int hashCode() {
236         return Objects.hash(maxDataCalls, isDcNrRestricted, isNrAvailable,
237                 isEnDcAvailable, mVopsSupportInfo,
238                 mLteAttachResultType, mLteAttachExtraInfo);
239     }
240 
241     @Override
equals(@ullable Object o)242     public boolean equals(@Nullable Object o) {
243         if (this == o) return true;
244 
245         if (!(o instanceof DataSpecificRegistrationInfo)) return false;
246 
247         DataSpecificRegistrationInfo other = (DataSpecificRegistrationInfo) o;
248         return this.maxDataCalls == other.maxDataCalls
249                 && this.isDcNrRestricted == other.isDcNrRestricted
250                 && this.isNrAvailable == other.isNrAvailable
251                 && this.isEnDcAvailable == other.isEnDcAvailable
252                 && Objects.equals(mVopsSupportInfo, other.mVopsSupportInfo)
253                 && this.mLteAttachResultType == other.mLteAttachResultType
254                 && this.mLteAttachExtraInfo == other.mLteAttachExtraInfo;
255     }
256 
257     public static final @NonNull Parcelable.Creator<DataSpecificRegistrationInfo> CREATOR =
258             new Parcelable.Creator<DataSpecificRegistrationInfo>() {
259                 @Override
260                 public DataSpecificRegistrationInfo createFromParcel(Parcel source) {
261                     return new DataSpecificRegistrationInfo(source);
262                 }
263 
264                 @Override
265                 public DataSpecificRegistrationInfo[] newArray(int size) {
266                     return new DataSpecificRegistrationInfo[size];
267                 }
268             };
269 
270     /**
271      * @return The LTE VOPS (Voice over Packet Switched) support information
272      *
273      * @deprecated use {@link #getVopsSupportInfo()}
274      */
275     @Deprecated
276     @NonNull
getLteVopsSupportInfo()277     public LteVopsSupportInfo getLteVopsSupportInfo() {
278         return mVopsSupportInfo instanceof LteVopsSupportInfo
279                 ? (LteVopsSupportInfo) mVopsSupportInfo
280                 : new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE,
281                 LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE);
282     }
283 
284     /**
285      * @return The VOPS (Voice over Packet Switched) support information.
286      *
287      * The instance of {@link LteVopsSupportInfo}, or {@link NrVopsSupportInfo},
288      * null if there is there is no VOPS support information available.
289      */
290     @Nullable
getVopsSupportInfo()291     public VopsSupportInfo getVopsSupportInfo() {
292         return mVopsSupportInfo;
293     }
294 
295     /**
296      * Provides the LTE attach type.
297      */
getLteAttachResultType()298     public @LteAttachResultType int getLteAttachResultType() {
299         return mLteAttachResultType;
300     }
301 
302     /**
303      * Provides the extra information of LTE attachment.
304      *
305      * @return the bitwise OR of {@link LteAttachExtraInfo}.
306      */
getLteAttachExtraInfo()307     public @LteAttachExtraInfo int getLteAttachExtraInfo() {
308         return mLteAttachExtraInfo;
309     }
310 
311     /**
312      * Builds {@link DataSpecificRegistrationInfo} instances, which may include optional parameters.
313      * @hide
314      */
315     public static final class Builder {
316         private final int mMaxDataCalls;
317 
318         private boolean mIsDcNrRestricted;
319         private boolean mIsNrAvailable;
320         private boolean mIsEnDcAvailable;
321         private @Nullable VopsSupportInfo mVopsSupportInfo;
322         private @LteAttachResultType int mLteAttachResultType = LTE_ATTACH_TYPE_UNKNOWN;
323         private @LteAttachExtraInfo int mLteAttachExtraInfo = LTE_ATTACH_EXTRA_INFO_NONE;
324 
Builder(int maxDataCalls)325         public Builder(int maxDataCalls) {
326             mMaxDataCalls = maxDataCalls;
327         }
328 
329         /**
330          * Ses whether the use of dual connectivity with NR is restricted.
331          * @param isDcNrRestricted {@code true} if the use of dual connectivity with NR is
332          *        restricted.
333          */
setDcNrRestricted(boolean isDcNrRestricted)334         public @NonNull Builder setDcNrRestricted(boolean isDcNrRestricted) {
335             mIsDcNrRestricted = isDcNrRestricted;
336             return this;
337         }
338 
339         /**
340          * Sets whether NR is supported by the selected PLMN.
341          * @param isNrAvailable {@code true} if NR is supported.
342          */
setNrAvailable(boolean isNrAvailable)343         public @NonNull Builder setNrAvailable(boolean isNrAvailable) {
344             mIsNrAvailable = isNrAvailable;
345             return this;
346         }
347 
348         /**
349          * Sets whether E-UTRA-NR Dual Connectivity (EN-DC) is supported by the primary serving
350          * cell.
351          * @param isEnDcAvailable {@code true} if EN_DC is supported.
352          */
setEnDcAvailable(boolean isEnDcAvailable)353         public @NonNull Builder setEnDcAvailable(boolean isEnDcAvailable) {
354             mIsEnDcAvailable = isEnDcAvailable;
355             return this;
356         }
357 
358         /**
359          * Sets the network support info for VoPS and Emergency bearer support.
360          * @param vops The network support info for VoPS and Emergency bearer support.
361          */
362         @Nullable
setVopsSupportInfo(VopsSupportInfo vops)363         public @NonNull Builder setVopsSupportInfo(VopsSupportInfo vops) {
364             mVopsSupportInfo = vops;
365             return this;
366         }
367 
368         /**
369          * Sets the LTE attach type.
370          * @param lteAttachResultType the Lte attach type
371          */
setLteAttachResultType( @teAttachResultType int lteAttachResultType)372         public @NonNull Builder setLteAttachResultType(
373                 @LteAttachResultType int lteAttachResultType) {
374             mLteAttachResultType = lteAttachResultType;
375             return this;
376         }
377 
378         /**
379          * Sets the extra information of LTE attachment.
380          * @param lteAttachExtraInfo the extra information of LTE attachment.
381          */
setLteAttachExtraInfo( @teAttachExtraInfo int lteAttachExtraInfo)382         public @NonNull Builder setLteAttachExtraInfo(
383                 @LteAttachExtraInfo int lteAttachExtraInfo) {
384             mLteAttachExtraInfo = lteAttachExtraInfo;
385             return this;
386         }
387 
388         /**
389          * @return a built {@link DataSpecificRegistrationInfo} instance.
390          */
build()391         public @NonNull DataSpecificRegistrationInfo build() {
392             return new DataSpecificRegistrationInfo(this);
393         }
394     }
395 }
396