FileDocCategorySizeDatePackage
SimulatedCommands.javaAPI DocAndroid 1.5 API41267Wed May 06 22:42:02 BST 2009com.android.internal.telephony.test

SimulatedCommands

public final class SimulatedCommands extends com.android.internal.telephony.gsm.BaseCommands implements com.android.internal.telephony.gsm.CommandsInterface, SimulatedRadioControl

Fields Summary
private static final String
LOG_TAG
private static final SimLockState
INITIAL_LOCK_STATE
private static final String
DEFAULT_SIM_PIN_CODE
private static final String
SIM_PUK_CODE
private static final SimFdnState
INITIAL_FDN_STATE
private static final String
DEFAULT_SIM_PIN2_CODE
private static final String
SIM_PUK2_CODE
SimulatedGsmCallState
simulatedCallState
android.os.HandlerThread
mHandlerThread
SimLockState
mSimLockedState
boolean
mSimLockEnabled
int
mPinUnlockAttempts
int
mPukUnlockAttempts
String
mPinCode
SimFdnState
mSimFdnEnabledState
boolean
mSimFdnEnabled
int
mPin2UnlockAttempts
int
mPuk2UnlockAttempts
int
mNetworkType
String
mPin2Code
boolean
mSsnNotifyOn
int
pausedResponseCount
ArrayList
pausedResponses
int
nextCallFailCause
Constructors Summary
public SimulatedCommands()

    
    //***** Constructor

    
     
        super(null);  // Don't log statistics
        mHandlerThread = new HandlerThread("SimulatedCommands");
        mHandlerThread.start();
        Looper looper = mHandlerThread.getLooper();
        
        simulatedCallState = new SimulatedGsmCallState(looper);
        
        setRadioState(RadioState.RADIO_OFF);
        mSimLockedState = INITIAL_LOCK_STATE;
        mSimLockEnabled = (mSimLockedState != SimLockState.NONE);
        mPinCode = DEFAULT_SIM_PIN_CODE;
        mSimFdnEnabledState = INITIAL_FDN_STATE;
        mSimFdnEnabled = (mSimFdnEnabledState != SimFdnState.NONE);
        mPin2Code = DEFAULT_SIM_PIN2_CODE;
    
Methods Summary
public voidacceptCall(android.os.Message result)
ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;
        
        success = simulatedCallState.onAnswer();

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidacknowledgeLastIncomingSMS(boolean success, android.os.Message result)

        unimplemented(result);
    
public voidcancelPendingUssd(android.os.Message response)

        resultSuccess(response, null);
    
public voidchangeBarringPassword(java.lang.String facility, java.lang.String oldPwd, java.lang.String newPwd, android.os.Message result)

        unimplemented(result);
    
public voidchangeSimPin(java.lang.String oldPin, java.lang.String newPin, android.os.Message result)

        if (oldPin != null && oldPin.equals(mPinCode)) {
            mPinCode = newPin;
            if (result != null) {
                AsyncResult.forMessage(result, null, null);
                result.sendToTarget();
            }

            return;
        }

        if (result != null) {
            Log.i(LOG_TAG, "[SimCmd] changeSimPin: pin failed!");

            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
        }
    
public voidchangeSimPin2(java.lang.String oldPin2, java.lang.String newPin2, android.os.Message result)

        if (oldPin2 != null && oldPin2.equals(mPin2Code)) {
            mPin2Code = newPin2;
            if (result != null) {
                AsyncResult.forMessage(result, null, null);
                result.sendToTarget();
            }

            return;
        }

        if (result != null) {
            Log.i(LOG_TAG, "[SimCmd] changeSimPin: pin2 failed!");

            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
        }
    
