Loading src/java/com/android/internal/telephony/NetworkIndication.java +23 −4 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIGNAL_STREN import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SUPP_SVC_NOTIFICATION; import static com.android.internal.telephony.RILConstants.RIL_UNSOL_VOICE_RADIO_TECH_CHANGED; import android.annotation.ElapsedRealtimeLong; import android.hardware.radio.network.IRadioNetworkIndication; import android.os.AsyncResult; import android.sysprop.TelephonyProperties; Loading Loading @@ -237,17 +238,35 @@ public class NetworkIndication extends IRadioNetworkIndication.Stub { * Indicates when radio has received a NITZ time message. * @param indicationType Type of radio indication * @param nitzTime NITZ time string in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt" * @param receivedTime milliseconds since boot that the NITZ time was received * @param receivedTimeMs time according to {@link android.os.SystemClock#elapsedRealtime()} when * the RIL sent the NITZ time to the framework * @param ageMs time in milliseconds indicating how long NITZ was cached in RIL and modem. * This must track true age and therefore must be calculated using clocks that * include the time spend in sleep / low power states. If it can not be guaranteed, * there must not be any caching done at the modem and should fill in 0 for ageMs */ public void nitzTimeReceived(int indicationType, String nitzTime, long receivedTime) { public void nitzTimeReceived(int indicationType, String nitzTime, @ElapsedRealtimeLong long receivedTimeMs, long ageMs) { mRil.processIndication(indicationType); if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NITZ_TIME_RECEIVED, nitzTime); // Ignore the NITZ if ageMs is not a valid time, e.g. negative or greater than // receivedTimeMs. if ((ageMs < 0) || (ageMs >= receivedTimeMs)) { AnomalyReporter.reportAnomaly(UUID.fromString("fc7c56d4-485d-475a-aaff-394203c6cdfc"), "NITZ indication with invalid age"); mRil.riljLoge("age time is invalid, ignoring nitzTimeReceived indication. " + "receivedTimeMs = " + receivedTimeMs + ", ageMs = " + ageMs); return; } // TODO: Clean this up with a parcelable class for better self-documentation Object[] result = new Object[2]; Object[] result = new Object[3]; result[0] = nitzTime; result[1] = receivedTime; result[1] = receivedTimeMs; result[2] = ageMs; boolean ignoreNitz = TelephonyProperties.ignore_nitz().orElse(false); Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +20 −10 Original line number Diff line number Diff line Loading @@ -1426,14 +1426,20 @@ public class ServiceStateTracker extends Handler { mCi.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH)); break; case EVENT_NITZ_TIME: case EVENT_NITZ_TIME: { ar = (AsyncResult) msg.obj; String nitzString = (String)((Object[])ar.result)[0]; long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue(); Object[] nitzArgs = (Object[])ar.result; String nitzString = (String)nitzArgs[0]; long nitzReceiveTimeMs = ((Long)nitzArgs[1]).longValue(); long ageMs = 0; if (nitzArgs.length >= 3) { ageMs = ((Long)nitzArgs[2]).longValue(); } setTimeFromNITZString(nitzString, nitzReceiveTime); setTimeFromNITZString(nitzString, nitzReceiveTimeMs, ageMs); break; } case EVENT_SIGNAL_STRENGTH_UPDATE: // This is a notification from CommandsInterface.setOnSignalStrengthUpdate Loading Loading @@ -4412,20 +4418,24 @@ public class ServiceStateTracker extends Handler { } /** * nitzReceiveTime is time_t that the NITZ time was posted * Handle the NITZ string from the modem * * @param nitzString NITZ time string in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt" * @param nitzReceiveTimeMs time according to {@link android.os.SystemClock#elapsedRealtime()} * when the RIL sent the NITZ time to the framework * @param ageMs time in milliseconds indicating how long NITZ was cached in RIL and modem */ private void setTimeFromNITZString(String nitzString, long nitzReceiveTime) { private void setTimeFromNITZString(String nitzString, long nitzReceiveTimeMs, long ageMs) { long start = SystemClock.elapsedRealtime(); if (DBG) { Rlog.d(LOG_TAG, "NITZ: " + nitzString + "," + nitzReceiveTime + " start=" + start + " delay=" + (start - nitzReceiveTime)); Rlog.d(LOG_TAG, "NITZ: " + nitzString + "," + nitzReceiveTimeMs + ", ageMs=" + ageMs + " start=" + start + " delay=" + (start - nitzReceiveTimeMs)); } NitzData newNitzData = NitzData.parse(nitzString); mLastNitzData = newNitzData; if (newNitzData != null) { try { long ageMillis = 0; NitzSignal nitzSignal = new NitzSignal(nitzReceiveTime, newNitzData, ageMillis); NitzSignal nitzSignal = new NitzSignal(nitzReceiveTimeMs, newNitzData, ageMs); mNitzState.handleNitzReceived(nitzSignal); } finally { if (DBG) { Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +35 −2 Original line number Diff line number Diff line Loading @@ -2046,7 +2046,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { @Test @SmallTest public void testSetTimeFromNITZStr() throws Exception { public void testSetTimeFromNITZStr_withoutAge() throws Exception { { // Mock sending incorrect nitz str from RIL mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0"); Loading @@ -2054,7 +2054,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { verify(mNitzStateMachine, times(0)).handleNitzReceived(any()); } { // Mock sending correct nitz str from RIL // Mock sending correct nitz str from RIL with a zero ageMs String nitzStr = "15/06/20,00:00:00+0"; NitzData expectedNitzData = NitzData.parse(nitzStr); mSimulatedCommands.triggerNITZupdate(nitzStr); Loading @@ -2070,6 +2070,39 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertEquals(expectedNitzData, actualNitzSignal.getNitzData()); assertTrue(actualNitzSignal.getReceiptElapsedRealtimeMillis() <= SystemClock.elapsedRealtime()); assertEquals(actualNitzSignal.getAgeMillis(), 0); } } @Test @SmallTest public void testSetTimeFromNITZStr_withAge() throws Exception { { // Mock sending incorrect nitz str from RIL with a non-zero ageMs long ageMs = 60 * 1000; mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0", ageMs); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mNitzStateMachine, times(0)).handleNitzReceived(any()); } { // Mock sending correct nitz str from RIL with a non-zero ageMs String nitzStr = "21/08/15,00:00:00+0"; long ageMs = 60 * 1000; NitzData expectedNitzData = NitzData.parse(nitzStr); mSimulatedCommands.triggerNITZupdate(nitzStr, ageMs); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); ArgumentCaptor<NitzSignal> argumentsCaptor = ArgumentCaptor.forClass(NitzSignal.class); verify(mNitzStateMachine, times(1)) .handleNitzReceived(argumentsCaptor.capture()); // Confirm the argument was what we expected. NitzSignal actualNitzSignal = argumentsCaptor.getValue(); assertEquals(expectedNitzData, actualNitzSignal.getNitzData()); assertTrue(actualNitzSignal.getReceiptElapsedRealtimeMillis() <= SystemClock.elapsedRealtime()); assertEquals(actualNitzSignal.getAgeMillis(), ageMs); } } Loading tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java +7 −0 Original line number Diff line number Diff line Loading @@ -1189,6 +1189,13 @@ public class SimulatedCommands extends BaseCommands } } public void triggerNITZupdate(String NITZStr, long ageMs) { if (NITZStr != null) { mNITZTimeRegistrant.notifyRegistrant(new AsyncResult (null, new Object[]{NITZStr, SystemClock.elapsedRealtime(), ageMs}, null)); } } @Override public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming, boolean allowRoaming, int reason, LinkProperties linkProperties, int pduSessionId, Loading Loading
src/java/com/android/internal/telephony/NetworkIndication.java +23 −4 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIGNAL_STREN import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SUPP_SVC_NOTIFICATION; import static com.android.internal.telephony.RILConstants.RIL_UNSOL_VOICE_RADIO_TECH_CHANGED; import android.annotation.ElapsedRealtimeLong; import android.hardware.radio.network.IRadioNetworkIndication; import android.os.AsyncResult; import android.sysprop.TelephonyProperties; Loading Loading @@ -237,17 +238,35 @@ public class NetworkIndication extends IRadioNetworkIndication.Stub { * Indicates when radio has received a NITZ time message. * @param indicationType Type of radio indication * @param nitzTime NITZ time string in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt" * @param receivedTime milliseconds since boot that the NITZ time was received * @param receivedTimeMs time according to {@link android.os.SystemClock#elapsedRealtime()} when * the RIL sent the NITZ time to the framework * @param ageMs time in milliseconds indicating how long NITZ was cached in RIL and modem. * This must track true age and therefore must be calculated using clocks that * include the time spend in sleep / low power states. If it can not be guaranteed, * there must not be any caching done at the modem and should fill in 0 for ageMs */ public void nitzTimeReceived(int indicationType, String nitzTime, long receivedTime) { public void nitzTimeReceived(int indicationType, String nitzTime, @ElapsedRealtimeLong long receivedTimeMs, long ageMs) { mRil.processIndication(indicationType); if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NITZ_TIME_RECEIVED, nitzTime); // Ignore the NITZ if ageMs is not a valid time, e.g. negative or greater than // receivedTimeMs. if ((ageMs < 0) || (ageMs >= receivedTimeMs)) { AnomalyReporter.reportAnomaly(UUID.fromString("fc7c56d4-485d-475a-aaff-394203c6cdfc"), "NITZ indication with invalid age"); mRil.riljLoge("age time is invalid, ignoring nitzTimeReceived indication. " + "receivedTimeMs = " + receivedTimeMs + ", ageMs = " + ageMs); return; } // TODO: Clean this up with a parcelable class for better self-documentation Object[] result = new Object[2]; Object[] result = new Object[3]; result[0] = nitzTime; result[1] = receivedTime; result[1] = receivedTimeMs; result[2] = ageMs; boolean ignoreNitz = TelephonyProperties.ignore_nitz().orElse(false); Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +20 −10 Original line number Diff line number Diff line Loading @@ -1426,14 +1426,20 @@ public class ServiceStateTracker extends Handler { mCi.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH)); break; case EVENT_NITZ_TIME: case EVENT_NITZ_TIME: { ar = (AsyncResult) msg.obj; String nitzString = (String)((Object[])ar.result)[0]; long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue(); Object[] nitzArgs = (Object[])ar.result; String nitzString = (String)nitzArgs[0]; long nitzReceiveTimeMs = ((Long)nitzArgs[1]).longValue(); long ageMs = 0; if (nitzArgs.length >= 3) { ageMs = ((Long)nitzArgs[2]).longValue(); } setTimeFromNITZString(nitzString, nitzReceiveTime); setTimeFromNITZString(nitzString, nitzReceiveTimeMs, ageMs); break; } case EVENT_SIGNAL_STRENGTH_UPDATE: // This is a notification from CommandsInterface.setOnSignalStrengthUpdate Loading Loading @@ -4412,20 +4418,24 @@ public class ServiceStateTracker extends Handler { } /** * nitzReceiveTime is time_t that the NITZ time was posted * Handle the NITZ string from the modem * * @param nitzString NITZ time string in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt" * @param nitzReceiveTimeMs time according to {@link android.os.SystemClock#elapsedRealtime()} * when the RIL sent the NITZ time to the framework * @param ageMs time in milliseconds indicating how long NITZ was cached in RIL and modem */ private void setTimeFromNITZString(String nitzString, long nitzReceiveTime) { private void setTimeFromNITZString(String nitzString, long nitzReceiveTimeMs, long ageMs) { long start = SystemClock.elapsedRealtime(); if (DBG) { Rlog.d(LOG_TAG, "NITZ: " + nitzString + "," + nitzReceiveTime + " start=" + start + " delay=" + (start - nitzReceiveTime)); Rlog.d(LOG_TAG, "NITZ: " + nitzString + "," + nitzReceiveTimeMs + ", ageMs=" + ageMs + " start=" + start + " delay=" + (start - nitzReceiveTimeMs)); } NitzData newNitzData = NitzData.parse(nitzString); mLastNitzData = newNitzData; if (newNitzData != null) { try { long ageMillis = 0; NitzSignal nitzSignal = new NitzSignal(nitzReceiveTime, newNitzData, ageMillis); NitzSignal nitzSignal = new NitzSignal(nitzReceiveTimeMs, newNitzData, ageMs); mNitzState.handleNitzReceived(nitzSignal); } finally { if (DBG) { Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +35 −2 Original line number Diff line number Diff line Loading @@ -2046,7 +2046,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { @Test @SmallTest public void testSetTimeFromNITZStr() throws Exception { public void testSetTimeFromNITZStr_withoutAge() throws Exception { { // Mock sending incorrect nitz str from RIL mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0"); Loading @@ -2054,7 +2054,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { verify(mNitzStateMachine, times(0)).handleNitzReceived(any()); } { // Mock sending correct nitz str from RIL // Mock sending correct nitz str from RIL with a zero ageMs String nitzStr = "15/06/20,00:00:00+0"; NitzData expectedNitzData = NitzData.parse(nitzStr); mSimulatedCommands.triggerNITZupdate(nitzStr); Loading @@ -2070,6 +2070,39 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertEquals(expectedNitzData, actualNitzSignal.getNitzData()); assertTrue(actualNitzSignal.getReceiptElapsedRealtimeMillis() <= SystemClock.elapsedRealtime()); assertEquals(actualNitzSignal.getAgeMillis(), 0); } } @Test @SmallTest public void testSetTimeFromNITZStr_withAge() throws Exception { { // Mock sending incorrect nitz str from RIL with a non-zero ageMs long ageMs = 60 * 1000; mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0", ageMs); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mNitzStateMachine, times(0)).handleNitzReceived(any()); } { // Mock sending correct nitz str from RIL with a non-zero ageMs String nitzStr = "21/08/15,00:00:00+0"; long ageMs = 60 * 1000; NitzData expectedNitzData = NitzData.parse(nitzStr); mSimulatedCommands.triggerNITZupdate(nitzStr, ageMs); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); ArgumentCaptor<NitzSignal> argumentsCaptor = ArgumentCaptor.forClass(NitzSignal.class); verify(mNitzStateMachine, times(1)) .handleNitzReceived(argumentsCaptor.capture()); // Confirm the argument was what we expected. NitzSignal actualNitzSignal = argumentsCaptor.getValue(); assertEquals(expectedNitzData, actualNitzSignal.getNitzData()); assertTrue(actualNitzSignal.getReceiptElapsedRealtimeMillis() <= SystemClock.elapsedRealtime()); assertEquals(actualNitzSignal.getAgeMillis(), ageMs); } } Loading
tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java +7 −0 Original line number Diff line number Diff line Loading @@ -1189,6 +1189,13 @@ public class SimulatedCommands extends BaseCommands } } public void triggerNITZupdate(String NITZStr, long ageMs) { if (NITZStr != null) { mNITZTimeRegistrant.notifyRegistrant(new AsyncResult (null, new Object[]{NITZStr, SystemClock.elapsedRealtime(), ageMs}, null)); } } @Override public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming, boolean allowRoaming, int reason, LinkProperties linkProperties, int pduSessionId, Loading