Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f7f6243 authored by Amit Mahajan's avatar Amit Mahajan Committed by Android Git Automerger
Browse files

am d1158a95: Merge "Adding EmergencyCall state to DcSwitch state machine." into mnc-dev

* commit 'd1158a95':
  Adding EmergencyCall state to DcSwitch state machine.
parents 668a5070 d1158a95
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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*/

@@ -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)) {
+5 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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);
        }
    }

@@ -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);
            }
        }
    }
+13 −3
Original line number Diff line number Diff line
@@ -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";
@@ -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 {
@@ -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) {
+46 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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");
@@ -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);
@@ -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
@@ -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