Loading proto/src/persist_atoms.proto +3 −3 Original line number Diff line number Diff line Loading @@ -26,10 +26,10 @@ option java_outer_classname = "PersistAtomsProto"; // Next id: 17 message PersistAtoms { /* Aggregated RAT usage during the call. */ repeated RawVoiceCallRatUsage raw_voice_call_rat_usage = 1; repeated VoiceCallRatUsage voice_call_rat_usage = 1; /* Timestamp of last voice_call_rat_usages pull. */ optional int64 raw_voice_call_rat_usage_pull_timestamp_millis = 2; optional int64 voice_call_rat_usage_pull_timestamp_millis = 2; /* Per call statistics and information. */ repeated VoiceCallSession voice_call_session = 3; Loading Loading @@ -111,7 +111,7 @@ message VoiceCallSession { optional int64 setup_begin_millis = 10001; } message RawVoiceCallRatUsage { message VoiceCallRatUsage { optional int32 carrier_id = 1; optional int32 rat = 2; optional int64 total_duration_millis = 3; // Duration needs to be rounded when pulled Loading src/java/com/android/internal/telephony/metrics/AirplaneModeStats.java +1 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ public class AirplaneModeStats extends ContentObserver { * Returns the carrier ID of the active data subscription. If this is not available, * it returns the carrier ID of the first phone. */ private int getCarrierId() { private static int getCarrierId() { int dataSubId = SubscriptionManager.getActiveDataSubscriptionId(); int phoneId = dataSubId != INVALID_SUBSCRIPTION_ID ? SubscriptionManager.getPhoneId(dataSubId) : 0; Loading src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java +13 −39 Original line number Diff line number Diff line Loading @@ -34,13 +34,10 @@ import android.telephony.data.DataService; import android.telephony.data.DataService.DeactivateDataReason; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; import com.android.internal.telephony.uicc.UiccController; import com.android.internal.telephony.uicc.UiccSlot; import com.android.telephony.Rlog; import java.util.Random; Loading @@ -59,16 +56,10 @@ public class DataCallSessionStats { private static final Random RANDOM = new Random(); public DataCallSessionStats(Phone phone) { if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) { mPhone = phone.getDefaultPhone(); } else { mPhone = phone; } } /** * create a new ongoing atom when data cal is set up */ /** create a new ongoing atom when data cal is set up */ public synchronized void onSetupDataCall() { // there shouldn't be an ongoing dataCall here, if that's the case, it means that // deactivateDataCall hasn't been processed properly, so we save the previous atom here Loading @@ -92,9 +83,12 @@ public class DataCallSessionStats { * @param apnTypeBitmask APN type bitmask * @param protocol Data connection protocol */ public synchronized void onSetupDataCallResponse(DataCallResponse response, @NetworkType int radioTechnology, int profileId, @ApnType int apnTypeBitmask, @ProtocolType int protocol) { public synchronized void onSetupDataCallResponse( DataCallResponse response, @NetworkType int radioTechnology, int profileId, @ApnType int apnTypeBitmask, @ProtocolType int protocol) { // there should've been another call to initiate the atom, // so this method is being called out of order -> no metric will be logged if (mOngoingDataCall == null) { Loading Loading @@ -156,6 +150,7 @@ public class DataCallSessionStats { /** * store the atom, when DataConnection reaches DISCONNECTED state * * @param cid Context Id, uniquely identifies the call */ public void onDataCallDisconnected(int cid) { Loading Loading @@ -195,11 +190,11 @@ public class DataCallSessionStats { private DataCallSession getDefaultProto() { DataCallSession proto = new DataCallSession(); proto.dimension = RANDOM.nextInt(); proto.isMultiSim = isMultiSim(); proto.isEsim = isEsim(); proto.isMultiSim = SimSlotState.isMultiSim(); proto.isEsim = SimSlotState.isEsim(mPhone.getPhoneId()); proto.profile = DATA_CALL_SESSION__PROFILE__DATA_PROFILE_DEFAULT; proto.apnTypeBitmask = ApnSetting.TYPE_NONE; proto.carrierId = getCarrierId(); proto.carrierId = mPhone.getCarrierId(); proto.isRoaming = getIsRoaming(); proto.oosAtEnd = false; proto.ratSwitchCount = 0L; Loading @@ -214,23 +209,6 @@ public class DataCallSessionStats { return proto; } private boolean isMultiSim() { return SimSlotState.getCurrentState().numActiveSims > 1; } private boolean isEsim() { UiccController uiccController = UiccController.getInstance(); int slotId = uiccController.getSlotIdFromPhoneId(mPhone.getPhoneId()); UiccSlot slot = uiccController.getUiccSlot(slotId); if (slot != null) { return slot.isEuicc(); } else { // should not happen, but assume we are not using eSIM loge("isEsim: slot %d is null", slotId); return false; } } private boolean getIsRoaming() { ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker(); ServiceState serviceState = Loading @@ -243,10 +221,6 @@ public class DataCallSessionStats { return subController != null ? subController.isOpportunistic(mPhone.getSubId()) : false; } private int getCarrierId() { return mPhone.getCarrierId(); } private void loge(String format, Object... args) { Rlog.e(TAG, "[" + mPhone.getPhoneId() + "]" + String.format(format, args)); } Loading src/java/com/android/internal/telephony/metrics/MetricsCollector.java +3 −3 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceStat import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms; import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; import com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession; import com.android.internal.util.ConcurrentUtils; import com.android.telephony.Rlog; Loading Loading @@ -215,7 +215,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { } private int pullVoiceCallRatUsages(List<StatsEvent> data) { RawVoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS); VoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS); if (usages != null) { // sort by carrier/RAT and remove buckets with insufficient number of calls Arrays.stream(usages) Loading Loading @@ -347,7 +347,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { (int) (round(state.totalTimeMillis, DURATION_BUCKET_MILLIS) / SECOND_IN_MILLIS)); } private static StatsEvent buildStatsEvent(RawVoiceCallRatUsage usage) { private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { return TelephonyStatsLog.buildStatsEvent( VOICE_CALL_RAT_USAGE, usage.carrierId, Loading src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +15 −15 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms; import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; import com.android.internal.telephony.nano.PersistAtomsProto.PersistAtoms; import com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession; import com.android.internal.util.ArrayUtils; import com.android.telephony.Rlog; Loading Loading @@ -105,7 +105,7 @@ public class PersistAtomsStorage { public PersistAtomsStorage(Context context) { mContext = context; mAtoms = loadAtomsFromFile(); mVoiceCallRatTracker = VoiceCallRatTracker.fromProto(mAtoms.rawVoiceCallRatUsage); mVoiceCallRatTracker = VoiceCallRatTracker.fromProto(mAtoms.voiceCallRatUsage); mHandlerThread = new HandlerThread("PersistAtomsThread"); mHandlerThread.start(); Loading @@ -123,7 +123,7 @@ public class PersistAtomsStorage { /** Adds RAT usages to the storage when a call session ends. */ public synchronized void addVoiceCallRatUsage(VoiceCallRatTracker ratUsages) { mVoiceCallRatTracker.mergeWith(ratUsages); mAtoms.rawVoiceCallRatUsage = mVoiceCallRatTracker.toProto(); mAtoms.voiceCallRatUsage = mVoiceCallRatTracker.toProto(); saveAtomsToFile(); } Loading Loading @@ -258,13 +258,13 @@ public class PersistAtomsStorage { * minIntervalMillis} ago, otherwise returns {@code null}. */ @Nullable public synchronized RawVoiceCallRatUsage[] getVoiceCallRatUsages(long minIntervalMillis) { if (getWallTimeMillis() - mAtoms.rawVoiceCallRatUsagePullTimestampMillis public synchronized VoiceCallRatUsage[] getVoiceCallRatUsages(long minIntervalMillis) { if (getWallTimeMillis() - mAtoms.voiceCallRatUsagePullTimestampMillis > minIntervalMillis) { mAtoms.rawVoiceCallRatUsagePullTimestampMillis = getWallTimeMillis(); RawVoiceCallRatUsage[] previousUsages = mAtoms.rawVoiceCallRatUsage; mAtoms.voiceCallRatUsagePullTimestampMillis = getWallTimeMillis(); VoiceCallRatUsage[] previousUsages = mAtoms.voiceCallRatUsage; mVoiceCallRatTracker.clear(); mAtoms.rawVoiceCallRatUsage = new RawVoiceCallRatUsage[0]; mAtoms.voiceCallRatUsage = new VoiceCallRatUsage[0]; saveAtomsToFile(); return previousUsages; } else { Loading Loading @@ -370,8 +370,8 @@ public class PersistAtomsStorage { PersistAtoms.parseFrom( Files.readAllBytes(mContext.getFileStreamPath(FILENAME).toPath())); // check all the fields in case of situations such as OTA or crash during saving atoms.rawVoiceCallRatUsage = sanitizeAtoms(atoms.rawVoiceCallRatUsage, RawVoiceCallRatUsage.class); atoms.voiceCallRatUsage = sanitizeAtoms(atoms.voiceCallRatUsage, VoiceCallRatUsage.class); atoms.voiceCallSession = sanitizeAtoms(atoms.voiceCallSession, VoiceCallSession.class, MAX_NUM_CALL_SESSIONS); atoms.incomingSms = sanitizeAtoms(atoms.incomingSms, IncomingSms.class, MAX_NUM_SMS); Loading @@ -385,8 +385,8 @@ public class PersistAtomsStorage { atoms.cellularDataServiceSwitch = sanitizeAtoms(atoms.cellularDataServiceSwitch, CellularDataServiceSwitch.class, MAX_NUM_CELLULAR_DATA_SERVICE_SWITCHES); // out of caution, sanitize also the timestamps atoms.rawVoiceCallRatUsagePullTimestampMillis = sanitizeTimestamp(atoms.rawVoiceCallRatUsagePullTimestampMillis); atoms.voiceCallRatUsagePullTimestampMillis = sanitizeTimestamp(atoms.voiceCallRatUsagePullTimestampMillis); atoms.voiceCallSessionPullTimestampMillis = sanitizeTimestamp(atoms.voiceCallSessionPullTimestampMillis); atoms.incomingSmsPullTimestampMillis = Loading @@ -409,8 +409,8 @@ public class PersistAtomsStorage { /** * Posts message to save a copy of {@link PersistAtoms} to a file after a delay. * * The delay is introduced to avoid too frequent operations to disk, that would have negative * impact on the power consumption. * <p>The delay is introduced to avoid too frequent operations to disk, which would negatively * impact the power consumption. */ private void saveAtomsToFile() { if (mSaveDelay > 0) { Loading Loading @@ -549,7 +549,7 @@ public class PersistAtomsStorage { PersistAtoms atoms = new PersistAtoms(); // allow pulling only after some time so data are sufficiently aggregated long currentTime = getWallTimeMillis(); atoms.rawVoiceCallRatUsagePullTimestampMillis = currentTime; atoms.voiceCallRatUsagePullTimestampMillis = currentTime; atoms.voiceCallSessionPullTimestampMillis = currentTime; atoms.incomingSmsPullTimestampMillis = currentTime; atoms.outgoingSmsPullTimestampMillis = currentTime; Loading Loading
proto/src/persist_atoms.proto +3 −3 Original line number Diff line number Diff line Loading @@ -26,10 +26,10 @@ option java_outer_classname = "PersistAtomsProto"; // Next id: 17 message PersistAtoms { /* Aggregated RAT usage during the call. */ repeated RawVoiceCallRatUsage raw_voice_call_rat_usage = 1; repeated VoiceCallRatUsage voice_call_rat_usage = 1; /* Timestamp of last voice_call_rat_usages pull. */ optional int64 raw_voice_call_rat_usage_pull_timestamp_millis = 2; optional int64 voice_call_rat_usage_pull_timestamp_millis = 2; /* Per call statistics and information. */ repeated VoiceCallSession voice_call_session = 3; Loading Loading @@ -111,7 +111,7 @@ message VoiceCallSession { optional int64 setup_begin_millis = 10001; } message RawVoiceCallRatUsage { message VoiceCallRatUsage { optional int32 carrier_id = 1; optional int32 rat = 2; optional int64 total_duration_millis = 3; // Duration needs to be rounded when pulled Loading
src/java/com/android/internal/telephony/metrics/AirplaneModeStats.java +1 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ public class AirplaneModeStats extends ContentObserver { * Returns the carrier ID of the active data subscription. If this is not available, * it returns the carrier ID of the first phone. */ private int getCarrierId() { private static int getCarrierId() { int dataSubId = SubscriptionManager.getActiveDataSubscriptionId(); int phoneId = dataSubId != INVALID_SUBSCRIPTION_ID ? SubscriptionManager.getPhoneId(dataSubId) : 0; Loading
src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java +13 −39 Original line number Diff line number Diff line Loading @@ -34,13 +34,10 @@ import android.telephony.data.DataService; import android.telephony.data.DataService.DeactivateDataReason; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; import com.android.internal.telephony.uicc.UiccController; import com.android.internal.telephony.uicc.UiccSlot; import com.android.telephony.Rlog; import java.util.Random; Loading @@ -59,16 +56,10 @@ public class DataCallSessionStats { private static final Random RANDOM = new Random(); public DataCallSessionStats(Phone phone) { if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) { mPhone = phone.getDefaultPhone(); } else { mPhone = phone; } } /** * create a new ongoing atom when data cal is set up */ /** create a new ongoing atom when data cal is set up */ public synchronized void onSetupDataCall() { // there shouldn't be an ongoing dataCall here, if that's the case, it means that // deactivateDataCall hasn't been processed properly, so we save the previous atom here Loading @@ -92,9 +83,12 @@ public class DataCallSessionStats { * @param apnTypeBitmask APN type bitmask * @param protocol Data connection protocol */ public synchronized void onSetupDataCallResponse(DataCallResponse response, @NetworkType int radioTechnology, int profileId, @ApnType int apnTypeBitmask, @ProtocolType int protocol) { public synchronized void onSetupDataCallResponse( DataCallResponse response, @NetworkType int radioTechnology, int profileId, @ApnType int apnTypeBitmask, @ProtocolType int protocol) { // there should've been another call to initiate the atom, // so this method is being called out of order -> no metric will be logged if (mOngoingDataCall == null) { Loading Loading @@ -156,6 +150,7 @@ public class DataCallSessionStats { /** * store the atom, when DataConnection reaches DISCONNECTED state * * @param cid Context Id, uniquely identifies the call */ public void onDataCallDisconnected(int cid) { Loading Loading @@ -195,11 +190,11 @@ public class DataCallSessionStats { private DataCallSession getDefaultProto() { DataCallSession proto = new DataCallSession(); proto.dimension = RANDOM.nextInt(); proto.isMultiSim = isMultiSim(); proto.isEsim = isEsim(); proto.isMultiSim = SimSlotState.isMultiSim(); proto.isEsim = SimSlotState.isEsim(mPhone.getPhoneId()); proto.profile = DATA_CALL_SESSION__PROFILE__DATA_PROFILE_DEFAULT; proto.apnTypeBitmask = ApnSetting.TYPE_NONE; proto.carrierId = getCarrierId(); proto.carrierId = mPhone.getCarrierId(); proto.isRoaming = getIsRoaming(); proto.oosAtEnd = false; proto.ratSwitchCount = 0L; Loading @@ -214,23 +209,6 @@ public class DataCallSessionStats { return proto; } private boolean isMultiSim() { return SimSlotState.getCurrentState().numActiveSims > 1; } private boolean isEsim() { UiccController uiccController = UiccController.getInstance(); int slotId = uiccController.getSlotIdFromPhoneId(mPhone.getPhoneId()); UiccSlot slot = uiccController.getUiccSlot(slotId); if (slot != null) { return slot.isEuicc(); } else { // should not happen, but assume we are not using eSIM loge("isEsim: slot %d is null", slotId); return false; } } private boolean getIsRoaming() { ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker(); ServiceState serviceState = Loading @@ -243,10 +221,6 @@ public class DataCallSessionStats { return subController != null ? subController.isOpportunistic(mPhone.getSubId()) : false; } private int getCarrierId() { return mPhone.getCarrierId(); } private void loge(String format, Object... args) { Rlog.e(TAG, "[" + mPhone.getPhoneId() + "]" + String.format(format, args)); } Loading
src/java/com/android/internal/telephony/metrics/MetricsCollector.java +3 −3 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceStat import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms; import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; import com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession; import com.android.internal.util.ConcurrentUtils; import com.android.telephony.Rlog; Loading Loading @@ -215,7 +215,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { } private int pullVoiceCallRatUsages(List<StatsEvent> data) { RawVoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS); VoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS); if (usages != null) { // sort by carrier/RAT and remove buckets with insufficient number of calls Arrays.stream(usages) Loading Loading @@ -347,7 +347,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { (int) (round(state.totalTimeMillis, DURATION_BUCKET_MILLIS) / SECOND_IN_MILLIS)); } private static StatsEvent buildStatsEvent(RawVoiceCallRatUsage usage) { private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { return TelephonyStatsLog.buildStatsEvent( VOICE_CALL_RAT_USAGE, usage.carrierId, Loading
src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +15 −15 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms; import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; import com.android.internal.telephony.nano.PersistAtomsProto.PersistAtoms; import com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession; import com.android.internal.util.ArrayUtils; import com.android.telephony.Rlog; Loading Loading @@ -105,7 +105,7 @@ public class PersistAtomsStorage { public PersistAtomsStorage(Context context) { mContext = context; mAtoms = loadAtomsFromFile(); mVoiceCallRatTracker = VoiceCallRatTracker.fromProto(mAtoms.rawVoiceCallRatUsage); mVoiceCallRatTracker = VoiceCallRatTracker.fromProto(mAtoms.voiceCallRatUsage); mHandlerThread = new HandlerThread("PersistAtomsThread"); mHandlerThread.start(); Loading @@ -123,7 +123,7 @@ public class PersistAtomsStorage { /** Adds RAT usages to the storage when a call session ends. */ public synchronized void addVoiceCallRatUsage(VoiceCallRatTracker ratUsages) { mVoiceCallRatTracker.mergeWith(ratUsages); mAtoms.rawVoiceCallRatUsage = mVoiceCallRatTracker.toProto(); mAtoms.voiceCallRatUsage = mVoiceCallRatTracker.toProto(); saveAtomsToFile(); } Loading Loading @@ -258,13 +258,13 @@ public class PersistAtomsStorage { * minIntervalMillis} ago, otherwise returns {@code null}. */ @Nullable public synchronized RawVoiceCallRatUsage[] getVoiceCallRatUsages(long minIntervalMillis) { if (getWallTimeMillis() - mAtoms.rawVoiceCallRatUsagePullTimestampMillis public synchronized VoiceCallRatUsage[] getVoiceCallRatUsages(long minIntervalMillis) { if (getWallTimeMillis() - mAtoms.voiceCallRatUsagePullTimestampMillis > minIntervalMillis) { mAtoms.rawVoiceCallRatUsagePullTimestampMillis = getWallTimeMillis(); RawVoiceCallRatUsage[] previousUsages = mAtoms.rawVoiceCallRatUsage; mAtoms.voiceCallRatUsagePullTimestampMillis = getWallTimeMillis(); VoiceCallRatUsage[] previousUsages = mAtoms.voiceCallRatUsage; mVoiceCallRatTracker.clear(); mAtoms.rawVoiceCallRatUsage = new RawVoiceCallRatUsage[0]; mAtoms.voiceCallRatUsage = new VoiceCallRatUsage[0]; saveAtomsToFile(); return previousUsages; } else { Loading Loading @@ -370,8 +370,8 @@ public class PersistAtomsStorage { PersistAtoms.parseFrom( Files.readAllBytes(mContext.getFileStreamPath(FILENAME).toPath())); // check all the fields in case of situations such as OTA or crash during saving atoms.rawVoiceCallRatUsage = sanitizeAtoms(atoms.rawVoiceCallRatUsage, RawVoiceCallRatUsage.class); atoms.voiceCallRatUsage = sanitizeAtoms(atoms.voiceCallRatUsage, VoiceCallRatUsage.class); atoms.voiceCallSession = sanitizeAtoms(atoms.voiceCallSession, VoiceCallSession.class, MAX_NUM_CALL_SESSIONS); atoms.incomingSms = sanitizeAtoms(atoms.incomingSms, IncomingSms.class, MAX_NUM_SMS); Loading @@ -385,8 +385,8 @@ public class PersistAtomsStorage { atoms.cellularDataServiceSwitch = sanitizeAtoms(atoms.cellularDataServiceSwitch, CellularDataServiceSwitch.class, MAX_NUM_CELLULAR_DATA_SERVICE_SWITCHES); // out of caution, sanitize also the timestamps atoms.rawVoiceCallRatUsagePullTimestampMillis = sanitizeTimestamp(atoms.rawVoiceCallRatUsagePullTimestampMillis); atoms.voiceCallRatUsagePullTimestampMillis = sanitizeTimestamp(atoms.voiceCallRatUsagePullTimestampMillis); atoms.voiceCallSessionPullTimestampMillis = sanitizeTimestamp(atoms.voiceCallSessionPullTimestampMillis); atoms.incomingSmsPullTimestampMillis = Loading @@ -409,8 +409,8 @@ public class PersistAtomsStorage { /** * Posts message to save a copy of {@link PersistAtoms} to a file after a delay. * * The delay is introduced to avoid too frequent operations to disk, that would have negative * impact on the power consumption. * <p>The delay is introduced to avoid too frequent operations to disk, which would negatively * impact the power consumption. */ private void saveAtomsToFile() { if (mSaveDelay > 0) { Loading Loading @@ -549,7 +549,7 @@ public class PersistAtomsStorage { PersistAtoms atoms = new PersistAtoms(); // allow pulling only after some time so data are sufficiently aggregated long currentTime = getWallTimeMillis(); atoms.rawVoiceCallRatUsagePullTimestampMillis = currentTime; atoms.voiceCallRatUsagePullTimestampMillis = currentTime; atoms.voiceCallSessionPullTimestampMillis = currentTime; atoms.incomingSmsPullTimestampMillis = currentTime; atoms.outgoingSmsPullTimestampMillis = currentTime; Loading