Loading src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +43 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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(); Loading tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java +37 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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); Loading @@ -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(); } Loading Loading @@ -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 { Loading Loading
src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +43 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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(); Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java +37 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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); Loading @@ -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(); } Loading Loading @@ -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 { Loading