Loading proto/src/persist_atoms.proto +69 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ option java_outer_classname = "PersistAtomsProto"; // Holds atoms to store on persist storage in case of power cycle or process crash. // NOTE: using int64 rather than google.protobuf.Timestamp for timestamps simplifies implementation. // Next id: 72 // Next id: 80 message PersistAtoms { /* Aggregated RAT usage during the call. */ repeated VoiceCallRatUsage voice_call_rat_usage = 1; Loading Loading @@ -237,6 +237,30 @@ message PersistAtoms { /* Timestamp of last data_network_validation pull. */ optional int64 data_network_validation_pull_timestamp_millis = 71; /* Snapshot of carrier roaming satellite session. */ repeated CarrierRoamingSatelliteSession carrier_roaming_satellite_session = 72; /* Timestamp of last carrier_roaming_satellite_session pull. */ optional int64 carrier_roaming_satellite_session_pull_timestamp_millis = 73; /* Snapshot of carrier roaming satellite controller stats. */ repeated CarrierRoamingSatelliteControllerStats carrier_roaming_satellite_controller_stats = 74; /* Timestamp of last carrier_roaming_satellite_controller_stats pull. */ optional int64 carrier_roaming_satellite_controller_stats_pull_timestamp_millis = 75; /* Snapshot of satellite entitlement. */ repeated SatelliteEntitlement satellite_entitlement = 76; /* Timestamp of last satellite_entitlement pull. */ optional int64 satellite_entitlement_pull_timestamp_millis = 77; /* Snapshot of satellite config updater. */ repeated SatelliteConfigUpdater satellite_config_updater = 78; /* Timestamp of last satellite_config_updater pull. */ optional int64 satellite_config_updater_pull_timestamp_millis = 79; } // The canonical versions of the following enums live in: Loading Loading @@ -739,3 +763,47 @@ message DataNetworkValidation { optional bool handover_attempted = 6; optional int32 network_validation_count = 7; } message CarrierRoamingSatelliteSession { optional int32 carrier_id = 1; optional bool is_ntn_roaming_in_home_country = 2; optional int32 total_satellite_mode_time_sec = 3; optional int32 number_of_satellite_connections = 4; optional int32 avg_duration_of_satellite_connection_sec = 5; optional int32 satellite_connection_gap_min_sec = 6; optional int32 satellite_connection_gap_avg_sec = 7; optional int32 satellite_connection_gap_max_sec = 8; optional int32 rsrp_avg = 9; optional int32 rsrp_median = 10; optional int32 rssnr_avg = 11; optional int32 rssnr_median = 12; optional int32 count_of_incoming_sms = 13; optional int32 count_of_outgoing_sms = 14; optional int32 count_of_incoming_mms = 15; optional int32 count_of_outgoing_mms = 16; } message CarrierRoamingSatelliteControllerStats { optional int32 config_data_source = 1; optional int32 count_of_entitlement_status_query_request = 2; optional int32 count_of_satellite_config_update_request = 3; optional int32 count_of_satellite_notification_displayed = 4; optional int32 satellite_session_gap_min_sec = 5; optional int32 satellite_session_gap_avg_sec = 6; optional int32 satellite_session_gap_max_sec = 7; } message SatelliteEntitlement { optional int32 carrier_id = 1; optional int32 result = 2; optional int32 entitlement_status = 3; optional bool is_retry = 4; optional int32 count = 5; } message SatelliteConfigUpdater { optional int32 config_version = 1; optional int32 oem_config_result = 2; optional int32 carrier_config_result = 3; optional int32 count = 4; } src/java/com/android/internal/telephony/configupdate/TelephonyConfigUpdateInstallReceiver.java +19 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.satellite.SatelliteConfig; import com.android.internal.telephony.satellite.SatelliteConfigParser; import com.android.internal.telephony.satellite.SatelliteConstants; import com.android.internal.telephony.satellite.metrics.ConfigUpdaterMetricsStats; import com.android.internal.telephony.util.TelephonyUtils; import com.android.server.updates.ConfigUpdateInstallReceiver; Loading Loading @@ -57,6 +59,7 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec private final Object mConfigParserLock = new Object(); @GuardedBy("mConfigParserLock") private ConfigParser mConfigParser; @NonNull private final ConfigUpdaterMetricsStats mConfigUpdaterMetricsStats; public static TelephonyConfigUpdateInstallReceiver sReceiverAdaptorInstance = Loading @@ -72,6 +75,7 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec public TelephonyConfigUpdateInstallReceiver() { super(UPDATE_DIR, NEW_CONFIG_CONTENT_PATH, UPDATE_METADATA_PATH, VERSION); mConfigUpdaterMetricsStats = ConfigUpdaterMetricsStats.getOrCreateInstance(); } /** Loading @@ -97,6 +101,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec SatelliteConfig satelliteConfig = (SatelliteConfig) parser.getConfig(); if (satelliteConfig == null) { Log.e(TAG, "satelliteConfig is null"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_NO_SATELLITE_DATA); return false; } Loading @@ -109,12 +115,16 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec for (String plmn : plmns) { if (!TelephonyUtils.isValidPlmn(plmn)) { Log.e(TAG, "found invalid plmn : " + plmn); mConfigUpdaterMetricsStats.reportCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_PLMN); return false; } Set<Integer> serviceSet = plmnsServices.get(plmn); for (int service : serviceSet) { if (!TelephonyUtils.isValidService(service)) { Log.e(TAG, "found invalid service : " + service); mConfigUpdaterMetricsStats.reportCarrierConfigError(SatelliteConstants .CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_SUPPORTED_SERVICES); return false; } } Loading Loading @@ -149,8 +159,11 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec int previousVersion = getInstance().mConfigParser.mVersion; Log.d(TAG, "previous version is " + previousVersion + " | updated version is " + updatedVersion); mConfigUpdaterMetricsStats.setConfigVersion(updatedVersion); if (updatedVersion <= previousVersion) { Log.e(TAG, "updatedVersion is smaller than previousVersion"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_INVALID_VERSION); return; } } Loading @@ -167,6 +180,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec if (!copySourceFileToTargetFile(NEW_CONFIG_CONTENT_PATH, VALID_CONFIG_CONTENT_PATH)) { Log.e(TAG, "fail to copy to the valid satellite carrier config data"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_IO_ERROR); } } Loading Loading @@ -231,6 +246,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec public ConfigParser getNewConfigParser(String domain, @Nullable byte[] data) { if (data == null) { Log.d(TAG, "content data is null"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_NO_DATA); return null; } switch (domain) { Loading @@ -238,6 +255,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec return new SatelliteConfigParser(data); default: Log.e(TAG, "DOMAIN should be specified"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_INVALID_DOMAIN); return null; } } Loading src/java/com/android/internal/telephony/metrics/MetricsCollector.java +129 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.internal.telephony.metrics; import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ID_TABLE_VERSION; import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS; import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ROAMING_SATELLITE_SESSION; import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_DATA_SERVICE_SWITCH; import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE; import static com.android.internal.telephony.TelephonyStatsLog.DATA_CALL_SESSION; Loading @@ -37,7 +39,9 @@ import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS; import static com.android.internal.telephony.TelephonyStatsLog.PRESENCE_NOTIFY_EVENT; import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS; import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONFIG_UPDATER; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONTROLLER; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_ENTITLEMENT; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_INCOMING_DATAGRAM; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_OUTGOING_DATAGRAM; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_PROVISION; Loading Loading @@ -70,6 +74,8 @@ import com.android.internal.telephony.TelephonyStatsLog; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.imsphone.ImsPhone; import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteControllerStats; import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteSession; import com.android.internal.telephony.nano.PersistAtomsProto.CellularDataServiceSwitch; import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceState; import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; Loading @@ -89,7 +95,9 @@ import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; import com.android.internal.telephony.nano.PersistAtomsProto.PresenceNotifyEvent; import com.android.internal.telephony.nano.PersistAtomsProto.RcsAcsProvisioningStats; import com.android.internal.telephony.nano.PersistAtomsProto.RcsClientProvisioningStats; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteIncomingDatagram; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteOutgoingDatagram; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteProvision; Loading Loading @@ -178,14 +186,15 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { public MetricsCollector(Context context, @NonNull FeatureFlags featureFlags) { this(context, new PersistAtomsStorage(context), new DeviceStateHelper(context), new VonrHelper(featureFlags), featureFlags); new DeviceStateHelper(context), new VonrHelper(featureFlags), new DefaultNetworkMonitor(context, featureFlags), featureFlags); } /** Allows dependency injection. Used during unit tests. */ @VisibleForTesting public MetricsCollector( Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper, VonrHelper vonrHelper, @NonNull FeatureFlags featureFlags) { public MetricsCollector(Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper, VonrHelper vonrHelper, DefaultNetworkMonitor defaultNetworkMonitor, @NonNull FeatureFlags featureFlags) { mStorage = storage; mDeviceStateHelper = deviceStateHelper; mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER); Loading Loading @@ -229,6 +238,10 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { registerAtom(SATELLITE_PROVISION); registerAtom(SATELLITE_SOS_MESSAGE_RECOMMENDER); registerAtom(DATA_NETWORK_VALIDATION); registerAtom(CARRIER_ROAMING_SATELLITE_SESSION); registerAtom(CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS); registerAtom(SATELLITE_ENTITLEMENT); registerAtom(SATELLITE_CONFIG_UPDATER); Rlog.d(TAG, "registered"); } else { Rlog.e(TAG, "could not get StatsManager, atoms not registered"); Loading Loading @@ -325,6 +338,14 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { return pullSatelliteSosMessageRecommender(data); case DATA_NETWORK_VALIDATION: return pullDataNetworkValidation(data); case CARRIER_ROAMING_SATELLITE_SESSION: return pullCarrierRoamingSatelliteSession(data); case CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS: return pullCarrierRoamingSatelliteControllerStats(data); case SATELLITE_ENTITLEMENT: return pullSatelliteEntitlement(data); case SATELLITE_CONFIG_UPDATER: return pullSatelliteConfigUpdater(data); default: Rlog.e(TAG, String.format("unexpected atom ID %d", atomTag)); return StatsManager.PULL_SKIP; Loading Loading @@ -958,6 +979,59 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { } } private int pullCarrierRoamingSatelliteSession(List<StatsEvent> data) { CarrierRoamingSatelliteSession[] carrierRoamingSatelliteSessionAtoms = mStorage.getCarrierRoamingSatelliteSessionStats(MIN_COOLDOWN_MILLIS); if (carrierRoamingSatelliteSessionAtoms != null) { Arrays.stream(carrierRoamingSatelliteSessionAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "CARRIER_ROAMING_SATELLITE_SESSION pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } private int pullCarrierRoamingSatelliteControllerStats(List<StatsEvent> data) { CarrierRoamingSatelliteControllerStats[] carrierRoamingSatelliteControllerStatsAtoms = mStorage.getCarrierRoamingSatelliteControllerStats(MIN_COOLDOWN_MILLIS); if (carrierRoamingSatelliteControllerStatsAtoms != null) { Arrays.stream(carrierRoamingSatelliteControllerStatsAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS " + "pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } private int pullSatelliteEntitlement(List<StatsEvent> data) { SatelliteEntitlement[] satelliteEntitlementAtoms = mStorage.getSatelliteEntitlementStats(MIN_COOLDOWN_MILLIS); if (satelliteEntitlementAtoms != null) { Arrays.stream(satelliteEntitlementAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "SATELLITE_ENTITLEMENT pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } private int pullSatelliteConfigUpdater(List<StatsEvent> data) { SatelliteConfigUpdater[] satelliteConfigUpdaterAtoms = mStorage.getSatelliteConfigUpdaterStats(MIN_COOLDOWN_MILLIS); if (satelliteConfigUpdaterAtoms != null) { Arrays.stream(satelliteConfigUpdaterAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "SATELLITE_CONFIG_UPDATER pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } /** Registers a pulled atom ID {@code atomId}. */ private void registerAtom(int atomId) { mStatsManager.setPullAtomCallback(atomId, /* metadata= */ null, Loading Loading @@ -1448,6 +1522,57 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { stats.networkValidationCount); } private static StatsEvent buildStatsEvent(CarrierRoamingSatelliteSession stats) { return TelephonyStatsLog.buildStatsEvent( CARRIER_ROAMING_SATELLITE_SESSION, stats.carrierId, stats.isNtnRoamingInHomeCountry, stats.totalSatelliteModeTimeSec, stats.numberOfSatelliteConnections, stats.avgDurationOfSatelliteConnectionSec, stats.satelliteConnectionGapMinSec, stats.satelliteConnectionGapAvgSec, stats.satelliteConnectionGapMaxSec, stats.rsrpAvg, stats.rsrpMedian, stats.rssnrAvg, stats.rssnrMedian, stats.countOfIncomingSms, stats.countOfOutgoingSms, stats.countOfIncomingMms, stats.countOfOutgoingMms); } private static StatsEvent buildStatsEvent(CarrierRoamingSatelliteControllerStats stats) { return TelephonyStatsLog.buildStatsEvent( CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS, stats.configDataSource, stats.countOfEntitlementStatusQueryRequest, stats.countOfSatelliteConfigUpdateRequest, stats.countOfSatelliteNotificationDisplayed, stats.satelliteSessionGapMinSec, stats.satelliteSessionGapAvgSec, stats.satelliteSessionGapMaxSec); } private static StatsEvent buildStatsEvent(SatelliteEntitlement stats) { return TelephonyStatsLog.buildStatsEvent( SATELLITE_ENTITLEMENT, stats.carrierId, stats.result, stats.entitlementStatus, stats.isRetry, stats.count); } private static StatsEvent buildStatsEvent(SatelliteConfigUpdater stats) { return TelephonyStatsLog.buildStatsEvent(SATELLITE_CONFIG_UPDATER, stats.configVersion, stats.oemConfigResult, stats.carrierConfigResult, stats.count); } /** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */ static Phone[] getPhonesIfAny() { try { Loading Loading
proto/src/persist_atoms.proto +69 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ option java_outer_classname = "PersistAtomsProto"; // Holds atoms to store on persist storage in case of power cycle or process crash. // NOTE: using int64 rather than google.protobuf.Timestamp for timestamps simplifies implementation. // Next id: 72 // Next id: 80 message PersistAtoms { /* Aggregated RAT usage during the call. */ repeated VoiceCallRatUsage voice_call_rat_usage = 1; Loading Loading @@ -237,6 +237,30 @@ message PersistAtoms { /* Timestamp of last data_network_validation pull. */ optional int64 data_network_validation_pull_timestamp_millis = 71; /* Snapshot of carrier roaming satellite session. */ repeated CarrierRoamingSatelliteSession carrier_roaming_satellite_session = 72; /* Timestamp of last carrier_roaming_satellite_session pull. */ optional int64 carrier_roaming_satellite_session_pull_timestamp_millis = 73; /* Snapshot of carrier roaming satellite controller stats. */ repeated CarrierRoamingSatelliteControllerStats carrier_roaming_satellite_controller_stats = 74; /* Timestamp of last carrier_roaming_satellite_controller_stats pull. */ optional int64 carrier_roaming_satellite_controller_stats_pull_timestamp_millis = 75; /* Snapshot of satellite entitlement. */ repeated SatelliteEntitlement satellite_entitlement = 76; /* Timestamp of last satellite_entitlement pull. */ optional int64 satellite_entitlement_pull_timestamp_millis = 77; /* Snapshot of satellite config updater. */ repeated SatelliteConfigUpdater satellite_config_updater = 78; /* Timestamp of last satellite_config_updater pull. */ optional int64 satellite_config_updater_pull_timestamp_millis = 79; } // The canonical versions of the following enums live in: Loading Loading @@ -739,3 +763,47 @@ message DataNetworkValidation { optional bool handover_attempted = 6; optional int32 network_validation_count = 7; } message CarrierRoamingSatelliteSession { optional int32 carrier_id = 1; optional bool is_ntn_roaming_in_home_country = 2; optional int32 total_satellite_mode_time_sec = 3; optional int32 number_of_satellite_connections = 4; optional int32 avg_duration_of_satellite_connection_sec = 5; optional int32 satellite_connection_gap_min_sec = 6; optional int32 satellite_connection_gap_avg_sec = 7; optional int32 satellite_connection_gap_max_sec = 8; optional int32 rsrp_avg = 9; optional int32 rsrp_median = 10; optional int32 rssnr_avg = 11; optional int32 rssnr_median = 12; optional int32 count_of_incoming_sms = 13; optional int32 count_of_outgoing_sms = 14; optional int32 count_of_incoming_mms = 15; optional int32 count_of_outgoing_mms = 16; } message CarrierRoamingSatelliteControllerStats { optional int32 config_data_source = 1; optional int32 count_of_entitlement_status_query_request = 2; optional int32 count_of_satellite_config_update_request = 3; optional int32 count_of_satellite_notification_displayed = 4; optional int32 satellite_session_gap_min_sec = 5; optional int32 satellite_session_gap_avg_sec = 6; optional int32 satellite_session_gap_max_sec = 7; } message SatelliteEntitlement { optional int32 carrier_id = 1; optional int32 result = 2; optional int32 entitlement_status = 3; optional bool is_retry = 4; optional int32 count = 5; } message SatelliteConfigUpdater { optional int32 config_version = 1; optional int32 oem_config_result = 2; optional int32 carrier_config_result = 3; optional int32 count = 4; }
src/java/com/android/internal/telephony/configupdate/TelephonyConfigUpdateInstallReceiver.java +19 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.satellite.SatelliteConfig; import com.android.internal.telephony.satellite.SatelliteConfigParser; import com.android.internal.telephony.satellite.SatelliteConstants; import com.android.internal.telephony.satellite.metrics.ConfigUpdaterMetricsStats; import com.android.internal.telephony.util.TelephonyUtils; import com.android.server.updates.ConfigUpdateInstallReceiver; Loading Loading @@ -57,6 +59,7 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec private final Object mConfigParserLock = new Object(); @GuardedBy("mConfigParserLock") private ConfigParser mConfigParser; @NonNull private final ConfigUpdaterMetricsStats mConfigUpdaterMetricsStats; public static TelephonyConfigUpdateInstallReceiver sReceiverAdaptorInstance = Loading @@ -72,6 +75,7 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec public TelephonyConfigUpdateInstallReceiver() { super(UPDATE_DIR, NEW_CONFIG_CONTENT_PATH, UPDATE_METADATA_PATH, VERSION); mConfigUpdaterMetricsStats = ConfigUpdaterMetricsStats.getOrCreateInstance(); } /** Loading @@ -97,6 +101,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec SatelliteConfig satelliteConfig = (SatelliteConfig) parser.getConfig(); if (satelliteConfig == null) { Log.e(TAG, "satelliteConfig is null"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_NO_SATELLITE_DATA); return false; } Loading @@ -109,12 +115,16 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec for (String plmn : plmns) { if (!TelephonyUtils.isValidPlmn(plmn)) { Log.e(TAG, "found invalid plmn : " + plmn); mConfigUpdaterMetricsStats.reportCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_PLMN); return false; } Set<Integer> serviceSet = plmnsServices.get(plmn); for (int service : serviceSet) { if (!TelephonyUtils.isValidService(service)) { Log.e(TAG, "found invalid service : " + service); mConfigUpdaterMetricsStats.reportCarrierConfigError(SatelliteConstants .CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_SUPPORTED_SERVICES); return false; } } Loading Loading @@ -149,8 +159,11 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec int previousVersion = getInstance().mConfigParser.mVersion; Log.d(TAG, "previous version is " + previousVersion + " | updated version is " + updatedVersion); mConfigUpdaterMetricsStats.setConfigVersion(updatedVersion); if (updatedVersion <= previousVersion) { Log.e(TAG, "updatedVersion is smaller than previousVersion"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_INVALID_VERSION); return; } } Loading @@ -167,6 +180,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec if (!copySourceFileToTargetFile(NEW_CONFIG_CONTENT_PATH, VALID_CONFIG_CONTENT_PATH)) { Log.e(TAG, "fail to copy to the valid satellite carrier config data"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_IO_ERROR); } } Loading Loading @@ -231,6 +246,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec public ConfigParser getNewConfigParser(String domain, @Nullable byte[] data) { if (data == null) { Log.d(TAG, "content data is null"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_NO_DATA); return null; } switch (domain) { Loading @@ -238,6 +255,8 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec return new SatelliteConfigParser(data); default: Log.e(TAG, "DOMAIN should be specified"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_INVALID_DOMAIN); return null; } } Loading
src/java/com/android/internal/telephony/metrics/MetricsCollector.java +129 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.internal.telephony.metrics; import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ID_TABLE_VERSION; import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS; import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ROAMING_SATELLITE_SESSION; import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_DATA_SERVICE_SWITCH; import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE; import static com.android.internal.telephony.TelephonyStatsLog.DATA_CALL_SESSION; Loading @@ -37,7 +39,9 @@ import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS; import static com.android.internal.telephony.TelephonyStatsLog.PRESENCE_NOTIFY_EVENT; import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS; import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONFIG_UPDATER; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONTROLLER; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_ENTITLEMENT; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_INCOMING_DATAGRAM; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_OUTGOING_DATAGRAM; import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_PROVISION; Loading Loading @@ -70,6 +74,8 @@ import com.android.internal.telephony.TelephonyStatsLog; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.imsphone.ImsPhone; import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteControllerStats; import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteSession; import com.android.internal.telephony.nano.PersistAtomsProto.CellularDataServiceSwitch; import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceState; import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; Loading @@ -89,7 +95,9 @@ import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; import com.android.internal.telephony.nano.PersistAtomsProto.PresenceNotifyEvent; import com.android.internal.telephony.nano.PersistAtomsProto.RcsAcsProvisioningStats; import com.android.internal.telephony.nano.PersistAtomsProto.RcsClientProvisioningStats; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteIncomingDatagram; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteOutgoingDatagram; import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteProvision; Loading Loading @@ -178,14 +186,15 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { public MetricsCollector(Context context, @NonNull FeatureFlags featureFlags) { this(context, new PersistAtomsStorage(context), new DeviceStateHelper(context), new VonrHelper(featureFlags), featureFlags); new DeviceStateHelper(context), new VonrHelper(featureFlags), new DefaultNetworkMonitor(context, featureFlags), featureFlags); } /** Allows dependency injection. Used during unit tests. */ @VisibleForTesting public MetricsCollector( Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper, VonrHelper vonrHelper, @NonNull FeatureFlags featureFlags) { public MetricsCollector(Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper, VonrHelper vonrHelper, DefaultNetworkMonitor defaultNetworkMonitor, @NonNull FeatureFlags featureFlags) { mStorage = storage; mDeviceStateHelper = deviceStateHelper; mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER); Loading Loading @@ -229,6 +238,10 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { registerAtom(SATELLITE_PROVISION); registerAtom(SATELLITE_SOS_MESSAGE_RECOMMENDER); registerAtom(DATA_NETWORK_VALIDATION); registerAtom(CARRIER_ROAMING_SATELLITE_SESSION); registerAtom(CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS); registerAtom(SATELLITE_ENTITLEMENT); registerAtom(SATELLITE_CONFIG_UPDATER); Rlog.d(TAG, "registered"); } else { Rlog.e(TAG, "could not get StatsManager, atoms not registered"); Loading Loading @@ -325,6 +338,14 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { return pullSatelliteSosMessageRecommender(data); case DATA_NETWORK_VALIDATION: return pullDataNetworkValidation(data); case CARRIER_ROAMING_SATELLITE_SESSION: return pullCarrierRoamingSatelliteSession(data); case CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS: return pullCarrierRoamingSatelliteControllerStats(data); case SATELLITE_ENTITLEMENT: return pullSatelliteEntitlement(data); case SATELLITE_CONFIG_UPDATER: return pullSatelliteConfigUpdater(data); default: Rlog.e(TAG, String.format("unexpected atom ID %d", atomTag)); return StatsManager.PULL_SKIP; Loading Loading @@ -958,6 +979,59 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { } } private int pullCarrierRoamingSatelliteSession(List<StatsEvent> data) { CarrierRoamingSatelliteSession[] carrierRoamingSatelliteSessionAtoms = mStorage.getCarrierRoamingSatelliteSessionStats(MIN_COOLDOWN_MILLIS); if (carrierRoamingSatelliteSessionAtoms != null) { Arrays.stream(carrierRoamingSatelliteSessionAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "CARRIER_ROAMING_SATELLITE_SESSION pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } private int pullCarrierRoamingSatelliteControllerStats(List<StatsEvent> data) { CarrierRoamingSatelliteControllerStats[] carrierRoamingSatelliteControllerStatsAtoms = mStorage.getCarrierRoamingSatelliteControllerStats(MIN_COOLDOWN_MILLIS); if (carrierRoamingSatelliteControllerStatsAtoms != null) { Arrays.stream(carrierRoamingSatelliteControllerStatsAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS " + "pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } private int pullSatelliteEntitlement(List<StatsEvent> data) { SatelliteEntitlement[] satelliteEntitlementAtoms = mStorage.getSatelliteEntitlementStats(MIN_COOLDOWN_MILLIS); if (satelliteEntitlementAtoms != null) { Arrays.stream(satelliteEntitlementAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "SATELLITE_ENTITLEMENT pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } private int pullSatelliteConfigUpdater(List<StatsEvent> data) { SatelliteConfigUpdater[] satelliteConfigUpdaterAtoms = mStorage.getSatelliteConfigUpdaterStats(MIN_COOLDOWN_MILLIS); if (satelliteConfigUpdaterAtoms != null) { Arrays.stream(satelliteConfigUpdaterAtoms) .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); return StatsManager.PULL_SUCCESS; } else { Rlog.w(TAG, "SATELLITE_CONFIG_UPDATER pull too frequent, skipping"); return StatsManager.PULL_SKIP; } } /** Registers a pulled atom ID {@code atomId}. */ private void registerAtom(int atomId) { mStatsManager.setPullAtomCallback(atomId, /* metadata= */ null, Loading Loading @@ -1448,6 +1522,57 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { stats.networkValidationCount); } private static StatsEvent buildStatsEvent(CarrierRoamingSatelliteSession stats) { return TelephonyStatsLog.buildStatsEvent( CARRIER_ROAMING_SATELLITE_SESSION, stats.carrierId, stats.isNtnRoamingInHomeCountry, stats.totalSatelliteModeTimeSec, stats.numberOfSatelliteConnections, stats.avgDurationOfSatelliteConnectionSec, stats.satelliteConnectionGapMinSec, stats.satelliteConnectionGapAvgSec, stats.satelliteConnectionGapMaxSec, stats.rsrpAvg, stats.rsrpMedian, stats.rssnrAvg, stats.rssnrMedian, stats.countOfIncomingSms, stats.countOfOutgoingSms, stats.countOfIncomingMms, stats.countOfOutgoingMms); } private static StatsEvent buildStatsEvent(CarrierRoamingSatelliteControllerStats stats) { return TelephonyStatsLog.buildStatsEvent( CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS, stats.configDataSource, stats.countOfEntitlementStatusQueryRequest, stats.countOfSatelliteConfigUpdateRequest, stats.countOfSatelliteNotificationDisplayed, stats.satelliteSessionGapMinSec, stats.satelliteSessionGapAvgSec, stats.satelliteSessionGapMaxSec); } private static StatsEvent buildStatsEvent(SatelliteEntitlement stats) { return TelephonyStatsLog.buildStatsEvent( SATELLITE_ENTITLEMENT, stats.carrierId, stats.result, stats.entitlementStatus, stats.isRetry, stats.count); } private static StatsEvent buildStatsEvent(SatelliteConfigUpdater stats) { return TelephonyStatsLog.buildStatsEvent(SATELLITE_CONFIG_UPDATER, stats.configVersion, stats.oemConfigResult, stats.carrierConfigResult, stats.count); } /** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */ static Phone[] getPhonesIfAny() { try { Loading