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; 18 19 import android.compat.annotation.UnsupportedAppUsage; 20 import android.os.AsyncResult; 21 import android.os.Handler; 22 import android.os.Message; 23 24 import com.android.internal.telephony.IccCardConstants.State; 25 import com.android.internal.telephony.uicc.IccCardApplicationStatus; 26 import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState; 27 import com.android.internal.telephony.uicc.IccRecords; 28 29 /** 30 * {@hide} 31 * @Deprecated use UiccController.getUiccCard instead. 32 * 33 * Integrated Circuit Card (ICC) interface 34 * An object of a class implementing this interface is used by external 35 * apps (specifically PhoneApp) to perform icc card related functionality. 36 * 37 * Apps (those that have access to Phone object) can retrieve this object 38 * by calling phone.getIccCard() 39 * 40 * This interface is implemented by UiccProfile and the object PhoneApp 41 * gets when it calls getIccCard is UiccProfile. 42 */ 43 public class IccCard { 44 private State mIccCardState = State.UNKNOWN; 45 46 /** 47 * Empty constructor. 48 */ IccCard()49 public IccCard() {} 50 51 /** 52 * Set the state of the IccCard to be returned in {@link getState}. 53 */ IccCard(State state)54 public IccCard(State state) { 55 mIccCardState = state; 56 } 57 58 /** 59 * @return combined Card and current App state 60 */ 61 @UnsupportedAppUsage getState()62 public State getState() { 63 return mIccCardState; 64 } 65 66 // todo: delete 67 /** 68 * @return IccRecords object belonging to current UiccCardApplication 69 */ getIccRecords()70 public IccRecords getIccRecords() { 71 return null; 72 } 73 74 /** 75 * Notifies handler of any transition into IccCardConstants.State.NETWORK_LOCKED 76 */ 77 @UnsupportedAppUsage registerForNetworkLocked(Handler h, int what, Object obj)78 public void registerForNetworkLocked(Handler h, int what, Object obj) { 79 return; 80 } 81 /** 82 * Unregister for networkLocked state change. 83 */ unregisterForNetworkLocked(Handler h)84 public void unregisterForNetworkLocked(Handler h) { 85 return; 86 } 87 88 /** 89 * Supply the ICC PIN to the ICC 90 * 91 * When the operation is complete, onComplete will be sent to its 92 * Handler. 93 * 94 * onComplete.obj will be an AsyncResult 95 * 96 * ((AsyncResult)onComplete.obj).exception == null on success 97 * ((AsyncResult)onComplete.obj).exception != null on fail 98 * 99 * If the supplied PIN is incorrect: 100 * ((AsyncResult)onComplete.obj).exception != null 101 * && ((AsyncResult)onComplete.obj).exception 102 * instanceof com.android.internal.telephony.gsm.CommandException) 103 * && ((CommandException)(((AsyncResult)onComplete.obj).exception)) 104 * .getCommandError() == CommandException.Error.PASSWORD_INCORRECT 105 */ 106 @UnsupportedAppUsage supplyPin(String pin, Message onComplete)107 public void supplyPin(String pin, Message onComplete) { 108 sendMessageWithCardAbsentException(onComplete); 109 } 110 111 /** 112 * Supply the ICC PUK to the ICC 113 */ 114 @UnsupportedAppUsage supplyPuk(String puk, String newPin, Message onComplete)115 public void supplyPuk(String puk, String newPin, Message onComplete) { 116 sendMessageWithCardAbsentException(onComplete); 117 } 118 119 /** 120 * Supply the ICC PIN2 to the ICC 121 */ supplyPin2(String pin2, Message onComplete)122 public void supplyPin2(String pin2, Message onComplete) { 123 sendMessageWithCardAbsentException(onComplete); 124 } 125 126 /** 127 * Supply the ICC PUK2 to the ICC 128 */ supplyPuk2(String puk2, String newPin2, Message onComplete)129 public void supplyPuk2(String puk2, String newPin2, Message onComplete) { 130 sendMessageWithCardAbsentException(onComplete); 131 } 132 133 /** 134 * Supply Network depersonalization code to the RIL 135 */ 136 @UnsupportedAppUsage supplyNetworkDepersonalization(String pin, Message onComplete)137 public void supplyNetworkDepersonalization(String pin, Message onComplete) { 138 sendMessageWithCardAbsentException(onComplete); 139 } 140 141 /** 142 * Supply Sim depersonalization code to the RIL 143 */ supplySimDepersonalization(PersoSubState persoType, String controlKey, Message onComplete)144 public void supplySimDepersonalization(PersoSubState persoType, 145 String controlKey, Message onComplete) { 146 sendMessageWithCardAbsentException(onComplete); 147 } 148 149 /** 150 * Check whether ICC pin lock is enabled 151 * This is a sync call which returns the cached pin enabled state 152 * 153 * @return true for ICC locked enabled 154 * false for ICC locked disabled 155 */ getIccLockEnabled()156 public boolean getIccLockEnabled() { 157 return false; 158 } 159 160 /** 161 * Check whether fdn (fixed dialing number) service is available. 162 * @return true if ICC fdn service available 163 * false if ICC fdn service not available 164 */ getIccFdnAvailable()165 public boolean getIccFdnAvailable() { 166 return false; 167 } 168 169 /** 170 * Check whether ICC fdn (fixed dialing number) is enabled 171 * This is a sync call which returns the cached pin enabled state 172 * 173 * @return true for ICC fdn enabled 174 * false for ICC fdn disabled 175 */ getIccFdnEnabled()176 public boolean getIccFdnEnabled() { 177 return false; 178 } 179 180 /** 181 * Set the ICC pin lock enabled or disabled 182 * When the operation is complete, onComplete will be sent to its handler 183 * 184 * @param enabled "true" for locked "false" for unlocked. 185 * @param password needed to change the ICC pin state, aka. Pin1 186 * @param onComplete 187 * onComplete.obj will be an AsyncResult 188 * ((AsyncResult)onComplete.obj).exception == null on success 189 * ((AsyncResult)onComplete.obj).exception != null on fail 190 */ setIccLockEnabled(boolean enabled, String password, Message onComplete)191 public void setIccLockEnabled(boolean enabled, 192 String password, Message onComplete) { 193 sendMessageWithCardAbsentException(onComplete); 194 } 195 196 /** 197 * Set the ICC fdn enabled or disabled 198 * When the operation is complete, onComplete will be sent to its handler 199 * 200 * @param enabled "true" for locked "false" for unlocked. 201 * @param password needed to change the ICC fdn enable, aka Pin2 202 * @param onComplete 203 * onComplete.obj will be an AsyncResult 204 * ((AsyncResult)onComplete.obj).exception == null on success 205 * ((AsyncResult)onComplete.obj).exception != null on fail 206 */ setIccFdnEnabled(boolean enabled, String password, Message onComplete)207 public void setIccFdnEnabled(boolean enabled, 208 String password, Message onComplete) { 209 sendMessageWithCardAbsentException(onComplete); 210 } 211 212 /** 213 * Change the ICC password used in ICC pin lock 214 * When the operation is complete, onComplete will be sent to its handler 215 * 216 * @param oldPassword is the old password 217 * @param newPassword is the new password 218 * @param onComplete 219 * onComplete.obj will be an AsyncResult 220 * ((AsyncResult)onComplete.obj).exception == null on success 221 * ((AsyncResult)onComplete.obj).exception != null on fail 222 */ changeIccLockPassword(String oldPassword, String newPassword, Message onComplete)223 public void changeIccLockPassword(String oldPassword, String newPassword, 224 Message onComplete) { 225 sendMessageWithCardAbsentException(onComplete); 226 } 227 228 /** 229 * Change the ICC password used in ICC fdn enable 230 * When the operation is complete, onComplete will be sent to its handler 231 * 232 * @param oldPassword is the old password 233 * @param newPassword is the new password 234 * @param onComplete 235 * onComplete.obj will be an AsyncResult 236 * ((AsyncResult)onComplete.obj).exception == null on success 237 * ((AsyncResult)onComplete.obj).exception != null on fail 238 */ changeIccFdnPassword(String oldPassword, String newPassword, Message onComplete)239 public void changeIccFdnPassword(String oldPassword, String newPassword, 240 Message onComplete) { 241 sendMessageWithCardAbsentException(onComplete); 242 } 243 244 /** 245 * Returns service provider name stored in ICC card. 246 * If there is no service provider name associated or the record is not 247 * yet available, null will be returned <p> 248 * 249 * Please use this value when display Service Provider Name in idle mode <p> 250 * 251 * Usage of this provider name in the UI is a common carrier requirement. 252 * 253 * Also available via Android property "gsm.sim.operator.alpha" 254 * 255 * @return Service Provider Name stored in ICC card 256 * null if no service provider name associated or the record is not 257 * yet available 258 * 259 */ getServiceProviderName()260 public String getServiceProviderName() { 261 return null; 262 } 263 264 /** 265 * Checks if an Application of specified type present on the card 266 * @param type is AppType to look for 267 */ isApplicationOnIcc(IccCardApplicationStatus.AppType type)268 public boolean isApplicationOnIcc(IccCardApplicationStatus.AppType type) { 269 return false; 270 } 271 272 /** 273 * @return true if a ICC card is present 274 */ hasIccCard()275 public boolean hasIccCard() { 276 return false; 277 } 278 279 /** 280 * @return true if ICC card is PIN2 blocked 281 */ getIccPin2Blocked()282 public boolean getIccPin2Blocked() { 283 return false; 284 } 285 286 /** 287 * @return true if ICC card is PUK2 blocked 288 */ getIccPuk2Blocked()289 public boolean getIccPuk2Blocked() { 290 return false; 291 } 292 293 /** 294 * @return whether the card is an empty profile, meaning there's no UiccCardApplication, 295 * and that we don't need to wait for LOADED state. 296 */ isEmptyProfile()297 public boolean isEmptyProfile() { 298 return false; 299 } 300 sendMessageWithCardAbsentException(Message onComplete)301 private void sendMessageWithCardAbsentException(Message onComplete) { 302 AsyncResult ret = AsyncResult.forMessage(onComplete); 303 ret.exception = new RuntimeException("No valid IccCard"); 304 onComplete.sendToTarget(); 305 } 306 } 307