Loading src/java/com/android/internal/telephony/LocaleTracker.java +26 −2 Original line number Diff line number Diff line Loading @@ -73,6 +73,9 @@ public class LocaleTracker extends Handler { /** Event for incoming cell info */ private static final int EVENT_RESPONSE_CELL_INFO = 5; /** Event to fire if the operator from ServiceState is considered truly lost */ private static final int EVENT_OPERATOR_LOST = 6; // Todo: Read this from Settings. /** The minimum delay to get cell info from the modem */ private static final long CELL_INFO_MIN_DELAY_MS = 2 * SECOND_IN_MILLIS; Loading @@ -85,6 +88,13 @@ public class LocaleTracker extends Handler { /** The delay for periodically getting cell info from the modem */ private static final long CELL_INFO_PERIODIC_POLLING_DELAY_MS = 10 * MINUTE_IN_MILLIS; /** * The delay after the last time the device camped on a cell before declaring that the * ServiceState's MCC information can no longer be used (and thus kicking in the CellInfo * based tracking. */ private static final long SERVICE_OPERATOR_LOST_DELAY_MS = 10 * MINUTE_IN_MILLIS; /** The maximum fail count to prevent delay time overflow */ private static final int MAX_FAIL_COUNT = 30; Loading Loading @@ -166,6 +176,11 @@ public class LocaleTracker extends Handler { onSimCardStateChanged(msg.arg1); break; case EVENT_OPERATOR_LOST: updateOperatorNumericImmediate(""); updateTrackingStatus(); break; default: throw new IllegalStateException("Unexpected message arrives. msg = " + msg.what); } Loading Loading @@ -247,7 +262,7 @@ public class LocaleTracker extends Handler { * * @param state SIM card state. Must be one of TelephonyManager.SIM_STATE_XXX. */ private synchronized void onSimCardStateChanged(int state) { private void onSimCardStateChanged(int state) { mSimState = state; updateLocale(); updateTrackingStatus(); Loading @@ -270,8 +285,17 @@ public class LocaleTracker extends Handler { * @param operatorNumeric MCC/MNC of the operator */ public void updateOperatorNumeric(String operatorNumeric) { if (TextUtils.isEmpty(operatorNumeric)) { sendMessageDelayed(obtainMessage(EVENT_OPERATOR_LOST), SERVICE_OPERATOR_LOST_DELAY_MS); } else { removeMessages(EVENT_OPERATOR_LOST); updateOperatorNumericImmediate(operatorNumeric); } } private void updateOperatorNumericImmediate(String operatorNumeric) { // Check if the operator numeric changes. if (!Objects.equals(mOperatorNumeric, operatorNumeric)) { if (!operatorNumeric.equals(mOperatorNumeric)) { String msg = "Operator numeric changes to \"" + operatorNumeric + "\""; if (DBG) log(msg); mLocalLog.log(msg); Loading tests/telephonytests/src/com/android/internal/telephony/LocaleTrackerTest.java +75 −5 Original line number Diff line number Diff line Loading @@ -44,14 +44,19 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import java.util.Arrays; import java.util.Collections; import java.util.List; public class LocaleTrackerTest extends TelephonyTest { private static final String US_MCC = "310"; private static final String LIECHTENSTEIN_MCC = "295"; private static final String FAKE_MNC = "123"; private static final String US_COUNTRY_CODE = "us"; private static final String COUNTRY_CODE_UNAVAILABLE = ""; private static final String US_COUNTRY_CODE = "us"; private static final String LIECHTENSTEIN_COUNTRY_CODE = "li"; private LocaleTracker mLocaleTracker; Loading Loading @@ -156,11 +161,12 @@ public class LocaleTrackerTest extends TelephonyTest { @Test @SmallTest public void testNoSim() throws Exception { // updateOperatorNumeric("") will not trigger an instantaneous country change mLocaleTracker.updateOperatorNumeric(""); sendGsmCellInfo(); sendServiceState(ServiceState.STATE_EMERGENCY_ONLY); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); verifyCountryCodeNotified(new String[]{US_COUNTRY_CODE}); assertTrue(mLocaleTracker.isTracking()); } Loading @@ -183,11 +189,11 @@ public class LocaleTrackerTest extends TelephonyTest { verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); assertFalse(mLocaleTracker.isTracking()); // updateOperatorNumeric("") will not trigger an instantaneous country change mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE, COUNTRY_CODE_UNAVAILABLE}); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); sendServiceState(ServiceState.STATE_POWER_OFF); assertFalse(mLocaleTracker.isTracking()); } Loading @@ -209,6 +215,70 @@ public class LocaleTrackerTest extends TelephonyTest { assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); } @Test @SmallTest public void testToggleAirplaneModeOosPlmn() throws Exception { sendServiceState(ServiceState.STATE_POWER_OFF); mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE}); assertFalse(mLocaleTracker.isTracking()); // Override the setUp() function and return an empty list for CellInfo doAnswer(invocation -> { Message m = invocation.getArgument(1); AsyncResult.forMessage(m, Collections.emptyList(), null); m.sendToTarget(); return null; }).when(mPhone).requestCellInfoUpdate(any(), any()); sendServiceState(ServiceState.STATE_OUT_OF_SERVICE); waitForHandlerAction(mLocaleTracker, 100); assertTrue(mLocaleTracker.isTracking()); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); mLocaleTracker.updateOperatorNumeric(US_MCC + FAKE_MNC); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); mLocaleTracker.updateOperatorNumeric(LIECHTENSTEIN_MCC + FAKE_MNC); waitForHandlerAction(mLocaleTracker, 100); assertEquals(LIECHTENSTEIN_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{ COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE, LIECHTENSTEIN_COUNTRY_CODE}); } @Test @SmallTest public void testToggleAirplaneModeNoCellInfo() throws Exception { sendServiceState(ServiceState.STATE_POWER_OFF); mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE}); assertFalse(mLocaleTracker.isTracking()); // Override the setUp() function and return an empty list for CellInfo doAnswer(invocation -> { Message m = invocation.getArgument(1); AsyncResult.forMessage(m, Collections.emptyList(), null); m.sendToTarget(); return null; }).when(mPhone).requestCellInfoUpdate(any(), any()); sendServiceState(ServiceState.STATE_OUT_OF_SERVICE); waitForHandlerAction(mLocaleTracker, 100); assertTrue(mLocaleTracker.isTracking()); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); } @Test @SmallTest public void testGetCellInfoDelayTime() throws Exception { Loading Loading
src/java/com/android/internal/telephony/LocaleTracker.java +26 −2 Original line number Diff line number Diff line Loading @@ -73,6 +73,9 @@ public class LocaleTracker extends Handler { /** Event for incoming cell info */ private static final int EVENT_RESPONSE_CELL_INFO = 5; /** Event to fire if the operator from ServiceState is considered truly lost */ private static final int EVENT_OPERATOR_LOST = 6; // Todo: Read this from Settings. /** The minimum delay to get cell info from the modem */ private static final long CELL_INFO_MIN_DELAY_MS = 2 * SECOND_IN_MILLIS; Loading @@ -85,6 +88,13 @@ public class LocaleTracker extends Handler { /** The delay for periodically getting cell info from the modem */ private static final long CELL_INFO_PERIODIC_POLLING_DELAY_MS = 10 * MINUTE_IN_MILLIS; /** * The delay after the last time the device camped on a cell before declaring that the * ServiceState's MCC information can no longer be used (and thus kicking in the CellInfo * based tracking. */ private static final long SERVICE_OPERATOR_LOST_DELAY_MS = 10 * MINUTE_IN_MILLIS; /** The maximum fail count to prevent delay time overflow */ private static final int MAX_FAIL_COUNT = 30; Loading Loading @@ -166,6 +176,11 @@ public class LocaleTracker extends Handler { onSimCardStateChanged(msg.arg1); break; case EVENT_OPERATOR_LOST: updateOperatorNumericImmediate(""); updateTrackingStatus(); break; default: throw new IllegalStateException("Unexpected message arrives. msg = " + msg.what); } Loading Loading @@ -247,7 +262,7 @@ public class LocaleTracker extends Handler { * * @param state SIM card state. Must be one of TelephonyManager.SIM_STATE_XXX. */ private synchronized void onSimCardStateChanged(int state) { private void onSimCardStateChanged(int state) { mSimState = state; updateLocale(); updateTrackingStatus(); Loading @@ -270,8 +285,17 @@ public class LocaleTracker extends Handler { * @param operatorNumeric MCC/MNC of the operator */ public void updateOperatorNumeric(String operatorNumeric) { if (TextUtils.isEmpty(operatorNumeric)) { sendMessageDelayed(obtainMessage(EVENT_OPERATOR_LOST), SERVICE_OPERATOR_LOST_DELAY_MS); } else { removeMessages(EVENT_OPERATOR_LOST); updateOperatorNumericImmediate(operatorNumeric); } } private void updateOperatorNumericImmediate(String operatorNumeric) { // Check if the operator numeric changes. if (!Objects.equals(mOperatorNumeric, operatorNumeric)) { if (!operatorNumeric.equals(mOperatorNumeric)) { String msg = "Operator numeric changes to \"" + operatorNumeric + "\""; if (DBG) log(msg); mLocalLog.log(msg); Loading
tests/telephonytests/src/com/android/internal/telephony/LocaleTrackerTest.java +75 −5 Original line number Diff line number Diff line Loading @@ -44,14 +44,19 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import java.util.Arrays; import java.util.Collections; import java.util.List; public class LocaleTrackerTest extends TelephonyTest { private static final String US_MCC = "310"; private static final String LIECHTENSTEIN_MCC = "295"; private static final String FAKE_MNC = "123"; private static final String US_COUNTRY_CODE = "us"; private static final String COUNTRY_CODE_UNAVAILABLE = ""; private static final String US_COUNTRY_CODE = "us"; private static final String LIECHTENSTEIN_COUNTRY_CODE = "li"; private LocaleTracker mLocaleTracker; Loading Loading @@ -156,11 +161,12 @@ public class LocaleTrackerTest extends TelephonyTest { @Test @SmallTest public void testNoSim() throws Exception { // updateOperatorNumeric("") will not trigger an instantaneous country change mLocaleTracker.updateOperatorNumeric(""); sendGsmCellInfo(); sendServiceState(ServiceState.STATE_EMERGENCY_ONLY); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); verifyCountryCodeNotified(new String[]{US_COUNTRY_CODE}); assertTrue(mLocaleTracker.isTracking()); } Loading @@ -183,11 +189,11 @@ public class LocaleTrackerTest extends TelephonyTest { verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); assertFalse(mLocaleTracker.isTracking()); // updateOperatorNumeric("") will not trigger an instantaneous country change mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE, COUNTRY_CODE_UNAVAILABLE}); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); sendServiceState(ServiceState.STATE_POWER_OFF); assertFalse(mLocaleTracker.isTracking()); } Loading @@ -209,6 +215,70 @@ public class LocaleTrackerTest extends TelephonyTest { assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); } @Test @SmallTest public void testToggleAirplaneModeOosPlmn() throws Exception { sendServiceState(ServiceState.STATE_POWER_OFF); mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE}); assertFalse(mLocaleTracker.isTracking()); // Override the setUp() function and return an empty list for CellInfo doAnswer(invocation -> { Message m = invocation.getArgument(1); AsyncResult.forMessage(m, Collections.emptyList(), null); m.sendToTarget(); return null; }).when(mPhone).requestCellInfoUpdate(any(), any()); sendServiceState(ServiceState.STATE_OUT_OF_SERVICE); waitForHandlerAction(mLocaleTracker, 100); assertTrue(mLocaleTracker.isTracking()); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); mLocaleTracker.updateOperatorNumeric(US_MCC + FAKE_MNC); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE}); mLocaleTracker.updateOperatorNumeric(LIECHTENSTEIN_MCC + FAKE_MNC); waitForHandlerAction(mLocaleTracker, 100); assertEquals(LIECHTENSTEIN_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{ COUNTRY_CODE_UNAVAILABLE, US_COUNTRY_CODE, LIECHTENSTEIN_COUNTRY_CODE}); } @Test @SmallTest public void testToggleAirplaneModeNoCellInfo() throws Exception { sendServiceState(ServiceState.STATE_POWER_OFF); mLocaleTracker.updateOperatorNumeric(""); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); verifyCountryCodeNotified(new String[]{COUNTRY_CODE_UNAVAILABLE}); assertFalse(mLocaleTracker.isTracking()); // Override the setUp() function and return an empty list for CellInfo doAnswer(invocation -> { Message m = invocation.getArgument(1); AsyncResult.forMessage(m, Collections.emptyList(), null); m.sendToTarget(); return null; }).when(mPhone).requestCellInfoUpdate(any(), any()); sendServiceState(ServiceState.STATE_OUT_OF_SERVICE); waitForHandlerAction(mLocaleTracker, 100); assertTrue(mLocaleTracker.isTracking()); waitForHandlerAction(mLocaleTracker, 100); assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); } @Test @SmallTest public void testGetCellInfoDelayTime() throws Exception { Loading