public voidconference(android.os.Message result)
3GPP 22.030 6.5.5 "Adds a held call to the conversation" ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;
        
        success = simulatedCallState.onChld('3", '\0");

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voiddeactivateDefaultPDP(int cid, android.os.Message result)

unimplemented(result);
public voiddeleteSmsOnSim(int index, android.os.Message response)

        Log.d(LOG_TAG, "Delete message at index " + index);
        unimplemented(response);
    
public voiddial(java.lang.String address, int clirMode, android.os.Message result)
returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure CLIR_DEFAULT == on "use subscription default value" CLIR_SUPPRESSION == on "CLIR suppression" (allow CLI presentation) CLIR_INVOCATION == on "CLIR invocation" (restrict CLI presentation)

        simulatedCallState.onDial(address);

        resultSuccess(result, null);
    
public voidexplicitCallTransfer(android.os.Message result)
3GPP 22.030 6.5.5 "Connects the two calls and disconnects the subscriber from both calls" ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;

        success = simulatedCallState.onChld('4", '\0");

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidgetAvailableNetworks(android.os.Message result)
Queries the currently available networks ((AsyncResult)response.obj).result is a List of NetworkInfo objects

unimplemented(result);
public voidgetBasebandVersion(android.os.Message result)

        resultSuccess(result, "SimulatedCommands"); 
    
public voidgetCLIR(android.os.Message result)
response.obj will be a an int[2] response.obj[0] will be TS 27.007 +CLIR parameter 'n' 0 presentation indicator is used according to the subscription of the CLIR service 1 CLIR invocation 2 CLIR suppression response.obj[1] will be TS 27.007 +CLIR parameter 'm' 0 CLIR not provisioned 1 CLIR provisioned in permanent mode 2 unknown (e.g. no network, etc.) 3 CLIR temporary mode presentation restricted 4 CLIR temporary mode presentation allowed

unimplemented(result);
public voidgetCurrentCalls(android.os.Message result)
returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result contains a List of DriverCall The ar.result List is sorted by DriverCall.index

        if (mState == RadioState.SIM_READY) {
            //Log.i("GSM", "[SimCmds] getCurrentCalls");
            resultSuccess(result, simulatedCallState.getDriverCalls());
        } else {
            //Log.i("GSM", "[SimCmds] getCurrentCalls: SIM not ready!");
            resultFail(result, 
                new CommandException(
                    CommandException.Error.RADIO_NOT_AVAILABLE));
        }
    
public voidgetGPRSRegistrationState(android.os.Message result)
response.obj.result is an String[4] response.obj.result[0] is registration state 0-5 from TS 27.007 7.2 response.obj.result[1] is LAC if registered or NULL if not response.obj.result[2] is CID if registered or NULL if not response.obj.result[3] indicates the available radio technology, where: 0 == unknown 1 == GPRS only 2 == EDGE 3 == UMTS valid LAC are 0x0000 - 0xffff valid CID are 0x00000000 - 0xffffffff Please note that registration state 4 ("unknown") is treated as "out of service" in the Android telephony system

        String ret[] = new String[4];

        ret[0] = "5"; // registered roam
        ret[1] = null;
        ret[2] = null;
        ret[3] = "2";

        resultSuccess(result, ret);
    
public voidgetIMEI(android.os.Message result)
returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is String containing IMEI on success

        resultSuccess(result, "012345678901234");
    
public voidgetIMEISV(android.os.Message result)
returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is String containing IMEISV on success

        resultSuccess(result, "99");
    
public voidgetIMSI(android.os.Message result)
returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is String containing IMSI on success

        resultSuccess(result, "012345678901234");
    
public voidgetLastCallFailCause(android.os.Message result)
cause code returned as Integer in Message.obj.response Returns integer cause code defined in TS 24.008 Annex H or closest approximation. Most significant codes: - Any defined in 22.001 F.4 (for generating busy/congestion) - Cause 68: ACM >= ACMMax

        int[] ret = new int[1];

        ret[0] = nextCallFailCause;
        resultSuccess(result, ret);
    
public voidgetLastPdpFailCause(android.os.Message result)

        unimplemented(result);
    
public voidgetMute(android.os.Message result)

unimplemented(result);
public voidgetNeighboringCids(android.os.Message result)

        int ret[] = new int[7];

        ret[0] = 6;
        for (int i = 1; i<7; i++) {
            ret[i] = i;
        }
        resultSuccess(result, ret);
    
public voidgetNetworkSelectionMode(android.os.Message result)
Queries whether the current network selection mode is automatic or manual ((AsyncResult)response.obj).result is an int[] with element [0] being a 0 for automatic selection and a 1 for manual selection

        int ret[] = new int[1];

        ret[0] = 0;
        resultSuccess(result, ret);
    
public voidgetOperator(android.os.Message result)
response.obj.result is a String[3] response.obj.result[0] is long alpha or null if unregistered response.obj.result[1] is short alpha or null if unregistered response.obj.result[2] is numeric or null if unregistered

        String[] ret = new String[3];

        ret[0] = "El Telco Loco";
        ret[1] = "Telco Loco";
        ret[2] = "001001";

        resultSuccess(result, ret);
    
public voidgetPDPContextList(android.os.Message result)
returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result contains a List of PDPContextState

        resultSuccess(result, new ArrayList<PDPContextState>(0));
    
public voidgetPreferredNetworkType(android.os.Message result)

        int ret[] = new int[1];

        ret[0] = mNetworkType;
        resultSuccess(result, ret);
    
public voidgetRegistrationState(android.os.Message result)
response.obj.result is an String[3] response.obj.result[0] is registration state 0-5 from TS 27.007 7.2 response.obj.result[1] is LAC if registered or NULL if not response.obj.result[2] is CID if registered or NULL if not valid LAC are 0x0000 - 0xffff valid CID are 0x00000000 - 0xffffffff Please note that registration state 4 ("unknown") is treated as "out of service" above

        String ret[] = new String[3];

        ret[0] = "5"; // registered roam
        ret[1] = null;
        ret[2] = null;

        resultSuccess(result, ret);
    
public voidgetSignalStrength(android.os.Message result)
response.obj is an AsyncResult response.obj.result is an int[2] response.obj.result[0] is received signal strength (0-31, 99) response.obj.result[1] is bit error rate (0-7, 99) as defined in TS 27.007 8.5

        int ret[] = new int[2];

        ret[0] = 23;
        ret[1] = 0;

        resultSuccess(result, ret);
    
public voidgetSimStatus(android.os.Message result)

        switch (mState) {
            case SIM_READY:
                resultSuccess(result, SimStatus.SIM_READY);
                break;

            case SIM_LOCKED_OR_ABSENT:
                returnSimLockedStatus(result);
                break;

            default:
                resultSuccess(result, SimStatus.SIM_NOT_READY);
                break;
        }
    
public voidhandleCallSetupRequestFromSim(boolean accept, android.os.Message response)
{@inheritDoc}

        resultSuccess(response, null);
    
public voidhangupConnection(int gsmIndex, android.os.Message result)
Hang up one individual connection. returned message retMsg.obj = AsyncResult ar ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure 3GPP 22.030 6.5.5 "Releases a specific active call X"

        boolean success;
        
        success = simulatedCallState.onChld('1", (char)('0"+gsmIndex));

        if (!success){
            Log.i("GSM", "[SimCmd] hangupConnection: resultFail");
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            Log.i("GSM", "[SimCmd] hangupConnection: resultSuccess");
            resultSuccess(result, null);
        }
    
public voidhangupForegroundResumeBackground(android.os.Message result)
3GPP 22.030 6.5.5 "Releases all active calls (if any exist) and accepts the other (held or waiting) call." ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;
        
        success = simulatedCallState.onChld('1", '\0");

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidhangupWaitingOrBackground(android.os.Message result)
3GPP 22.030 6.5.5 "Releases all held calls or sets User Determined User Busy (UDUB) for a waiting call." ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;
        
        success = simulatedCallState.onChld('0", '\0");

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidinvokeOemRilRequestRaw(byte[] data, android.os.Message response)

        // Just echo back data
        if (response != null) {
            AsyncResult.forMessage(response).result = data;
            response.sendToTarget();
        }
    
public voidinvokeOemRilRequestStrings(java.lang.String[] strings, android.os.Message response)

        // Just echo back data
        if (response != null) {
            AsyncResult.forMessage(response).result = strings;
            response.sendToTarget();
        }
    
private booleanisSimLocked()

        if (mSimLockedState != SimLockState.NONE) {
            return true;
        }
        return false;
    
public voidpauseResponses()

        pausedResponseCount++;
    
public voidprogressConnectingCallState()

        simulatedCallState.progressConnectingCallState();
        mCallStateRegistrants.notifyRegistrants();
    
public voidprogressConnectingToActive()
If a call is DIALING or ALERTING, progress it all the way to ACTIVE

        simulatedCallState.progressConnectingToActive();
        mCallStateRegistrants.notifyRegistrants();
    
public voidqueryAvailableBandMode(android.os.Message result)
Query the list of band mode supported by RF.

param
result is callback message ((AsyncResult)response.obj).result is an int[] with every element representing one avialable BM_*_BAND

        int ret[] = new int [4];

        ret[0] = 4;
        ret[1] = Phone.BM_US_BAND;
        ret[2] = Phone.BM_JPN_BAND;
        ret[3] = Phone.BM_AUS_BAND;

        resultSuccess(result, ret);
    
public voidqueryCLIP(android.os.Message response)
(AsyncResult)response.obj).result is an int[] with element [0] set to 1 for "CLIP is provisioned", and 0 for "CLIP is not provisioned".

param
response is callback message

 unimplemented(response); 
public voidqueryCallForwardStatus(int cfReason, int serviceClass, java.lang.String number, android.os.Message result)
cfReason is one of CF_REASON_* ((AsyncResult)response.obj).result will be an array of CallForwardInfo's An array of length 0 means "disabled for all codes"

unimplemented(result);
public voidqueryCallWaiting(int serviceClass, android.os.Message response)
(AsyncResult)response.obj).result is an int[] with element [0] set to 0 for disabled, 1 for enabled.

param
serviceClass is a sum of SERVICE_CLASS_*
param
response is callback message

        unimplemented(response);
    
public voidqueryFacilityLock(java.lang.String facility, java.lang.String pin, int serviceClass, android.os.Message result)
(AsyncResult)response.obj).result will be an Integer representing the sum of enabled serivice classes (sum of SERVICE_CLASS_*)

param
facility one of CB_FACILTY_*
param
pin password or "" if not required
param
serviceClass is a sum of SERVICE_CLASS_*

        if (facility != null &&
                facility.equals(CommandsInterface.CB_FACILITY_BA_SIM)) {
            if (result != null) {
                int[] r = new int[1];
                r[0] = (mSimLockEnabled ? 1 : 0);
                Log.i(LOG_TAG, "[SimCmd] queryFacilityLock: SIM is " +
                        (r[0] == 0 ? "unlocked" : "locked"));
                AsyncResult.forMessage(result, r, null);
                result.sendToTarget();
            }
            return;
        } else if (facility != null &&
                facility.equals(CommandsInterface.CB_FACILITY_BA_FD)) {
            if (result != null) {
                int[] r = new int[1];
                r[0] = (mSimFdnEnabled ? 1 : 0);
                Log.i(LOG_TAG, "[SimCmd] queryFacilityLock: FDN is " +
                        (r[0] == 0 ? "disabled" : "enabled"));
                AsyncResult.forMessage(result, r, null);
                result.sendToTarget();
            }
            return;
        }

        unimplemented(result);
    
public voidrejectCall(android.os.Message result)
also known as UDUB ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;
        
        success = simulatedCallState.onChld('0", '\0");

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidresetRadio(android.os.Message result)

        unimplemented(result);
    
private voidresultFail(android.os.Message result, java.lang.Throwable tr)

        if (result != null) {
            AsyncResult.forMessage(result).exception = tr;
            if (pausedResponseCount > 0) {
                pausedResponses.add(result);
            } else {
                result.sendToTarget();
            }
        }
    
private voidresultSuccess(android.os.Message result, java.lang.Object ret)

        if (result != null) {
            AsyncResult.forMessage(result).result = ret;
            if (pausedResponseCount > 0) {
                pausedResponses.add(result);
            } else {
                result.sendToTarget();
            }
        }
    
public voidresumeResponses()

        pausedResponseCount--;

        if (pausedResponseCount == 0) {
            for (int i = 0, s = pausedResponses.size(); i < s ; i++) {
                pausedResponses.get(i).sendToTarget();
            }
            pausedResponses.clear();
        } else {
            Log.e("GSM", "SimulatedCommands.resumeResponses < 0");
        }
    
private voidreturnSimLockedStatus(android.os.Message result)

        switch (mSimLockedState) {
            case REQUIRE_PIN:
                Log.i(LOG_TAG, "[SimCmd] returnSimLockedStatus: SIM_PIN");
                resultSuccess(result, SimStatus.SIM_PIN);
                break;

            case REQUIRE_PUK:
                Log.i(LOG_TAG, "[SimCmd] returnSimLockedStatus: SIM_PUK");
                resultSuccess(result, SimStatus.SIM_PUK);
                break;

            default:
                Log.i(LOG_TAG,
                        "[SimCmd] returnSimLockedStatus: mSimLockedState==NONE !?");
                break;
        }
    
public voidsendDtmf(char c, android.os.Message result)
ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        resultSuccess(result, null);
    
public voidsendEnvelope(java.lang.String contents, android.os.Message response)
{@inheritDoc}

        resultSuccess(response, null);
    
public voidsendSMS(java.lang.String smscPDU, java.lang.String pdu, android.os.Message result)
smscPDU is smsc address in PDU form GSM BCD format prefixed by a length byte (as expected by TS 27.005) or NULL for default SMSC pdu is SMS in PDU format as an ASCII hex string less the SMSC address

unimplemented(result);
public voidsendTerminalResponse(java.lang.String contents, android.os.Message response)
{@inheritDoc}

        resultSuccess(response, null);
    
public voidsendUSSD(java.lang.String ussdString, android.os.Message result)


        // We simulate this particular sequence
        if (ussdString.equals("#646#")) {
            resultSuccess(result, null);

            // 0 == USSD-Notify
            triggerIncomingUssd("0", "You have NNN minutes remaining.");
        } else {
            resultSuccess(result, null);

            triggerIncomingUssd("0", "All Done");
        }
    
public voidseparateConnection(int gsmIndex, android.os.Message result)
3GPP 22.030 6.5.5 "Places all active calls on hold except call X with which communication shall be supported."

        boolean success;

        char ch = (char)(gsmIndex + '0");
        success = simulatedCallState.onChld('2", ch);

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidsetAutoProgressConnectingCall(boolean b)
automatically progress mobile originated calls to ACTIVE. default to true

        simulatedCallState.setAutoProgressConnectingCall(b);
    
public voidsetBandMode(int bandMode, android.os.Message result)
Assign a specified band for RF configuration.

param
bandMode one of BM_*_BAND
param
result is callback message

        resultSuccess(result, null);
    
public voidsetCLIR(int clirMode, android.os.Message result)
clirMode is one of the CLIR_* constants above response.obj is null

unimplemented(result);
public voidsetCallForward(int action, int cfReason, int serviceClass, java.lang.String number, int timeSeconds, android.os.Message result)

param
action is one of CF_ACTION_*
param
cfReason is one of CF_REASON_*
param
serviceClass is a sum of SERVICE_CLASSS_*

unimplemented(result);
public voidsetCallWaiting(boolean enable, int serviceClass, android.os.Message response)

param
enable is true to enable, false to disable
param
serviceClass is a sum of SERVICE_CLASS_*
param
response is callback message

        unimplemented(response);
    
public voidsetFacilityLock(java.lang.String facility, boolean lockEnabled, java.lang.String pin, int serviceClass, android.os.Message result)

param
facility one of CB_FACILTY_*
param
lockEnabled true if SIM lock is enabled
param
pin the SIM pin or "" if not required
param
serviceClass is a sum of SERVICE_CLASS_*

        if (facility != null &&
                facility.equals(CommandsInterface.CB_FACILITY_BA_SIM)) {
            if (pin != null && pin.equals(mPinCode)) {
                Log.i(LOG_TAG, "[SimCmd] setFacilityLock: pin is valid");
                mSimLockEnabled = lockEnabled;

                if (result != null) {
                    AsyncResult.forMessage(result, null, null);
                    result.sendToTarget();
                }

                return;
            }

            if (result != null) {
                Log.i(LOG_TAG, "[SimCmd] setFacilityLock: pin failed!");

                CommandException ex = new CommandException(
                        CommandException.Error.GENERIC_FAILURE);
                AsyncResult.forMessage(result, null, ex);
                result.sendToTarget();
            }

            return;
        }  else if (facility != null &&
                facility.equals(CommandsInterface.CB_FACILITY_BA_FD)) {
            if (pin != null && pin.equals(mPin2Code)) {
                Log.i(LOG_TAG, "[SimCmd] setFacilityLock: pin2 is valid");
                mSimFdnEnabled = lockEnabled;

                if (result != null) {
                    AsyncResult.forMessage(result, null, null);
                    result.sendToTarget();
                }

                return;
            }

            if (result != null) {
                Log.i(LOG_TAG, "[SimCmd] setFacilityLock: pin2 failed!");

                CommandException ex = new CommandException(
                        CommandException.Error.GENERIC_FAILURE);
                AsyncResult.forMessage(result, null, ex);
                result.sendToTarget();
            }

            return;
        }

        unimplemented(result);
    
public voidsetLocationUpdates(boolean enable, android.os.Message response)

        unimplemented(response);
    
public voidsetMute(boolean enableMute, android.os.Message result)

unimplemented(result);
public voidsetNetworkSelectionModeAutomatic(android.os.Message result)

unimplemented(result);
public voidsetNetworkSelectionModeManual(java.lang.String operatorNumeric, android.os.Message result)

unimplemented(result);
public voidsetNextCallFailCause(int gsmCause)

        nextCallFailCause = gsmCause;    
    
public voidsetNextDialFailImmediately(boolean b)

        simulatedCallState.setNextDialFailImmediately(b);
    
public voidsetPreferredNetworkType(int networkType, android.os.Message result)

        mNetworkType = networkType;
        resultSuccess(result, null);
    
public voidsetRadioPower(boolean on, android.os.Message result)

        if(on) {
            if (isSimLocked()) {
                Log.i("SIM", "[SimCmd] setRadioPower: SIM locked! state=" +
                        mSimLockedState);
                setRadioState(RadioState.SIM_LOCKED_OR_ABSENT);
            }
            else {
                setRadioState(RadioState.SIM_READY);
            }
        } else {
            setRadioState(RadioState.RADIO_OFF);
        }
    
public voidsetSuppServiceNotifications(boolean enable, android.os.Message result)

        resultSuccess(result, null);
        
        if (enable && mSsnNotifyOn) {
            Log.w(LOG_TAG, "Supp Service Notifications already enabled!");
        }
        
        mSsnNotifyOn = enable;
    
public voidsetupDefaultPDP(java.lang.String apn, java.lang.String user, java.lang.String password, android.os.Message result)

        unimplemented(result);
    
public voidshutdown()

        setRadioState(RadioState.RADIO_UNAVAILABLE);
        Looper looper = mHandlerThread.getLooper();
        if (looper != null) {
            looper.quit();
        }
    
public voidsimIO(int command, int fileid, java.lang.String path, int p1, int p2, int p3, java.lang.String data, java.lang.String pin2, android.os.Message result)
parameters equivilient to 27.007 AT+CRSM command response.obj will be an AsyncResult response.obj.userObj will be a SimIoResult on success

        unimplemented(result);
    
public voidstartDtmf(char c, android.os.Message result)
ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        resultSuccess(result, null);
    
public voidstopDtmf(android.os.Message result)
ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        resultSuccess(result, null);
    
public voidsupplyNetworkDepersonalization(java.lang.String netpin, android.os.Message result)

        unimplemented(result);
    
public voidsupplySimPin(java.lang.String pin, android.os.Message result)

        if (mSimLockedState != SimLockState.REQUIRE_PIN) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPin: wrong state, state=" +
                    mSimLockedState);
            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
            return;
        }

        if (pin != null && pin.equals(mPinCode)) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPin: success!");
            setRadioState(RadioState.SIM_READY);
            mPinUnlockAttempts = 0;
            mSimLockedState = SimLockState.NONE;

            if (result != null) {
                AsyncResult.forMessage(result, null, null);
                result.sendToTarget();
            }

            return;
        }

        if (result != null) {
            mPinUnlockAttempts ++;

            Log.i(LOG_TAG, "[SimCmd] supplySimPin: failed! attempt=" +
                    mPinUnlockAttempts);
            if (mPinUnlockAttempts >= 3) {
                Log.i(LOG_TAG, "[SimCmd] supplySimPin: set state to REQUIRE_PUK");
                mSimLockedState = SimLockState.REQUIRE_PUK;
            }

            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
        }
    
public voidsupplySimPin2(java.lang.String pin2, android.os.Message result)

        if (mSimFdnEnabledState != SimFdnState.REQUIRE_PIN2) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPin2: wrong state, state=" +
                    mSimFdnEnabledState);
            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
            return;
        }

        if (pin2 != null && pin2.equals(mPin2Code)) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPin2: success!");
            mPin2UnlockAttempts = 0;
            mSimFdnEnabledState = SimFdnState.NONE;

            if (result != null) {
                AsyncResult.forMessage(result, null, null);
                result.sendToTarget();
            }

            return;
        }

        if (result != null) {
            mPin2UnlockAttempts ++;

            Log.i(LOG_TAG, "[SimCmd] supplySimPin2: failed! attempt=" +
                    mPin2UnlockAttempts);
            if (mPin2UnlockAttempts >= 3) {
                Log.i(LOG_TAG, "[SimCmd] supplySimPin2: set state to REQUIRE_PUK2");
                mSimFdnEnabledState = SimFdnState.REQUIRE_PUK2;
            }

            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
        }
    
