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

Commit 73e13e5a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Normalization of IMS registration durations" into tm-dev

parents 1cbd74a9 ae23fe16
Loading
Loading
Loading
Loading
+43 −5
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony.metrics;

import static android.text.format.DateUtils.DAY_IN_MILLIS;

import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -723,19 +725,20 @@ public class PersistAtomsStorage {
    }

    /**
     * Returns and clears the IMS registration statistics if last pulled longer than {@code
     * minIntervalMillis} ago, otherwise returns {@code null}.
     * Returns and clears the IMS registration statistics normalized to 24h cycle if last
     * pulled longer than {@code minIntervalMillis} ago, otherwise returns {@code null}.
     */
    @Nullable
    public synchronized ImsRegistrationStats[] getImsRegistrationStats(long minIntervalMillis) {
        if (getWallTimeMillis() - mAtoms.imsRegistrationStatsPullTimestampMillis
                > minIntervalMillis) {
        long intervalMillis =
                getWallTimeMillis() - mAtoms.imsRegistrationStatsPullTimestampMillis;
        if (intervalMillis > minIntervalMillis) {
            mAtoms.imsRegistrationStatsPullTimestampMillis = getWallTimeMillis();
            ImsRegistrationStats[] previousStats = mAtoms.imsRegistrationStats;
            Arrays.stream(previousStats).forEach(stats -> stats.lastUsedMillis = 0L);
            mAtoms.imsRegistrationStats = new ImsRegistrationStats[0];
            saveAtomsToFile(SAVE_TO_FILE_DELAY_FOR_GET_MILLIS);
            return previousStats;
            return normalizeData(previousStats, intervalMillis);
        } else {
            return null;
        }
@@ -1627,6 +1630,41 @@ public class PersistAtomsStorage {
        return timestamp <= 0L ? getWallTimeMillis() : timestamp;
    }

    /**
     * Returns {@link ImsRegistrationStats} array with durations normalized to 24 hours
     * depending on the interval.
     */
    private ImsRegistrationStats[] normalizeData(ImsRegistrationStats[] stats,
            long intervalMillis) {
        for (int i = 0; i < stats.length; i++) {
            stats[i].registeredMillis =
                    normalizeDurationTo24H(stats[i].registeredMillis, intervalMillis);
            stats[i].voiceCapableMillis =
                    normalizeDurationTo24H(stats[i].voiceCapableMillis, intervalMillis);
            stats[i].voiceAvailableMillis =
                    normalizeDurationTo24H(stats[i].voiceAvailableMillis, intervalMillis);
            stats[i].smsCapableMillis =
                    normalizeDurationTo24H(stats[i].smsCapableMillis, intervalMillis);
            stats[i].smsAvailableMillis =
                    normalizeDurationTo24H(stats[i].smsAvailableMillis, intervalMillis);
            stats[i].videoCapableMillis =
                    normalizeDurationTo24H(stats[i].videoCapableMillis, intervalMillis);
            stats[i].videoAvailableMillis =
                    normalizeDurationTo24H(stats[i].videoAvailableMillis, intervalMillis);
            stats[i].utCapableMillis =
                    normalizeDurationTo24H(stats[i].utCapableMillis, intervalMillis);
            stats[i].utAvailableMillis =
                    normalizeDurationTo24H(stats[i].utAvailableMillis, intervalMillis);
        }
        return stats;
    }

    /** Returns a duration normalized to 24 hours. */
    private long normalizeDurationTo24H(long timeInMillis, long intervalMillis) {
        long interval = intervalMillis < 1000 ? 1 : intervalMillis / 1000;
        return ((timeInMillis / 1000) * (DAY_IN_MILLIS / 1000) / interval) * 1000;
    }

    /** Returns an empty PersistAtoms with pull timestamp set to current time. */
    private PersistAtoms makeNewPersistAtoms() {
        PersistAtoms atoms = new PersistAtoms();
+37 −10
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony.metrics;

import static android.text.format.DateUtils.DAY_IN_MILLIS;

import static com.android.internal.telephony.TelephonyStatsLog.GBA_EVENT__FAILED_REASON__FEATURE_NOT_READY;
import static com.android.internal.telephony.TelephonyStatsLog.GBA_EVENT__FAILED_REASON__UNKNOWN;
import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS__RESPONSE_TYPE__ERROR;
@@ -1496,8 +1498,8 @@ public class PersistAtomsStorageTest extends TelephonyTest {
        createEmptyTestFile();

        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
        mPersistAtomsStorage.addImsRegistrationStats(mImsRegistrationStatsLte0);
        mPersistAtomsStorage.incTimeMillis(100L);
        mPersistAtomsStorage.addImsRegistrationStats(copyOf(mImsRegistrationStatsLte0));
        mPersistAtomsStorage.incTimeMillis(DAY_IN_MILLIS);

        // service state and service switch should be added successfully
        verifyCurrentStateSavedToFileOnce();
@@ -1510,10 +1512,10 @@ public class PersistAtomsStorageTest extends TelephonyTest {
    public void addImsRegistrationStats_withExistingEntries() throws Exception {
        createEmptyTestFile();
        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
        mPersistAtomsStorage.addImsRegistrationStats(mImsRegistrationStatsLte0);
        mPersistAtomsStorage.addImsRegistrationStats(copyOf(mImsRegistrationStatsLte0));

        mPersistAtomsStorage.addImsRegistrationStats(mImsRegistrationStatsWifi0);
        mPersistAtomsStorage.incTimeMillis(100L);
        mPersistAtomsStorage.addImsRegistrationStats(copyOf(mImsRegistrationStatsWifi0));
        mPersistAtomsStorage.incTimeMillis(DAY_IN_MILLIS);

        // service state and service switch should be added successfully
        verifyCurrentStateSavedToFileOnce();
@@ -1531,7 +1533,7 @@ public class PersistAtomsStorageTest extends TelephonyTest {
        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);

        mPersistAtomsStorage.addImsRegistrationStats(copyOf(mImsRegistrationStatsLte0));
        mPersistAtomsStorage.incTimeMillis(100L);
        mPersistAtomsStorage.incTimeMillis(DAY_IN_MILLIS);

        // mImsRegistrationStatsLte0's durations should be doubled
        verifyCurrentStateSavedToFileOnce();
@@ -1680,7 +1682,7 @@ public class PersistAtomsStorageTest extends TelephonyTest {
        createTestFile(START_TIME_MILLIS);

        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
        mPersistAtomsStorage.incTimeMillis(100L);
        mPersistAtomsStorage.incTimeMillis(DAY_IN_MILLIS);
        ImsRegistrationStats[] stats1 = mPersistAtomsStorage.getImsRegistrationStats(50L);
        mPersistAtomsStorage.incTimeMillis(100L);
        ImsRegistrationStats[] stats2 = mPersistAtomsStorage.getImsRegistrationStats(50L);
@@ -1694,14 +1696,14 @@ public class PersistAtomsStorageTest extends TelephonyTest {
                stats1);
        assertProtoArrayEquals(new ImsRegistrationStats[0], stats2);
        assertEquals(
                START_TIME_MILLIS + 200L,
                START_TIME_MILLIS + DAY_IN_MILLIS + 100L,
                mPersistAtomsStorage.getAtomsProto().imsRegistrationStatsPullTimestampMillis);
        InOrder inOrder = inOrder(mTestFileOutputStream);
        assertEquals(
                START_TIME_MILLIS + 100L,
                START_TIME_MILLIS + DAY_IN_MILLIS,
                getAtomsWritten(inOrder).imsRegistrationStatsPullTimestampMillis);
        assertEquals(
                START_TIME_MILLIS + 200L,
                START_TIME_MILLIS + DAY_IN_MILLIS + 100L,
                getAtomsWritten(inOrder).imsRegistrationStatsPullTimestampMillis);
        inOrder.verifyNoMoreInteractions();
    }
@@ -2235,6 +2237,31 @@ public class PersistAtomsStorageTest extends TelephonyTest {
        inOrder.verifyNoMoreInteractions();
    }

    @Test
    @SmallTest
    public void getImsRegistrationStats_24hNormalization() throws Exception {
        createEmptyTestFile();
        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
        mPersistAtomsStorage.addImsRegistrationStats(copyOf(mImsRegistrationStatsWifi0));
        mPersistAtomsStorage.incTimeMillis(DAY_IN_MILLIS / 2);

        ImsRegistrationStats[] serviceStates = mPersistAtomsStorage.getImsRegistrationStats(0L);
        mImsRegistrationStatsWifi0.registeredMillis *= 2;
        mImsRegistrationStatsWifi0.voiceCapableMillis *= 2;
        mImsRegistrationStatsWifi0.voiceAvailableMillis *= 2;
        mImsRegistrationStatsWifi0.smsCapableMillis *= 2;
        mImsRegistrationStatsWifi0.smsAvailableMillis *= 2;
        mImsRegistrationStatsWifi0.videoCapableMillis *= 2;
        mImsRegistrationStatsWifi0.videoAvailableMillis *= 2;
        mImsRegistrationStatsWifi0.utCapableMillis *= 2;
        mImsRegistrationStatsWifi0.utAvailableMillis *= 2;
        assertProtoArrayEqualsIgnoringOrder(
                new ImsRegistrationStats[] {
                    mImsRegistrationStatsWifi0
                },
                serviceStates);
    }

    @Test
    @SmallTest
    public void addImsDedicatedBearerListenerEvent_emptyProto() throws Exception {