Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7144b72 authored by Neil Fuller's avatar Neil Fuller
Browse files

Add age to the NITZ info sent to NitzStateMachine

Add a new data type (NitzSignal) to support passing NITZ age to the
NitzStateMachine.

Bug: 203638508
Test: atest tests/telephonytests/src/com/android/internal/telephony/nitz/
Change-Id: I33ee54764d3088cedf5b72f3dda2c3a2f099a1df
parent 966e900f
Loading
Loading
Loading
Loading
+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
                + '}';
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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
+2 −3
Original line number Diff line number Diff line
@@ -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;
@@ -4425,8 +4424,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) {
+15 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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);
    }

    /**
@@ -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"
@@ -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
@@ -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()
@@ -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) {
+13 −11
Original line number Diff line number Diff line
@@ -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;
@@ -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);
    }

    /**
@@ -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 = "NewNitzStateMachineImpl";
@@ -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.

@@ -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;
        }
@@ -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);
@@ -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);
@@ -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
@@ -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