public voidsupplySimPuk(java.lang.String puk, java.lang.String newPin, android.os.Message result)

        if (mSimLockedState != SimLockState.REQUIRE_PUK) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPuk: wrong state, state=" +
                    mSimLockedState);
            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
            return;
        }

        if (puk != null && puk.equals(SIM_PUK_CODE)) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPuk: success!");
            setRadioState(RadioState.SIM_READY);
            mSimLockedState = SimLockState.NONE;
            mPukUnlockAttempts = 0;

            if (result != null) {
                AsyncResult.forMessage(result, null, null);
                result.sendToTarget();
            }

            return;
        }

        if (result != null) {
            mPukUnlockAttempts ++;

            Log.i(LOG_TAG, "[SimCmd] supplySimPuk: failed! attempt=" +
                    mPukUnlockAttempts);
            if (mPukUnlockAttempts >= 10) {
                Log.i(LOG_TAG, "[SimCmd] supplySimPuk: set state to SIM_PERM_LOCKED");
                mSimLockedState = SimLockState.SIM_PERM_LOCKED;
            }

            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
        }
    
public voidsupplySimPuk2(java.lang.String puk2, java.lang.String newPin2, android.os.Message result)

        if (mSimFdnEnabledState != SimFdnState.REQUIRE_PUK2) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPuk2: wrong state, state=" +
                    mSimLockedState);
            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
            return;
        }

        if (puk2 != null && puk2.equals(SIM_PUK2_CODE)) {
            Log.i(LOG_TAG, "[SimCmd] supplySimPuk2: success!");
            mSimFdnEnabledState = SimFdnState.NONE;
            mPuk2UnlockAttempts = 0;

            if (result != null) {
                AsyncResult.forMessage(result, null, null);
                result.sendToTarget();
            }

            return;
        }

        if (result != null) {
            mPuk2UnlockAttempts ++;

            Log.i(LOG_TAG, "[SimCmd] supplySimPuk2: failed! attempt=" +
                    mPuk2UnlockAttempts);
            if (mPuk2UnlockAttempts >= 10) {
                Log.i(LOG_TAG, "[SimCmd] supplySimPuk2: set state to SIM_PERM_LOCKED");
                mSimFdnEnabledState = SimFdnState.SIM_PERM_LOCKED;
            }

            CommandException ex = new CommandException(
                    CommandException.Error.PASSWORD_INCORRECT);
            AsyncResult.forMessage(result, null, ex);
            result.sendToTarget();
        }
    
