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

Commit 34fae707 authored by Aishwarya Mallampati's avatar Aishwarya Mallampati Committed by Android (Google) Code Review
Browse files

Merge "Framework side implementation of carrier roaming satellite metrics." into main

parents a431e37c ab4b18ce
Loading
Loading
Loading
Loading
+69 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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:
@@ -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;
}
+19 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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 =
@@ -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();
    }

    /**
@@ -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;
        }

@@ -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;
                    }
                }
@@ -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;
                }
            }
@@ -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);
        }
    }

@@ -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) {
@@ -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;
        }
    }
+129 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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);
@@ -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");
@@ -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;
@@ -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,
@@ -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 {
+191 −0

File changed.

Preview size limit exceeded, changes collapsed.

+751 −0

File changed.

Preview size limit exceeded, changes collapsed.

Loading