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

Commit 041542a6 authored by Hakjun Choi's avatar Hakjun Choi
Browse files

Add Carrrier ID whenever CarrierRoamingSatelliteController atom event is reported

Due to a device can upload multiple snapshot of CarrierRoamingController atom per carrier ID, it is needed to be explicitly designated that this satellite service is operated by which carrier those event have happened.
It was not needed, because we used only single snapshot per device recently, but upgraded to be able to report multiple snapshots per carrier

Flag: EXEMPT bug fix
Bug: 400557374
Test: atest PersistAtomsStorageTest SatelliteStatsTest CarrierRoamingSatelliteControllerStatsTest
Test: manuall run e2e live netwok and verified DB https://b.corp.google.com/issues/403264455#comment4
Change-Id: Ibc67e9111b39b2c4517b144eefbefc03486ac78e
parent 44383b8c
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.internal.telephony.satellite.SatelliteConstants;
import com.android.telephony.Rlog;

import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

/** Tracks Satellite metrics for each phone */
@@ -2301,7 +2302,6 @@ public class SatelliteStats {
            return mConfigDataSource;
        }


        public int getCountOfEntitlementStatusQueryRequest() {
            return mCountOfEntitlementStatusQueryRequest;
        }
@@ -2462,6 +2462,37 @@ public class SatelliteStats {
            }
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null || getClass() != obj.getClass()) return false;
            CarrierRoamingSatelliteControllerStatsParams that =
                    (CarrierRoamingSatelliteControllerStatsParams) obj;
            return mConfigDataSource == that.getConfigDataSource()
                    && mCountOfEntitlementStatusQueryRequest
                    == that.getCountOfEntitlementStatusQueryRequest()
                    && mCountOfSatelliteConfigUpdateRequest
                    == that.getCountOfSatelliteConfigUpdateRequest()
                    && mCountOfSatelliteNotificationDisplayed
                    == that.getCountOfSatelliteNotificationDisplayed()
                    && sSatelliteSessionGapMinSec == that.getSatelliteSessionGapMinSec()
                    && sSatelliteSessionGapAvgSec == that.getSatelliteSessionGapAvgSec()
                    && sSatelliteSessionGapMaxSec == that.getSatelliteSessionGapMaxSec()
                    && sCarrierId == that.getCarrierId()
                    && sIsDeviceEntitled == that.isDeviceEntitled()
                    && sIsMultiSim == that.isMultiSim()
                    && mCountOfSatelliteSessions == that.getCountOfSatelliteSessions();
        }

        @Override
        public int hashCode() {
            return Objects.hash(mConfigDataSource, mCountOfEntitlementStatusQueryRequest,
                    mCountOfSatelliteConfigUpdateRequest, mCountOfSatelliteNotificationDisplayed,
                    sSatelliteSessionGapMinSec, sSatelliteSessionGapAvgSec,
                    sSatelliteSessionGapMaxSec, sCarrierId, sIsDeviceEntitled, sIsMultiSim,
                    mCountOfSatelliteSessions);
        }

        @Override
        public String toString() {
            return "CarrierRoamingSatelliteControllerStatsParams("
+11 −9
Original line number Diff line number Diff line
@@ -2140,7 +2140,8 @@ public class SatelliteController extends Handler {
                    int defaultSubId = mSubscriptionManagerService.getDefaultSubId();
                    boolean isEntitled = mSatelliteEntitlementStatusPerCarrier.get(defaultSubId,
                            false);
                    mCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(isEntitled);
                    mCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(defaultSubId,
                            isEntitled);
                }
                sendMessageDelayed(obtainMessage(
                                EVENT_WAIT_FOR_REPORT_ENTITLED_TO_MERTICS_HYSTERESIS_TIMED_OUT),
@@ -4336,7 +4337,8 @@ public class SatelliteController extends Handler {
            if (mSatelliteEntitlementStatusPerCarrier.get(subId, false) != entitlementEnabled) {
                logd("update the carrier satellite enabled to " + entitlementEnabled);
                mSatelliteEntitlementStatusPerCarrier.put(subId, entitlementEnabled);
                mCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(entitlementEnabled);
                mCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(subId,
                        entitlementEnabled);
                if (hasMessages(EVENT_WAIT_FOR_REPORT_ENTITLED_TO_MERTICS_HYSTERESIS_TIMED_OUT)) {
                    removeMessages(EVENT_WAIT_FOR_REPORT_ENTITLED_TO_MERTICS_HYSTERESIS_TIMED_OUT);
                    sendMessageDelayed(obtainMessage(
@@ -5345,7 +5347,7 @@ public class SatelliteController extends Handler {
                if (!entitlementPlmnList.isEmpty()) {
                    mMergedPlmnListPerCarrier.put(subId, entitlementPlmnList);
                    plogd("mMergedPlmnListPerCarrier is updated by Entitlement");
                    mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(
                    mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(subId,
                            SatelliteConstants.CONFIG_DATA_SOURCE_ENTITLEMENT);
                    return;
                }
@@ -5360,7 +5362,7 @@ public class SatelliteController extends Handler {
                    plogd("mMergedPlmnListPerCarrier is updated by ConfigUpdater : "
                            + String.join(",", plmnList));
                    mMergedPlmnListPerCarrier.put(subId, plmnList);
                    mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(
                    mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(subId,
                            SatelliteConstants.CONFIG_DATA_SOURCE_CONFIG_UPDATER);
                    return;
                }
@@ -5373,7 +5375,7 @@ public class SatelliteController extends Handler {
                                .stream().toList();
                plogd("mMergedPlmnListPerCarrier is updated by carrier config: "
                        + String.join(",", carrierPlmnList));
                mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(
                mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(subId,
                        SatelliteConstants.CONFIG_DATA_SOURCE_CARRIER_CONFIG);
            } else {
                carrierPlmnList = new ArrayList<>();
@@ -5869,7 +5871,7 @@ public class SatelliteController extends Handler {
                }
                boolean result = entitlementStatus.equals("1");
                mSatelliteEntitlementStatusPerCarrier.put(subId, result);
                mCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(result);
                mCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(subId, result);
                if (hasMessages(EVENT_WAIT_FOR_REPORT_ENTITLED_TO_MERTICS_HYSTERESIS_TIMED_OUT)) {
                    removeMessages(EVENT_WAIT_FOR_REPORT_ENTITLED_TO_MERTICS_HYSTERESIS_TIMED_OUT);
                    sendMessageDelayed(obtainMessage(
@@ -6229,14 +6231,14 @@ public class SatelliteController extends Handler {
                sessionStats.onSessionStart(phone.getCarrierId(), phone,
                        supported_satellite_services, dataPolicy);
                mCarrierRoamingSatelliteSessionStatsMap.put(subId, sessionStats);
                mCarrierRoamingSatelliteControllerStats.onSessionStart();
                mCarrierRoamingSatelliteControllerStats.onSessionStart(subId);
            } else if (lastNotifiedNtnMode && !currNtnMode) {
                // Log satellite session end
                CarrierRoamingSatelliteSessionStats sessionStats =
                        mCarrierRoamingSatelliteSessionStatsMap.get(subId);
                sessionStats.onSessionEnd();
                mCarrierRoamingSatelliteSessionStatsMap.remove(subId);
                mCarrierRoamingSatelliteControllerStats.onSessionEnd();
                mCarrierRoamingSatelliteControllerStats.onSessionEnd(subId);
            }
        }
    }
@@ -6909,7 +6911,7 @@ public class SatelliteController extends Handler {
                Context.RECEIVER_EXPORTED);

        mIsNotificationShowing = true;
        mCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteNotificationDisplayed();
        mCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteNotificationDisplayed(subId);
        mCarrierRoamingSatelliteControllerStats.reportCarrierId(getSatelliteCarrierId());
        mSessionMetricsStats.addCountOfSatelliteNotificationDisplayed();
    }
+58 −22
Original line number Diff line number Diff line
@@ -17,26 +17,35 @@
package com.android.internal.telephony.satellite.metrics;

import android.annotation.NonNull;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.metrics.SatelliteStats;
import com.android.internal.telephony.satellite.SatelliteConstants;
import com.android.internal.telephony.subscription.SubscriptionManagerService;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CarrierRoamingSatelliteControllerStats {
    private static final String TAG = CarrierRoamingSatelliteControllerStats.class.getSimpleName();
    private static CarrierRoamingSatelliteControllerStats sInstance = null;
    private static final int ADD_COUNT = 1;
    private SatelliteStats mSatelliteStats;
    private List<Long> mSessionStartTimeList;
    private List<Long> mSessionEndTimeList;
    /** Map key subId, value: list of session start time in milliseconds */
    private Map<Integer, List<Long>> mSessionStartTimeMap = new HashMap<>();
    /** Map key subId, list of session end time in milliseconds */
    private Map<Integer, List<Long>> mSessionEndTimeMap = new HashMap<>();

    private CarrierRoamingSatelliteControllerStats() {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    public CarrierRoamingSatelliteControllerStats() {
        mSatelliteStats = SatelliteStats.getInstance();
        resetSessionGapLists();
    }
@@ -57,19 +66,22 @@ public class CarrierRoamingSatelliteControllerStats {
    }

    /** Report config data source */
    public void reportConfigDataSource(@SatelliteConstants.ConfigDataSource int configDataSource) {
    public void reportConfigDataSource(int subId,
            @SatelliteConstants.ConfigDataSource int configDataSource) {
        mSatelliteStats.onCarrierRoamingSatelliteControllerStatsMetrics(
                new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
                        .setConfigDataSource(configDataSource)
                        .setCarrierId(getCarrierIdFromSubscription(subId))
                        .setIsMultiSim(isMultiSim())
                        .build());
    }

    /** Report count of entitlement status query request */
    public void reportCountOfEntitlementStatusQueryRequest() {
    public void reportCountOfEntitlementStatusQueryRequest(int subId) {
        mSatelliteStats.onCarrierRoamingSatelliteControllerStatsMetrics(
                new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
                        .setCountOfEntitlementStatusQueryRequest(ADD_COUNT)
                        .setCarrierId(getCarrierIdFromSubscription(subId))
                        .setIsMultiSim(isMultiSim())
                        .build());
    }
@@ -84,10 +96,11 @@ public class CarrierRoamingSatelliteControllerStats {
    }

    /** Report count of satellite notification displayed */
    public void reportCountOfSatelliteNotificationDisplayed() {
    public void reportCountOfSatelliteNotificationDisplayed(int subId) {
        mSatelliteStats.onCarrierRoamingSatelliteControllerStatsMetrics(
                new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
                        .setCountOfSatelliteNotificationDisplayed(ADD_COUNT)
                        .setCarrierId(getCarrierIdFromSubscription(subId))
                        .setIsMultiSim(isMultiSim())
                        .build());
    }
@@ -102,29 +115,38 @@ public class CarrierRoamingSatelliteControllerStats {
    }

    /** Capture whether the device is satellite entitled or not */
    public void reportIsDeviceEntitled(boolean isDeviceEntitled) {
    public void reportIsDeviceEntitled(int subId, boolean isDeviceEntitled) {
        mSatelliteStats.onCarrierRoamingSatelliteControllerStatsMetrics(
                new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
                        .setIsDeviceEntitled(isDeviceEntitled)
                        .setCarrierId(getCarrierIdFromSubscription(subId))
                        .setIsMultiSim(isMultiSim())
                        .build());
    }

    /** Log carrier roaming satellite session start */
    public void onSessionStart() {
        mSessionStartTimeList.add(getCurrentTime());
    public void onSessionStart(int subId) {
        List<Long> sessionStartTimeListForSubscription = mSessionStartTimeMap.getOrDefault(subId,
                new ArrayList<>());
        sessionStartTimeListForSubscription.add(getCurrentTime());
        mSessionStartTimeMap.put(subId, sessionStartTimeListForSubscription);

        mSatelliteStats.onCarrierRoamingSatelliteControllerStatsMetrics(
                new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
                        .setCarrierId(getCarrierIdFromSubscription(subId))
                        .increaseCountOfSatelliteSessions()
                        .build());
    }

    /** Log carrier roaming satellite session end */
    public void onSessionEnd() {
        mSessionEndTimeList.add(getCurrentTime());

        int numberOfSatelliteSessions = getNumberOfSatelliteSessions();
        List<Integer> sessionGapList = getSatelliteSessionGapList(numberOfSatelliteSessions);
    public void onSessionEnd(int subId) {
        List<Long> sessionEndTimeListForSubscription = mSessionEndTimeMap.getOrDefault(subId,
                new ArrayList<>());
        sessionEndTimeListForSubscription.add(getCurrentTime());
        mSessionEndTimeMap.put(subId, sessionEndTimeListForSubscription);

        int numberOfSatelliteSessions = getNumberOfSatelliteSessions(subId);
        List<Integer> sessionGapList = getSatelliteSessionGapList(subId, numberOfSatelliteSessions);
        int satelliteSessionGapMinSec = 0;
        int satelliteSessionGapMaxSec = 0;
        if (!sessionGapList.isEmpty()) {
@@ -137,29 +159,34 @@ public class CarrierRoamingSatelliteControllerStats {
                        .setSatelliteSessionGapMinSec(satelliteSessionGapMinSec)
                        .setSatelliteSessionGapAvgSec(getAvg(sessionGapList))
                        .setSatelliteSessionGapMaxSec(satelliteSessionGapMaxSec)
                        .setCarrierId(getCarrierIdFromSubscription(subId))
                        .setIsMultiSim(isMultiSim())
                        .build());
    }

    /** Atom is pulled once per day. Reset session gap lists after the atom is pulled. */
    public void resetSessionGapLists() {
        mSessionStartTimeList = new ArrayList<>();
        mSessionEndTimeList = new ArrayList<>();
        mSessionStartTimeMap = new HashMap<>();
        mSessionEndTimeMap = new HashMap<>();
    }

    private int getNumberOfSatelliteSessions() {
        return Math.min(mSessionStartTimeList.size(), mSessionEndTimeList.size());
    private int getNumberOfSatelliteSessions(int subId) {
        return Math.min(mSessionStartTimeMap.getOrDefault(subId, new ArrayList<>()).size(),
                mSessionEndTimeMap.getOrDefault(subId, new ArrayList<>()).size());
    }

    private List<Integer> getSatelliteSessionGapList(int numberOfSatelliteSessions) {
    private List<Integer> getSatelliteSessionGapList(int subId, int numberOfSatelliteSessions) {
        if (numberOfSatelliteSessions == 0) {
            return new ArrayList<>();
        }

        List<Long> sessionStartTimeList = mSessionStartTimeMap.getOrDefault(subId,
                new ArrayList<>());
        List<Long> sessionEndTimeList = mSessionEndTimeMap.getOrDefault(subId, new ArrayList<>());
        List<Integer> sessionGapList = new ArrayList<>();
        for (int i = 1; i < numberOfSatelliteSessions; i++) {
            long prevSessionEndTime = mSessionEndTimeList.get(i - 1);
            long currentSessionStartTime = mSessionStartTimeList.get(i);
            long prevSessionEndTime = sessionEndTimeList.get(i - 1);
            long currentSessionStartTime = sessionStartTimeList.get(i);
            if (currentSessionStartTime > prevSessionEndTime && prevSessionEndTime > 0) {
                sessionGapList.add((int) (
                        (currentSessionStartTime - prevSessionEndTime) / 1000));
@@ -181,7 +208,8 @@ public class CarrierRoamingSatelliteControllerStats {
        return total / list.size();
    }

    private long getCurrentTime() {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected long getCurrentTime() {
        return System.currentTimeMillis();
    }

@@ -190,6 +218,14 @@ public class CarrierRoamingSatelliteControllerStats {
        return SubscriptionManagerService.getInstance().getActiveSubIdList(true).length > 1;
    }

    /** Returns the carrier ID of the given subscription id. */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected int getCarrierIdFromSubscription(int subId) {
        int phoneId = SubscriptionManager.getPhoneId(subId);
        Phone phone = PhoneFactory.getPhone(phoneId);
        return phone != null ? phone.getCarrierId() : TelephonyManager.UNKNOWN_CARRIER_ID;
    }

    private static void logd(@NonNull String log) {
        Log.d(TAG, log);
    }
+1 −1
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ public class EntitlementMetricsStats {
        logd("reportEntitlementMetrics: " + entitlementParams);

        CarrierRoamingSatelliteControllerStats.getOrCreateInstance()
                .reportCountOfEntitlementStatusQueryRequest();
                .reportCountOfEntitlementStatusQueryRequest(mSubId);
    }

    /** Returns the carrier ID of the given subscription id. */
+595 −0

File added.

Preview size limit exceeded, changes collapsed.