public voidswitchWaitingOrHoldingAndActive(android.os.Message result)
3GPP 22.030 6.5.5 "Places all active calls (if any exist) on hold and accepts the other (held or waiting) call." ar.exception carries exception on failure ar.userObject contains the orignal value of result.obj ar.result is null on success and failure

        boolean success;
        
        success = simulatedCallState.onChld('2", '\0");

        if (!success){
            resultFail(result, new RuntimeException("Hangup Error"));
        } else {
            resultSuccess(result, null);
        }
    
public voidtriggerHangupAll()
hangup all

        simulatedCallState.triggerHangupAll();
        mCallStateRegistrants.notifyRegistrants();
    
public voidtriggerHangupBackground()
hangup holding calls

        simulatedCallState.triggerHangupBackground();
        mCallStateRegistrants.notifyRegistrants();
    
public voidtriggerHangupForeground()

        simulatedCallState.triggerHangupForeground();
        mCallStateRegistrants.notifyRegistrants();
    
public voidtriggerIncomingSMS(java.lang.String message)

        //TODO
    
public voidtriggerIncomingUssd(java.lang.String statusCode, java.lang.String message)
Simulates an incoming USSD message

param
statusCode Status code string. See setOnUSSD in CommandsInterface.java
param
message Message text to send or null if none

        if (mUSSDRegistrant != null) {
            String[] result = {statusCode, message};
            mUSSDRegistrant.notifyResult(result);            
        }
    
public voidtriggerRing(java.lang.String number)
Start the simulated phone ringing

        simulatedCallState.triggerRing(number);
        mCallStateRegistrants.notifyRegistrants();
    
public voidtriggerSsn(int type, int code)

        SuppServiceNotification not = new SuppServiceNotification();
        not.notificationType = type;
        not.code = code;
        mSsnRegistrant.notifyRegistrant(new AsyncResult(null, not, null));
    
private voidunimplemented(android.os.Message result)

        if (result != null) {
            AsyncResult.forMessage(result).exception 
                = new RuntimeException("Unimplemented");

            if (pausedResponseCount > 0) {
                pausedResponses.add(result);
            } else {
                result.sendToTarget();
            }
        }
    
public voidwriteSmsToSim(int status, java.lang.String smsc, java.lang.String pdu, android.os.Message response)

        Log.d(LOG_TAG, "Write SMS to SIM with status " + status);
        unimplemented(response);