summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--telephony/java/com/android/internal/telephony/SemcRIL.java649
1 files changed, 301 insertions, 348 deletions
diff --git a/telephony/java/com/android/internal/telephony/SemcRIL.java b/telephony/java/com/android/internal/telephony/SemcRIL.java
index 9288aa1..837f148 100644
--- a/telephony/java/com/android/internal/telephony/SemcRIL.java
+++ b/telephony/java/com/android/internal/telephony/SemcRIL.java
@@ -1,8 +1,6 @@
/*
* Copyright (C) 2011 The CyanogenMod Project
*
- * Diogo Ferreira, Andreas Makris, Alin Jerpelea
- *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -20,247 +18,208 @@ package com.android.internal.telephony;
import static com.android.internal.telephony.RILConstants.*;
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Message;
-import android.os.Parcel;
-import android.os.SystemProperties;
+import android.content.*;
+import android.net.*;
+import android.os.*;
+import android.telephony.*;
import android.text.TextUtils;
import android.util.Log;
-import android.net.ConnectivityManager;
-import android.net.LocalSocket;
-import android.net.LocalSocketAddress;
-
-import com.android.internal.telephony.DataCallState;
-import com.android.internal.telephony.DataConnection.FailCause;
-import com.android.internal.telephony.OperatorInfo;
-import com.android.internal.telephony.IccCardApplication;
-import com.android.internal.telephony.IccCardStatus;
-
-import java.util.ArrayList;
-
+import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
+import com.android.internal.telephony.cdma.CdmaInformationRecords;
+import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
+import com.android.internal.telephony.gsm.SuppServiceNotification;
+import java.io.*;
+import java.util.*;
/**
* Custom SEMC ril
*
* {@hide}
*/
-public class SemcRIL extends QualcommNoSimReadyRIL implements CommandsInterface {
- protected String mAid;
-
- boolean RILJ_LOGV = true;
- boolean RILJ_LOGD = true;
+public class SemcRIL extends RIL {
+ String mAid = "";
+ IccHandler mIccHandler;
+ HandlerThread mIccThread;
public SemcRIL(Context context, int networkMode, int cdmaSubscription) {
super(context, networkMode, cdmaSubscription);
+ mIccHandler = null;
}
@Override
- public void
- supplyIccPin(String pin, Message result) {
- // but this request is also valid for SIM and RUIM
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN, result);
-
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- rr.mp.writeString(pin);
-
- send(rr);
+ protected RadioState getRadioStateFromInt(int stateInt) {
+ RadioState state;
+
+ /* RIL_RadioState ril.h */
+ switch(stateInt) {
+ case 0: state = RadioState.RADIO_OFF; break;
+ case 1: state = RadioState.RADIO_UNAVAILABLE; break;
+ case 2: {
+ if (mIccHandler == null)
+ {
+ mIccThread = new HandlerThread("IccHandler");
+ mIccThread.start();
+ mIccHandler = new IccHandler(this, mIccThread.getLooper());
+ }
+ mIccHandler.run();
+ state = mPhoneType == RILConstants.CDMA_PHONE ? RadioState.RUIM_NOT_READY : RadioState.SIM_NOT_READY;
+ break;
+ }
+ case 3: state = RadioState.SIM_LOCKED_OR_ABSENT; break;
+ case 4: state = RadioState.SIM_READY; break;
+ case 5: state = RadioState.RUIM_NOT_READY; break;
+ case 6: state = RadioState.RUIM_READY; break;
+ case 7: state = RadioState.RUIM_LOCKED_OR_ABSENT; break;
+ case 8: state = RadioState.NV_NOT_READY; break;
+ case 9: state = RadioState.NV_READY; break;
+
+ default:
+ throw new RuntimeException(
+ "Unrecognized RIL_RadioState: " + stateInt);
+ }
+ return state;
}
@Override
- public void
- supplyIccPuk(String puk, String newPin, Message result) {
- //Note: This RIL request has not been renamed to ICC,
- // but this request is also valid for SIM and RUIM
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK, result);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- rr.mp.writeString(puk);
- rr.mp.writeString(newPin);
+ protected Object
+ responseIccCardStatus(Parcel p) {
+ IccCardApplication ca;
- send(rr);
- }
+ IccCardStatus status = new IccCardStatus();
+ status.setCardState(p.readInt());
+ status.setUniversalPinState(p.readInt());
+ status.setGsmUmtsSubscriptionAppIndex(p.readInt());
+ status.setCdmaSubscriptionAppIndex(p.readInt());
+ status.setImsSubscriptionAppIndex(p.readInt());
- @Override
- public void
- supplyIccPin2(String pin, Message result) {
- //Note: This RIL request has not been renamed to ICC,
- // but this request is also valid for SIM and RUIM
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN2, result);
+ int numApplications = p.readInt();
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ // limit to maximum allowed applications
+ if (numApplications > IccCardStatus.CARD_MAX_APPS) {
+ numApplications = IccCardStatus.CARD_MAX_APPS;
+ }
+ status.setNumApplications(numApplications);
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- rr.mp.writeString(pin);
+ for (int i = 0 ; i < numApplications ; i++) {
+ ca = new IccCardApplication();
+ ca.app_type = ca.AppTypeFromRILInt(p.readInt());
+ ca.app_state = ca.AppStateFromRILInt(p.readInt());
+ ca.perso_substate = ca.PersoSubstateFromRILInt(p.readInt());
+ ca.aid = p.readString();
+ ca.app_label = p.readString();
+ ca.pin1_replaced = p.readInt();
+ ca.pin1 = ca.PinStateFromRILInt(p.readInt());
+ ca.pin2 = ca.PinStateFromRILInt(p.readInt());
+ status.addApplication(ca);
+ }
- send(rr);
+ updateIccType(status);
+ return status;
}
- @Override
- public void
- supplyIccPuk2(String puk, String newPin2, Message result) {
- //Note: This RIL request has not been renamed to ICC,
- // but this request is also valid for SIM and RUIM
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK2, result);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- rr.mp.writeString(puk);
- rr.mp.writeString(newPin2);
+ private void updateIccType (IccCardStatus status) {
+ if (status.getNumApplications() > 0)
+ {
+ int appType;
+ if (mPhoneType == RILConstants.CDMA_PHONE)
+ {
+ appType = status.getCdmaSubscriptionAppIndex();
+ } else {
+ appType = status.getGsmUmtsSubscriptionAppIndex();
+ }
- send(rr);
+ IccCardApplication application = status.getApplication(appType);
+ mAid = application.aid;
+ Log.d(LOG_TAG, "Picked default AID: " + mAid);
+ SystemProperties.set("ril.icctype", Integer.toString(application.app_type.ordinal()));
+ }
}
@Override
- public void
- changeIccPin(String oldPin, String newPin, Message result) {
- //Note: This RIL request has not been renamed to ICC,
- // but this request is also valid for SIM and RUIM
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN, result);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- rr.mp.writeString(oldPin);
- rr.mp.writeString(newPin);
+ protected DataCallState getDataCallState(Parcel p, int version) {
+ DataCallState dataCall = new DataCallState();
- send(rr);
+ dataCall.version = version;
+ if (version < 5) {
+ dataCall.cid = p.readInt();
+ dataCall.active = p.readInt();
+ dataCall.type = p.readString();
+ String addresses = p.readString();
+ if (!TextUtils.isEmpty(addresses)) {
+ dataCall.addresses = addresses.split(" ");
+ }
+ // DataCallState needs an ifname. Since we don't have one use the name from the ThrottleService resource (default=rmnet0).
+ dataCall.ifname = "rmnet0";
+ } else {
+ dataCall.status = p.readInt();
+ dataCall.suggestedRetryTime = p.readInt();
+ dataCall.cid = p.readInt();
+ dataCall.active = p.readInt();
+ dataCall.type = p.readString();
+ dataCall.ifname = p.readString();
+ if ((dataCall.status == DataConnection.FailCause.NONE.getErrorCode()) &&
+ TextUtils.isEmpty(dataCall.ifname)) {
+ throw new RuntimeException("getDataCallState, no ifname");
+ }
+ String addresses = p.readString();
+ if (!TextUtils.isEmpty(addresses)) {
+ dataCall.addresses = addresses.split(" ");
+ }
+ String dnses = p.readString();
+ if (!TextUtils.isEmpty(dnses)) {
+ dataCall.dnses = dnses.split(" ");
+ }
+ String gateways = p.readString();
+ if (!TextUtils.isEmpty(gateways)) {
+ dataCall.gateways = gateways.split(" ");
+ }
+ }
+ return dataCall;
}
- @Override
- public void
- changeIccPin2(String oldPin2, String newPin2, Message result) {
- //Note: This RIL request has not been renamed to ICC,
- // but this request is also valid for SIM and RUIM
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN2, result);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- rr.mp.writeString(oldPin2);
- rr.mp.writeString(newPin2);
- send(rr);
+ @Override public void
+ supplyIccPin(String pin, Message result) {
+ supplyIccPinForApp(pin, mAid, result);
}
- @Override
- public void
- supplyNetworkDepersonalization(String netpin, Message result) {
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, result);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(3);
- rr.mp.writeString(netpin);
-
- send(rr);
+ @Override public void
+ changeIccPin(String oldPin, String newPin, Message result) {
+ changeIccPinForApp(oldPin, newPin, mAid, result);
}
- @Override
- public void
- changeBarringPassword(String facility, String oldPwd, String newPwd, Message result) {
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_BARRING_PASSWORD, result);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- rr.mp.writeInt(3);
- rr.mp.writeString(facility);
- rr.mp.writeString(oldPwd);
- rr.mp.writeString(newPwd);
-
- send(rr);
+ @Override public void
+ supplyIccPin2(String pin, Message result) {
+ supplyIccPin2ForApp(pin, mAid, result);
}
-
- @Override
- public void
- dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
-
- rr.mp.writeString(address);
- rr.mp.writeInt(clirMode);
-
- if (uusInfo == null) {
- rr.mp.writeInt(0); // UUS information is absent
- } else {
- rr.mp.writeInt(1); // UUS information is present
- rr.mp.writeInt(uusInfo.getType());
- rr.mp.writeInt(uusInfo.getDcs());
- rr.mp.writeByteArray(uusInfo.getUserData());
- }
- rr.mp.writeInt(0xff);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- send(rr);
+ @Override public void
+ changeIccPin2(String oldPin2, String newPin2, Message result) {
+ changeIccPin2ForApp(oldPin2, newPin2, mAid, result);
}
- @Override
- public void
- getIMSI(Message result) {
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMSI, result);
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
- if (RILJ_LOGD) riljLog(rr.serialString() +
- "> getIMSI:RIL_REQUEST_GET_IMSI " +
- RIL_REQUEST_GET_IMSI +
- " " + requestToString(rr.mRequest));
+ @Override public void
+ supplyIccPuk(String puk, String newPin, Message result) {
+ supplyIccPukForApp(puk, newPin, mAid, result);
+ }
- send(rr);
+ @Override public void
+ supplyIccPuk2(String puk2, String newPin2, Message result) {
+ supplyIccPuk2ForApp(puk2, newPin2, mAid, result);
}
@Override
public void
- setupDataCall(String radioTechnology, String profile, String apn,
- String user, String password, String authType, String ipVersion,
- Message result) {
- RILRequest rr
- = RILRequest.obtain(RIL_REQUEST_SETUP_DATA_CALL, result);
-
- rr.mp.writeInt(7);
-
- rr.mp.writeString(radioTechnology);
- rr.mp.writeString(profile);
- rr.mp.writeString(apn);
- rr.mp.writeString(user);
- rr.mp.writeString(password);
- rr.mp.writeString(authType);
- rr.mp.writeString(ipVersion);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> "
- + requestToString(rr.mRequest) + " " + radioTechnology + " "
- + profile + " " + apn + " " + user + " "
- + password + " " + authType + " " + ipVersion);
-
- send(rr);
+ queryFacilityLock(String facility, String password, int serviceClass,
+ Message response) {
+ queryFacilityLockForApp(facility, password, serviceClass, mAid, response);
}
@Override
public void
- deactivateDataCall(int cid, int reason, Message result) {
- RILRequest rr
- = RILRequest.obtain(RIL_REQUEST_DEACTIVATE_DATA_CALL, result);
-
- rr.mp.writeInt(2);
- rr.mp.writeString(Integer.toString(cid));
- rr.mp.writeString(Integer.toString(reason));
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " +
- requestToString(rr.mRequest) + " " + cid + " " + reason);
-
- send(rr);
+ setFacilityLock (String facility, boolean lockState, String password,
+ int serviceClass, Message response) {
+ setFacilityLockForApp(facility, lockState, password, serviceClass, mAid, response);
}
@Override
@@ -272,8 +231,6 @@ public class SemcRIL extends QualcommNoSimReadyRIL implements CommandsInterface
RILRequest rr
= RILRequest.obtain(RIL_REQUEST_SIM_IO, result);
- rr.mp.writeInt(0);
- rr.mp.writeString(mAid);
rr.mp.writeInt(command);
rr.mp.writeInt(fileid);
rr.mp.writeString(path);
@@ -282,6 +239,7 @@ public class SemcRIL extends QualcommNoSimReadyRIL implements CommandsInterface
rr.mp.writeInt(p3);
rr.mp.writeString(data);
rr.mp.writeString(pin2);
+ rr.mp.writeString(mAid);
if (RILJ_LOGD) riljLog(rr.serialString() + "> iccIO: " + requestToString(rr.mRequest)
+ " 0x" + Integer.toHexString(command)
@@ -294,6 +252,17 @@ public class SemcRIL extends QualcommNoSimReadyRIL implements CommandsInterface
@Override
public void
+ getIMSI(Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMSI, result);
+ rr.mp.writeString(mAid);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
+
+ @Override
+ public void
setNetworkSelectionModeAutomatic(Message response) {
RILRequest rr
= RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,
@@ -303,6 +272,7 @@ public class SemcRIL extends QualcommNoSimReadyRIL implements CommandsInterface
rr.mp.writeString(null);
rr.mp.writeInt(-1);
+
send(rr);
}
@@ -323,179 +293,162 @@ public class SemcRIL extends QualcommNoSimReadyRIL implements CommandsInterface
}
@Override
- public void
- queryFacilityLock (String facility, String password, int serviceClass,
- Message response) {
- RILRequest rr = RILRequest.obtain(RIL_REQUEST_QUERY_FACILITY_LOCK, response);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- // count strings
- rr.mp.writeInt(5);
- rr.mp.writeString("0");
- rr.mp.writeString(mAid);
- rr.mp.writeString(facility);
- rr.mp.writeString(password);
-
- rr.mp.writeString(Integer.toString(serviceClass));
-
- send(rr);
- }
-
- @Override
- public void
- setFacilityLock (String facility, boolean lockState, String password,
- int serviceClass, Message response) {
- String lockString;
- RILRequest rr
- = RILRequest.obtain(RIL_REQUEST_SET_FACILITY_LOCK, response);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
-
- // count strings
- rr.mp.writeInt(6);
-
- rr.mp.writeString("0");
- rr.mp.writeString(mAid);
- rr.mp.writeString(facility);
- lockString = (lockState)?"1":"0";
- rr.mp.writeString(lockString);
- rr.mp.writeString(password);
- rr.mp.writeString(Integer.toString(serviceClass));
-
- send(rr);
-
- }
-
- @Override
protected Object
- responseIccCardStatus(Parcel p) {
- IccCardApplication ca;
-
- IccCardStatus status = new IccCardStatus();
- p.readInt(); // unknown first parameter
- status.setCardState(p.readInt());
- status.setUniversalPinState(p.readInt());
- int gsmUmtsSubscriptionAppCount = p.readInt();
-
- for (int i = 0; i < gsmUmtsSubscriptionAppCount; i++) {
- if (i == 0)
- status.setGsmUmtsSubscriptionAppIndex(p.readInt());
- else
- p.readInt();
- }
+ responseOperatorInfos(Parcel p) {
+ String strings[] = (String [])responseStrings(p);
+ ArrayList<OperatorInfo> ret;
- int cdmaSubscriptionAppCount = p.readInt();
- for (int i = 0; i < cdmaSubscriptionAppCount; i++) {
- if (i == 0)
- status.setCdmaSubscriptionAppIndex(p.readInt());
- else
- p.readInt();
+ if (strings.length % 5 != 0) {
+ throw new RuntimeException(
+ "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got "
+ + strings.length + " strings, expected multible of 5");
}
- int numApplications = p.readInt();
+ ret = new ArrayList<OperatorInfo>(strings.length / 4);
- // limit to maximum allowed applications
- if (numApplications > IccCardStatus.CARD_MAX_APPS) {
- numApplications = IccCardStatus.CARD_MAX_APPS;
+ for (int i = 0 ; i < strings.length ; i += 5) {
+ ret.add (
+ new OperatorInfo(
+ strings[i+0],
+ strings[i+1],
+ strings[i+2],
+ strings[i+3]));
}
- status.setNumApplications(numApplications);
+ return ret;
+ }
- for (int i = 0 ; i < numApplications ; i++) {
- ca = new IccCardApplication();
- ca.app_type = ca.AppTypeFromRILInt(p.readInt());
- ca.app_state = ca.AppStateFromRILInt(p.readInt());
- ca.perso_substate = ca.PersoSubstateFromRILInt(p.readInt());
- ca.aid = p.readString();
- ca.app_label = p.readString();
- ca.pin1_replaced = p.readInt();
- ca.pin1 = ca.PinStateFromRILInt(p.readInt());
- ca.pin2 = ca.PinStateFromRILInt(p.readInt());
- status.addApplication(ca);
- p.readInt();
- p.readInt();
- p.readInt();
- p.readInt();
- }
+ @Override
+ public void
+ dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
+ rr.mp.writeString(address);
+ rr.mp.writeInt(clirMode);
+ rr.mp.writeInt(0); // UUS information is absent
- int appIndex = -1;
- if (mPhoneType == RILConstants.CDMA_PHONE) {
- appIndex = status.getCdmaSubscriptionAppIndex();
- Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex);
+ if (uusInfo == null) {
+ rr.mp.writeInt(0); // UUS information is absent
} else {
- appIndex = status.getGsmUmtsSubscriptionAppIndex();
- Log.d(LOG_TAG, "This is a GSM PHONE " + appIndex);
+ rr.mp.writeInt(1); // UUS information is present
+ rr.mp.writeInt(uusInfo.getType());
+ rr.mp.writeInt(uusInfo.getDcs());
+ rr.mp.writeByteArray(uusInfo.getUserData());
}
+ rr.mp.writeInt(255);
- IccCardApplication application = status.getApplication(appIndex);
- mAid = application.aid;
-
- return status;
- }
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
- @Override
- protected DataCallState getDataCallState(Parcel p, int version) {
- DataCallState datacallstate = new DataCallState();
- datacallstate.version = 3;
- datacallstate.cid = p.readInt();
- datacallstate.active = p.readInt();
- datacallstate.type = p.readString();
- String s1 = p.readString();
- if(!TextUtils.isEmpty(s1)) {
- datacallstate.addresses = s1.split(" "); }
- datacallstate.ifname = "rmnet0";
- p.readInt();
- p.readInt();
- return datacallstate;
+ send(rr);
}
- @Override
- protected Object
- responseSetupDataCall(Parcel p) {
+ class IccHandler extends Handler implements Runnable {
+ private static final int EVENT_RADIO_ON = 1;
+ private static final int EVENT_ICC_STATUS_CHANGED = 2;
+ private static final int EVENT_GET_ICC_STATUS_DONE = 3;
+ private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 4;
- DataCallState dataCall;
+ private RIL mRil;
+ private boolean mRadioOn = false;
- dataCall = new DataCallState();
- dataCall.version = 3;
- dataCall.cid = 0;
- p.readInt();
- dataCall.ifname = p.readString();
- if (TextUtils.isEmpty(dataCall.ifname)) {
- throw new RuntimeException(
- "RIL_REQUEST_SETUP_DATA_CALL response, no ifname");
- }
+ public IccHandler (RIL ril, Looper looper) {
+ super (looper);
+ mRil = ril;
+ }
- String addresses = p.readString();
- if (!TextUtils.isEmpty(addresses)) {
- dataCall.addresses = addresses.split(" ");
+ public void handleMessage (Message paramMessage) {
+ switch (paramMessage.what) {
+ case EVENT_RADIO_ON:
+ mRadioOn = true;
+ Log.d(LOG_TAG, "Radio on -> Forcing sim status update");
+ sendMessage(obtainMessage(EVENT_ICC_STATUS_CHANGED));
+ break;
+ case EVENT_GET_ICC_STATUS_DONE:
+ AsyncResult asyncResult = (AsyncResult) paramMessage.obj;
+ if (asyncResult.exception != null) {
+ Log.e (LOG_TAG, "IccCardStatusDone shouldn't return exceptions!", asyncResult.exception);
+ break;
+ }
+ IccCardStatus status = (IccCardStatus) asyncResult.result;
+ if (status.getNumApplications() == 0) {
+ if (!mRil.getRadioState().isOn()) {
+ break;
+ }
+
+ if (mPhoneType == RILConstants.CDMA_PHONE) {
+ mRil.setRadioState(CommandsInterface.RadioState.RUIM_LOCKED_OR_ABSENT);
+ } else {
+ mRil.setRadioState(CommandsInterface.RadioState.SIM_LOCKED_OR_ABSENT);
+ }
+ } else {
+ int appIndex = -1;
+ if (mPhoneType == RILConstants.CDMA_PHONE) {
+ appIndex = status.getCdmaSubscriptionAppIndex();
+ Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex);
+ } else {
+ appIndex = status.getGsmUmtsSubscriptionAppIndex();
+ Log.d(LOG_TAG, "This is a GSM PHONE " + appIndex);
+ }
+
+ IccCardApplication application = status.getApplication(appIndex);
+ IccCardApplication.AppState app_state = application.app_state;
+ IccCardApplication.AppType app_type = application.app_type;
+
+ switch (app_state) {
+ case APPSTATE_PIN:
+ case APPSTATE_PUK:
+ switch (app_type) {
+ case APPTYPE_SIM:
+ case APPTYPE_USIM:
+ mRil.setRadioState(CommandsInterface.RadioState.SIM_LOCKED_OR_ABSENT);
+ break;
+ case APPTYPE_RUIM:
+ mRil.setRadioState(CommandsInterface.RadioState.RUIM_LOCKED_OR_ABSENT);
+ break;
+ default:
+ Log.e(LOG_TAG, "Currently we don't handle SIMs of type: " + app_type);
+ return;
+ }
+ break;
+ case APPSTATE_READY:
+ switch (app_type) {
+ case APPTYPE_SIM:
+ case APPTYPE_USIM:
+ mRil.setRadioState(CommandsInterface.RadioState.SIM_READY);
+ break;
+ case APPTYPE_RUIM:
+ mRil.setRadioState(CommandsInterface.RadioState.RUIM_READY);
+ break;
+ default:
+ Log.e(LOG_TAG, "Currently we don't handle SIMs of type: " + app_type);
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ }
+ break;
+ case EVENT_ICC_STATUS_CHANGED:
+ if (mRadioOn) {
+ Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus");
+ mRil.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, paramMessage.obj));
+ } else {
+ Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED while radio is not ON. Ignoring");
+ }
+ break;
+ case EVENT_RADIO_OFF_OR_UNAVAILABLE:
+ mRadioOn = false;
+ // disposeCards(); // to be verified;
+ default:
+ Log.e(LOG_TAG, " Unknown Event " + paramMessage.what);
+ break;
}
- return dataCall;
- }
-
- @Override
- protected Object
- responseOperatorInfos(Parcel p) {
- String strings[] = (String [])responseStrings(p);
- ArrayList<OperatorInfo> ret;
-
- if (strings.length % 5 != 0) {
- throw new RuntimeException(
- "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got "
- + strings.length + " strings, expected multible of 5");
}
- ret = new ArrayList<OperatorInfo>(strings.length / 5);
-
- for (int i = 0 ; i < strings.length ; i += 5) {
- ret.add (
- new OperatorInfo(
- strings[i+0],
- strings[i+1],
- strings[i+2],
- strings[i+3]));
+ public void run () {
+ mRil.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
+ Message msg = obtainMessage(EVENT_RADIO_ON);
+ mRil.getIccCardStatus(msg);
}
-
- return ret;
}
}