Merge change 3107 into donut
* changes: Motorola changes from 090602 through 090605
This commit is contained in:
@@ -59,6 +59,12 @@ public abstract class BaseCommands implements CommandsInterface {
|
||||
protected RegistrantList mCallWaitingInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mDisplayInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mSignalInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mNumberInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mRedirNumInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mLineControlInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mT53ClirInfoRegistrants = new RegistrantList();
|
||||
protected RegistrantList mT53AudCntrlInfoRegistrants = new RegistrantList();
|
||||
|
||||
protected Registrant mSMSRegistrant;
|
||||
protected Registrant mNITZTimeRegistrant;
|
||||
protected Registrant mSignalStrengthRegistrant;
|
||||
@@ -509,6 +515,50 @@ public abstract class BaseCommands implements CommandsInterface {
|
||||
mOtaProvisionRegistrants.remove(h);
|
||||
}
|
||||
|
||||
public void registerForNumberInfo(Handler h,int what, Object obj) {
|
||||
Registrant r = new Registrant (h, what, obj);
|
||||
mNumberInfoRegistrants.add(r);
|
||||
}
|
||||
|
||||
public void unregisterForNumberInfo(Handler h){
|
||||
mNumberInfoRegistrants.remove(h);
|
||||
}
|
||||
|
||||
public void registerForRedirectedNumberInfo(Handler h,int what, Object obj) {
|
||||
Registrant r = new Registrant (h, what, obj);
|
||||
mRedirNumInfoRegistrants.add(r);
|
||||
}
|
||||
|
||||
public void unregisterForRedirectedNumberInfo(Handler h) {
|
||||
mRedirNumInfoRegistrants.remove(h);
|
||||
}
|
||||
|
||||
public void registerForLineControlInfo(Handler h, int what, Object obj) {
|
||||
Registrant r = new Registrant (h, what, obj);
|
||||
mLineControlInfoRegistrants.add(r);
|
||||
}
|
||||
|
||||
public void unregisterForLineControlInfo(Handler h) {
|
||||
mLineControlInfoRegistrants.remove(h);
|
||||
}
|
||||
|
||||
public void registerFoT53ClirlInfo(Handler h,int what, Object obj) {
|
||||
Registrant r = new Registrant (h, what, obj);
|
||||
mT53ClirInfoRegistrants.add(r);
|
||||
}
|
||||
|
||||
public void unregisterForT53ClirInfo(Handler h) {
|
||||
mT53ClirInfoRegistrants.remove(h);
|
||||
}
|
||||
|
||||
public void registerForT53AudioControlInfo(Handler h,int what, Object obj) {
|
||||
Registrant r = new Registrant (h, what, obj);
|
||||
mT53AudCntrlInfoRegistrants.add(r);
|
||||
}
|
||||
|
||||
public void unregisterForT53AudioControlInfo(Handler h) {
|
||||
mT53AudCntrlInfoRegistrants.remove(h);
|
||||
}
|
||||
|
||||
//***** Protected Methods
|
||||
/**
|
||||
|
||||
@@ -46,6 +46,13 @@ public abstract class Call {
|
||||
public State state = State.IDLE;
|
||||
|
||||
|
||||
// Flag to indicate if the current calling/caller information
|
||||
// is accurate. If false the information is known to be accurate.
|
||||
//
|
||||
// For CDMA, during call waiting/3 way, there is no network response
|
||||
// if call waiting is answered, network timed out, dropped, 3 way
|
||||
// merged, etc.
|
||||
protected boolean isGeneric = false;
|
||||
|
||||
/* Instance Methods */
|
||||
|
||||
@@ -126,6 +133,7 @@ public abstract class Call {
|
||||
|
||||
if (t < time) {
|
||||
earliest = c;
|
||||
time = t;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,10 +165,8 @@ public abstract class Call {
|
||||
|
||||
public long
|
||||
getEarliestConnectTime() {
|
||||
List l;
|
||||
long time = Long.MAX_VALUE;
|
||||
|
||||
l = getConnections();
|
||||
List l = getConnections();
|
||||
|
||||
if (l.size() == 0) {
|
||||
return 0;
|
||||
@@ -189,4 +195,44 @@ public abstract class Call {
|
||||
return getState().isRinging();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Connection associated with this Call that was created
|
||||
* last, or null if there are no Connections in this Call
|
||||
*/
|
||||
public Connection
|
||||
getLatestConnection() {
|
||||
List l = getConnections();
|
||||
if (l.size() == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
long time = 0;
|
||||
Connection latest = null;
|
||||
for (int i = 0, s = l.size() ; i < s ; i++) {
|
||||
Connection c = (Connection) l.get(i);
|
||||
long t = c.getCreateTime();
|
||||
|
||||
if (t > time) {
|
||||
latest = c;
|
||||
time = t;
|
||||
}
|
||||
}
|
||||
|
||||
return latest;
|
||||
}
|
||||
|
||||
/**
|
||||
* To indicate if the connection information is accurate
|
||||
* or not. false means accurate. Only used for CDMA.
|
||||
*/
|
||||
public boolean isGeneric() {
|
||||
return isGeneric;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the generic instance variable
|
||||
*/
|
||||
public void setGeneric(boolean generic) {
|
||||
isGeneric = generic;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,20 +44,21 @@ public abstract class CallTracker extends Handler {
|
||||
|
||||
//***** Events
|
||||
|
||||
protected static final int EVENT_POLL_CALLS_RESULT = 1;
|
||||
protected static final int EVENT_CALL_STATE_CHANGE = 2;
|
||||
protected static final int EVENT_REPOLL_AFTER_DELAY = 3;
|
||||
protected static final int EVENT_OPERATION_COMPLETE = 4;
|
||||
protected static final int EVENT_GET_LAST_CALL_FAIL_CAUSE = 5;
|
||||
|
||||
protected static final int EVENT_SWITCH_RESULT = 8;
|
||||
protected static final int EVENT_RADIO_AVAILABLE = 9;
|
||||
protected static final int EVENT_RADIO_NOT_AVAILABLE = 10;
|
||||
protected static final int EVENT_CONFERENCE_RESULT = 11;
|
||||
protected static final int EVENT_SEPARATE_RESULT = 12;
|
||||
protected static final int EVENT_ECT_RESULT = 13;
|
||||
protected static final int EVENT_EXIT_ECM_RESPONSE_CDMA = 14;
|
||||
protected static final int EVENT_POLL_CALLS_RESULT = 1;
|
||||
protected static final int EVENT_CALL_STATE_CHANGE = 2;
|
||||
protected static final int EVENT_REPOLL_AFTER_DELAY = 3;
|
||||
protected static final int EVENT_OPERATION_COMPLETE = 4;
|
||||
protected static final int EVENT_GET_LAST_CALL_FAIL_CAUSE = 5;
|
||||
|
||||
protected static final int EVENT_SWITCH_RESULT = 8;
|
||||
protected static final int EVENT_RADIO_AVAILABLE = 9;
|
||||
protected static final int EVENT_RADIO_NOT_AVAILABLE = 10;
|
||||
protected static final int EVENT_CONFERENCE_RESULT = 11;
|
||||
protected static final int EVENT_SEPARATE_RESULT = 12;
|
||||
protected static final int EVENT_ECT_RESULT = 13;
|
||||
protected static final int EVENT_EXIT_ECM_RESPONSE_CDMA = 14;
|
||||
protected static final int EVENT_CALL_WAITING_INFO_CDMA = 15;
|
||||
protected static final int EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA = 16;
|
||||
|
||||
protected void pollCallsWhenSafe() {
|
||||
needsPoll = true;
|
||||
|
||||
@@ -465,6 +465,61 @@ public interface CommandsInterface {
|
||||
void registerForSignalInfo(Handler h, int what, Object obj);
|
||||
void unregisterForSignalInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Registers the handler for CDMA number information record
|
||||
* Unlike the register* methods, there's only one notification handler
|
||||
*
|
||||
* @param h Handler for notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForNumberInfo(Handler h, int what, Object obj);
|
||||
void unregisterForNumberInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Registers the handler for CDMA redirected number Information record
|
||||
* Unlike the register* methods, there's only one notification handler
|
||||
*
|
||||
* @param h Handler for notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForRedirectedNumberInfo(Handler h, int what, Object obj);
|
||||
void unregisterForRedirectedNumberInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Registers the handler for CDMA line control information record
|
||||
* Unlike the register* methods, there's only one notification handler
|
||||
*
|
||||
* @param h Handler for notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForLineControlInfo(Handler h, int what, Object obj);
|
||||
void unregisterForLineControlInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Registers the handler for CDMA T53 CLIR information record
|
||||
* Unlike the register* methods, there's only one notification handler
|
||||
*
|
||||
* @param h Handler for notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerFoT53ClirlInfo(Handler h, int what, Object obj);
|
||||
void unregisterForT53ClirInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Registers the handler for CDMA T53 audio control information record
|
||||
* Unlike the register* methods, there's only one notification handler
|
||||
*
|
||||
* @param h Handler for notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForT53AudioControlInfo(Handler h, int what, Object obj);
|
||||
void unregisterForT53AudioControlInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Fires on if Modem enters Emergency Callback mode
|
||||
*/
|
||||
|
||||
@@ -1350,9 +1350,13 @@ public interface Phone {
|
||||
/**
|
||||
* Retrieves the MIN for CDMA phones.
|
||||
*/
|
||||
|
||||
String getCdmaMin();
|
||||
|
||||
/**
|
||||
* Retrieves PRL Version for CDMA phones
|
||||
*/
|
||||
String getCdmaPrlVersion();
|
||||
|
||||
/**
|
||||
* Retrieves the ESN for CDMA phones.
|
||||
*/
|
||||
@@ -1464,14 +1468,12 @@ public interface Phone {
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
// TODO(Moto) TODO: Remove when generic implemented
|
||||
void registerForCallWaiting(Handler h, int what, Object obj);
|
||||
|
||||
/**
|
||||
* Unegister for notifications when CDMA Call waiting comes
|
||||
* @param h Handler to be removed from the registrant list.
|
||||
*/
|
||||
// TODO(Moto): Remove when generic implemented
|
||||
void unregisterForCallWaiting(Handler h);
|
||||
|
||||
|
||||
@@ -1513,6 +1515,109 @@ public interface Phone {
|
||||
*/
|
||||
void unregisterForDisplayInfo(Handler h) ;
|
||||
|
||||
/**
|
||||
* Register for CDMA number information record notification from the network.
|
||||
* Message.obj will contain an AsyncResult.
|
||||
* AsyncResult.result will be a CdmaInformationRecords.CdmaNumberInfoRec
|
||||
* instance.
|
||||
*
|
||||
* @param h Handler that receives the notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForNumberInfo(Handler h, int what, Object obj);
|
||||
|
||||
/**
|
||||
* Unregisters for number information record notifications.
|
||||
* Extraneous calls are tolerated silently
|
||||
*
|
||||
* @param h Handler to be removed from the registrant list.
|
||||
*/
|
||||
void unregisterForNumberInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Register for CDMA redirected number information record notification
|
||||
* from the network.
|
||||
* Message.obj will contain an AsyncResult.
|
||||
* AsyncResult.result will be a CdmaInformationRecords.CdmaRedirectingNumberInfoRec
|
||||
* instance.
|
||||
*
|
||||
* @param h Handler that receives the notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForRedirectedNumberInfo(Handler h, int what, Object obj);
|
||||
|
||||
/**
|
||||
* Unregisters for redirected number information record notification.
|
||||
* Extraneous calls are tolerated silently
|
||||
*
|
||||
* @param h Handler to be removed from the registrant list.
|
||||
*/
|
||||
void unregisterForRedirectedNumberInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Register for CDMA line control information record notification
|
||||
* from the network.
|
||||
* Message.obj will contain an AsyncResult.
|
||||
* AsyncResult.result will be a CdmaInformationRecords.CdmaLineControlInfoRec
|
||||
* instance.
|
||||
*
|
||||
* @param h Handler that receives the notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForLineControlInfo(Handler h, int what, Object obj);
|
||||
|
||||
/**
|
||||
* Unregisters for line control information notifications.
|
||||
* Extraneous calls are tolerated silently
|
||||
*
|
||||
* @param h Handler to be removed from the registrant list.
|
||||
*/
|
||||
void unregisterForLineControlInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Register for CDMA T53 CLIR information record notifications
|
||||
* from the network.
|
||||
* Message.obj will contain an AsyncResult.
|
||||
* AsyncResult.result will be a CdmaInformationRecords.CdmaT53ClirInfoRec
|
||||
* instance.
|
||||
*
|
||||
* @param h Handler that receives the notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerFoT53ClirlInfo(Handler h, int what, Object obj);
|
||||
|
||||
/**
|
||||
* Unregisters for T53 CLIR information record notification
|
||||
* Extraneous calls are tolerated silently
|
||||
*
|
||||
* @param h Handler to be removed from the registrant list.
|
||||
*/
|
||||
void unregisterForT53ClirInfo(Handler h);
|
||||
|
||||
/**
|
||||
* Register for CDMA T53 audio control information record notifications
|
||||
* from the network.
|
||||
* Message.obj will contain an AsyncResult.
|
||||
* AsyncResult.result will be a CdmaInformationRecords.CdmaT53AudioControlInfoRec
|
||||
* instance.
|
||||
*
|
||||
* @param h Handler that receives the notification message.
|
||||
* @param what User-defined message code.
|
||||
* @param obj User object.
|
||||
*/
|
||||
void registerForT53AudioControlInfo(Handler h, int what, Object obj);
|
||||
|
||||
/**
|
||||
* Unregisters for T53 audio control information record notifications.
|
||||
* Extraneous calls are tolerated silently
|
||||
*
|
||||
* @param h Handler to be removed from the registrant list.
|
||||
*/
|
||||
void unregisterForT53AudioControlInfo(Handler h);
|
||||
|
||||
/**
|
||||
* registers for exit emergency call back mode request response
|
||||
|
||||
@@ -674,6 +674,12 @@ public abstract class PhoneBase implements Phone {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getCdmaPrlVersion(){
|
||||
// This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
|
||||
Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
|
||||
return null;
|
||||
}
|
||||
|
||||
public void sendBurstDtmf(String dtmfString, Message onComplete) {
|
||||
// This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
|
||||
Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
|
||||
@@ -726,6 +732,46 @@ public abstract class PhoneBase implements Phone {
|
||||
mCM.unregisterForDisplayInfo(h);
|
||||
}
|
||||
|
||||
public void registerForNumberInfo(Handler h, int what, Object obj) {
|
||||
mCM.registerForNumberInfo(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForNumberInfo(Handler h) {
|
||||
mCM.unregisterForNumberInfo(h);
|
||||
}
|
||||
|
||||
public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) {
|
||||
mCM.registerForRedirectedNumberInfo(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForRedirectedNumberInfo(Handler h) {
|
||||
mCM.unregisterForRedirectedNumberInfo(h);
|
||||
}
|
||||
|
||||
public void registerForLineControlInfo(Handler h, int what, Object obj) {
|
||||
mCM.registerForLineControlInfo( h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForLineControlInfo(Handler h) {
|
||||
mCM.unregisterForLineControlInfo(h);
|
||||
}
|
||||
|
||||
public void registerFoT53ClirlInfo(Handler h, int what, Object obj) {
|
||||
mCM.registerFoT53ClirlInfo(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForT53ClirInfo(Handler h) {
|
||||
mCM.unregisterForT53ClirInfo(h);
|
||||
}
|
||||
|
||||
public void registerForT53AudioControlInfo(Handler h, int what, Object obj) {
|
||||
mCM.registerForT53AudioControlInfo( h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForT53AudioControlInfo(Handler h) {
|
||||
mCM.unregisterForT53AudioControlInfo(h);
|
||||
}
|
||||
|
||||
public void setOnEcbModeExitResponse(Handler h, int what, Object obj){
|
||||
// This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
|
||||
Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
|
||||
|
||||
@@ -418,6 +418,10 @@ public class PhoneProxy extends Handler implements Phone {
|
||||
return mActivePhone.getCdmaMin();
|
||||
}
|
||||
|
||||
public String getCdmaPrlVersion() {
|
||||
return mActivePhone.getCdmaPrlVersion();
|
||||
}
|
||||
|
||||
public String getLine1AlphaTag() {
|
||||
return mActivePhone.getLine1AlphaTag();
|
||||
}
|
||||
@@ -745,6 +749,46 @@ public class PhoneProxy extends Handler implements Phone {
|
||||
mActivePhone.unregisterForDisplayInfo(h);
|
||||
}
|
||||
|
||||
public void registerForNumberInfo(Handler h, int what, Object obj) {
|
||||
mActivePhone.registerForNumberInfo(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForNumberInfo(Handler h) {
|
||||
mActivePhone.unregisterForNumberInfo(h);
|
||||
}
|
||||
|
||||
public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) {
|
||||
mActivePhone.registerForRedirectedNumberInfo(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForRedirectedNumberInfo(Handler h) {
|
||||
mActivePhone.unregisterForRedirectedNumberInfo(h);
|
||||
}
|
||||
|
||||
public void registerForLineControlInfo(Handler h, int what, Object obj) {
|
||||
mActivePhone.registerForLineControlInfo( h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForLineControlInfo(Handler h) {
|
||||
mActivePhone.unregisterForLineControlInfo(h);
|
||||
}
|
||||
|
||||
public void registerFoT53ClirlInfo(Handler h, int what, Object obj) {
|
||||
mActivePhone.registerFoT53ClirlInfo(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForT53ClirInfo(Handler h) {
|
||||
mActivePhone.unregisterForT53ClirInfo(h);
|
||||
}
|
||||
|
||||
public void registerForT53AudioControlInfo(Handler h, int what, Object obj) {
|
||||
mActivePhone.registerForT53AudioControlInfo( h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForT53AudioControlInfo(Handler h) {
|
||||
mActivePhone.unregisterForT53AudioControlInfo(h);
|
||||
}
|
||||
|
||||
public void setOnEcbModeExitResponse(Handler h, int what, Object obj){
|
||||
mActivePhone.setOnEcbModeExitResponse(h,what,obj);
|
||||
}
|
||||
|
||||
@@ -2233,7 +2233,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
|
||||
case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break;
|
||||
case RIL_UNSOL_CDMA_CALL_WAITING: ret = responseCdmaCallWaiting(p); break;
|
||||
case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: ret = responseInts(p); break;
|
||||
case RIL_UNSOL_CDMA_INFO_REC: ret = responseCdmaInfoRec(p); break;
|
||||
case RIL_UNSOL_CDMA_INFO_REC: ret = responseCdmaInformationRecord(p); break;
|
||||
case RIL_UNSOL_OEM_HOOK_RAW: ret = responseRaw(p); break;
|
||||
|
||||
default:
|
||||
@@ -2490,23 +2490,18 @@ public final class RIL extends BaseCommands implements CommandsInterface {
|
||||
break;
|
||||
|
||||
case RIL_UNSOL_CDMA_INFO_REC:
|
||||
if (RILJ_LOGD) unsljLog(response);
|
||||
ArrayList<CdmaInformationRecords> listInfoRecs;
|
||||
|
||||
CdmaInformationRecords infoRec = (CdmaInformationRecords) ret;
|
||||
if (infoRec.isDispInfo) {
|
||||
if (mDisplayInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.cdmaDisplayInfoRecord);
|
||||
|
||||
mDisplayInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.cdmaDisplayInfoRecord, null));
|
||||
}
|
||||
try {
|
||||
listInfoRecs = (ArrayList<CdmaInformationRecords>)ret;
|
||||
} catch (ClassCastException e) {
|
||||
Log.e(LOG_TAG, "Unexpected exception casting to listInfoRecs", e);
|
||||
break;
|
||||
}
|
||||
if (infoRec.isSignInfo) {
|
||||
if (mSignalInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.cdmaSignalInfoRecord);
|
||||
mSignalInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.cdmaSignalInfoRecord, null));
|
||||
}
|
||||
|
||||
for (CdmaInformationRecords rec : listInfoRecs) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, rec);
|
||||
notifyRegistrantsCdmaInfoRec(rec);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2764,30 +2759,24 @@ public final class RIL extends BaseCommands implements CommandsInterface {
|
||||
dc.als = p.readInt();
|
||||
voiceSettings = p.readInt();
|
||||
dc.isVoice = (0 == voiceSettings) ? false : true;
|
||||
int voicePrivacy = p.readInt();
|
||||
dc.isVoicePrivacy = (0 != voicePrivacy);
|
||||
dc.isVoicePrivacy = (0 != p.readInt());
|
||||
dc.number = p.readString();
|
||||
int np = p.readInt();
|
||||
dc.numberPresentation = DriverCall.presentationFromCLIP(np);
|
||||
dc.name = p.readString();
|
||||
dc.namePresentation = p.readInt();
|
||||
|
||||
// Make sure there's a leading + on addresses with a TOA
|
||||
// of 145
|
||||
|
||||
dc.number = PhoneNumberUtils.stringFromStringAndTOA(
|
||||
dc.number, dc.TOA);
|
||||
// Make sure there's a leading + on addresses with a TOA of 145
|
||||
dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
|
||||
|
||||
response.add(dc);
|
||||
|
||||
if ( RILConstants.CDMA_VOICE_PRIVACY == voicePrivacy ) {
|
||||
if (dc.isVoicePrivacy) {
|
||||
mVoicePrivacyOnRegistrants.notifyRegistrants();
|
||||
Log.d(LOG_TAG, "InCall VoicePrivacy is enabled: " +
|
||||
Integer.toString(voicePrivacy));
|
||||
Log.d(LOG_TAG, "InCall VoicePrivacy is enabled");
|
||||
} else {
|
||||
mVoicePrivacyOffRegistrants.notifyRegistrants();
|
||||
Log.d(LOG_TAG, "InCall VoicePrivacy is disabled: " +
|
||||
Integer.toString(voicePrivacy));
|
||||
Log.d(LOG_TAG, "InCall VoicePrivacy is disabled");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2880,15 +2869,19 @@ public final class RIL extends BaseCommands implements CommandsInterface {
|
||||
numServiceCategories = p.readInt();
|
||||
|
||||
if (numServiceCategories == 0) {
|
||||
// TODO(Teleca) TODO(Moto): The logic of providing default
|
||||
// values should not be done by this transport layer. And
|
||||
// needs to be done by the vendor ril or application logic.
|
||||
// TODO(Google): Remove ASAP
|
||||
int numInts;
|
||||
numInts = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES * CDMA_BSI_NO_OF_INTS_STRUCT + 1;
|
||||
response = new int[numInts];
|
||||
|
||||
// Indicate that a zero length table was received
|
||||
response[0] = 0; // TODO(Moto): This is very strange, please explain why.
|
||||
// Faking a default record for all possible records.
|
||||
response[0] = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES;
|
||||
|
||||
// Loop over CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES set 'english' as
|
||||
// default language and selection status to false
|
||||
// default language and selection status to false for all.
|
||||
for (int i = 1; i < numInts; i += CDMA_BSI_NO_OF_INTS_STRUCT ) {
|
||||
response[i + 0] = i / CDMA_BSI_NO_OF_INTS_STRUCT;
|
||||
response[i + 1] = 1;
|
||||
@@ -2922,66 +2915,24 @@ public final class RIL extends BaseCommands implements CommandsInterface {
|
||||
return response;
|
||||
}
|
||||
|
||||
private Object
|
||||
responseCdmaInfoRec(Parcel p) {
|
||||
int infoRecordName;
|
||||
CdmaInformationRecords records = new CdmaInformationRecords();
|
||||
private ArrayList<CdmaInformationRecords>
|
||||
responseCdmaInformationRecord(Parcel p) {
|
||||
int numberOfInfoRecs;
|
||||
ArrayList<CdmaInformationRecords> response;
|
||||
|
||||
/**
|
||||
* Loop through all of the information records unmarshalling them
|
||||
* and converting them to Java Objects.
|
||||
*/
|
||||
numberOfInfoRecs = p.readInt();
|
||||
response = new ArrayList<CdmaInformationRecords>(numberOfInfoRecs);
|
||||
|
||||
int numberOfInfoRecs = p.readInt();
|
||||
for (int i = 0; i < numberOfInfoRecs; i++) {
|
||||
infoRecordName = p.readInt();
|
||||
switch(infoRecordName) {
|
||||
case CdmaInformationRecords.RIL_CDMA_DISPLAY_INFO_REC:
|
||||
case CdmaInformationRecords.RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
|
||||
records.setDispInfo(p.readString());
|
||||
break;
|
||||
case CdmaInformationRecords.RIL_CDMA_SIGNAL_INFO_REC:
|
||||
records.setSignInfo(p.readInt(), p.readInt(), p.readInt(), p.readInt());
|
||||
break;
|
||||
// InfoReocords with names as below aren't supported in AFW yet
|
||||
case CdmaInformationRecords.RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
|
||||
case CdmaInformationRecords.RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
|
||||
case CdmaInformationRecords.RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
|
||||
// TODO(Moto) implement
|
||||
p.readString(); // number
|
||||
p.readInt(); // number_type
|
||||
p.readInt(); // number_plan
|
||||
p.readInt(); // pi
|
||||
p.readInt(); // si
|
||||
break;
|
||||
case CdmaInformationRecords.RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
|
||||
// TODO(Moto) implement
|
||||
p.readString(); // redirecting number
|
||||
p.readInt(); // number_type
|
||||
p.readInt(); // number_plan
|
||||
p.readInt(); // pi
|
||||
p.readInt(); // si
|
||||
p.readInt(); // reason
|
||||
break;
|
||||
case CdmaInformationRecords.RIL_CDMA_LINE_CONTROL_INFO_REC:
|
||||
// TODO(Moto) implement
|
||||
p.readInt(); // PolarityIncluded
|
||||
p.readInt(); // Toggle
|
||||
p.readInt(); // Reverse
|
||||
p.readInt(); // PowerDenial
|
||||
break;
|
||||
case CdmaInformationRecords.RIL_CDMA_T53_CLIR_INFO_REC:
|
||||
// TODO(Moto) implement
|
||||
p.readInt(); // Cause
|
||||
break;
|
||||
case CdmaInformationRecords.RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
|
||||
// TODO(Moto) implement
|
||||
p.readInt(); // upLink
|
||||
p.readInt(); // downLink
|
||||
break;
|
||||
case CdmaInformationRecords.RIL_CDMA_T53_RELEASE_INFO_REC:
|
||||
// TODO(Moto) implement unknown fall through
|
||||
default:
|
||||
throw new RuntimeException("RIL_UNSOL_CDMA_INFO_REC: unsupported record. Got "
|
||||
+ records.recordToString(infoRecordName) + " ");
|
||||
}
|
||||
CdmaInformationRecords InfoRec = new CdmaInformationRecords(p);
|
||||
response.add(InfoRec);
|
||||
}
|
||||
return records;
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
private Object
|
||||
@@ -3012,6 +2963,54 @@ public final class RIL extends BaseCommands implements CommandsInterface {
|
||||
return response;
|
||||
}
|
||||
|
||||
private void
|
||||
notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
|
||||
int response = RIL_UNSOL_CDMA_INFO_REC;
|
||||
if (infoRec.record instanceof CdmaInformationRecords.CdmaDisplayInfoRec) {
|
||||
if (mDisplayInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mDisplayInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
} else if (infoRec.record instanceof CdmaInformationRecords.CdmaSignalInfoRec) {
|
||||
if (mSignalInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mSignalInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
} else if (infoRec.record instanceof CdmaInformationRecords.CdmaNumberInfoRec) {
|
||||
if (mNumberInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mNumberInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
} else if (infoRec.record instanceof CdmaInformationRecords.CdmaRedirectingNumberInfoRec) {
|
||||
if (mRedirNumInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mRedirNumInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
} else if (infoRec.record instanceof CdmaInformationRecords.CdmaLineControlInfoRec) {
|
||||
if (mLineControlInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mLineControlInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
} else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53ClirInfoRec) {
|
||||
if (mT53ClirInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mT53ClirInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
} else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53AudioControlInfoRec) {
|
||||
if (mT53AudCntrlInfoRegistrants != null) {
|
||||
if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
|
||||
mT53AudCntrlInfoRegistrants.notifyRegistrants(
|
||||
new AsyncResult (null, infoRec.record, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static String
|
||||
requestToString(int request) {
|
||||
/*
|
||||
|
||||
@@ -78,9 +78,6 @@ public interface RILConstants {
|
||||
int CDM_TTY_HCO_MODE = 2;
|
||||
int CDM_TTY_VCO_MODE = 3;
|
||||
|
||||
byte CDMA_VOICE_PRIVACY = 0x70; /* "p" value used in Ril_Call.isVoice if Privacy
|
||||
is active */
|
||||
|
||||
/*
|
||||
cat include/telephony/ril.h | \
|
||||
egrep '^#define' | \
|
||||
|
||||
@@ -185,8 +185,9 @@ public class TelephonyIntents {
|
||||
/**
|
||||
* <p>Broadcast Action: It indicates the Emergency callback mode blocks datacall/sms
|
||||
* <p class="note">.
|
||||
* This is to pop up a notice to show user that the phone is in emergency callback mode
|
||||
* and atacalls and outgoing sms are blocked.
|
||||
*/
|
||||
// TODO(Moto): What is the use case, who is interested in this?
|
||||
public static final String ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS
|
||||
= "android.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS";
|
||||
|
||||
@@ -202,6 +203,11 @@ public class TelephonyIntents {
|
||||
// TODO(Moto): Generally broadcast intents are for use to allow entities which
|
||||
// may not know about each other to "communicate". This seems quite specific
|
||||
// and maybe using the registrant style would be better.
|
||||
|
||||
// Moto: Since this is used for apps not in the same process of phone, can the
|
||||
// registrant style be used? (Ling Li says: Maybe the "app" can request rather
|
||||
// than save the MDN each time and this intent would not be necessary?)
|
||||
// Moto response: Moto internal discussion is on-going.
|
||||
public static final String ACTION_CDMA_OTA_MDN_CHANGED
|
||||
= "android.intent.action.ACTION_MDN_STATE_CHANGED";
|
||||
|
||||
|
||||
@@ -101,4 +101,9 @@ public interface TelephonyProperties
|
||||
/** Indicate if phone is in emergency callback mode */
|
||||
static final String PROPERTY_INECM_MODE = "ril.cdma.inecmmode";
|
||||
|
||||
/** Indicate the timer value for exiting emergency callback mode */
|
||||
static final String PROPERTY_ECM_EXIT_TIMER = "ro.cdma.ecmexittimer";
|
||||
|
||||
/** The international dialing prefix conversion string */
|
||||
static final String PROPERTY_IDP_STRING = "ro.cdma.idpstring";
|
||||
}
|
||||
|
||||
@@ -34,9 +34,6 @@ import android.telephony.SignalStrength;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_BASEBAND_VERSION;
|
||||
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_INECM_MODE;
|
||||
|
||||
import com.android.internal.telephony.CallStateException;
|
||||
import com.android.internal.telephony.CommandException;
|
||||
import com.android.internal.telephony.CommandsInterface;
|
||||
@@ -66,6 +63,9 @@ public class CDMAPhone extends PhoneBase {
|
||||
static final String LOG_TAG = "CDMA";
|
||||
private static final boolean LOCAL_DEBUG = true;
|
||||
|
||||
// Default Emergency Callback Mode exit timer
|
||||
private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 30000;
|
||||
|
||||
//***** Instance Variables
|
||||
CdmaCallTracker mCT;
|
||||
CdmaSMSDispatcher mSMS;
|
||||
@@ -144,8 +144,8 @@ public class CDMAPhone extends PhoneBase {
|
||||
SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
|
||||
new Integer(RILConstants.CDMA_PHONE).toString());
|
||||
|
||||
// TODO(Moto): Is this needed to handle phone crashes and/or power cycling?
|
||||
String inEcm=SystemProperties.get(PROPERTY_INECM_MODE, "false");
|
||||
// This is needed to handle phone process crashes
|
||||
String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
|
||||
mIsPhoneInECMState = inEcm.equals("true");
|
||||
}
|
||||
|
||||
@@ -288,16 +288,10 @@ public class CDMAPhone extends PhoneBase {
|
||||
if (fc != null) {
|
||||
//mMmiRegistrants.notifyRegistrants(new AsyncResult(null, fc, null));
|
||||
fc.processCode();
|
||||
} else {
|
||||
FeatureCode digits = new FeatureCode(this);
|
||||
// use dial number as poundString
|
||||
digits.poundString = newDialString;
|
||||
digits.processCode();
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
} else {
|
||||
return mCT.dial(newDialString);
|
||||
}
|
||||
return mCT.dial(newDialString);
|
||||
}
|
||||
|
||||
public SignalStrength getSignalStrength() {
|
||||
@@ -388,6 +382,10 @@ public class CDMAPhone extends PhoneBase {
|
||||
return mSST.getMdnNumber();
|
||||
}
|
||||
|
||||
public String getCdmaPrlVersion(){
|
||||
return mRuimRecords.getPrlVersion();
|
||||
}
|
||||
|
||||
public String getCdmaMIN() {
|
||||
return mSST.getCdmaMin();
|
||||
}
|
||||
@@ -420,8 +418,13 @@ public class CDMAPhone extends PhoneBase {
|
||||
}
|
||||
|
||||
public String getSubscriberId() {
|
||||
Log.e(LOG_TAG, "method getSubscriberId for IMSI is NOT supported in CDMA!");
|
||||
return null;
|
||||
// Subscriber ID is the combination of MCC+MNC+MIN as CDMA IMSI
|
||||
// TODO(Moto): Replace with call to mRuimRecords.getIMSI_M() when implemented.
|
||||
if ((getServiceState().getOperatorNumeric() != null) && (getCdmaMIN() != null)) {
|
||||
return (getServiceState().getOperatorNumeric() + getCdmaMIN());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canConference() {
|
||||
@@ -513,11 +516,11 @@ public class CDMAPhone extends PhoneBase {
|
||||
}
|
||||
|
||||
public void registerForCallWaiting(Handler h, int what, Object obj) {
|
||||
Log.e(LOG_TAG, "method registerForCallWaiting is NOT yet supported in CDMA");
|
||||
mCT.registerForCallWaiting(h, what, obj);
|
||||
}
|
||||
|
||||
public void unregisterForCallWaiting(Handler h) {
|
||||
Log.e(LOG_TAG, "method unregisterForCallWaiting is NOT yet supported in CDMA");
|
||||
mCT.unregisterForCallWaiting(h);
|
||||
}
|
||||
|
||||
public String getIpAddress(String apnType) {
|
||||
@@ -850,12 +853,12 @@ public class CDMAPhone extends PhoneBase {
|
||||
mIsPhoneInECMState = true;
|
||||
// notify change
|
||||
sendEmergencyCallbackModeChange();
|
||||
setSystemProperty(PROPERTY_INECM_MODE, "true");
|
||||
setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "true");
|
||||
|
||||
// Post this runnable so we will automatically exit
|
||||
// if no one invokes exitEmergencyCallbackMode() directly.
|
||||
// TODO(Moto): Get the delay a property so it can be adjusted
|
||||
long delayInMillis = 300000; // 30,000 millis == 5 minutes
|
||||
long delayInMillis = SystemProperties.getLong(
|
||||
TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
|
||||
h.postDelayed(mExitEcmRunnable, delayInMillis);
|
||||
}
|
||||
}
|
||||
@@ -874,7 +877,7 @@ public class CDMAPhone extends PhoneBase {
|
||||
if (ar.exception == null) {
|
||||
if (mIsPhoneInECMState) {
|
||||
mIsPhoneInECMState = false;
|
||||
setSystemProperty(PROPERTY_INECM_MODE, "false");
|
||||
setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "false");
|
||||
}
|
||||
// send an Intent
|
||||
sendEmergencyCallbackModeChange();
|
||||
@@ -911,7 +914,7 @@ public class CDMAPhone extends PhoneBase {
|
||||
}
|
||||
|
||||
if (LOCAL_DEBUG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
|
||||
setSystemProperty(PROPERTY_BASEBAND_VERSION, (String)ar.result);
|
||||
setSystemProperty(TelephonyProperties.PROPERTY_BASEBAND_VERSION, (String)ar.result);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -977,7 +980,7 @@ public class CDMAPhone extends PhoneBase {
|
||||
Log.d(LOG_TAG, "ERI read, notify registrants");
|
||||
mEriFileLoadedRegistrants.notifyRegistrants();
|
||||
}
|
||||
setSystemProperty(PROPERTY_INECM_MODE,"false");
|
||||
setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE,"false");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -181,9 +181,7 @@ public final class CdmaCall extends Call {
|
||||
*/
|
||||
void
|
||||
onHangupLocal() {
|
||||
for (int i = 0, s = connections.size()
|
||||
; i < s; i++
|
||||
) {
|
||||
for (int i = 0, s = connections.size(); i < s; i++) {
|
||||
CdmaConnection cn = (CdmaConnection)connections.get(i);
|
||||
|
||||
cn.onHangupLocal();
|
||||
|
||||
@@ -58,6 +58,7 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
CdmaConnection connections[] = new CdmaConnection[MAX_CONNECTIONS];
|
||||
RegistrantList voiceCallEndedRegistrants = new RegistrantList();
|
||||
RegistrantList voiceCallStartedRegistrants = new RegistrantList();
|
||||
RegistrantList callWaitingRegistrants = new RegistrantList();
|
||||
|
||||
|
||||
// connections dropped durin last poll
|
||||
@@ -93,13 +94,15 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
cm.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);
|
||||
cm.registerForOn(this, EVENT_RADIO_AVAILABLE, null);
|
||||
cm.registerForNotAvailable(this, EVENT_RADIO_NOT_AVAILABLE, null);
|
||||
cm.registerForCallWaitingInfo(this, EVENT_CALL_WAITING_INFO_CDMA, null);
|
||||
foregroundCall.setGeneric(false);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
cm.unregisterForCallStateChanged(this);
|
||||
cm.unregisterForOn(this);
|
||||
cm.unregisterForNotAvailable(this);
|
||||
|
||||
cm.unregisterForCallWaitingInfo(this);
|
||||
for(CdmaConnection c : connections) {
|
||||
try {
|
||||
if(c != null) hangup(c);
|
||||
@@ -143,6 +146,15 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
voiceCallEndedRegistrants.remove(h);
|
||||
}
|
||||
|
||||
public void registerForCallWaiting(Handler h, int what, Object obj) {
|
||||
Registrant r = new Registrant (h, what, obj);
|
||||
callWaitingRegistrants.add(r);
|
||||
}
|
||||
|
||||
public void unregisterForCallWaiting(Handler h) {
|
||||
callWaitingRegistrants.remove(h);
|
||||
}
|
||||
|
||||
private void
|
||||
fakeHoldForegroundBeforeDial() {
|
||||
List<Connection> connCopy;
|
||||
@@ -170,34 +182,24 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
throw new CallStateException("cannot dial in current state");
|
||||
}
|
||||
|
||||
|
||||
// We are initiating a call therefore even if we previously
|
||||
// didn't know the state (i.e. Generic was true) we now know
|
||||
// and therefore can set Generic to false.
|
||||
foregroundCall.setGeneric(false);
|
||||
|
||||
// The new call must be assigned to the foreground call.
|
||||
// That call must be idle, so place anything that's
|
||||
// there on hold
|
||||
if (foregroundCall.getState() == CdmaCall.State.ACTIVE) {
|
||||
// this will probably be done by the radio anyway
|
||||
// but the dial might fail before this happens
|
||||
// and we need to make sure the foreground call is clear
|
||||
// for the newly dialed connection
|
||||
switchWaitingOrHoldingAndActive();
|
||||
|
||||
// Fake local state so that
|
||||
// a) foregroundCall is empty for the newly dialed connection
|
||||
// b) hasNonHangupStateChanged remains false in the
|
||||
// next poll, so that we don't clear a failed dialing call
|
||||
fakeHoldForegroundBeforeDial();
|
||||
}
|
||||
|
||||
if (foregroundCall.getState() != CdmaCall.State.IDLE) {
|
||||
//we should have failed in !canDial() above before we get here
|
||||
throw new CallStateException("cannot dial in current state");
|
||||
return dialThreeWay(dialString);
|
||||
}
|
||||
|
||||
pendingMO = new CdmaConnection(phone.getContext(), dialString, this, foregroundCall);
|
||||
hangupPendingMO = false;
|
||||
|
||||
if (pendingMO.address == null || pendingMO.address.length() == 0
|
||||
|| pendingMO.address.indexOf(PhoneNumberUtils.WILD) >= 0
|
||||
) {
|
||||
|| pendingMO.address.indexOf(PhoneNumberUtils.WILD) >= 0) {
|
||||
// Phone number is invalid
|
||||
pendingMO.cause = Connection.DisconnectCause.INVALID_NUMBER;
|
||||
|
||||
@@ -231,19 +233,39 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
return dial(dialString, CommandsInterface.CLIR_DEFAULT);
|
||||
}
|
||||
|
||||
void
|
||||
acceptCall () throws CallStateException {
|
||||
// FIXME if SWITCH fails, should retry with ANSWER
|
||||
// in case the active/holding call disappeared and this
|
||||
// is no longer call waiting
|
||||
private Connection
|
||||
dialThreeWay (String dialString) {
|
||||
if (!foregroundCall.isIdle()) {
|
||||
// Attach the new connection to foregroundCall
|
||||
pendingMO = new CdmaConnection(phone.getContext(),
|
||||
dialString, this, foregroundCall);
|
||||
cm.sendCDMAFeatureCode(pendingMO.address,
|
||||
obtainMessage(EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA));
|
||||
return pendingMO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void
|
||||
acceptCall() throws CallStateException {
|
||||
if (ringingCall.getState() == CdmaCall.State.INCOMING) {
|
||||
Log.i("phone", "acceptCall: incoming...");
|
||||
// Always unmute when answering a new call
|
||||
setMute(false);
|
||||
cm.acceptCall(obtainCompleteMessage());
|
||||
} else if (ringingCall.getState() == CdmaCall.State.WAITING) {
|
||||
setMute(false);
|
||||
} else if ((foregroundCall.connections.size() > 0) &&
|
||||
(ringingCall.getState() == CdmaCall.State.WAITING)) {
|
||||
// TODO(Moto): jsh asks, "Is this check necessary? I don't think it should be
|
||||
// possible to have no fg connection and a WAITING call, but if we should hit
|
||||
// this situation, is a CallStateExcetion appropriate?"
|
||||
CdmaConnection cwConn = (CdmaConnection)(ringingCall.getLatestConnection());
|
||||
|
||||
// Since there is no network response for supplimentary
|
||||
// service for CDMA, we assume call waiting is answered.
|
||||
// ringing Call state change to idle is in CdmaCall.detach
|
||||
// triggered by updateParent.
|
||||
cwConn.updateParent(ringingCall, foregroundCall);
|
||||
cwConn.onConnectedInOrOut();
|
||||
switchWaitingOrHoldingAndActive();
|
||||
} else {
|
||||
throw new CallStateException("phone not ringing");
|
||||
@@ -267,14 +289,14 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
if (ringingCall.getState() == CdmaCall.State.INCOMING) {
|
||||
throw new CallStateException("cannot be in the incoming state");
|
||||
} else {
|
||||
cm.sendCDMAFeatureCode("", obtainCompleteMessage(EVENT_SWITCH_RESULT));
|
||||
flashAndSetGenericTrue();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
conference() throws CallStateException {
|
||||
// three way calls in CDMA will be handled by feature codes
|
||||
Log.e(LOG_TAG, "conference: not possible in CDMA");
|
||||
// Should we be checking state?
|
||||
flashAndSetGenericTrue();
|
||||
}
|
||||
|
||||
void
|
||||
@@ -307,6 +329,7 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
pendingMO == null
|
||||
&& !ringingCall.isRinging()
|
||||
&& (!foregroundCall.getState().isAlive()
|
||||
|| (foregroundCall.getState() == CdmaCall.State.ACTIVE)
|
||||
|| !backgroundCall.getState().isAlive());
|
||||
|
||||
return ret;
|
||||
@@ -495,9 +518,24 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
}
|
||||
hasNonHangupStateChanged = true;
|
||||
} else if (conn != null && dc == null) {
|
||||
// Connection missing in CLCC response that we were
|
||||
// tracking.
|
||||
droppedDuringPoll.add(conn);
|
||||
int count = foregroundCall.connections.size();
|
||||
if (count == 0) {
|
||||
// Handle an unanswered MO/MT call, there is no
|
||||
// foregroundCall connections at this time.
|
||||
droppedDuringPoll.add(conn);
|
||||
} else {
|
||||
// Loop through foreground call connections as
|
||||
// it contains the known logical connections.
|
||||
for (int n = 0; n < count; n++) {
|
||||
CdmaConnection cn = (CdmaConnection)foregroundCall.connections.get(n);
|
||||
droppedDuringPoll.add(cn);
|
||||
}
|
||||
// TODO(Moto): jsh asks, "Are we sure we don't need to do this for
|
||||
// ringingCall as well? What if there's a WAITING call (ie, UI timer
|
||||
// hasn't expired, moving it to DISCONNECTED)? How/when will it
|
||||
// transition to DISCONNECTED?"
|
||||
}
|
||||
foregroundCall.setGeneric(false);
|
||||
// Dropped connections are removed from the CallTracker
|
||||
// list but kept in the Call list
|
||||
connections[i] = null;
|
||||
@@ -634,6 +672,18 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
|
||||
if (Phone.DEBUG_PHONE) log("hangup: set hangupPendingMO to true");
|
||||
hangupPendingMO = true;
|
||||
} else if ((conn.getCall() == ringingCall)
|
||||
&& (ringingCall.getState() == CdmaCall.State.WAITING)) {
|
||||
// Handle call waiting hang up case.
|
||||
//
|
||||
// The ringingCall state will change to IDLE in CdmaCall.detach
|
||||
// if the ringing call connection size is 0. We don't specifically
|
||||
// set the ringing call state to IDLE here to avoid a race condition
|
||||
// where a new call waiting could get a hang up from an old call
|
||||
// waiting ringingCall.
|
||||
// TODO(Moto): jsh asks, "Should we call conn.ondisconnect() here or Somewhere?"
|
||||
ringingCall.detach(conn);
|
||||
return;
|
||||
} else {
|
||||
try {
|
||||
cm.hangupConnection (conn.getCDMAIndex(), obtainCompleteMessage());
|
||||
@@ -768,6 +818,16 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void flashAndSetGenericTrue() throws CallStateException {
|
||||
cm.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
|
||||
|
||||
// Set generic to true because in CDMA it is not known what
|
||||
// the status of the call is after a call waiting is answered,
|
||||
// 3 way call merged or a switch between calls.
|
||||
foregroundCall.setGeneric(true);
|
||||
phone.notifyCallStateChanged();
|
||||
}
|
||||
|
||||
private Phone.SuppService getFailedService(int what) {
|
||||
switch (what) {
|
||||
case EVENT_SWITCH_RESULT:
|
||||
@@ -789,6 +849,30 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
pollCallsWhenSafe();
|
||||
}
|
||||
|
||||
private void notifyCallWaitingInfo(CdmaCallWaitingNotification obj) {
|
||||
if (callWaitingRegistrants != null) {
|
||||
callWaitingRegistrants.notifyRegistrants(new AsyncResult(null, obj, null));
|
||||
}
|
||||
}
|
||||
|
||||
private void handleCallWaitingInfo (CdmaCallWaitingNotification cw) {
|
||||
// Check how many connections in foregroundCall.
|
||||
// If the connection in foregroundCall is more
|
||||
// than one, then the connection information is
|
||||
// not reliable anymore since it means either
|
||||
// call waiting is connected or 3 way call is
|
||||
// dialed before, so set generic.
|
||||
if (foregroundCall.connections.size() > 1 ) {
|
||||
foregroundCall.setGeneric(true);
|
||||
}
|
||||
|
||||
// Create a new CdmaConnection which attaches itself to ringingCall.
|
||||
ringingCall.setGeneric(false);
|
||||
new CdmaConnection(phone.getContext(), cw, this, ringingCall);
|
||||
|
||||
// Finally notify application
|
||||
notifyCallWaitingInfo(cw);
|
||||
}
|
||||
//****** Overridden from Handler
|
||||
|
||||
public void
|
||||
@@ -811,13 +895,13 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
break;
|
||||
|
||||
case EVENT_OPERATION_COMPLETE:
|
||||
ar = (AsyncResult)msg.obj;
|
||||
operationComplete();
|
||||
break;
|
||||
|
||||
case EVENT_SWITCH_RESULT:
|
||||
ar = (AsyncResult)msg.obj;
|
||||
operationComplete();
|
||||
// In GSM call operationComplete() here which gets the
|
||||
// current call list. But in CDMA there is no list so
|
||||
// there is nothing to do.
|
||||
break;
|
||||
|
||||
case EVENT_GET_LAST_CALL_FAIL_CAUSE:
|
||||
@@ -871,6 +955,22 @@ public final class CdmaCallTracker extends CallTracker {
|
||||
phone.unsetOnEcbModeExitResponse(this);
|
||||
break;
|
||||
|
||||
case EVENT_CALL_WAITING_INFO_CDMA:
|
||||
ar = (AsyncResult)msg.obj;
|
||||
if (ar.exception == null) {
|
||||
handleCallWaitingInfo((CdmaCallWaitingNotification)ar.result);
|
||||
Log.d(LOG_TAG, "Event EVENT_CALL_WAITING_INFO_CDMA Received");
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA:
|
||||
ar = (AsyncResult)msg.obj;
|
||||
if (ar.exception == null) {
|
||||
// Assume 3 way call is connected
|
||||
pendingMO.onConnectedInOrOut();
|
||||
}
|
||||
break;
|
||||
|
||||
default:{
|
||||
throw new RuntimeException("unexpected event not handled");
|
||||
}
|
||||
|
||||
@@ -25,11 +25,14 @@ import android.os.Message;
|
||||
import android.os.PowerManager;
|
||||
import android.os.Registrant;
|
||||
import android.os.SystemClock;
|
||||
import android.os.SystemProperties;
|
||||
import android.util.Config;
|
||||
import android.util.Log;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import android.telephony.PhoneNumberUtils;
|
||||
import android.telephony.ServiceState;
|
||||
|
||||
import com.android.internal.telephony.TelephonyProperties;
|
||||
|
||||
/**
|
||||
* {@hide}
|
||||
@@ -90,17 +93,7 @@ public class CdmaConnection extends Connection {
|
||||
//***** Constants
|
||||
static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000;
|
||||
static final int PAUSE_DELAY_MILLIS = 2 * 1000;
|
||||
|
||||
// TODO(Moto): These should be come from a resourse file
|
||||
// at a minimum as different carriers may want to use
|
||||
// different characters and our general default is "," & ";".
|
||||
// Furthermore Android supports contacts that have phone
|
||||
// numbers entered as strings so '1-800-164flowers' would not
|
||||
// be handled as expected. Both issues need to be resolved.
|
||||
static final char CUSTOMERIZED_WAIT_CHAR_UPPER ='W';
|
||||
static final char CUSTOMERIZED_WAIT_CHAR_LOWER ='w';
|
||||
static final char CUSTOMERIZED_PAUSE_CHAR_UPPER ='P';
|
||||
static final char CUSTOMERIZED_PAUSE_CHAR_LOWER ='p';
|
||||
|
||||
//***** Inner Classes
|
||||
|
||||
class MyHandler extends Handler {
|
||||
@@ -147,19 +140,9 @@ public class CdmaConnection extends Connection {
|
||||
parent.attach(this, dc);
|
||||
}
|
||||
|
||||
CdmaConnection () {
|
||||
owner = null;
|
||||
h = null;
|
||||
address = null;
|
||||
index = -1;
|
||||
parent = null;
|
||||
isIncoming = true;
|
||||
createTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
/** This is an MO call, created when dialing */
|
||||
/** This is an MO call/three way call, created when dialing */
|
||||
/*package*/
|
||||
CdmaConnection (Context context, String dialString, CdmaCallTracker ct, CdmaCall parent) {
|
||||
CdmaConnection(Context context, String dialString, CdmaCallTracker ct, CdmaCall parent) {
|
||||
createWakeLock(context);
|
||||
acquireWakeLock();
|
||||
|
||||
@@ -184,10 +167,36 @@ public class CdmaConnection extends Connection {
|
||||
|
||||
if (parent != null) {
|
||||
this.parent = parent;
|
||||
parent.attachFake(this, CdmaCall.State.DIALING);
|
||||
|
||||
//for the three way call case, not change parent state
|
||||
if (parent.state == CdmaCall.State.ACTIVE) {
|
||||
parent.attachFake(this, CdmaCall.State.ACTIVE);
|
||||
} else {
|
||||
parent.attachFake(this, CdmaCall.State.DIALING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** This is a Call waiting call*/
|
||||
CdmaConnection(Context context, CdmaCallWaitingNotification cw, CdmaCallTracker ct,
|
||||
CdmaCall parent) {
|
||||
createWakeLock(context);
|
||||
acquireWakeLock();
|
||||
|
||||
owner = ct;
|
||||
h = new MyHandler(owner.getLooper());
|
||||
address = cw.number;
|
||||
numberPresentation = cw.numberPresentation;
|
||||
cnapName = cw.name;
|
||||
cnapNamePresentation = cw.namePresentation;
|
||||
index = -1;
|
||||
isIncoming = true;
|
||||
createTime = System.currentTimeMillis();
|
||||
connectTime = 0;
|
||||
this.parent = parent;
|
||||
parent.attachFake(this, CdmaCall.State.WAITING);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
}
|
||||
|
||||
@@ -363,16 +372,6 @@ public class CdmaConnection extends Connection {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for 3way call only
|
||||
*/
|
||||
void update (CdmaConnection c) {
|
||||
address = c.address;
|
||||
cnapName = c.cnapName;
|
||||
cnapNamePresentation = c.cnapNamePresentation;
|
||||
numberPresentation = c.numberPresentation;
|
||||
}
|
||||
|
||||
public void cancelPostDial() {
|
||||
setPostDialState(PostDialState.CANCELLED);
|
||||
}
|
||||
@@ -408,7 +407,7 @@ public class CdmaConnection extends Connection {
|
||||
case CallFailCause.CDMA_LOCKED_UNTIL_POWER_CYCLE:
|
||||
return DisconnectCause.CDMA_LOCKED_UNTIL_POWER_CYCLE;
|
||||
case CallFailCause.CDMA_DROP:
|
||||
return DisconnectCause.LOST_SIGNAL; // TODO(Moto): wink/dave changed from CDMA_DROP;
|
||||
return DisconnectCause.CDMA_DROP;
|
||||
case CallFailCause.CDMA_INTERCEPT:
|
||||
return DisconnectCause.CDMA_INTERCEPT;
|
||||
case CallFailCause.CDMA_REORDER:
|
||||
@@ -488,15 +487,14 @@ public class CdmaConnection extends Connection {
|
||||
}
|
||||
|
||||
// A null cnapName should be the same as ""
|
||||
if (null != dc.name) {
|
||||
if (cnapName != dc.name) {
|
||||
cnapName = dc.name;
|
||||
changed = true;
|
||||
}
|
||||
} else {
|
||||
if (TextUtils.isEmpty(dc.name) && !TextUtils.isEmpty(cnapName)) {
|
||||
changed = true;
|
||||
cnapName = "";
|
||||
// TODO(Moto): Should changed = true if cnapName wasn't previously ""
|
||||
} else if (dc.name.equals(cnapName) == false) {
|
||||
changed = true;
|
||||
cnapName = dc.name;
|
||||
}
|
||||
|
||||
log("--dssds----"+cnapName);
|
||||
cnapNamePresentation = dc.namePresentation;
|
||||
numberPresentation = dc.numberPresentation;
|
||||
@@ -631,21 +629,7 @@ public class CdmaConnection extends Connection {
|
||||
int wIndex = subStr.indexOf(PhoneNumberUtils.WAIT);
|
||||
int pIndex = subStr.indexOf(PhoneNumberUtils.PAUSE);
|
||||
|
||||
// TODO(Moto): Courtesy of jsh; is this simpler expression equivalent?
|
||||
//
|
||||
// if (wIndex > 0 && (wIndex < pIndex || pIndex <= 0)) {
|
||||
// subStr = subStr.substring(0, wIndex);
|
||||
// } else if (pIndex > 0) {
|
||||
// subStr = subStr.substring(0, pIndex);
|
||||
// }
|
||||
|
||||
if (wIndex > 0 && pIndex > 0) {
|
||||
if (wIndex > pIndex) {
|
||||
subStr = subStr.substring(0, pIndex);
|
||||
} else {
|
||||
subStr = subStr.substring(0, wIndex);
|
||||
}
|
||||
} else if (wIndex > 0) {
|
||||
if (wIndex > 0 && (wIndex < pIndex || pIndex <= 0)) {
|
||||
subStr = subStr.substring(0, wIndex);
|
||||
} else if (pIndex > 0) {
|
||||
subStr = subStr.substring(0, pIndex);
|
||||
@@ -654,6 +638,16 @@ public class CdmaConnection extends Connection {
|
||||
return subStr;
|
||||
}
|
||||
|
||||
public void updateParent(CdmaCall oldParent, CdmaCall newParent){
|
||||
if (newParent != oldParent) {
|
||||
if (oldParent != null) {
|
||||
oldParent.detach(this);
|
||||
}
|
||||
newParent.attachFake(this, CdmaCall.State.ACTIVE);
|
||||
parent = newParent;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finalize()
|
||||
{
|
||||
@@ -795,114 +789,121 @@ public class CdmaConnection extends Connection {
|
||||
}
|
||||
|
||||
private static boolean isPause(char c) {
|
||||
if (c == CUSTOMERIZED_PAUSE_CHAR_UPPER || c == CUSTOMERIZED_PAUSE_CHAR_LOWER
|
||||
|| c == PhoneNumberUtils.PAUSE) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return c == PhoneNumberUtils.PAUSE;
|
||||
}
|
||||
|
||||
private static boolean isWait(char c) {
|
||||
if (c == CUSTOMERIZED_WAIT_CHAR_LOWER || c == CUSTOMERIZED_WAIT_CHAR_UPPER
|
||||
|| c == PhoneNumberUtils.WAIT) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return c == PhoneNumberUtils.WAIT;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// This function is to find the next PAUSE character index if
|
||||
// multiple pauses in a row. Otherwise it finds the next non PAUSE or
|
||||
// non WAIT character index.
|
||||
private static int
|
||||
findNextPCharOrNonPOrNonWCharIndex(String phoneNumber, int currIndex) {
|
||||
boolean wMatched = false;
|
||||
int index = currIndex + 1;
|
||||
int length = phoneNumber.length();
|
||||
while (index < length) {
|
||||
char cNext = phoneNumber.charAt(index);
|
||||
// if there is any W inside P/W sequence,mark it
|
||||
if (isWait(cNext)) {
|
||||
wMatched = true;
|
||||
}
|
||||
// if any characters other than P/W chars after P/W sequence
|
||||
// we break out the loop and append the correct
|
||||
if (!isWait(cNext) && !isPause(cNext)) {
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
// It means the PAUSE character(s) is in the middle of dial string
|
||||
// and it needs to be handled one by one.
|
||||
if ((index < length) && (index > (currIndex + 1)) &&
|
||||
((wMatched == false) && isPause(phoneNumber.charAt(currIndex)))) {
|
||||
return (currIndex + 1);
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
// This function returns either PAUSE or WAIT character to append.
|
||||
// It is based on the next non PAUSE/WAIT character in the phoneNumber and the
|
||||
// index for the current PAUSE/WAIT character
|
||||
private static char
|
||||
findPOrWCharToAppend(String phoneNumber, int currPwIndex, int nextNonPwCharIndex) {
|
||||
char c = phoneNumber.charAt(currPwIndex);
|
||||
char ret;
|
||||
|
||||
// Append the PW char
|
||||
ret = (isPause(c)) ? PhoneNumberUtils.PAUSE : PhoneNumberUtils.WAIT;
|
||||
|
||||
// if there is a PAUSE in at the begining of PW character sequences, and this
|
||||
// PW character sequences has more than 2 PAUSE and WAIT Characters,skip P, append W
|
||||
if (isPause(c) && (nextNonPwCharIndex > (currPwIndex + 1))) {
|
||||
ret = PhoneNumberUtils.WAIT;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* format string
|
||||
* convert "+" to "011"
|
||||
* handle corner cases for PAUSE/WAIT
|
||||
* If PAUSE/WAIT sequence at the end,ignore them
|
||||
* If PAUSE/WAIT sequence in the middle, then if there is any WAIT
|
||||
* in PAUSE/WAIT sequence, treat them like WAIT
|
||||
* If PAUSE followed by WAIT or WAIT followed by PAUSE in the middle,
|
||||
* treat them like just PAUSE or WAIT
|
||||
* format orignal dial string
|
||||
* 1) convert international dialing prefix "+" to
|
||||
* string specified per region
|
||||
*
|
||||
* 2) handle corner cases for PAUSE/WAIT dialing:
|
||||
*
|
||||
* If PAUSE/WAIT sequence at the end, ignore them.
|
||||
*
|
||||
* If consecutive PAUSE/WAIT sequence in the middle of the string,
|
||||
* and if there is any WAIT in PAUSE/WAIT sequence, treat them like WAIT.
|
||||
*/
|
||||
private static String formatDialString(String phoneNumber) {
|
||||
public static String formatDialString(String phoneNumber) {
|
||||
if (phoneNumber == null) {
|
||||
return null;
|
||||
}
|
||||
int length = phoneNumber.length();
|
||||
StringBuilder ret = new StringBuilder();
|
||||
|
||||
// TODO(Moto): Modifying the for loop index is confusing, a
|
||||
// while loop is probably better and overall this code is
|
||||
// hard to follow. If this was routine was refactored and
|
||||
// used several private methods with good names to make it
|
||||
// easier to follow.
|
||||
for (int i = 0; i < length; i++) {
|
||||
char c = phoneNumber.charAt(i);
|
||||
|
||||
char c;
|
||||
int currIndex = 0;
|
||||
while (currIndex < length) {
|
||||
c = phoneNumber.charAt(currIndex);
|
||||
if (PhoneNumberUtils.isDialable(c)) {
|
||||
if (c == '+') {
|
||||
// TODO(Moto): Is this valid for "all" countries????
|
||||
// should probably be pulled from a resource based
|
||||
// on current contry code (MCC).
|
||||
ret.append("011");
|
||||
String ps = null;
|
||||
SystemProperties.get(TelephonyProperties.PROPERTY_IDP_STRING, ps);
|
||||
if (TextUtils.isEmpty(ps)) {
|
||||
ps = "011";
|
||||
}
|
||||
ret.append(ps);
|
||||
} else {
|
||||
ret.append(c);
|
||||
}
|
||||
} else if (isPause(c) || isWait(c)) {
|
||||
if (i < length - 1) { // if PAUSE/WAIT not at the end
|
||||
int index = 0;
|
||||
boolean wMatched = false;
|
||||
for (index = i + 1; index < length; index++) {
|
||||
char cNext = phoneNumber.charAt(index);
|
||||
// if there is any W inside P/W sequence,mark it
|
||||
if (isWait(cNext)) {
|
||||
wMatched = true;
|
||||
}
|
||||
// if any characters other than P/W chars after P/W sequence
|
||||
// we break out the loop and append the correct
|
||||
if (!isWait(cNext) && !isPause(cNext)) {
|
||||
break;
|
||||
if (currIndex < length - 1) {
|
||||
// if PW not at the end
|
||||
int nextIndex = findNextPCharOrNonPOrNonWCharIndex(phoneNumber, currIndex);
|
||||
// If there is non PW char following PW sequence
|
||||
if (nextIndex < length) {
|
||||
char pC = findPOrWCharToAppend(phoneNumber, currIndex, nextIndex);
|
||||
ret.append(pC);
|
||||
// If PW char is immediately followed by non-PW char
|
||||
if (nextIndex > (currIndex + 1)) {
|
||||
currIndex = nextIndex - 1;
|
||||
}
|
||||
} else if (nextIndex == length) {
|
||||
// It means PW characters at the end, ignore
|
||||
currIndex = length - 1;
|
||||
}
|
||||
if (index == length) {
|
||||
// it means there is no dialable character after PAUSE/WAIT
|
||||
i = length - 1;
|
||||
break;
|
||||
} else {// means index <length
|
||||
if (isPause(c)) {
|
||||
c = PhoneNumberUtils.PAUSE;
|
||||
} else if (isWait(c)) {
|
||||
c = PhoneNumberUtils.WAIT;
|
||||
}
|
||||
|
||||
if (index == i + 1) {
|
||||
ret.append(c);
|
||||
} else if (isWait(c)) {
|
||||
// for case like 123WP456 =123P456
|
||||
if ((index == i + 2) && isPause(phoneNumber.charAt(index - 1))) {
|
||||
// skip W,append P
|
||||
ret.append(PhoneNumberUtils.PAUSE);
|
||||
} else {
|
||||
// append W
|
||||
ret.append(c);
|
||||
}
|
||||
i = index - 1;
|
||||
} else if (isPause(c)) {
|
||||
|
||||
// for case like 123PW456 =123W456, skip p, append W
|
||||
// or there is 1 W in between, treat the whole PW
|
||||
// sequence as W
|
||||
if (wMatched == true) {
|
||||
// skip P,append W
|
||||
ret.append(PhoneNumberUtils.WAIT);
|
||||
i = index - 1;
|
||||
} else {
|
||||
ret.append(c);
|
||||
}
|
||||
} // end of pause case
|
||||
} // end of index <length, it means dialable characters after P/W
|
||||
}
|
||||
} else { // if it's characters other than P/W
|
||||
} else {
|
||||
ret.append(c);
|
||||
}
|
||||
currIndex++;
|
||||
}
|
||||
return ret.toString();
|
||||
}
|
||||
|
||||
@@ -16,8 +16,14 @@
|
||||
|
||||
package com.android.internal.telephony.cdma;
|
||||
import static com.android.internal.telephony.RILConstants.*;
|
||||
import android.os.Parcel;
|
||||
|
||||
public final class CdmaInformationRecords {
|
||||
public Object record;
|
||||
|
||||
/**
|
||||
* Record type identifier
|
||||
*/
|
||||
public static final int RIL_CDMA_DISPLAY_INFO_REC = 0;
|
||||
public static final int RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC = 1;
|
||||
public static final int RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC = 2;
|
||||
@@ -30,34 +36,54 @@ public final class CdmaInformationRecords {
|
||||
public static final int RIL_CDMA_T53_RELEASE_INFO_REC = 9;
|
||||
public static final int RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC = 10;
|
||||
|
||||
public boolean isDispInfo;
|
||||
public boolean isSignInfo;
|
||||
public String cdmaDisplayInfoRecord;
|
||||
public int[] cdmaSignalInfoRecord;
|
||||
public CdmaInformationRecords(Parcel p) {
|
||||
int id = p.readInt();
|
||||
switch (id) {
|
||||
case RIL_CDMA_DISPLAY_INFO_REC:
|
||||
case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
|
||||
record = new CdmaDisplayInfoRec(id, p.readString());
|
||||
break;
|
||||
|
||||
private static final int ALPHA_LEN_FOR_DISPLAY_INFO = 64;
|
||||
case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
|
||||
case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
|
||||
case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
|
||||
record = new CdmaNumberInfoRec(id, p.readString(), p.readInt(), p.readInt(),
|
||||
p.readInt(), p.readInt());
|
||||
break;
|
||||
|
||||
public CdmaInformationRecords() {
|
||||
isDispInfo = false;
|
||||
isSignInfo = false;
|
||||
case RIL_CDMA_SIGNAL_INFO_REC:
|
||||
record = new CdmaSignalInfoRec(p.readInt(), p.readInt(), p.readInt(), p.readInt());
|
||||
break;
|
||||
|
||||
case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
|
||||
record = new CdmaRedirectingNumberInfoRec(p.readString(), p.readInt(), p.readInt(),
|
||||
p.readInt(), p.readInt(), p.readInt());
|
||||
break;
|
||||
|
||||
case RIL_CDMA_LINE_CONTROL_INFO_REC:
|
||||
record = new CdmaLineControlInfoRec(p.readInt(), p.readInt(), p.readInt(),
|
||||
p.readInt());
|
||||
break;
|
||||
|
||||
case RIL_CDMA_T53_CLIR_INFO_REC:
|
||||
record = new CdmaT53ClirInfoRec(p.readInt());
|
||||
break;
|
||||
|
||||
case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
|
||||
record = new CdmaT53AudioControlInfoRec(p.readInt(), p.readInt());
|
||||
break;
|
||||
|
||||
case RIL_CDMA_T53_RELEASE_INFO_REC:
|
||||
// TODO(Moto): WHAT to do, for now fall through and throw exception
|
||||
default:
|
||||
throw new RuntimeException("RIL_UNSOL_CDMA_INFO_REC: unsupported record. Got "
|
||||
+ CdmaInformationRecords.idToString(id) + " ");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void setDispInfo(String resString) {
|
||||
isDispInfo = true;
|
||||
cdmaDisplayInfoRecord = resString;
|
||||
}
|
||||
|
||||
public void setSignInfo(int isPresent, int signalType, int alertPitch, int signal) {
|
||||
isSignInfo = true;
|
||||
cdmaSignalInfoRecord = new int[4];
|
||||
cdmaSignalInfoRecord[0] = isPresent;
|
||||
cdmaSignalInfoRecord[1] = signalType;
|
||||
cdmaSignalInfoRecord[2] = alertPitch;
|
||||
cdmaSignalInfoRecord[3] = signal;
|
||||
}
|
||||
|
||||
public String recordToString (int record) {
|
||||
switch(record) {
|
||||
public static String idToString(int id) {
|
||||
switch(id) {
|
||||
case RIL_CDMA_DISPLAY_INFO_REC: return "RIL_CDMA_DISPLAY_INFO_REC";
|
||||
case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC: return "RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC";
|
||||
case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC: return "RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC";
|
||||
@@ -72,4 +98,166 @@ public final class CdmaInformationRecords {
|
||||
default: return "<unknown record>";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Signal Information record from 3GPP2 C.S005 3.7.5.5
|
||||
*/
|
||||
public static class CdmaSignalInfoRec {
|
||||
public boolean isPresent; /* non-zero if signal information record is present */
|
||||
public int signalType;
|
||||
public int alertPitch;
|
||||
public int signal;
|
||||
|
||||
public CdmaSignalInfoRec() {}
|
||||
|
||||
public CdmaSignalInfoRec(int isPresent, int signalType, int alertPitch, int signal) {
|
||||
this.isPresent = isPresent != 0;
|
||||
this.signalType = signalType;
|
||||
this.alertPitch = alertPitch;
|
||||
this.signal = signal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaSignalInfo: {" +
|
||||
" isPresent: " + isPresent +
|
||||
", signalType: " + signalType +
|
||||
", alertPitch: " + alertPitch +
|
||||
", signal: " + signal +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
|
||||
public static class CdmaDisplayInfoRec {
|
||||
public int id;
|
||||
public String alpha;
|
||||
|
||||
public CdmaDisplayInfoRec(int id, String alpha) {
|
||||
this.id = id;
|
||||
this.alpha = alpha;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaDisplayInfoRec: {" +
|
||||
" id: " + CdmaInformationRecords.idToString(id) +
|
||||
", alpha: " + alpha +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
|
||||
public static class CdmaNumberInfoRec {
|
||||
public int id;
|
||||
public String number;
|
||||
public byte numberType;
|
||||
public byte numberPlan;
|
||||
public byte pi;
|
||||
public byte si;
|
||||
|
||||
public CdmaNumberInfoRec(int id, String number, int numberType, int numberPlan, int pi,
|
||||
int si) {
|
||||
this.number = number;
|
||||
this.numberType = (byte)numberType;
|
||||
this.numberPlan = (byte)numberPlan;
|
||||
this.pi = (byte)pi;
|
||||
this.si = (byte)si;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaNumberInfoRec: {" +
|
||||
" id: " + CdmaInformationRecords.idToString(id) +
|
||||
", number: " + number +
|
||||
", numberType: " + numberType +
|
||||
", numberPlan: " + numberPlan +
|
||||
", pi: " + pi +
|
||||
", si: " + si +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
|
||||
public static class CdmaRedirectingNumberInfoRec {
|
||||
public static final int REASON_UNKNOWN = 0;
|
||||
public static final int REASON_CALL_FORWARDING_BUSY = 1;
|
||||
public static final int REASON_CALL_FORWARDING_NO_REPLY = 2;
|
||||
public static final int REASON_CALLED_DTE_OUT_OF_ORDER = 9;
|
||||
public static final int REASON_CALL_FORWARDING_BY_THE_CALLED_DTE = 10;
|
||||
public static final int REASON_CALL_FORWARDING_UNCONDITIONAL = 15;
|
||||
|
||||
public CdmaNumberInfoRec numberInfoRec;
|
||||
public int redirectingReason;
|
||||
|
||||
public CdmaRedirectingNumberInfoRec(String number, int numberType, int numberPlan,
|
||||
int pi, int si, int reason) {
|
||||
numberInfoRec = new CdmaNumberInfoRec(RIL_CDMA_REDIRECTING_NUMBER_INFO_REC,
|
||||
number, numberType, numberPlan, pi, si);
|
||||
redirectingReason = reason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaNumberInfoRec: {" +
|
||||
" numberInfoRec: " + numberInfoRec +
|
||||
", redirectingReason: " + redirectingReason +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
|
||||
public static class CdmaLineControlInfoRec {
|
||||
public byte lineCtrlPolarityIncluded;
|
||||
public byte lineCtrlToggle;
|
||||
public byte lineCtrlReverse;
|
||||
public byte lineCtrlPowerDenial;
|
||||
|
||||
public CdmaLineControlInfoRec(int lineCtrlPolarityIncluded, int lineCtrlToggle,
|
||||
int lineCtrlReverse, int lineCtrlPowerDenial) {
|
||||
this.lineCtrlPolarityIncluded = (byte)lineCtrlPolarityIncluded;
|
||||
this.lineCtrlToggle = (byte)lineCtrlToggle;
|
||||
this.lineCtrlReverse = (byte)lineCtrlReverse;
|
||||
this.lineCtrlPowerDenial = (byte)lineCtrlPowerDenial;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaLineControlInfoRec: {" +
|
||||
" lineCtrlPolarityIncluded: " + lineCtrlPolarityIncluded +
|
||||
" lineCtrlToggle: " + lineCtrlToggle +
|
||||
" lineCtrlReverse: " + lineCtrlReverse +
|
||||
" lineCtrlPowerDenial: " + lineCtrlPowerDenial +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
|
||||
public static class CdmaT53ClirInfoRec {
|
||||
public byte cause;
|
||||
|
||||
public CdmaT53ClirInfoRec(int cause) {
|
||||
this.cause = (byte)cause;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaT53ClirInfoRec: {" +
|
||||
" cause: " + cause +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
|
||||
public static class CdmaT53AudioControlInfoRec {
|
||||
public byte uplink;
|
||||
public byte downlink;
|
||||
|
||||
public CdmaT53AudioControlInfoRec(int uplink, int downlink) {
|
||||
this.uplink = (byte) uplink;
|
||||
this.downlink = (byte) downlink;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CdmaT53AudioControlInfoRec: {" +
|
||||
" uplink: " + uplink +
|
||||
" downlink: " + downlink +
|
||||
" }";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,11 @@ package com.android.internal.telephony.cdma;
|
||||
import android.app.AlarmManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Intent;
|
||||
import android.database.ContentObserver;
|
||||
import android.database.SQLException;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncResult;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
@@ -32,6 +35,7 @@ import android.os.SystemProperties;
|
||||
import android.provider.Checkin;
|
||||
import android.provider.Settings;
|
||||
import android.provider.Settings.SettingNotFoundException;
|
||||
import android.provider.Telephony;
|
||||
import android.provider.Telephony.Intents;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.SignalStrength;
|
||||
@@ -134,6 +138,7 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
static final String LOG_TAG = "CDMA";
|
||||
|
||||
private ContentResolver cr;
|
||||
private String currentCarrier = null;
|
||||
|
||||
private ContentObserver mAutoTimeObserver = new ContentObserver(new Handler()) {
|
||||
@Override
|
||||
@@ -203,6 +208,7 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
cr.unregisterContentObserver(this.mAutoTimeObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finalize() {
|
||||
if (DBG) log("CdmaServiceStateTracker finalized");
|
||||
}
|
||||
@@ -265,10 +271,8 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
EVENT_GET_LOC_DONE_CDMA, onComplete));
|
||||
}
|
||||
|
||||
|
||||
//***** Overridden from ServiceStateTracker
|
||||
public void
|
||||
handleMessage (Message msg) {
|
||||
@Override
|
||||
public void handleMessage (Message msg) {
|
||||
AsyncResult ar;
|
||||
int[] ints;
|
||||
String[] strings;
|
||||
@@ -434,8 +438,8 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
|
||||
//***** Private Instance Methods
|
||||
|
||||
protected void setPowerStateToDesired()
|
||||
{
|
||||
@Override
|
||||
protected void setPowerStateToDesired() {
|
||||
// If we want it on and it's off, turn it on
|
||||
if (mDesiredPowerState
|
||||
&& cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
|
||||
@@ -470,6 +474,7 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
} // Otherwise, we're in the desired state
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateSpnDisplay() {
|
||||
String spn = "";
|
||||
boolean showSpn = false;
|
||||
@@ -511,8 +516,8 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
* Handle the result of one of the pollState()-related requests
|
||||
*/
|
||||
|
||||
protected void
|
||||
handlePollStateResult (int what, AsyncResult ar) {
|
||||
@Override
|
||||
protected void handlePollStateResult (int what, AsyncResult ar) {
|
||||
int ints[];
|
||||
String states[];
|
||||
|
||||
@@ -624,11 +629,32 @@ final class CdmaServiceStateTracker extends ServiceStateTracker {
|
||||
if (opNames != null && opNames.length >= 3) {
|
||||
if (cm.getRadioState().isNVReady()) {
|
||||
// In CDMA in case on NV the ss.mOperatorAlphaLong is set later with the
|
||||
// ERI text, so here is ignored what is coming from the modem
|
||||
// ERI text, so here it is ignored what is coming from the modem
|
||||
newSS.setOperatorName(null, opNames[1], opNames[2]);
|
||||
} else {
|
||||
newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
|
||||
}
|
||||
|
||||
if (!(opNames[2].equals(currentCarrier))) {
|
||||
// TODO(Moto): jsh asks, "This uses the MCC+MNC of the current registered
|
||||
// network to set the "current" entry in the APN table. But the correct
|
||||
// entry should be the MCC+MNC that matches the subscribed operator
|
||||
// (eg, phone issuer). These can be different when roaming."
|
||||
try {
|
||||
// Set the current field of the telephony provider according to
|
||||
// the CDMA's operator
|
||||
Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
|
||||
ContentValues map = new ContentValues();
|
||||
map.put(Telephony.Carriers.NUMERIC, opNames[2]);
|
||||
cr.insert(uri, map);
|
||||
// save current carrier for the next time check
|
||||
currentCarrier = opNames[2];
|
||||
} catch (SQLException e) {
|
||||
Log.e(LOG_TAG, "Can't store current operator", e);
|
||||
}
|
||||
} else {
|
||||
Log.i(LOG_TAG, "current carrier is not changed");
|
||||
}
|
||||
} else {
|
||||
Log.w(LOG_TAG, "error parsing opNames");
|
||||
}
|
||||
|
||||
@@ -84,7 +84,6 @@ public final class FeatureCode extends Handler implements MmiCode {
|
||||
|
||||
CDMAPhone phone;
|
||||
Context context;
|
||||
CdmaConnection suppConn;
|
||||
String action; // '*' in CDMA
|
||||
String sc; // Service Code
|
||||
String poundString; // Entire Flash string
|
||||
@@ -237,17 +236,9 @@ public final class FeatureCode extends Handler implements MmiCode {
|
||||
}
|
||||
|
||||
/** Process a Flash Code...anything that isn't a dialing number */
|
||||
void processCode () {
|
||||
void processCode() {
|
||||
Log.d(LOG_TAG, "send feature code...");
|
||||
if (this.poundString != null) {
|
||||
// TODO(Moto): Is suppConn going away?
|
||||
suppConn = new CdmaConnection(phone.getContext(), this.poundString, phone.mCT, null);
|
||||
phone.mCM.sendCDMAFeatureCode(suppConn.address,
|
||||
obtainMessage(EVENT_CDMA_FLASH_COMPLETED));
|
||||
} else {
|
||||
phone.mCM.sendCDMAFeatureCode(this.poundString,
|
||||
obtainMessage(EVENT_CDMA_FLASH_COMPLETED));
|
||||
}
|
||||
phone.mCM.sendCDMAFeatureCode(this.poundString, obtainMessage(EVENT_CDMA_FLASH_COMPLETED));
|
||||
}
|
||||
|
||||
/** Called from CDMAPhone.handleMessage; not a Handler subclass */
|
||||
@@ -268,7 +259,6 @@ public final class FeatureCode extends Handler implements MmiCode {
|
||||
} else {
|
||||
state = State.COMPLETE;
|
||||
message = context.getText(com.android.internal.R.string.fcComplete);
|
||||
suppConn.processNextPostDialChar();
|
||||
}
|
||||
phone.onFeatureCodeDone(this);
|
||||
break;
|
||||
|
||||
@@ -16,19 +16,17 @@
|
||||
|
||||
package com.android.internal.telephony.cdma;
|
||||
|
||||
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
|
||||
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
|
||||
import android.os.AsyncResult;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.os.Registrant;
|
||||
import android.util.Log;
|
||||
|
||||
import static com.android.internal.telephony.TelephonyProperties.*;
|
||||
import com.android.internal.telephony.AdnRecord;
|
||||
import com.android.internal.telephony.AdnRecordCache;
|
||||
import com.android.internal.telephony.AdnRecordLoader;
|
||||
import com.android.internal.telephony.CommandsInterface;
|
||||
import com.android.internal.telephony.TelephonyProperties;
|
||||
import com.android.internal.telephony.cdma.RuimCard;
|
||||
import com.android.internal.telephony.gsm.MccTable;
|
||||
|
||||
@@ -55,8 +53,13 @@ public final class RuimRecords extends IccRecords {
|
||||
|
||||
//***** Instance Variables
|
||||
|
||||
String spn;
|
||||
int spnDisplayCondition;
|
||||
private String mImsi;
|
||||
private String mMyMobileNumber;
|
||||
private String mSid;
|
||||
private String mNid;
|
||||
private String mMin2Min1;
|
||||
|
||||
private String mPrlVersion;
|
||||
|
||||
//***** Event Constants
|
||||
|
||||
@@ -122,8 +125,8 @@ public final class RuimRecords extends IccRecords {
|
||||
|
||||
adnCache.reset();
|
||||
|
||||
phone.setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, null);
|
||||
phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null);
|
||||
phone.setSystemProperty(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, null);
|
||||
phone.setSystemProperty(TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null);
|
||||
|
||||
// recordsRequested is set to false indicating that the SIM
|
||||
// read requests made so far are not valid. This is set to
|
||||
@@ -131,6 +134,25 @@ public final class RuimRecords extends IccRecords {
|
||||
recordsRequested = false;
|
||||
}
|
||||
|
||||
/** Returns null if RUIM is not yet ready */
|
||||
public String getIMSI_M() {
|
||||
// TODO(Moto): mImsi is not initialized, fix.
|
||||
return mImsi;
|
||||
}
|
||||
|
||||
public String getMdnNumber() {
|
||||
return mMyMobileNumber;
|
||||
}
|
||||
|
||||
public String getCdmaMin() {
|
||||
return mMin2Min1;
|
||||
}
|
||||
|
||||
/** Returns null if RUIM is not yet ready */
|
||||
public String getPrlVersion() {
|
||||
return mPrlVersion;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVoiceMailNumber(String alphaTag, String voiceNumber, Message onComplete){
|
||||
// In CDMA this is Operator/OEM dependent
|
||||
@@ -155,6 +177,30 @@ public final class RuimRecords extends IccRecords {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the 5 or 6 digit MCC/MNC of the operator that
|
||||
* provided the RUIM card. Returns null of RUIM is not yet ready
|
||||
*/
|
||||
public String getRUIMOperatorNumeric() {
|
||||
if (mImsi == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// TODO(Moto): mncLength is not set anywhere.
|
||||
if (mncLength != 0) {
|
||||
// Length = length of MCC + length of MNC
|
||||
// TODO: change spec name
|
||||
// length of mcc = 3 (3GPP2 C.S0005 - Section 2.3)
|
||||
return mImsi.substring(0, 3 + mncLength);
|
||||
}
|
||||
|
||||
// Guess the MNC length based on the MCC if we don't
|
||||
// have a valid value in ef[ad]
|
||||
|
||||
int mcc = Integer.parseInt(mImsi.substring(0,3));
|
||||
return mImsi.substring(0, 3 + MccTable.smallestDigitsMccForMnc(mcc));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
AsyncResult ar;
|
||||
@@ -181,35 +227,27 @@ public final class RuimRecords extends IccRecords {
|
||||
/* IO events */
|
||||
|
||||
case EVENT_GET_CDMA_SUBSCRIPTION_DONE:
|
||||
// TODO(Moto):TODO(Teleca): This event was removed by Teleca/QCT
|
||||
// I've left it as it's needed to complete EVENT_OTA_PROVISION_STATUS_CHANGE.
|
||||
// But since various instance variables are removed I've commented
|
||||
// out code that references them. I'm sure this is wrong so
|
||||
// Moto/Teleca/QCT need to come to an agreement. Also see onRuimReady
|
||||
// and onVnReady.
|
||||
|
||||
ar = (AsyncResult)msg.obj;
|
||||
String localTemp[] = (String[])ar.result;
|
||||
if (ar.exception != null) {
|
||||
break;
|
||||
}
|
||||
if(m_ota_commited) {
|
||||
//if(mMyMobileNumber != localTemp[0]) {
|
||||
if (m_ota_commited) {
|
||||
if (mMyMobileNumber != localTemp[0]) {
|
||||
Intent intent = new Intent(TelephonyIntents.ACTION_CDMA_OTA_MDN_CHANGED);
|
||||
intent.putExtra("mdn", localTemp[0]);
|
||||
Log.d(LOG_TAG,"Broadcasting intent MDN Change in OTA ");
|
||||
ActivityManagerNative.broadcastStickyIntent(intent, null);
|
||||
//}
|
||||
m_ota_commited=false;
|
||||
}
|
||||
m_ota_commited = false;
|
||||
}
|
||||
//mMyMobileNumber = localTemp[0];
|
||||
//mSid = localTemp[1];
|
||||
//mNid = localTemp[2];
|
||||
//if (localTemp.length >= 3) { // TODO(Moto): remove when new ril always returns min2_min1
|
||||
// mMin2Min1 = localTemp[3];
|
||||
//}
|
||||
mMyMobileNumber = localTemp[0];
|
||||
mSid = localTemp[1];
|
||||
mNid = localTemp[2];
|
||||
mMin2Min1 = localTemp[3];
|
||||
mPrlVersion = localTemp[4];
|
||||
|
||||
//Log.d(LOG_TAG, "MDN: " + mMyMobileNumber + " MIN: " + mMin2Min1);
|
||||
Log.d(LOG_TAG, "MDN: " + mMyMobileNumber + " MIN: " + mMin2Min1);
|
||||
|
||||
break;
|
||||
|
||||
@@ -262,9 +300,11 @@ public final class RuimRecords extends IccRecords {
|
||||
if (ar.exception == null) {
|
||||
int[] ints = (int[]) ar.result;
|
||||
int otaStatus = ints[0];
|
||||
if (otaStatus== phone.CDMA_OTA_PROVISION_STATUS_COMMITTED) {
|
||||
if (otaStatus == phone.CDMA_OTA_PROVISION_STATUS_COMMITTED) {
|
||||
m_ota_commited=true;
|
||||
phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
|
||||
} else if (otaStatus == phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED) {
|
||||
phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -315,14 +355,14 @@ public final class RuimRecords extends IccRecords {
|
||||
RuimCard.INTENT_VALUE_ICC_READY, null);
|
||||
|
||||
fetchRuimRecords();
|
||||
|
||||
// TODO(Moto): TODO(Teleca): Work out how to do CDMA subscription
|
||||
// phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
|
||||
|
||||
phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
|
||||
|
||||
}
|
||||
|
||||
private void onNvReady() {
|
||||
// TODO(Moto): TODO(Teleca): Work out how to do CDMA subscription
|
||||
// phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
|
||||
phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
|
||||
|
||||
}
|
||||
|
||||
private void fetchRuimRecords() {
|
||||
|
||||
@@ -74,13 +74,18 @@ public class SignalToneUtil {
|
||||
static private HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
|
||||
|
||||
private static Integer signalParamHash(int signalType, int alertPitch, int signal) {
|
||||
// TODO(Moto): The input should get checked before usage
|
||||
if ((signalType < 0) || (signalType > 256) || (alertPitch > 256) ||
|
||||
(alertPitch < 0) || (signal > 256) || (signal < 0)) {
|
||||
return new Integer(ToneGenerator.TONE_CDMA_INVALID);
|
||||
}
|
||||
return new Integer(signalType * 256 * 256 + alertPitch * 256 + signal);
|
||||
}
|
||||
|
||||
public static int getAudioToneFromSignalInfo(int signalType, int alertPitch, int signal) {
|
||||
int result = ToneGenerator.TONE_CDMA_INVALID;
|
||||
result = hm.get(signalParamHash(signalType, alertPitch, signal));
|
||||
Integer result = hm.get(signalParamHash(signalType, alertPitch, signal));
|
||||
if (result == null) {
|
||||
return ToneGenerator.TONE_CDMA_INVALID;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user