Loading src/java/com/android/internal/telephony/PhoneBase.java +20 −0 Original line number Diff line number Diff line Loading @@ -335,6 +335,9 @@ public abstract class PhoneBase extends Handler implements Phone { protected final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList(); protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList(); protected Looper mLooper; /* to insure registrants are in correct thread*/ Loading Loading @@ -999,6 +1002,23 @@ public abstract class PhoneBase extends Handler implements Phone { updateSavedNetworkOperator(nsm); } /** * Registration point for emergency call/callback mode start. Message.obj is AsyncResult and * Message.obj.result will be Integer indicating start of call by value 1 or end of call by * value 0 * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj.userObj */ public void registerForEmergencyCallToggle(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mEmergencyCallToggledRegistrants.add(r); } public void unregisterForEmergencyCallToggle(Handler h) { mEmergencyCallToggledRegistrants.remove(h); } private void updateSavedNetworkOperator(NetworkSelectMessage nsm) { int subId = getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { Loading src/java/com/android/internal/telephony/cdma/CDMAPhone.java +5 −0 Original line number Diff line number Diff line Loading @@ -1144,9 +1144,14 @@ public class CDMAPhone extends PhoneBase { sendEmergencyCallbackModeChange(); // Re-initiate data connection mDcTracker.setInternalDataEnabled(true); notifyEmergencyCallRegistrants(false); } } protected void notifyEmergencyCallRegistrants(boolean started) { mEmergencyCallToggledRegistrants.notifyResult(started ? 1 : 0); } /** * Handle to cancel or restart Ecm timer in emergency call back mode * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled; Loading src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java +2 −0 Original line number Diff line number Diff line Loading @@ -1123,6 +1123,7 @@ public final class CdmaCallTracker extends CallTracker { if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall"); mIsInEmergencyCall = true; mPhone.mDcTracker.setInternalDataEnabled(false); mPhone.notifyEmergencyCallRegistrants(true); } } Loading @@ -1140,6 +1141,7 @@ public final class CdmaCallTracker extends CallTracker { if (inEcm.compareTo("false") == 0) { // Re-initiate data connection mPhone.mDcTracker.setInternalDataEnabled(true); mPhone.notifyEmergencyCallRegistrants(false); } } } Loading src/java/com/android/internal/telephony/dataconnection/DcSwitchAsyncChannel.java +13 −3 Original line number Diff line number Diff line Loading @@ -44,8 +44,10 @@ public class DcSwitchAsyncChannel extends AsyncChannel { static final int RSP_IS_IDLE_OR_DETACHING_STATE = BASE + 6; static final int EVENT_DATA_ATTACHED = BASE + 7; static final int EVENT_DATA_DETACHED = BASE + 8; static final int EVENT_EMERGENCY_CALL_STARTED = BASE + 9; static final int EVENT_EMERGENCY_CALL_ENDED = BASE + 10; private static final int CMD_TO_STRING_COUNT = EVENT_DATA_DETACHED - BASE + 1; private static final int CMD_TO_STRING_COUNT = EVENT_EMERGENCY_CALL_ENDED - BASE + 1; private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; static { sCmdToString[REQ_CONNECT - BASE] = "REQ_CONNECT"; Loading @@ -57,6 +59,8 @@ public class DcSwitchAsyncChannel extends AsyncChannel { sCmdToString[RSP_IS_IDLE_OR_DETACHING_STATE - BASE] = "RSP_IS_IDLE_OR_DETACHING_STATE"; sCmdToString[EVENT_DATA_ATTACHED - BASE] = "EVENT_DATA_ATTACHED"; sCmdToString[EVENT_DATA_DETACHED - BASE] = "EVENT_DATA_DETACHED"; sCmdToString[EVENT_EMERGENCY_CALL_STARTED - BASE] = "EVENT_EMERGENCY_CALL_STARTED"; sCmdToString[EVENT_EMERGENCY_CALL_ENDED - BASE] = "EVENT_EMERGENCY_CALL_ENDED"; } public static class RequestInfo { Loading Loading @@ -117,12 +121,18 @@ public class DcSwitchAsyncChannel extends AsyncChannel { public void notifyDataAttached() { sendMessage(EVENT_DATA_ATTACHED); if (DBG) log("notifyDataAttached"); } public void notifyDataDetached() { sendMessage(EVENT_DATA_DETACHED); if (DBG) log("EVENT_DATA_DETACHED"); } public void notifyEmergencyCallToggled(int start) { if (start != 0) { sendMessage(EVENT_EMERGENCY_CALL_STARTED); } else { sendMessage(EVENT_EMERGENCY_CALL_ENDED); } } private boolean rspIsIdle(Message response) { Loading src/java/com/android/internal/telephony/dataconnection/DcSwitchStateMachine.java +46 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.internal.telephony.dataconnection; import com.android.internal.util.AsyncChannel; import com.android.internal.util.IState; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; Loading Loading @@ -48,11 +49,16 @@ public class DcSwitchStateMachine extends StateMachine { private AsyncChannel mAc; private IdleState mIdleState = new IdleState(); private EmergencyState mEmergencyState = new EmergencyState(); private AttachingState mAttachingState = new AttachingState(); private AttachedState mAttachedState = new AttachedState(); private DetachingState mDetachingState = new DetachingState(); private DefaultState mDefaultState = new DefaultState(); // In case of transition to emergency state, this tracks the state of the state machine prior // to entering emergency state private IState mPreEmergencyState; protected DcSwitchStateMachine(Phone phone, String name, int id) { super(name); if (DBG) log("DcSwitchState constructor E"); Loading @@ -61,6 +67,7 @@ public class DcSwitchStateMachine extends StateMachine { addState(mDefaultState); addState(mIdleState, mDefaultState); addState(mEmergencyState, mDefaultState); addState(mAttachingState, mDefaultState); addState(mAttachedState, mDefaultState); addState(mDetachingState, mDefaultState); Loading Loading @@ -140,6 +147,40 @@ public class DcSwitchStateMachine extends StateMachine { } } private class EmergencyState extends State { @Override public boolean processMessage(Message msg) { final PhoneBase pb = (PhoneBase)((PhoneProxy)mPhone).getActivePhone(); if (!pb.mDcTracker.isEmergency()) { loge("EmergencyState: isEmergency() is false. deferMessage msg.what=0x" + Integer.toHexString(msg.what)); deferMessage(msg); transitionTo(mPreEmergencyState); return HANDLED; } switch (msg.what) { case DcSwitchAsyncChannel.EVENT_EMERGENCY_CALL_ENDED: { transitionTo(mPreEmergencyState); break; } case DcSwitchAsyncChannel.EVENT_EMERGENCY_CALL_STARTED: { loge("EmergencyState: ignoring EVENT_EMERGENCY_CALL_STARTED"); break; } default: { log("EmergencyState: deferMessage msg.what=0x" + Integer.toHexString(msg.what)); deferMessage(msg); break; } } return HANDLED; } } private class AttachingState extends State { private int mCurrentAllowedSequence = 0; @Override Loading Loading @@ -398,6 +439,11 @@ public class DcSwitchStateMachine extends StateMachine { DcSwitchAsyncChannel.RSP_IS_IDLE_OR_DETACHING_STATE, val ? 1 : 0); break; } case DcSwitchAsyncChannel.EVENT_EMERGENCY_CALL_STARTED: { mPreEmergencyState = getCurrentState(); transitionTo(mEmergencyState); break; } default: if (DBG) { log("DefaultState: shouldn't happen but ignore msg.what=0x" + Loading Loading
src/java/com/android/internal/telephony/PhoneBase.java +20 −0 Original line number Diff line number Diff line Loading @@ -335,6 +335,9 @@ public abstract class PhoneBase extends Handler implements Phone { protected final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList(); protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList(); protected Looper mLooper; /* to insure registrants are in correct thread*/ Loading Loading @@ -999,6 +1002,23 @@ public abstract class PhoneBase extends Handler implements Phone { updateSavedNetworkOperator(nsm); } /** * Registration point for emergency call/callback mode start. Message.obj is AsyncResult and * Message.obj.result will be Integer indicating start of call by value 1 or end of call by * value 0 * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj.userObj */ public void registerForEmergencyCallToggle(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mEmergencyCallToggledRegistrants.add(r); } public void unregisterForEmergencyCallToggle(Handler h) { mEmergencyCallToggledRegistrants.remove(h); } private void updateSavedNetworkOperator(NetworkSelectMessage nsm) { int subId = getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { Loading
src/java/com/android/internal/telephony/cdma/CDMAPhone.java +5 −0 Original line number Diff line number Diff line Loading @@ -1144,9 +1144,14 @@ public class CDMAPhone extends PhoneBase { sendEmergencyCallbackModeChange(); // Re-initiate data connection mDcTracker.setInternalDataEnabled(true); notifyEmergencyCallRegistrants(false); } } protected void notifyEmergencyCallRegistrants(boolean started) { mEmergencyCallToggledRegistrants.notifyResult(started ? 1 : 0); } /** * Handle to cancel or restart Ecm timer in emergency call back mode * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled; Loading
src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java +2 −0 Original line number Diff line number Diff line Loading @@ -1123,6 +1123,7 @@ public final class CdmaCallTracker extends CallTracker { if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall"); mIsInEmergencyCall = true; mPhone.mDcTracker.setInternalDataEnabled(false); mPhone.notifyEmergencyCallRegistrants(true); } } Loading @@ -1140,6 +1141,7 @@ public final class CdmaCallTracker extends CallTracker { if (inEcm.compareTo("false") == 0) { // Re-initiate data connection mPhone.mDcTracker.setInternalDataEnabled(true); mPhone.notifyEmergencyCallRegistrants(false); } } } Loading
src/java/com/android/internal/telephony/dataconnection/DcSwitchAsyncChannel.java +13 −3 Original line number Diff line number Diff line Loading @@ -44,8 +44,10 @@ public class DcSwitchAsyncChannel extends AsyncChannel { static final int RSP_IS_IDLE_OR_DETACHING_STATE = BASE + 6; static final int EVENT_DATA_ATTACHED = BASE + 7; static final int EVENT_DATA_DETACHED = BASE + 8; static final int EVENT_EMERGENCY_CALL_STARTED = BASE + 9; static final int EVENT_EMERGENCY_CALL_ENDED = BASE + 10; private static final int CMD_TO_STRING_COUNT = EVENT_DATA_DETACHED - BASE + 1; private static final int CMD_TO_STRING_COUNT = EVENT_EMERGENCY_CALL_ENDED - BASE + 1; private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; static { sCmdToString[REQ_CONNECT - BASE] = "REQ_CONNECT"; Loading @@ -57,6 +59,8 @@ public class DcSwitchAsyncChannel extends AsyncChannel { sCmdToString[RSP_IS_IDLE_OR_DETACHING_STATE - BASE] = "RSP_IS_IDLE_OR_DETACHING_STATE"; sCmdToString[EVENT_DATA_ATTACHED - BASE] = "EVENT_DATA_ATTACHED"; sCmdToString[EVENT_DATA_DETACHED - BASE] = "EVENT_DATA_DETACHED"; sCmdToString[EVENT_EMERGENCY_CALL_STARTED - BASE] = "EVENT_EMERGENCY_CALL_STARTED"; sCmdToString[EVENT_EMERGENCY_CALL_ENDED - BASE] = "EVENT_EMERGENCY_CALL_ENDED"; } public static class RequestInfo { Loading Loading @@ -117,12 +121,18 @@ public class DcSwitchAsyncChannel extends AsyncChannel { public void notifyDataAttached() { sendMessage(EVENT_DATA_ATTACHED); if (DBG) log("notifyDataAttached"); } public void notifyDataDetached() { sendMessage(EVENT_DATA_DETACHED); if (DBG) log("EVENT_DATA_DETACHED"); } public void notifyEmergencyCallToggled(int start) { if (start != 0) { sendMessage(EVENT_EMERGENCY_CALL_STARTED); } else { sendMessage(EVENT_EMERGENCY_CALL_ENDED); } } private boolean rspIsIdle(Message response) { Loading
src/java/com/android/internal/telephony/dataconnection/DcSwitchStateMachine.java +46 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.internal.telephony.dataconnection; import com.android.internal.util.AsyncChannel; import com.android.internal.util.IState; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; Loading Loading @@ -48,11 +49,16 @@ public class DcSwitchStateMachine extends StateMachine { private AsyncChannel mAc; private IdleState mIdleState = new IdleState(); private EmergencyState mEmergencyState = new EmergencyState(); private AttachingState mAttachingState = new AttachingState(); private AttachedState mAttachedState = new AttachedState(); private DetachingState mDetachingState = new DetachingState(); private DefaultState mDefaultState = new DefaultState(); // In case of transition to emergency state, this tracks the state of the state machine prior // to entering emergency state private IState mPreEmergencyState; protected DcSwitchStateMachine(Phone phone, String name, int id) { super(name); if (DBG) log("DcSwitchState constructor E"); Loading @@ -61,6 +67,7 @@ public class DcSwitchStateMachine extends StateMachine { addState(mDefaultState); addState(mIdleState, mDefaultState); addState(mEmergencyState, mDefaultState); addState(mAttachingState, mDefaultState); addState(mAttachedState, mDefaultState); addState(mDetachingState, mDefaultState); Loading Loading @@ -140,6 +147,40 @@ public class DcSwitchStateMachine extends StateMachine { } } private class EmergencyState extends State { @Override public boolean processMessage(Message msg) { final PhoneBase pb = (PhoneBase)((PhoneProxy)mPhone).getActivePhone(); if (!pb.mDcTracker.isEmergency()) { loge("EmergencyState: isEmergency() is false. deferMessage msg.what=0x" + Integer.toHexString(msg.what)); deferMessage(msg); transitionTo(mPreEmergencyState); return HANDLED; } switch (msg.what) { case DcSwitchAsyncChannel.EVENT_EMERGENCY_CALL_ENDED: { transitionTo(mPreEmergencyState); break; } case DcSwitchAsyncChannel.EVENT_EMERGENCY_CALL_STARTED: { loge("EmergencyState: ignoring EVENT_EMERGENCY_CALL_STARTED"); break; } default: { log("EmergencyState: deferMessage msg.what=0x" + Integer.toHexString(msg.what)); deferMessage(msg); break; } } return HANDLED; } } private class AttachingState extends State { private int mCurrentAllowedSequence = 0; @Override Loading Loading @@ -398,6 +439,11 @@ public class DcSwitchStateMachine extends StateMachine { DcSwitchAsyncChannel.RSP_IS_IDLE_OR_DETACHING_STATE, val ? 1 : 0); break; } case DcSwitchAsyncChannel.EVENT_EMERGENCY_CALL_STARTED: { mPreEmergencyState = getCurrentState(); transitionTo(mEmergencyState); break; } default: if (DBG) { log("DefaultState: shouldn't happen but ignore msg.what=0x" + Loading