Loading src/java/com/android/internal/telephony/SubscriptionController.java +1 −2 Original line number Diff line number Diff line Loading @@ -220,8 +220,7 @@ public class SubscriptionController extends ISub.Stub { logdl("[SubscriptionController] init by Context"); mDataConnectionHandler = new DataConnectionHandler(); mScheduler = DdsScheduler.makeDdsScheduler(); mScheduler.start(); mScheduler = DdsScheduler.getInstance(); mSchedulerAc = new DdsSchedulerAc(); mSchedulerAc.connect(mContext, mDataConnectionHandler, mScheduler.getHandler()); Loading src/java/com/android/internal/telephony/dataconnection/DctController.java +2 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.TelephonyProperties; import com.android.internal.telephony.DefaultPhoneNotifier; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.dataconnection.DdsScheduler; import android.util.Log; import java.util.HashSet; Loading Loading @@ -232,6 +233,7 @@ public class DctController extends Handler { public static DctController makeDctController(PhoneProxy[] phones, Looper looper) { if (sDctController == null) { sDctController = new DctController(phones, looper); DdsScheduler.init(); } return sDctController; } Loading src/java/com/android/internal/telephony/dataconnection/DdsScheduler.java +110 −71 Original line number Diff line number Diff line Loading @@ -61,9 +61,10 @@ public class DdsScheduler extends StateMachine { private PsAttachReservedState mPsAttachReservedState = new PsAttachReservedState(); private DdsSwitchState mDdsSwitchState = new DdsSwitchState(); private DdsAutoRevertState mDdsAutoRevertState = new DdsAutoRevertState(); private long mCurrentDds = SubscriptionManager.INVALID_SUB_ID; private DctController mDctController; private ModemStackController mModemStackController; private static DdsScheduler sDdsScheduler; private final int MODEM_DATA_CAPABILITY_UNKNOWN = -1; private final int MODEM_SINGLE_DATA_CAPABLE = 1; Loading @@ -86,17 +87,34 @@ public class DdsScheduler extends StateMachine { private List<NetworkRequestInfo> mInbox = Collections.synchronizedList( new ArrayList<NetworkRequestInfo>()); public static DdsScheduler makeDdsScheduler() { HandlerThread t = new HandlerThread("DdsSchedulerThread"); t.start(); DdsScheduler scheduler = new DdsScheduler(t.getLooper()); scheduler.start(); return scheduler; private static DdsScheduler createDdsScheduler() { DdsScheduler ddsScheduler = new DdsScheduler(); ddsScheduler.start(); return ddsScheduler; } public static DdsScheduler getInstance() { if (sDdsScheduler == null) { sDdsScheduler = createDdsScheduler(); } Rlog.d(TAG, "getInstance = " + sDdsScheduler); return sDdsScheduler; } public static void init() { if (sDdsScheduler == null) { sDdsScheduler = getInstance(); } sDdsScheduler.registerCallbacks(); Rlog.d(TAG, "init = " + sDdsScheduler); } private DdsScheduler(Looper looper) { super("DdsScheduler", looper); private DdsScheduler() { super("DdsScheduler"); addState(mDefaultState); addState(mDdsIdleState, mDefaultState); Loading Loading @@ -221,7 +239,14 @@ public class DdsScheduler extends StateMachine { } private void requestDdsSwitch(NetworkRequest n) { if (n != null) { mDctController.setOnDemandDataSubId(n); } else { // set DDS to user configured defaultDds SUB. // requestPsAttach would make sure that OemHook api to set DDS // is called as well as PS ATTACH is requested. requestPsAttach(null); } } private void requestPsAttach(NetworkRequest n) { Loading @@ -233,7 +258,10 @@ public class DdsScheduler extends StateMachine { } private int getMaxDataAllowed() { int maxData = mModemStackController.getMaxDataAllowed(); ModemStackController modemStackController = ModemStackController.getInstance(); Rlog.d(TAG, "ModemStackController = " + modemStackController); int maxData = modemStackController.getMaxDataAllowed(); Rlog.d(TAG, "modem value of max_data = " + maxData); int override = SystemProperties.getInt(OVERRIDE_MODEM_DUAL_DATA_CAP_PROP, Loading @@ -245,27 +273,42 @@ public class DdsScheduler extends StateMachine { return maxData; } void triggerSwitch(NetworkRequest n) { private void registerCallbacks() { if(mDctController == null) { Rlog.d(TAG, "registerCallbacks"); mDctController = DctController.getInstance(); mDctController.registerForOnDemandDataSwitchInfo(getHandler(), DdsSchedulerAc.EVENT_ON_DEMAND_DDS_SWITCH_DONE, null); mDctController.registerForOnDemandPsAttach(getHandler(), DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE, null); mModemStackController = ModemStackController.getInstance(); Rlog.d(TAG, "ModemStackController = " + mModemStackController); } } void triggerSwitch(NetworkRequest n) { boolean multiDataSupported = false; mModemStackController.registerForModemDataCapsUpdate(getHandler(), DdsSchedulerAc.EVENT_MODEM_DATA_CAPABILITY_UPDATE, null); if (isMultiDataSupported()) { multiDataSupported = true; Rlog.d(TAG, "Simultaneous dual-data supported"); } else { Rlog.d(TAG, "Simultaneous dual-data NOT supported"); } if ((n != null) && (getMaxDataAllowed() == MODEM_DUAL_DATA_CAPABLE)) { if ((n != null) && multiDataSupported) { requestPsAttach(n); } else { requestDdsSwitch(n); } } boolean isMultiDataSupported() { boolean flag = false; if (getMaxDataAllowed() == MODEM_DUAL_DATA_CAPABLE) { flag = true; } return flag; } boolean isAnyRequestWaiting() { synchronized(mInbox) { return !mInbox.isEmpty(); Loading Loading @@ -302,6 +345,17 @@ public class DdsScheduler extends StateMachine { break; } case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION, currentState = " + getCurrentState().getName()); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE, currentState = " + getCurrentState().getName()); return HANDLED; } default: { Rlog.d(TAG, "unknown msg = " + msg); break; Loading Loading @@ -359,11 +413,6 @@ public class DdsScheduler extends StateMachine { return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE: NO OP!"); return HANDLED; } default: { Rlog.d(TAG, "unknown msg = " + msg); return NOT_HANDLED; Loading @@ -384,7 +433,7 @@ public class DdsScheduler extends StateMachine { Rlog.d(TAG, "Switch required for " + nr); transitionTo(mDdsSwitchState); } else { Rlog.e(TAG, "This request failed to get accepted. nr = " + nr); Rlog.e(TAG, "This request could not get accepted, start over. nr = " + nr); //reset state machine to stable state. transitionTo(mDdsAutoRevertState); } Loading Loading @@ -412,8 +461,10 @@ public class DdsScheduler extends StateMachine { if (getSubIdFromNetworkRequest(n) == getCurrentDds()) { Rlog.d(TAG, "Accepting simultaneous request for current sub"); notifyRequestAccepted(n); } else if (isMultiDataSupported()) { Rlog.d(TAG, "Incoming request is for on-demand subscription, n = " + n); requestPsAttach(n); } return HANDLED; } Loading @@ -430,6 +481,20 @@ public class DdsScheduler extends StateMachine { return HANDLED; } case DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE: { AsyncResult ar = (AsyncResult) msg.obj; NetworkRequest n = (NetworkRequest)ar.result; if (ar.exception == null) { updateCurrentDds(n); transitionTo(mPsAttachReservedState); } else { Rlog.d(TAG, "Switch failed, ignore the req = " + n); //discard the request so that we can process other pending reqeusts removeRequest(n); } return HANDLED; } default: { Rlog.d(TAG, "unknown msg = " + msg); return NOT_HANDLED; Loading @@ -440,7 +505,6 @@ public class DdsScheduler extends StateMachine { private class PsAttachReservedState extends State { static final String TAG = DdsScheduler.TAG + "[PSAttachReservedState]"; private boolean isMultiDataSupported = true; private void handleOtherSubRequests() { NetworkRequest nr = getFirstWaitingRequest(); Loading @@ -449,8 +513,14 @@ public class DdsScheduler extends StateMachine { } else if (getSubIdFromNetworkRequest(nr) != getCurrentDds()) { Rlog.d(TAG, "Next request is not for current on-demand PS sub(DSDA). nr = " + nr); if (isAlreadyAccepted(nr)) { Rlog.d(TAG, "Next request is already accepted on other sub in DSDA mode. nr = " + nr); transitionTo(mDdsReservedState); return; } transitionTo(mDdsIdleState); } transitionTo(mDdsAutoRevertState); } Loading Loading @@ -478,29 +548,22 @@ public class DdsScheduler extends StateMachine { switch(msg.what) { case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION"); NetworkRequest n = (NetworkRequest)msg.obj; Rlog.d(TAG, "Accepting request in dual-data mode, req = " + n); notifyRequestAccepted(n); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE"); if (isMultiDataSupported) { Rlog.d(TAG, "Simultaneous dual-data supported."); if (!acceptWaitingRequest()) { //No more requests for current sub. If there are few accepted requests //for defaultDds then move to DdsReservedState so that on-demand PS //detach on current sub can be triggered. handleOtherSubRequests(); } } else { Rlog.d(TAG, "Simultaneous dual-data no more supported."); transitionTo(mDdsIdleState); } return HANDLED; } case DdsSchedulerAc.EVENT_MODEM_DATA_CAPABILITY_UPDATE: { Rlog.d(TAG, "EVENT_MODEM_DATA_CAPABILITY_UPDATE"); if (getMaxDataAllowed() != MODEM_DUAL_DATA_CAPABLE) { Rlog.d(TAG, "Lost simultaneous dual-data capability."); isMultiDataSupported = false; } return HANDLED; } Loading Loading @@ -533,16 +596,6 @@ public class DdsScheduler extends StateMachine { @Override public boolean processMessage(Message msg) { switch(msg.what) { case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION"); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE"); return HANDLED; } case DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE: case DdsSchedulerAc.EVENT_ON_DEMAND_DDS_SWITCH_DONE : { AsyncResult ar = (AsyncResult) msg.obj; Loading Loading @@ -579,11 +632,7 @@ public class DdsScheduler extends StateMachine { public void enter() { Rlog.d(TAG, "Enter"); if(!isAnyRequestWaiting()) { triggerSwitch(null); } else { Rlog.d(TAG, "Error"); } } @Override Loading @@ -594,19 +643,9 @@ public class DdsScheduler extends StateMachine { @Override public boolean processMessage(Message msg) { switch(msg.what) { case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION"); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE"); return HANDLED; } case DdsSchedulerAc.EVENT_ON_DEMAND_DDS_SWITCH_DONE : { AsyncResult ar = (AsyncResult) msg.obj; NetworkRequest n = (NetworkRequest)ar.result; updateCurrentDds(n); case DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE: { Rlog.d(TAG, "SET_DDS_DONE"); updateCurrentDds(null); transitionTo(mDdsIdleState); return HANDLED; Loading Loading
src/java/com/android/internal/telephony/SubscriptionController.java +1 −2 Original line number Diff line number Diff line Loading @@ -220,8 +220,7 @@ public class SubscriptionController extends ISub.Stub { logdl("[SubscriptionController] init by Context"); mDataConnectionHandler = new DataConnectionHandler(); mScheduler = DdsScheduler.makeDdsScheduler(); mScheduler.start(); mScheduler = DdsScheduler.getInstance(); mSchedulerAc = new DdsSchedulerAc(); mSchedulerAc.connect(mContext, mDataConnectionHandler, mScheduler.getHandler()); Loading
src/java/com/android/internal/telephony/dataconnection/DctController.java +2 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.TelephonyProperties; import com.android.internal.telephony.DefaultPhoneNotifier; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.dataconnection.DdsScheduler; import android.util.Log; import java.util.HashSet; Loading Loading @@ -232,6 +233,7 @@ public class DctController extends Handler { public static DctController makeDctController(PhoneProxy[] phones, Looper looper) { if (sDctController == null) { sDctController = new DctController(phones, looper); DdsScheduler.init(); } return sDctController; } Loading
src/java/com/android/internal/telephony/dataconnection/DdsScheduler.java +110 −71 Original line number Diff line number Diff line Loading @@ -61,9 +61,10 @@ public class DdsScheduler extends StateMachine { private PsAttachReservedState mPsAttachReservedState = new PsAttachReservedState(); private DdsSwitchState mDdsSwitchState = new DdsSwitchState(); private DdsAutoRevertState mDdsAutoRevertState = new DdsAutoRevertState(); private long mCurrentDds = SubscriptionManager.INVALID_SUB_ID; private DctController mDctController; private ModemStackController mModemStackController; private static DdsScheduler sDdsScheduler; private final int MODEM_DATA_CAPABILITY_UNKNOWN = -1; private final int MODEM_SINGLE_DATA_CAPABLE = 1; Loading @@ -86,17 +87,34 @@ public class DdsScheduler extends StateMachine { private List<NetworkRequestInfo> mInbox = Collections.synchronizedList( new ArrayList<NetworkRequestInfo>()); public static DdsScheduler makeDdsScheduler() { HandlerThread t = new HandlerThread("DdsSchedulerThread"); t.start(); DdsScheduler scheduler = new DdsScheduler(t.getLooper()); scheduler.start(); return scheduler; private static DdsScheduler createDdsScheduler() { DdsScheduler ddsScheduler = new DdsScheduler(); ddsScheduler.start(); return ddsScheduler; } public static DdsScheduler getInstance() { if (sDdsScheduler == null) { sDdsScheduler = createDdsScheduler(); } Rlog.d(TAG, "getInstance = " + sDdsScheduler); return sDdsScheduler; } public static void init() { if (sDdsScheduler == null) { sDdsScheduler = getInstance(); } sDdsScheduler.registerCallbacks(); Rlog.d(TAG, "init = " + sDdsScheduler); } private DdsScheduler(Looper looper) { super("DdsScheduler", looper); private DdsScheduler() { super("DdsScheduler"); addState(mDefaultState); addState(mDdsIdleState, mDefaultState); Loading Loading @@ -221,7 +239,14 @@ public class DdsScheduler extends StateMachine { } private void requestDdsSwitch(NetworkRequest n) { if (n != null) { mDctController.setOnDemandDataSubId(n); } else { // set DDS to user configured defaultDds SUB. // requestPsAttach would make sure that OemHook api to set DDS // is called as well as PS ATTACH is requested. requestPsAttach(null); } } private void requestPsAttach(NetworkRequest n) { Loading @@ -233,7 +258,10 @@ public class DdsScheduler extends StateMachine { } private int getMaxDataAllowed() { int maxData = mModemStackController.getMaxDataAllowed(); ModemStackController modemStackController = ModemStackController.getInstance(); Rlog.d(TAG, "ModemStackController = " + modemStackController); int maxData = modemStackController.getMaxDataAllowed(); Rlog.d(TAG, "modem value of max_data = " + maxData); int override = SystemProperties.getInt(OVERRIDE_MODEM_DUAL_DATA_CAP_PROP, Loading @@ -245,27 +273,42 @@ public class DdsScheduler extends StateMachine { return maxData; } void triggerSwitch(NetworkRequest n) { private void registerCallbacks() { if(mDctController == null) { Rlog.d(TAG, "registerCallbacks"); mDctController = DctController.getInstance(); mDctController.registerForOnDemandDataSwitchInfo(getHandler(), DdsSchedulerAc.EVENT_ON_DEMAND_DDS_SWITCH_DONE, null); mDctController.registerForOnDemandPsAttach(getHandler(), DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE, null); mModemStackController = ModemStackController.getInstance(); Rlog.d(TAG, "ModemStackController = " + mModemStackController); } } void triggerSwitch(NetworkRequest n) { boolean multiDataSupported = false; mModemStackController.registerForModemDataCapsUpdate(getHandler(), DdsSchedulerAc.EVENT_MODEM_DATA_CAPABILITY_UPDATE, null); if (isMultiDataSupported()) { multiDataSupported = true; Rlog.d(TAG, "Simultaneous dual-data supported"); } else { Rlog.d(TAG, "Simultaneous dual-data NOT supported"); } if ((n != null) && (getMaxDataAllowed() == MODEM_DUAL_DATA_CAPABLE)) { if ((n != null) && multiDataSupported) { requestPsAttach(n); } else { requestDdsSwitch(n); } } boolean isMultiDataSupported() { boolean flag = false; if (getMaxDataAllowed() == MODEM_DUAL_DATA_CAPABLE) { flag = true; } return flag; } boolean isAnyRequestWaiting() { synchronized(mInbox) { return !mInbox.isEmpty(); Loading Loading @@ -302,6 +345,17 @@ public class DdsScheduler extends StateMachine { break; } case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION, currentState = " + getCurrentState().getName()); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE, currentState = " + getCurrentState().getName()); return HANDLED; } default: { Rlog.d(TAG, "unknown msg = " + msg); break; Loading Loading @@ -359,11 +413,6 @@ public class DdsScheduler extends StateMachine { return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE: NO OP!"); return HANDLED; } default: { Rlog.d(TAG, "unknown msg = " + msg); return NOT_HANDLED; Loading @@ -384,7 +433,7 @@ public class DdsScheduler extends StateMachine { Rlog.d(TAG, "Switch required for " + nr); transitionTo(mDdsSwitchState); } else { Rlog.e(TAG, "This request failed to get accepted. nr = " + nr); Rlog.e(TAG, "This request could not get accepted, start over. nr = " + nr); //reset state machine to stable state. transitionTo(mDdsAutoRevertState); } Loading Loading @@ -412,8 +461,10 @@ public class DdsScheduler extends StateMachine { if (getSubIdFromNetworkRequest(n) == getCurrentDds()) { Rlog.d(TAG, "Accepting simultaneous request for current sub"); notifyRequestAccepted(n); } else if (isMultiDataSupported()) { Rlog.d(TAG, "Incoming request is for on-demand subscription, n = " + n); requestPsAttach(n); } return HANDLED; } Loading @@ -430,6 +481,20 @@ public class DdsScheduler extends StateMachine { return HANDLED; } case DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE: { AsyncResult ar = (AsyncResult) msg.obj; NetworkRequest n = (NetworkRequest)ar.result; if (ar.exception == null) { updateCurrentDds(n); transitionTo(mPsAttachReservedState); } else { Rlog.d(TAG, "Switch failed, ignore the req = " + n); //discard the request so that we can process other pending reqeusts removeRequest(n); } return HANDLED; } default: { Rlog.d(TAG, "unknown msg = " + msg); return NOT_HANDLED; Loading @@ -440,7 +505,6 @@ public class DdsScheduler extends StateMachine { private class PsAttachReservedState extends State { static final String TAG = DdsScheduler.TAG + "[PSAttachReservedState]"; private boolean isMultiDataSupported = true; private void handleOtherSubRequests() { NetworkRequest nr = getFirstWaitingRequest(); Loading @@ -449,8 +513,14 @@ public class DdsScheduler extends StateMachine { } else if (getSubIdFromNetworkRequest(nr) != getCurrentDds()) { Rlog.d(TAG, "Next request is not for current on-demand PS sub(DSDA). nr = " + nr); if (isAlreadyAccepted(nr)) { Rlog.d(TAG, "Next request is already accepted on other sub in DSDA mode. nr = " + nr); transitionTo(mDdsReservedState); return; } transitionTo(mDdsIdleState); } transitionTo(mDdsAutoRevertState); } Loading Loading @@ -478,29 +548,22 @@ public class DdsScheduler extends StateMachine { switch(msg.what) { case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION"); NetworkRequest n = (NetworkRequest)msg.obj; Rlog.d(TAG, "Accepting request in dual-data mode, req = " + n); notifyRequestAccepted(n); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE"); if (isMultiDataSupported) { Rlog.d(TAG, "Simultaneous dual-data supported."); if (!acceptWaitingRequest()) { //No more requests for current sub. If there are few accepted requests //for defaultDds then move to DdsReservedState so that on-demand PS //detach on current sub can be triggered. handleOtherSubRequests(); } } else { Rlog.d(TAG, "Simultaneous dual-data no more supported."); transitionTo(mDdsIdleState); } return HANDLED; } case DdsSchedulerAc.EVENT_MODEM_DATA_CAPABILITY_UPDATE: { Rlog.d(TAG, "EVENT_MODEM_DATA_CAPABILITY_UPDATE"); if (getMaxDataAllowed() != MODEM_DUAL_DATA_CAPABLE) { Rlog.d(TAG, "Lost simultaneous dual-data capability."); isMultiDataSupported = false; } return HANDLED; } Loading Loading @@ -533,16 +596,6 @@ public class DdsScheduler extends StateMachine { @Override public boolean processMessage(Message msg) { switch(msg.what) { case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION"); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE"); return HANDLED; } case DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE: case DdsSchedulerAc.EVENT_ON_DEMAND_DDS_SWITCH_DONE : { AsyncResult ar = (AsyncResult) msg.obj; Loading Loading @@ -579,11 +632,7 @@ public class DdsScheduler extends StateMachine { public void enter() { Rlog.d(TAG, "Enter"); if(!isAnyRequestWaiting()) { triggerSwitch(null); } else { Rlog.d(TAG, "Error"); } } @Override Loading @@ -594,19 +643,9 @@ public class DdsScheduler extends StateMachine { @Override public boolean processMessage(Message msg) { switch(msg.what) { case DdsSchedulerAc.REQ_DDS_ALLOCATION: { Rlog.d(TAG, "REQ_DDS_ALLOCATION"); return HANDLED; } case DdsSchedulerAc.REQ_DDS_FREE: { Rlog.d(TAG, "REQ_DDS_FREE"); return HANDLED; } case DdsSchedulerAc.EVENT_ON_DEMAND_DDS_SWITCH_DONE : { AsyncResult ar = (AsyncResult) msg.obj; NetworkRequest n = (NetworkRequest)ar.result; updateCurrentDds(n); case DdsSchedulerAc.EVENT_ON_DEMAND_PS_ATTACH_DONE: { Rlog.d(TAG, "SET_DDS_DONE"); updateCurrentDds(null); transitionTo(mDdsIdleState); return HANDLED; Loading