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

Commit edbff8f1 authored by Neil Fuller's avatar Neil Fuller Committed by Automerger Merge Worker
Browse files

Merge "Add age to the NITZ info sent to NitzStateMachine" am: 40850260 am:...

Merge "Add age to the NITZ info sent to NitzStateMachine" am: 40850260 am: c867b570 am: 6dce1147

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1864718

Change-Id: I93944c242902f80356fffad76d66dec853322187
parents 969afaa0 6dce1147
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;
@@ -4431,8 +4430,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