Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +45 −17 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.database.ContentObserver; import android.hardware.radio.V1_0.CellInfoType; import android.hardware.radio.V1_0.CellInfoType; import android.hardware.radio.V1_0.DataRegStateResult; import android.hardware.radio.V1_0.DataRegStateResult; import android.hardware.radio.V1_0.RegState; import android.hardware.radio.V1_0.VoiceRegStateResult; import android.hardware.radio.V1_0.VoiceRegStateResult; import android.os.AsyncResult; import android.os.AsyncResult; import android.os.BaseBundle; import android.os.BaseBundle; Loading Loading @@ -918,6 +919,17 @@ public class ServiceStateTracker extends Handler { } } break; break; } } case CellInfoType.LTE: { if (voiceRegStateResult.cellIdentity.cellIdentityLte.size() == 1) { android.hardware.radio.V1_0.CellIdentityLte cellIdentityLte = voiceRegStateResult.cellIdentity.cellIdentityLte.get(0); cid = cellIdentityLte.ci; /* Continuing the historical behaviour of using tac as lac. */ lac = cellIdentityLte.tac; } break; } default: { default: { break; break; } } Loading Loading @@ -1660,12 +1672,39 @@ public class ServiceStateTracker extends Handler { return cdmaRoaming && !isSameOperatorNameFromSimAndSS(s); return cdmaRoaming && !isSameOperatorNameFromSimAndSS(s); } } private int getRegStateFromHalRegState(int regState) { switch (regState) { case RegState.NOT_REG_MT_NOT_SEARCHING_OP: return ServiceState.RIL_REG_STATE_NOT_REG; case RegState.REG_HOME: return ServiceState.RIL_REG_STATE_HOME; case RegState.NOT_REG_MT_SEARCHING_OP: return ServiceState.RIL_REG_STATE_SEARCHING; case RegState.REG_DENIED: return ServiceState.RIL_REG_STATE_DENIED; case RegState.UNKNOWN: return ServiceState.RIL_REG_STATE_UNKNOWN; case RegState.REG_ROAMING: return ServiceState.RIL_REG_STATE_ROAMING; case RegState.NOT_REG_MT_NOT_SEARCHING_OP_EM: return ServiceState.RIL_REG_STATE_NOT_REG_EMERGENCY_CALL_ENABLED; case RegState.NOT_REG_MT_SEARCHING_OP_EM: return ServiceState.RIL_REG_STATE_SEARCHING_EMERGENCY_CALL_ENABLED; case RegState.REG_DENIED_EM: return ServiceState.RIL_REG_STATE_DENIED_EMERGENCY_CALL_ENABLED; case RegState.UNKNOWN_EM: return ServiceState.RIL_REG_STATE_UNKNOWN_EMERGENCY_CALL_ENABLED; default: return ServiceState.REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING; } } void handlePollStateResultMessage(int what, AsyncResult ar) { void handlePollStateResultMessage(int what, AsyncResult ar) { int ints[]; int ints[]; switch (what) { switch (what) { case EVENT_POLL_STATE_REGISTRATION: { case EVENT_POLL_STATE_REGISTRATION: { VoiceRegStateResult voiceRegStateResult = (VoiceRegStateResult) ar.result; VoiceRegStateResult voiceRegStateResult = (VoiceRegStateResult) ar.result; int registrationState = voiceRegStateResult.regState; int registrationState = getRegStateFromHalRegState(voiceRegStateResult.regState); mNewSS.setVoiceRegState(regCodeToServiceState(registrationState)); mNewSS.setVoiceRegState(regCodeToServiceState(registrationState)); mNewSS.setRilVoiceRadioTechnology(voiceRegStateResult.rat); mNewSS.setRilVoiceRadioTechnology(voiceRegStateResult.rat); Loading Loading @@ -1751,7 +1790,7 @@ public class ServiceStateTracker extends Handler { case EVENT_POLL_STATE_GPRS: { case EVENT_POLL_STATE_GPRS: { DataRegStateResult dataRegStateResult = (DataRegStateResult) ar.result; DataRegStateResult dataRegStateResult = (DataRegStateResult) ar.result; int regState = dataRegStateResult.regState; int regState = getRegStateFromHalRegState(dataRegStateResult.regState); int dataRegState = regCodeToServiceState(regState); int dataRegState = regCodeToServiceState(regState); int newDataRat = dataRegStateResult.rat; int newDataRat = dataRegStateResult.rat; Loading Loading @@ -3068,25 +3107,14 @@ public class ServiceStateTracker extends Handler { return guess; return guess; } } /** code is registration state 0-5 from TS 27.007 7.2 */ /** convert ServiceState registration code * to service state */ private int regCodeToServiceState(int code) { private int regCodeToServiceState(int code) { switch (code) { switch (code) { case 0: case ServiceState.RIL_REG_STATE_HOME: case 2: // 2 is "searching" case ServiceState.RIL_REG_STATE_ROAMING: case 3: // 3 is "registration denied" case 4: // 4 is "unknown" no vaild in current baseband case 10:// same as 0, but indicates that emergency call is possible. case 12:// same as 2, but indicates that emergency call is possible. case 13:// same as 3, but indicates that emergency call is possible. case 14:// same as 4, but indicates that emergency call is possible. return ServiceState.STATE_OUT_OF_SERVICE; case 1: case 5: // 5 is "registered, roaming" return ServiceState.STATE_IN_SERVICE; return ServiceState.STATE_IN_SERVICE; default: default: loge("regCodeToServiceState: unexpected service state " + code); return ServiceState.STATE_OUT_OF_SERVICE; return ServiceState.STATE_OUT_OF_SERVICE; } } } } Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +98 −0 Original line number Original line Diff line number Diff line Loading @@ -607,6 +607,51 @@ public class ServiceStateTrackerTest extends TelephonyTest { verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); } } @Test @MediumTest public void testRegAndInvalidregForDataConnAttach() throws Exception { // Initially set service state out of service doReturn(true).when(mPhone).isPhoneTypeGsm(); mSimulatedCommands.setVoiceRegState(23); mSimulatedCommands.setDataRegState(23); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null); // set service state in service and trigger events to post message on handler mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(200); // verify if registered handler has message posted to it ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what); // set service state out of service mSimulatedCommands.setVoiceRegState(-1); mSimulatedCommands.setDataRegState(-1); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // Unregister registrant sst.unregisterForDataConnectionAttached(mTestHandler); // set service state in service mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // verify that no new message posted to handler verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); } @Test @Test @MediumTest @MediumTest public void testRegAndUnregForDataConnAttach() throws Exception { public void testRegAndUnregForDataConnAttach() throws Exception { Loading Loading @@ -762,6 +807,59 @@ public class ServiceStateTrackerTest extends TelephonyTest { verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); } } @Test @MediumTest public void testRegAndInvalidRegForNetworkAttached() throws Exception { // Initially set service state out of service doReturn(true).when(mPhone).isPhoneTypeGsm(); mSimulatedCommands.setVoiceRegState(23); mSimulatedCommands.setDataRegState(23); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); // set service state in service and trigger events to post message on handler mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // verify if registered handler has message posted to it ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); // set service state out of service mSimulatedCommands.setVoiceRegState(-1); mSimulatedCommands.setDataRegState(-1); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // Unregister registrant sst.unregisterForNetworkAttached(mTestHandler); waitForMs(100); sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); // set service state in service mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // verify if registered handler has message posted to it messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); } @Test @Test @MediumTest @MediumTest public void testRegisterForPsRestrictedEnabled() throws Exception { public void testRegisterForPsRestrictedEnabled() throws Exception { Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +45 −17 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.database.ContentObserver; import android.hardware.radio.V1_0.CellInfoType; import android.hardware.radio.V1_0.CellInfoType; import android.hardware.radio.V1_0.DataRegStateResult; import android.hardware.radio.V1_0.DataRegStateResult; import android.hardware.radio.V1_0.RegState; import android.hardware.radio.V1_0.VoiceRegStateResult; import android.hardware.radio.V1_0.VoiceRegStateResult; import android.os.AsyncResult; import android.os.AsyncResult; import android.os.BaseBundle; import android.os.BaseBundle; Loading Loading @@ -918,6 +919,17 @@ public class ServiceStateTracker extends Handler { } } break; break; } } case CellInfoType.LTE: { if (voiceRegStateResult.cellIdentity.cellIdentityLte.size() == 1) { android.hardware.radio.V1_0.CellIdentityLte cellIdentityLte = voiceRegStateResult.cellIdentity.cellIdentityLte.get(0); cid = cellIdentityLte.ci; /* Continuing the historical behaviour of using tac as lac. */ lac = cellIdentityLte.tac; } break; } default: { default: { break; break; } } Loading Loading @@ -1660,12 +1672,39 @@ public class ServiceStateTracker extends Handler { return cdmaRoaming && !isSameOperatorNameFromSimAndSS(s); return cdmaRoaming && !isSameOperatorNameFromSimAndSS(s); } } private int getRegStateFromHalRegState(int regState) { switch (regState) { case RegState.NOT_REG_MT_NOT_SEARCHING_OP: return ServiceState.RIL_REG_STATE_NOT_REG; case RegState.REG_HOME: return ServiceState.RIL_REG_STATE_HOME; case RegState.NOT_REG_MT_SEARCHING_OP: return ServiceState.RIL_REG_STATE_SEARCHING; case RegState.REG_DENIED: return ServiceState.RIL_REG_STATE_DENIED; case RegState.UNKNOWN: return ServiceState.RIL_REG_STATE_UNKNOWN; case RegState.REG_ROAMING: return ServiceState.RIL_REG_STATE_ROAMING; case RegState.NOT_REG_MT_NOT_SEARCHING_OP_EM: return ServiceState.RIL_REG_STATE_NOT_REG_EMERGENCY_CALL_ENABLED; case RegState.NOT_REG_MT_SEARCHING_OP_EM: return ServiceState.RIL_REG_STATE_SEARCHING_EMERGENCY_CALL_ENABLED; case RegState.REG_DENIED_EM: return ServiceState.RIL_REG_STATE_DENIED_EMERGENCY_CALL_ENABLED; case RegState.UNKNOWN_EM: return ServiceState.RIL_REG_STATE_UNKNOWN_EMERGENCY_CALL_ENABLED; default: return ServiceState.REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING; } } void handlePollStateResultMessage(int what, AsyncResult ar) { void handlePollStateResultMessage(int what, AsyncResult ar) { int ints[]; int ints[]; switch (what) { switch (what) { case EVENT_POLL_STATE_REGISTRATION: { case EVENT_POLL_STATE_REGISTRATION: { VoiceRegStateResult voiceRegStateResult = (VoiceRegStateResult) ar.result; VoiceRegStateResult voiceRegStateResult = (VoiceRegStateResult) ar.result; int registrationState = voiceRegStateResult.regState; int registrationState = getRegStateFromHalRegState(voiceRegStateResult.regState); mNewSS.setVoiceRegState(regCodeToServiceState(registrationState)); mNewSS.setVoiceRegState(regCodeToServiceState(registrationState)); mNewSS.setRilVoiceRadioTechnology(voiceRegStateResult.rat); mNewSS.setRilVoiceRadioTechnology(voiceRegStateResult.rat); Loading Loading @@ -1751,7 +1790,7 @@ public class ServiceStateTracker extends Handler { case EVENT_POLL_STATE_GPRS: { case EVENT_POLL_STATE_GPRS: { DataRegStateResult dataRegStateResult = (DataRegStateResult) ar.result; DataRegStateResult dataRegStateResult = (DataRegStateResult) ar.result; int regState = dataRegStateResult.regState; int regState = getRegStateFromHalRegState(dataRegStateResult.regState); int dataRegState = regCodeToServiceState(regState); int dataRegState = regCodeToServiceState(regState); int newDataRat = dataRegStateResult.rat; int newDataRat = dataRegStateResult.rat; Loading Loading @@ -3068,25 +3107,14 @@ public class ServiceStateTracker extends Handler { return guess; return guess; } } /** code is registration state 0-5 from TS 27.007 7.2 */ /** convert ServiceState registration code * to service state */ private int regCodeToServiceState(int code) { private int regCodeToServiceState(int code) { switch (code) { switch (code) { case 0: case ServiceState.RIL_REG_STATE_HOME: case 2: // 2 is "searching" case ServiceState.RIL_REG_STATE_ROAMING: case 3: // 3 is "registration denied" case 4: // 4 is "unknown" no vaild in current baseband case 10:// same as 0, but indicates that emergency call is possible. case 12:// same as 2, but indicates that emergency call is possible. case 13:// same as 3, but indicates that emergency call is possible. case 14:// same as 4, but indicates that emergency call is possible. return ServiceState.STATE_OUT_OF_SERVICE; case 1: case 5: // 5 is "registered, roaming" return ServiceState.STATE_IN_SERVICE; return ServiceState.STATE_IN_SERVICE; default: default: loge("regCodeToServiceState: unexpected service state " + code); return ServiceState.STATE_OUT_OF_SERVICE; return ServiceState.STATE_OUT_OF_SERVICE; } } } } Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +98 −0 Original line number Original line Diff line number Diff line Loading @@ -607,6 +607,51 @@ public class ServiceStateTrackerTest extends TelephonyTest { verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); } } @Test @MediumTest public void testRegAndInvalidregForDataConnAttach() throws Exception { // Initially set service state out of service doReturn(true).when(mPhone).isPhoneTypeGsm(); mSimulatedCommands.setVoiceRegState(23); mSimulatedCommands.setDataRegState(23); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null); // set service state in service and trigger events to post message on handler mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(200); // verify if registered handler has message posted to it ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what); // set service state out of service mSimulatedCommands.setVoiceRegState(-1); mSimulatedCommands.setDataRegState(-1); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // Unregister registrant sst.unregisterForDataConnectionAttached(mTestHandler); // set service state in service mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // verify that no new message posted to handler verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); } @Test @Test @MediumTest @MediumTest public void testRegAndUnregForDataConnAttach() throws Exception { public void testRegAndUnregForDataConnAttach() throws Exception { Loading Loading @@ -762,6 +807,59 @@ public class ServiceStateTrackerTest extends TelephonyTest { verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); } } @Test @MediumTest public void testRegAndInvalidRegForNetworkAttached() throws Exception { // Initially set service state out of service doReturn(true).when(mPhone).isPhoneTypeGsm(); mSimulatedCommands.setVoiceRegState(23); mSimulatedCommands.setDataRegState(23); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); // set service state in service and trigger events to post message on handler mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // verify if registered handler has message posted to it ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); // set service state out of service mSimulatedCommands.setVoiceRegState(-1); mSimulatedCommands.setDataRegState(-1); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // Unregister registrant sst.unregisterForNetworkAttached(mTestHandler); waitForMs(100); sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); // set service state in service mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING); mSimulatedCommands.notifyNetworkStateChanged(); waitForMs(100); // verify if registered handler has message posted to it messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); } @Test @Test @MediumTest @MediumTest public void testRegisterForPsRestrictedEnabled() throws Exception { public void testRegisterForPsRestrictedEnabled() throws Exception { Loading