Aurimas Liutikas | 88c7ff1 | 2023-08-10 12:42:26 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2006 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.internal.telephony.uicc; |
| 18 | |
| 19 | import android.compat.annotation.UnsupportedAppUsage; |
| 20 | import android.os.Build; |
| 21 | import android.telephony.SubscriptionInfo; |
| 22 | |
| 23 | import com.android.internal.telephony.uicc.IccSlotStatus.MultipleEnabledProfilesMode; |
| 24 | import com.android.internal.telephony.util.TelephonyUtils; |
| 25 | import com.android.telephony.Rlog; |
| 26 | |
| 27 | /** |
| 28 | * See also RIL_CardStatus in include/telephony/ril.h |
| 29 | * |
| 30 | * {@hide} |
| 31 | */ |
| 32 | public class IccCardStatus { |
| 33 | public static final int CARD_MAX_APPS = 8; |
| 34 | |
| 35 | public enum CardState { |
| 36 | @UnsupportedAppUsage |
| 37 | CARDSTATE_ABSENT, |
| 38 | @UnsupportedAppUsage |
| 39 | CARDSTATE_PRESENT, |
| 40 | @UnsupportedAppUsage |
| 41 | CARDSTATE_ERROR, |
| 42 | CARDSTATE_RESTRICTED; |
| 43 | |
| 44 | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) |
| 45 | public boolean isCardPresent() { |
| 46 | return this == CARDSTATE_PRESENT || |
| 47 | this == CARDSTATE_RESTRICTED; |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | public enum PinState { |
| 52 | PINSTATE_UNKNOWN, |
| 53 | PINSTATE_ENABLED_NOT_VERIFIED, |
| 54 | PINSTATE_ENABLED_VERIFIED, |
| 55 | @UnsupportedAppUsage |
| 56 | PINSTATE_DISABLED, |
| 57 | @UnsupportedAppUsage |
| 58 | PINSTATE_ENABLED_BLOCKED, |
| 59 | @UnsupportedAppUsage |
| 60 | PINSTATE_ENABLED_PERM_BLOCKED; |
| 61 | |
| 62 | boolean isPermBlocked() { |
| 63 | return this == PINSTATE_ENABLED_PERM_BLOCKED; |
| 64 | } |
| 65 | |
| 66 | boolean isPinRequired() { |
| 67 | return this == PINSTATE_ENABLED_NOT_VERIFIED; |
| 68 | } |
| 69 | |
| 70 | boolean isPukRequired() { |
| 71 | return this == PINSTATE_ENABLED_BLOCKED; |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | @UnsupportedAppUsage |
| 76 | public CardState mCardState; |
| 77 | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) |
| 78 | public PinState mUniversalPinState; |
| 79 | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) |
| 80 | public int mGsmUmtsSubscriptionAppIndex; |
| 81 | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) |
| 82 | public int mCdmaSubscriptionAppIndex; |
| 83 | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) |
| 84 | public int mImsSubscriptionAppIndex; |
| 85 | public String atr; |
| 86 | public String iccid; |
| 87 | public String eid; |
| 88 | |
| 89 | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) |
| 90 | public IccCardApplicationStatus[] mApplications; |
| 91 | |
| 92 | public IccSlotPortMapping mSlotPortMapping; |
| 93 | |
| 94 | public MultipleEnabledProfilesMode mSupportedMepMode = MultipleEnabledProfilesMode.NONE; |
| 95 | |
| 96 | /** |
| 97 | * Set the MultipleEnabledProfilesMode according to the input mode. |
| 98 | */ |
| 99 | public void setMultipleEnabledProfilesMode(int mode) { |
| 100 | switch(mode) { |
| 101 | case 0: |
| 102 | mSupportedMepMode = MultipleEnabledProfilesMode.NONE; |
| 103 | break; |
| 104 | case 1: |
| 105 | mSupportedMepMode = MultipleEnabledProfilesMode.MEP_A1; |
| 106 | break; |
| 107 | case 2: |
| 108 | mSupportedMepMode = MultipleEnabledProfilesMode.MEP_A2; |
| 109 | break; |
| 110 | case 3: |
| 111 | mSupportedMepMode = MultipleEnabledProfilesMode.MEP_B; |
| 112 | break; |
| 113 | default: |
| 114 | throw new RuntimeException("Unrecognized RIL_MultipleEnabledProfilesMode: " + mode); |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | public void setCardState(int state) { |
| 119 | switch(state) { |
| 120 | case 0: |
| 121 | mCardState = CardState.CARDSTATE_ABSENT; |
| 122 | break; |
| 123 | case 1: |
| 124 | mCardState = CardState.CARDSTATE_PRESENT; |
| 125 | break; |
| 126 | case 2: |
| 127 | mCardState = CardState.CARDSTATE_ERROR; |
| 128 | break; |
| 129 | case 3: |
| 130 | mCardState = CardState.CARDSTATE_RESTRICTED; |
| 131 | break; |
| 132 | default: |
| 133 | throw new RuntimeException("Unrecognized RIL_CardState: " + state); |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | public void setUniversalPinState(int state) { |
| 138 | switch(state) { |
| 139 | case 0: |
| 140 | mUniversalPinState = PinState.PINSTATE_UNKNOWN; |
| 141 | break; |
| 142 | case 1: |
| 143 | mUniversalPinState = PinState.PINSTATE_ENABLED_NOT_VERIFIED; |
| 144 | break; |
| 145 | case 2: |
| 146 | mUniversalPinState = PinState.PINSTATE_ENABLED_VERIFIED; |
| 147 | break; |
| 148 | case 3: |
| 149 | mUniversalPinState = PinState.PINSTATE_DISABLED; |
| 150 | break; |
| 151 | case 4: |
| 152 | mUniversalPinState = PinState.PINSTATE_ENABLED_BLOCKED; |
| 153 | break; |
| 154 | case 5: |
| 155 | mUniversalPinState = PinState.PINSTATE_ENABLED_PERM_BLOCKED; |
| 156 | break; |
| 157 | default: |
| 158 | throw new RuntimeException("Unrecognized RIL_PinState: " + state); |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | @Override |
| 163 | public String toString() { |
| 164 | IccCardApplicationStatus app; |
| 165 | |
| 166 | StringBuilder sb = new StringBuilder(); |
| 167 | sb.append("IccCardState {").append(mCardState).append(",") |
| 168 | .append(mUniversalPinState); |
| 169 | if (mApplications != null) { |
| 170 | sb.append(",num_apps=").append(mApplications.length); |
| 171 | } else { |
| 172 | sb.append(",mApplications=null"); |
| 173 | } |
| 174 | |
| 175 | sb.append(",gsm_id=").append(mGsmUmtsSubscriptionAppIndex); |
| 176 | if (mApplications != null |
| 177 | && mGsmUmtsSubscriptionAppIndex >= 0 |
| 178 | && mGsmUmtsSubscriptionAppIndex < mApplications.length) { |
| 179 | app = mApplications[mGsmUmtsSubscriptionAppIndex]; |
| 180 | sb.append(app == null ? "null" : app); |
| 181 | } |
| 182 | |
| 183 | sb.append(",cdma_id=").append(mCdmaSubscriptionAppIndex); |
| 184 | if (mApplications != null |
| 185 | && mCdmaSubscriptionAppIndex >= 0 |
| 186 | && mCdmaSubscriptionAppIndex < mApplications.length) { |
| 187 | app = mApplications[mCdmaSubscriptionAppIndex]; |
| 188 | sb.append(app == null ? "null" : app); |
| 189 | } |
| 190 | |
| 191 | sb.append(",ims_id=").append(mImsSubscriptionAppIndex); |
| 192 | if (mApplications != null |
| 193 | && mImsSubscriptionAppIndex >= 0 |
| 194 | && mImsSubscriptionAppIndex < mApplications.length) { |
| 195 | app = mApplications[mImsSubscriptionAppIndex]; |
| 196 | sb.append(app == null ? "null" : app); |
| 197 | } |
| 198 | |
| 199 | sb.append(",atr=").append(atr); |
| 200 | sb.append(",iccid=").append(SubscriptionInfo.getPrintableId(iccid)); |
| 201 | sb.append(",eid=").append(Rlog.pii(TelephonyUtils.IS_DEBUGGABLE, eid)); |
| 202 | sb.append(",SupportedMepMode=").append(mSupportedMepMode); |
| 203 | sb.append(",SlotPortMapping=").append(mSlotPortMapping); |
| 204 | |
| 205 | sb.append("}"); |
| 206 | return sb.toString(); |
| 207 | } |
| 208 | |
| 209 | } |