/*
* Copyright (C) 2011 The CyanogenMod Project
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
import static com.android.internal.telephony.RILConstants.*;
import android.content.Context;
import android.os.AsyncResult;
import android.os.Message;
import android.os.Parcel;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Log;
/**
* Qualcomm RIL class for basebands that do not send the SIM status
* piggybacked in RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED. Instead,
* these radios will send radio state and we have to query for SIM
* status separately.
* Custom Qualcomm No SimReady RIL for LGE
*
* {@hide}
*/
public class LGEQualcommRIL extends QualcommSharedRIL implements CommandsInterface {
protected int mPinState;
boolean RILJ_LOGV = true;
boolean RILJ_LOGD = true;
public LGEQualcommRIL(Context context, int networkMode, int cdmaSubscription) {
super(context, networkMode, cdmaSubscription);
}
@Override
public void
supplyIccPin(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_PIN, result);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
rr.mp.writeString(mAid);
rr.mp.writeString(pin);
send(rr);
}
@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.writeString(mAid);
rr.mp.writeString(puk);
rr.mp.writeString(newPin);
send(rr);
}
@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);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
rr.mp.writeString(mAid);
rr.mp.writeString(pin);
send(rr);
}
@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.writeString(mAid);
rr.mp.writeString(puk);
rr.mp.writeString(newPin2);
send(rr);
}
@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.writeString(mAid);
rr.mp.writeString(oldPin);
rr.mp.writeString(newPin);
send(rr);
}
@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.writeString(mAid);
rr.mp.writeString(oldPin2);
rr.mp.writeString(newPin2);
send(rr);
}
@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() +
"> getIMSI:RIL_REQUEST_GET_IMSI " +
RIL_REQUEST_GET_IMSI +
" aid: " + mAid +
" " + requestToString(rr.mRequest));
send(rr);
}
@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("IP"); // ipVersion
if (RILJ_LOGD) riljLog(rr.serialString() + "> "
+ requestToString(rr.mRequest) + " " + radioTechnology + " "
+ profile + " " + apn + " " + user + " "
+ password + " " + authType + " " + ipVersion);
send(rr);
}
@Override
public void
iccIO (int command, int fileid, String path, int p1, int p2, int p3,
String data, String pin2, 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_SIM_IO, result);
rr.mp.writeString(mAid);
rr.mp.writeInt(command);
rr.mp.writeInt(fileid);
rr.mp.writeString(path);
rr.mp.writeInt(p1);
rr.mp.writeInt(p2);
rr.mp.writeInt(p3);
rr.mp.writeString(data);
rr.mp.writeString(pin2);
if (RILJ_LOGD) riljLog(rr.serialString() + "> iccIO: "
+ " aid: " + mAid + " "
+ requestToString(rr.mRequest)
+ " 0x" + Integer.toHexString(command)
+ " 0x" + Integer.toHexString(fileid) + " "
+ " path: " + path + ","
+ p1 + "," + p2 + "," + p3);
send(rr);
}
@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)
+ " aid: " + mAid + " facility: " + facility);
if (facility.equals("SC") &&
SystemProperties.get("ro.cm.device").indexOf("e73") == 0) {
int [] iccstatus = new int[1];
iccstatus[0] = mPinState;
AsyncResult.forMessage(response, iccstatus, null);
response.sendToTarget();
} else {
// count strings
rr.mp.writeInt(4);
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)
+ " aid: " + mAid + " facility: " + facility
+ " lockstate: " + lockState);
// count strings
rr.mp.writeInt(5);
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();
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();
}
int cdmaSubscriptionAppCount = p.readInt();
for (int i = 0; i < cdmaSubscriptionAppCount; i++) {
if (i == 0)
status.setCdmaSubscriptionAppIndex(p.readInt());
else
p.readInt();
}
int numApplications = p.readInt();
// limit to maximum allowed applications
if (numApplications > IccCardStatus.CARD_MAX_APPS) {
numApplications = IccCardStatus.CARD_MAX_APPS;
}
status.setNumApplications(numApplications);
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();
}
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);
mAid = application.aid;
mPinState = (application.pin1 == IccCardStatus.PinState.PINSTATE_DISABLED ||
application.pin1 == IccCardStatus.PinState.PINSTATE_UNKNOWN) ? 0 : 1;
return status;
}
@Override
protected DataCallState getDataCallState(Parcel p, int version) {
DataCallState dataCall = new DataCallState();
boolean oldRil = needsOldRilFeature("datacall");
if (!oldRil)
return super.getDataCallState(p, version);
dataCall.version = 3; // was dataCall.version = version;
dataCall.cid = p.readInt();
dataCall.active = p.readInt();
dataCall.type = p.readString();
p.readString(); // apn
String addresses = p.readString();
if (!TextUtils.isEmpty(addresses)) {
dataCall.addresses = addresses.split(" ");
}
dataCall.ifname = "rmnet0";
p.readInt(); // RadioTechnology
p.readInt(); // inactiveReason
dataCall.dnses = new String[2];
dataCall.dnses[0] = SystemProperties.get("net."+dataCall.ifname+".dns1");
dataCall.dnses[1] = SystemProperties.get("net."+dataCall.ifname+".dns2");
return dataCall;
}
@Override
public void
getBasebandVersion (Message response) {
if (SystemProperties.get("ro.cm.device").indexOf("e73") == 0) {
/* This model wants a RIL_REQUEST_GET_MODEM_VERSION */
RILRequest rr
= RILRequest.obtain(220, response);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
send(rr);
} else {
super.getBasebandVersion(response);
}
}
}