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;
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 java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy;
27 import java.util.Objects;
28 
29 /**
30  * Class for the information of a UICC slot.
31  * @hide
32  */
33 @SystemApi
34 public class UiccSlotInfo implements Parcelable {
35     /**
36      * Card state.
37      * @hide
38      */
39     @Retention(RetentionPolicy.SOURCE)
40     @IntDef(prefix = { "CARD_STATE_INFO_" }, value = {
41             CARD_STATE_INFO_ABSENT,
42             CARD_STATE_INFO_PRESENT,
43             CARD_STATE_INFO_ERROR,
44             CARD_STATE_INFO_RESTRICTED
45     })
46     public @interface CardStateInfo {}
47 
48     /** Card state absent. */
49     public static final int CARD_STATE_INFO_ABSENT = 1;
50 
51     /** Card state present. */
52     public static final int CARD_STATE_INFO_PRESENT = 2;
53 
54     /** Card state error. */
55     public static final int CARD_STATE_INFO_ERROR = 3;
56 
57     /** Card state restricted. */
58     public static final int CARD_STATE_INFO_RESTRICTED = 4;
59 
60     private final boolean mIsActive;
61     private final boolean mIsEuicc;
62     private final String mCardId;
63     private final @CardStateInfo int mCardStateInfo;
64     private final int mLogicalSlotIdx;
65     private final boolean mIsExtendedApduSupported;
66     private final boolean mIsRemovable;
67 
68     public static final @android.annotation.NonNull Creator<UiccSlotInfo> CREATOR = new Creator<UiccSlotInfo>() {
69         @Override
70         public UiccSlotInfo createFromParcel(Parcel in) {
71             return new UiccSlotInfo(in);
72         }
73 
74         @Override
75         public UiccSlotInfo[] newArray(int size) {
76             return new UiccSlotInfo[size];
77         }
78     };
79 
UiccSlotInfo(Parcel in)80     private UiccSlotInfo(Parcel in) {
81         mIsActive = in.readByte() != 0;
82         mIsEuicc = in.readByte() != 0;
83         mCardId = in.readString();
84         mCardStateInfo = in.readInt();
85         mLogicalSlotIdx = in.readInt();
86         mIsExtendedApduSupported = in.readByte() != 0;
87         mIsRemovable = in.readByte() != 0;
88     }
89 
90     @Override
writeToParcel(Parcel dest, int flags)91     public void writeToParcel(Parcel dest, int flags) {
92         dest.writeByte((byte) (mIsActive ? 1 : 0));
93         dest.writeByte((byte) (mIsEuicc ? 1 : 0));
94         dest.writeString(mCardId);
95         dest.writeInt(mCardStateInfo);
96         dest.writeInt(mLogicalSlotIdx);
97         dest.writeByte((byte) (mIsExtendedApduSupported ? 1 : 0));
98         dest.writeByte((byte) (mIsRemovable ? 1 : 0));
99     }
100 
101     @Override
describeContents()102     public int describeContents() {
103         return 0;
104     }
105 
106     /**
107      * Construct a UiccSlotInfo.
108      * @deprecated apps should not be constructing UiccSlotInfo objects
109      */
110     @Deprecated
UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId, @CardStateInfo int cardStateInfo, int logicalSlotIdx, boolean isExtendedApduSupported)111     public UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId,
112             @CardStateInfo int cardStateInfo, int logicalSlotIdx, boolean isExtendedApduSupported) {
113         this.mIsActive = isActive;
114         this.mIsEuicc = isEuicc;
115         this.mCardId = cardId;
116         this.mCardStateInfo = cardStateInfo;
117         this.mLogicalSlotIdx = logicalSlotIdx;
118         this.mIsExtendedApduSupported = isExtendedApduSupported;
119         this.mIsRemovable = false;
120     }
121 
122     /**
123      * @hide
124      */
UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId, @CardStateInfo int cardStateInfo, int logicalSlotIdx, boolean isExtendedApduSupported, boolean isRemovable)125     public UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId,
126             @CardStateInfo int cardStateInfo, int logicalSlotIdx, boolean isExtendedApduSupported,
127             boolean isRemovable) {
128         this.mIsActive = isActive;
129         this.mIsEuicc = isEuicc;
130         this.mCardId = cardId;
131         this.mCardStateInfo = cardStateInfo;
132         this.mLogicalSlotIdx = logicalSlotIdx;
133         this.mIsExtendedApduSupported = isExtendedApduSupported;
134         this.mIsRemovable = isRemovable;
135     }
136 
getIsActive()137     public boolean getIsActive() {
138         return mIsActive;
139     }
140 
getIsEuicc()141     public boolean getIsEuicc() {
142         return mIsEuicc;
143     }
144 
145     /**
146      * Returns the ICCID of the card in the slot, or the EID of an active eUICC.
147      * <p>
148      * If the UICC slot is for an active eUICC, returns the EID.
149      * If the UICC slot is for an inactive eUICC, returns the ICCID of the enabled profile, or the
150      * root profile if all other profiles are disabled.
151      * If the UICC slot is not an eUICC, returns the ICCID.
152      */
getCardId()153     public String getCardId() {
154         return mCardId;
155     }
156 
157     @CardStateInfo
getCardStateInfo()158     public int getCardStateInfo() {
159         return mCardStateInfo;
160     }
161 
getLogicalSlotIdx()162     public int getLogicalSlotIdx() {
163         return mLogicalSlotIdx;
164     }
165 
166     /**
167      * @return {@code true} if this slot supports extended APDU from ATR, {@code false} otherwise.
168      */
getIsExtendedApduSupported()169     public boolean getIsExtendedApduSupported() {
170         return mIsExtendedApduSupported;
171     }
172 
173    /**
174      * Return whether the UICC slot is for a removable UICC.
175      * <p>
176      * UICCs are generally removable, but eUICCs may be removable or built in to the device.
177      * @return true if the slot is for removable UICCs
178      */
isRemovable()179     public boolean isRemovable() {
180         return mIsRemovable;
181     }
182 
183     @Override
equals(@ullable Object obj)184     public boolean equals(@Nullable Object obj) {
185         if (this == obj) {
186             return true;
187         }
188         if (obj == null || getClass() != obj.getClass()) {
189             return false;
190         }
191 
192         UiccSlotInfo that = (UiccSlotInfo) obj;
193         return (mIsActive == that.mIsActive)
194                 && (mIsEuicc == that.mIsEuicc)
195                 && (Objects.equals(mCardId, that.mCardId))
196                 && (mCardStateInfo == that.mCardStateInfo)
197                 && (mLogicalSlotIdx == that.mLogicalSlotIdx)
198                 && (mIsExtendedApduSupported == that.mIsExtendedApduSupported)
199                 && (mIsRemovable == that.mIsRemovable);
200     }
201 
202     @Override
hashCode()203     public int hashCode() {
204         int result = 1;
205         result = 31 * result + (mIsActive ? 1 : 0);
206         result = 31 * result + (mIsEuicc ? 1 : 0);
207         result = 31 * result + Objects.hashCode(mCardId);
208         result = 31 * result + mCardStateInfo;
209         result = 31 * result + mLogicalSlotIdx;
210         result = 31 * result + (mIsExtendedApduSupported ? 1 : 0);
211         result = 31 * result + (mIsRemovable ? 1 : 0);
212         return result;
213     }
214 
215     @NonNull
216     @Override
toString()217     public String toString() {
218         return "UiccSlotInfo (mIsActive="
219                 + mIsActive
220                 + ", mIsEuicc="
221                 + mIsEuicc
222                 + ", mCardId="
223                 + mCardId
224                 + ", cardState="
225                 + mCardStateInfo
226                 + ", phoneId="
227                 + mLogicalSlotIdx
228                 + ", mIsExtendedApduSupported="
229                 + mIsExtendedApduSupported
230                 + ", mIsRemovable="
231                 + mIsRemovable
232                 + ")";
233     }
234 }
235