Loading src/java/com/android/internal/telephony/NitzSignal.java 0 → 100644 +105 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.annotation.DurationMillisLong; import android.annotation.ElapsedRealtimeLong; import android.annotation.NonNull; import java.time.Duration; import java.util.Objects; /** NITZ information and associated metadata. */ public final class NitzSignal { @ElapsedRealtimeLong private final long mReceiptElapsedMillis; @NonNull private final NitzData mNitzData; @DurationMillisLong private final long mAgeMillis; /** * @param receiptElapsedMillis the time according to {@link * android.os.SystemClock#elapsedRealtime()} when the NITZ signal was first received by * the platform code * @param nitzData the NITZ data * @param ageMillis the age of the NITZ when it was passed to the platform, e.g. if it was * cached by the modem for a period of time. Must not be negative. */ public NitzSignal( @ElapsedRealtimeLong long receiptElapsedMillis, @NonNull NitzData nitzData, long ageMillis) { mReceiptElapsedMillis = receiptElapsedMillis; mNitzData = Objects.requireNonNull(nitzData); if (ageMillis < 0) { throw new IllegalArgumentException("ageMillis < 0"); } mAgeMillis = ageMillis; } /** * Returns the time according to {@link android.os.SystemClock#elapsedRealtime()} when the NITZ * signal was first received by the platform code. */ @ElapsedRealtimeLong public long getReceiptElapsedRealtimeMillis() { return mReceiptElapsedMillis; } /** * Returns the NITZ data. */ @NonNull public NitzData getNitzData() { return mNitzData; } /** * Returns the age of the NITZ when it was passed to the platform, e.g. if it was cached by the * modem for a period of time. Must not be negative. */ @DurationMillisLong public long getAgeMillis() { return mAgeMillis; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } NitzSignal that = (NitzSignal) o; return mReceiptElapsedMillis == that.mReceiptElapsedMillis && mAgeMillis == that.mAgeMillis && mNitzData.equals(that.mNitzData); } @Override public int hashCode() { return Objects.hash(mReceiptElapsedMillis, mNitzData, mAgeMillis); } @Override public String toString() { return "NitzSignal{" + "mReceiptElapsedMillis=" + Duration.ofMillis(mReceiptElapsedMillis) + ", mNitzData=" + mNitzData + ", mAgeMillis=" + mAgeMillis + '}'; } } src/java/com/android/internal/telephony/NitzStateMachine.java +1 −2 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.content.ContentResolver; import android.content.Context; import android.os.SystemClock; import android.os.SystemProperties; import android.os.TimestampedValue; import android.provider.Settings; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -65,7 +64,7 @@ public interface NitzStateMachine { /** * Handle a new NITZ signal being received. */ void handleNitzReceived(@NonNull TimestampedValue<NitzData> nitzSignal); void handleNitzReceived(@NonNull NitzSignal nitzSignal); /** * Handle the user putting the device into or out of airplane mode Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +2 −3 Original line number Diff line number Diff line Loading @@ -49,7 +49,6 @@ import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemClock; import android.os.SystemProperties; import android.os.TimestampedValue; import android.os.UserHandle; import android.os.WorkSource; import android.preference.PreferenceManager; Loading Loading @@ -4432,8 +4431,8 @@ public class ServiceStateTracker extends Handler { mLastNitzData = newNitzData; if (newNitzData != null) { try { TimestampedValue<NitzData> nitzSignal = new TimestampedValue<>(nitzReceiveTime, newNitzData); long ageMillis = 0; NitzSignal nitzSignal = new NitzSignal(nitzReceiveTime, newNitzData, ageMillis); mNitzState.handleNitzReceived(nitzSignal); } finally { if (DBG) { Loading src/java/com/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory.java +15 −14 Original line number Diff line number Diff line Loading @@ -21,10 +21,10 @@ import android.annotation.Nullable; import android.content.Context; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.TimestampedValue; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.NitzData; import com.android.internal.telephony.NitzSignal; import com.android.internal.telephony.NitzStateMachine.DeviceState; import com.android.internal.telephony.nitz.NitzStateMachineImpl.NitzSignalInputFilterPredicate; import com.android.telephony.Rlog; Loading Loading @@ -84,8 +84,8 @@ public final class NitzSignalInputFilterPredicateFactory { */ @Nullable Boolean mustProcessNitzSignal( @Nullable TimestampedValue<NitzData> previousSignal, @NonNull TimestampedValue<NitzData> newSignal); @Nullable NitzSignal previousSignal, @NonNull NitzSignal newSignal); } /** Loading Loading @@ -133,7 +133,8 @@ public final class NitzSignalInputFilterPredicateFactory { wakeLock.acquire(); long elapsedRealtime = deviceState.elapsedRealtime(); long millisSinceNitzReceived = elapsedRealtime - newSignal.getReferenceTimeMillis(); long millisSinceNitzReceived = elapsedRealtime - newSignal.getReceiptElapsedRealtimeMillis(); if (millisSinceNitzReceived < 0 || millisSinceNitzReceived > Integer.MAX_VALUE) { if (DBG) { Rlog.d(LOG_TAG, "mustProcessNitzSignal: Not processing NITZ signal" Loading Loading @@ -178,15 +179,15 @@ public final class NitzSignalInputFilterPredicateFactory { @Override @NonNull public Boolean mustProcessNitzSignal( @NonNull TimestampedValue<NitzData> previousSignal, @NonNull TimestampedValue<NitzData> newSignal) { @NonNull NitzSignal previousSignal, @NonNull NitzSignal newSignal) { Objects.requireNonNull(newSignal); Objects.requireNonNull(newSignal.getValue()); Objects.requireNonNull(newSignal.getNitzData()); Objects.requireNonNull(previousSignal); Objects.requireNonNull(previousSignal.getValue()); Objects.requireNonNull(previousSignal.getNitzData()); NitzData newNitzData = newSignal.getValue(); NitzData previousNitzData = previousSignal.getValue(); NitzData newNitzData = newSignal.getNitzData(); NitzData previousNitzData = previousSignal.getNitzData(); // Compare the discrete NitzData fields associated with local time offset. Any // difference and we should process the signal regardless of how recent the last one Loading @@ -201,8 +202,8 @@ public final class NitzSignalInputFilterPredicateFactory { int nitzUpdateDiff = deviceState.getNitzUpdateDiffMillis(); // Calculate the elapsed time between the new signal and the last signal. long elapsedRealtimeSinceLastSaved = newSignal.getReferenceTimeMillis() - previousSignal.getReferenceTimeMillis(); long elapsedRealtimeSinceLastSaved = newSignal.getReceiptElapsedRealtimeMillis() - previousSignal.getReceiptElapsedRealtimeMillis(); // Calculate the UTC difference between the time the two signals hold. long utcTimeDifferenceMillis = newNitzData.getCurrentTimeInMillis() Loading Loading @@ -256,8 +257,8 @@ public final class NitzSignalInputFilterPredicateFactory { } @Override public boolean mustProcessNitzSignal(@Nullable TimestampedValue<NitzData> oldSignal, @NonNull TimestampedValue<NitzData> newSignal) { public boolean mustProcessNitzSignal(@Nullable NitzSignal oldSignal, @NonNull NitzSignal newSignal) { Objects.requireNonNull(newSignal); for (TrivalentPredicate component : mComponents) { Loading src/java/com/android/internal/telephony/nitz/NitzStateMachineImpl.java +13 −11 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.TimestampedValue; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.NitzData; import com.android.internal.telephony.NitzSignal; import com.android.internal.telephony.NitzStateMachine; import com.android.internal.telephony.Phone; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -68,8 +69,8 @@ public final class NitzStateMachineImpl implements NitzStateMachine { * See {@link NitzSignalInputFilterPredicate}. */ boolean mustProcessNitzSignal( @Nullable TimestampedValue<NitzData> oldSignal, @NonNull TimestampedValue<NitzData> newSignal); @Nullable NitzSignal oldSignal, @NonNull NitzSignal newSignal); } /** Loading @@ -89,7 +90,7 @@ public final class NitzStateMachineImpl implements NitzStateMachine { @NonNull TelephonyTimeZoneSuggestion getTimeZoneSuggestion( int slotIndex, @Nullable String countryIsoCode, @Nullable TimestampedValue<NitzData> nitzSignal); @Nullable NitzSignal nitzSignal); } static final String LOG_TAG = "NitzStateMachineImpl"; Loading @@ -114,7 +115,7 @@ public final class NitzStateMachineImpl implements NitzStateMachine { * needs to be recalculated when something else has changed. */ @Nullable private TimestampedValue<NitzData> mLatestNitzSignal; private NitzSignal mLatestNitzSignal; // Time Zone detection state. Loading Loading @@ -227,14 +228,14 @@ public final class NitzStateMachineImpl implements NitzStateMachine { } @Override public void handleNitzReceived(@NonNull TimestampedValue<NitzData> nitzSignal) { public void handleNitzReceived(@NonNull NitzSignal nitzSignal) { if (DBG) { Rlog.d(LOG_TAG, "handleNitzReceived: nitzSignal=" + nitzSignal); } Objects.requireNonNull(nitzSignal); // Perform input filtering to filter bad data and avoid processing signals too often. TimestampedValue<NitzData> previousNitzSignal = mLatestNitzSignal; NitzSignal previousNitzSignal = mLatestNitzSignal; if (!mNitzSignalInputFilter.mustProcessNitzSignal(previousNitzSignal, nitzSignal)) { return; } Loading Loading @@ -278,7 +279,8 @@ public final class NitzStateMachineImpl implements NitzStateMachine { * Perform a round of time zone detection and notify the time zone detection service as needed. */ private void doTimeZoneDetection( @Nullable String countryIsoCode, @Nullable TimestampedValue<NitzData> nitzSignal, @Nullable String countryIsoCode, @Nullable NitzSignal nitzSignal, @NonNull String reason) { try { Objects.requireNonNull(reason); Loading Loading @@ -306,7 +308,7 @@ public final class NitzStateMachineImpl implements NitzStateMachine { /** * Perform a round of time detection and notify the time detection service as needed. */ private void doTimeDetection(@Nullable TimestampedValue<NitzData> nitzSignal, private void doTimeDetection(@Nullable NitzSignal nitzSignal, @NonNull String reason) { try { Objects.requireNonNull(reason); Loading @@ -318,8 +320,8 @@ public final class NitzStateMachineImpl implements NitzStateMachine { + " reason=" + reason); } else { TimestampedValue<Long> newNitzTime = new TimestampedValue<>( nitzSignal.getReferenceTimeMillis(), nitzSignal.getValue().getCurrentTimeInMillis()); nitzSignal.getReceiptElapsedRealtimeMillis(), nitzSignal.getNitzData().getCurrentTimeInMillis()); builder.setUtcTime(newNitzTime); builder.addDebugInfo("Sending new time suggestion" + " nitzSignal=" + nitzSignal Loading Loading @@ -350,6 +352,6 @@ public final class NitzStateMachineImpl implements NitzStateMachine { @Nullable public NitzData getCachedNitzData() { return mLatestNitzSignal != null ? mLatestNitzSignal.getValue() : null; return mLatestNitzSignal != null ? mLatestNitzSignal.getNitzData() : null; } } Loading
src/java/com/android/internal/telephony/NitzSignal.java 0 → 100644 +105 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.annotation.DurationMillisLong; import android.annotation.ElapsedRealtimeLong; import android.annotation.NonNull; import java.time.Duration; import java.util.Objects; /** NITZ information and associated metadata. */ public final class NitzSignal { @ElapsedRealtimeLong private final long mReceiptElapsedMillis; @NonNull private final NitzData mNitzData; @DurationMillisLong private final long mAgeMillis; /** * @param receiptElapsedMillis the time according to {@link * android.os.SystemClock#elapsedRealtime()} when the NITZ signal was first received by * the platform code * @param nitzData the NITZ data * @param ageMillis the age of the NITZ when it was passed to the platform, e.g. if it was * cached by the modem for a period of time. Must not be negative. */ public NitzSignal( @ElapsedRealtimeLong long receiptElapsedMillis, @NonNull NitzData nitzData, long ageMillis) { mReceiptElapsedMillis = receiptElapsedMillis; mNitzData = Objects.requireNonNull(nitzData); if (ageMillis < 0) { throw new IllegalArgumentException("ageMillis < 0"); } mAgeMillis = ageMillis; } /** * Returns the time according to {@link android.os.SystemClock#elapsedRealtime()} when the NITZ * signal was first received by the platform code. */ @ElapsedRealtimeLong public long getReceiptElapsedRealtimeMillis() { return mReceiptElapsedMillis; } /** * Returns the NITZ data. */ @NonNull public NitzData getNitzData() { return mNitzData; } /** * Returns the age of the NITZ when it was passed to the platform, e.g. if it was cached by the * modem for a period of time. Must not be negative. */ @DurationMillisLong public long getAgeMillis() { return mAgeMillis; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } NitzSignal that = (NitzSignal) o; return mReceiptElapsedMillis == that.mReceiptElapsedMillis && mAgeMillis == that.mAgeMillis && mNitzData.equals(that.mNitzData); } @Override public int hashCode() { return Objects.hash(mReceiptElapsedMillis, mNitzData, mAgeMillis); } @Override public String toString() { return "NitzSignal{" + "mReceiptElapsedMillis=" + Duration.ofMillis(mReceiptElapsedMillis) + ", mNitzData=" + mNitzData + ", mAgeMillis=" + mAgeMillis + '}'; } }
src/java/com/android/internal/telephony/NitzStateMachine.java +1 −2 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.content.ContentResolver; import android.content.Context; import android.os.SystemClock; import android.os.SystemProperties; import android.os.TimestampedValue; import android.provider.Settings; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -65,7 +64,7 @@ public interface NitzStateMachine { /** * Handle a new NITZ signal being received. */ void handleNitzReceived(@NonNull TimestampedValue<NitzData> nitzSignal); void handleNitzReceived(@NonNull NitzSignal nitzSignal); /** * Handle the user putting the device into or out of airplane mode Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +2 −3 Original line number Diff line number Diff line Loading @@ -49,7 +49,6 @@ import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemClock; import android.os.SystemProperties; import android.os.TimestampedValue; import android.os.UserHandle; import android.os.WorkSource; import android.preference.PreferenceManager; Loading Loading @@ -4432,8 +4431,8 @@ public class ServiceStateTracker extends Handler { mLastNitzData = newNitzData; if (newNitzData != null) { try { TimestampedValue<NitzData> nitzSignal = new TimestampedValue<>(nitzReceiveTime, newNitzData); long ageMillis = 0; NitzSignal nitzSignal = new NitzSignal(nitzReceiveTime, newNitzData, ageMillis); mNitzState.handleNitzReceived(nitzSignal); } finally { if (DBG) { Loading
src/java/com/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory.java +15 −14 Original line number Diff line number Diff line Loading @@ -21,10 +21,10 @@ import android.annotation.Nullable; import android.content.Context; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.TimestampedValue; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.NitzData; import com.android.internal.telephony.NitzSignal; import com.android.internal.telephony.NitzStateMachine.DeviceState; import com.android.internal.telephony.nitz.NitzStateMachineImpl.NitzSignalInputFilterPredicate; import com.android.telephony.Rlog; Loading Loading @@ -84,8 +84,8 @@ public final class NitzSignalInputFilterPredicateFactory { */ @Nullable Boolean mustProcessNitzSignal( @Nullable TimestampedValue<NitzData> previousSignal, @NonNull TimestampedValue<NitzData> newSignal); @Nullable NitzSignal previousSignal, @NonNull NitzSignal newSignal); } /** Loading Loading @@ -133,7 +133,8 @@ public final class NitzSignalInputFilterPredicateFactory { wakeLock.acquire(); long elapsedRealtime = deviceState.elapsedRealtime(); long millisSinceNitzReceived = elapsedRealtime - newSignal.getReferenceTimeMillis(); long millisSinceNitzReceived = elapsedRealtime - newSignal.getReceiptElapsedRealtimeMillis(); if (millisSinceNitzReceived < 0 || millisSinceNitzReceived > Integer.MAX_VALUE) { if (DBG) { Rlog.d(LOG_TAG, "mustProcessNitzSignal: Not processing NITZ signal" Loading Loading @@ -178,15 +179,15 @@ public final class NitzSignalInputFilterPredicateFactory { @Override @NonNull public Boolean mustProcessNitzSignal( @NonNull TimestampedValue<NitzData> previousSignal, @NonNull TimestampedValue<NitzData> newSignal) { @NonNull NitzSignal previousSignal, @NonNull NitzSignal newSignal) { Objects.requireNonNull(newSignal); Objects.requireNonNull(newSignal.getValue()); Objects.requireNonNull(newSignal.getNitzData()); Objects.requireNonNull(previousSignal); Objects.requireNonNull(previousSignal.getValue()); Objects.requireNonNull(previousSignal.getNitzData()); NitzData newNitzData = newSignal.getValue(); NitzData previousNitzData = previousSignal.getValue(); NitzData newNitzData = newSignal.getNitzData(); NitzData previousNitzData = previousSignal.getNitzData(); // Compare the discrete NitzData fields associated with local time offset. Any // difference and we should process the signal regardless of how recent the last one Loading @@ -201,8 +202,8 @@ public final class NitzSignalInputFilterPredicateFactory { int nitzUpdateDiff = deviceState.getNitzUpdateDiffMillis(); // Calculate the elapsed time between the new signal and the last signal. long elapsedRealtimeSinceLastSaved = newSignal.getReferenceTimeMillis() - previousSignal.getReferenceTimeMillis(); long elapsedRealtimeSinceLastSaved = newSignal.getReceiptElapsedRealtimeMillis() - previousSignal.getReceiptElapsedRealtimeMillis(); // Calculate the UTC difference between the time the two signals hold. long utcTimeDifferenceMillis = newNitzData.getCurrentTimeInMillis() Loading Loading @@ -256,8 +257,8 @@ public final class NitzSignalInputFilterPredicateFactory { } @Override public boolean mustProcessNitzSignal(@Nullable TimestampedValue<NitzData> oldSignal, @NonNull TimestampedValue<NitzData> newSignal) { public boolean mustProcessNitzSignal(@Nullable NitzSignal oldSignal, @NonNull NitzSignal newSignal) { Objects.requireNonNull(newSignal); for (TrivalentPredicate component : mComponents) { Loading
src/java/com/android/internal/telephony/nitz/NitzStateMachineImpl.java +13 −11 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.TimestampedValue; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.NitzData; import com.android.internal.telephony.NitzSignal; import com.android.internal.telephony.NitzStateMachine; import com.android.internal.telephony.Phone; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -68,8 +69,8 @@ public final class NitzStateMachineImpl implements NitzStateMachine { * See {@link NitzSignalInputFilterPredicate}. */ boolean mustProcessNitzSignal( @Nullable TimestampedValue<NitzData> oldSignal, @NonNull TimestampedValue<NitzData> newSignal); @Nullable NitzSignal oldSignal, @NonNull NitzSignal newSignal); } /** Loading @@ -89,7 +90,7 @@ public final class NitzStateMachineImpl implements NitzStateMachine { @NonNull TelephonyTimeZoneSuggestion getTimeZoneSuggestion( int slotIndex, @Nullable String countryIsoCode, @Nullable TimestampedValue<NitzData> nitzSignal); @Nullable NitzSignal nitzSignal); } static final String LOG_TAG = "NitzStateMachineImpl"; Loading @@ -114,7 +115,7 @@ public final class NitzStateMachineImpl implements NitzStateMachine { * needs to be recalculated when something else has changed. */ @Nullable private TimestampedValue<NitzData> mLatestNitzSignal; private NitzSignal mLatestNitzSignal; // Time Zone detection state. Loading Loading @@ -227,14 +228,14 @@ public final class NitzStateMachineImpl implements NitzStateMachine { } @Override public void handleNitzReceived(@NonNull TimestampedValue<NitzData> nitzSignal) { public void handleNitzReceived(@NonNull NitzSignal nitzSignal) { if (DBG) { Rlog.d(LOG_TAG, "handleNitzReceived: nitzSignal=" + nitzSignal); } Objects.requireNonNull(nitzSignal); // Perform input filtering to filter bad data and avoid processing signals too often. TimestampedValue<NitzData> previousNitzSignal = mLatestNitzSignal; NitzSignal previousNitzSignal = mLatestNitzSignal; if (!mNitzSignalInputFilter.mustProcessNitzSignal(previousNitzSignal, nitzSignal)) { return; } Loading Loading @@ -278,7 +279,8 @@ public final class NitzStateMachineImpl implements NitzStateMachine { * Perform a round of time zone detection and notify the time zone detection service as needed. */ private void doTimeZoneDetection( @Nullable String countryIsoCode, @Nullable TimestampedValue<NitzData> nitzSignal, @Nullable String countryIsoCode, @Nullable NitzSignal nitzSignal, @NonNull String reason) { try { Objects.requireNonNull(reason); Loading Loading @@ -306,7 +308,7 @@ public final class NitzStateMachineImpl implements NitzStateMachine { /** * Perform a round of time detection and notify the time detection service as needed. */ private void doTimeDetection(@Nullable TimestampedValue<NitzData> nitzSignal, private void doTimeDetection(@Nullable NitzSignal nitzSignal, @NonNull String reason) { try { Objects.requireNonNull(reason); Loading @@ -318,8 +320,8 @@ public final class NitzStateMachineImpl implements NitzStateMachine { + " reason=" + reason); } else { TimestampedValue<Long> newNitzTime = new TimestampedValue<>( nitzSignal.getReferenceTimeMillis(), nitzSignal.getValue().getCurrentTimeInMillis()); nitzSignal.getReceiptElapsedRealtimeMillis(), nitzSignal.getNitzData().getCurrentTimeInMillis()); builder.setUtcTime(newNitzTime); builder.addDebugInfo("Sending new time suggestion" + " nitzSignal=" + nitzSignal Loading Loading @@ -350,6 +352,6 @@ public final class NitzStateMachineImpl implements NitzStateMachine { @Nullable public NitzData getCachedNitzData() { return mLatestNitzSignal != null ? mLatestNitzSignal.getValue() : null; return mLatestNitzSignal != null ? mLatestNitzSignal.getNitzData() : null; } }