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
diff --git a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
index 59ceb6d..a99613a 100644
--- a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
@@ -40,6 +40,7 @@
 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 @@
             return mConfigDataSource;
         }
 
-
         public int getCountOfEntitlementStatusQueryRequest() {
             return mCountOfEntitlementStatusQueryRequest;
         }
@@ -2463,6 +2463,37 @@
         }
 
         @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("
                     + "configDataSource=" + mConfigDataSource
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 11d2b76..40eb40c 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -2140,7 +2140,8 @@
                     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 @@
             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 @@
                 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 @@
                     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 @@
                                 .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 @@
                 }
                 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 @@
                 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 @@
                 Context.RECEIVER_EXPORTED);
 
         mIsNotificationShowing = true;
-        mCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteNotificationDisplayed();
+        mCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteNotificationDisplayed(subId);
         mCarrierRoamingSatelliteControllerStats.reportCarrierId(getSatelliteCarrierId());
         mSessionMetricsStats.addCountOfSatelliteNotificationDisplayed();
     }
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteControllerStats.java b/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteControllerStats.java
index 8d78045..642f398 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteControllerStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteControllerStats.java
@@ -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 @@
     }
 
     /** 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 @@
     }
 
     /** 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 @@
     }
 
     /** 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());
+    public void onSessionEnd(int subId) {
+        List<Long> sessionEndTimeListForSubscription = mSessionEndTimeMap.getOrDefault(subId,
+                new ArrayList<>());
+        sessionEndTimeListForSubscription.add(getCurrentTime());
+        mSessionEndTimeMap.put(subId, sessionEndTimeListForSubscription);
 
-        int numberOfSatelliteSessions = getNumberOfSatelliteSessions();
-        List<Integer> sessionGapList = getSatelliteSessionGapList(numberOfSatelliteSessions);
+        int numberOfSatelliteSessions = getNumberOfSatelliteSessions(subId);
+        List<Integer> sessionGapList = getSatelliteSessionGapList(subId, numberOfSatelliteSessions);
         int satelliteSessionGapMinSec = 0;
         int satelliteSessionGapMaxSec = 0;
         if (!sessionGapList.isEmpty()) {
@@ -137,29 +159,34 @@
                         .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 @@
         return total / list.size();
     }
 
-    private long getCurrentTime() {
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+    protected long getCurrentTime() {
         return System.currentTimeMillis();
     }
 
@@ -190,6 +218,14 @@
         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);
     }
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/EntitlementMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/EntitlementMetricsStats.java
index 828642c..93185b2 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/EntitlementMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/EntitlementMetricsStats.java
@@ -99,7 +99,7 @@
         logd("reportEntitlementMetrics: " + entitlementParams);
 
         CarrierRoamingSatelliteControllerStats.getOrCreateInstance()
-                .reportCountOfEntitlementStatusQueryRequest();
+                .reportCountOfEntitlementStatusQueryRequest(mSubId);
     }
 
     /** Returns the carrier ID of the given subscription id. */
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/CarrierRoamingSatelliteControllerStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/CarrierRoamingSatelliteControllerStatsTest.java
new file mode 100644
index 0000000..9b76d3a
--- /dev/null
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/CarrierRoamingSatelliteControllerStatsTest.java
@@ -0,0 +1,595 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony.satellite;
+
+import static android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID;
+
+import static com.android.internal.telephony.satellite.SatelliteConstants.CONFIG_DATA_SOURCE_CONFIG_UPDATER;
+import static com.android.internal.telephony.satellite.SatelliteConstants.CONFIG_DATA_SOURCE_ENTITLEMENT;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.internal.telephony.TelephonyTest;
+import com.android.internal.telephony.metrics.SatelliteStats;
+import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteControllerStats;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
+import com.android.telephony.Rlog;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatchers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class CarrierRoamingSatelliteControllerStatsTest extends TelephonyTest {
+    private static final String TAG = "CarrierRoamingSatelliteControllerStatsTest";
+    private static final int TEST_SUB_ID_0 = 0;
+    private static final int TEST_SUB_ID_1 = 1;
+    private static final int TEST_CARRIER_ID_0 = 1000;
+    private static final int TEST_CARRIER_ID_1 = 1111;
+    private static final long SESSION_TIME = 100L;
+    private static final long SESSION_GAP_1 = 1000000L;
+    private static final long SESSION_GAP_2 = 2000000L;
+    private static final long SESSION_GAP_3 = 4000000L;
+
+    private TestCarrierRoamingSatelliteControllerStats mTestCarrierRoamingSatelliteControllerStats;
+    @Mock
+    private SatelliteStats mMockSatelliteStats;
+    @Mock
+    private SubscriptionManagerService mMockSubscriptionManagerService;
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp(getClass().getSimpleName());
+        MockitoAnnotations.initMocks(this);
+        logd(TAG + " Setup!");
+        BackupAndRestoreCarrierRoamContParam.backUpStaticParams();
+        replaceInstance(SatelliteStats.class, "sInstance", null, mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats =
+                new TestCarrierRoamingSatelliteControllerStats();
+        replaceInstance(SubscriptionManagerService.class, "sInstance", null,
+                mMockSubscriptionManagerService);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Rlog.d(TAG, "tearDown()");
+        BackupAndRestoreCarrierRoamContParam.restoreStaticParams();
+        super.tearDown();
+    }
+
+    @Test
+    public void testReportConfigDataSource() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setConfigDataSource(CONFIG_DATA_SOURCE_ENTITLEMENT);
+        expected.setCarrierId(TEST_CARRIER_ID_0);
+        expected.setIsMultiSim(false);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportConfigDataSource(TEST_SUB_ID_0,
+                CONFIG_DATA_SOURCE_ENTITLEMENT);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        doReturn(new int[]{TEST_SUB_ID_0, TEST_SUB_ID_1}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setConfigDataSource(CONFIG_DATA_SOURCE_CONFIG_UPDATER);
+        expected.setCarrierId(TEST_CARRIER_ID_1);
+        expected.setIsMultiSim(true);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportConfigDataSource(TEST_SUB_ID_1,
+                CONFIG_DATA_SOURCE_CONFIG_UPDATER);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    @Test
+    public void testReportCountOfEntitlementStatusQueryRequest() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCountOfEntitlementStatusQueryRequest(1);
+        expected.setCarrierId(TEST_CARRIER_ID_0);
+        expected.setIsMultiSim(false);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCountOfEntitlementStatusQueryRequest(
+                TEST_SUB_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        doReturn(new int[]{TEST_SUB_ID_0, TEST_SUB_ID_1}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCountOfEntitlementStatusQueryRequest(1);
+        expected.setCarrierId(TEST_CARRIER_ID_1);
+        expected.setIsMultiSim(true);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCountOfEntitlementStatusQueryRequest(
+                TEST_SUB_ID_1);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    @Test
+    public void testReportCountOfSatelliteConfigUpdateRequest() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCountOfSatelliteConfigUpdateRequest(1);
+        expected.setCarrierId(UNKNOWN_CARRIER_ID);
+        expected.setIsMultiSim(false);
+
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteConfigUpdateRequest();
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        doReturn(new int[]{TEST_SUB_ID_0, TEST_SUB_ID_1}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCountOfSatelliteConfigUpdateRequest(1);
+        expected.setCarrierId(UNKNOWN_CARRIER_ID);
+        expected.setIsMultiSim(true);
+
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteConfigUpdateRequest();
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    @Test
+    public void testReportCountOfSatelliteNotificationDisplayed() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCountOfSatelliteNotificationDisplayed(1);
+        expected.setCarrierId(TEST_CARRIER_ID_0);
+        expected.setIsMultiSim(false);
+
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteNotificationDisplayed(
+                TEST_SUB_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        doReturn(new int[]{TEST_SUB_ID_0, TEST_SUB_ID_1}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCountOfSatelliteNotificationDisplayed(1);
+        expected.setCarrierId(TEST_CARRIER_ID_1);
+        expected.setIsMultiSim(true);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCountOfSatelliteNotificationDisplayed(
+                TEST_SUB_ID_1);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    @Test
+    public void testReportCarrierId() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCarrierId(TEST_CARRIER_ID_0);
+        expected.setIsMultiSim(false);
+
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCarrierId(TEST_CARRIER_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        doReturn(new int[]{TEST_SUB_ID_0, TEST_SUB_ID_1}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCarrierId(TEST_CARRIER_ID_1);
+        expected.setIsMultiSim(true);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportCarrierId(TEST_CARRIER_ID_1);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    @Test
+    public void testReportIsDeviceEntitled() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setIsDeviceEntitled(true);
+        expected.setCarrierId(TEST_CARRIER_ID_0);
+        expected.setIsMultiSim(false);
+
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(TEST_SUB_ID_0, true);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        doReturn(new int[]{TEST_SUB_ID_0, TEST_SUB_ID_1}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setIsDeviceEntitled(false);
+        expected.setCarrierId(TEST_CARRIER_ID_1);
+        expected.setIsMultiSim(true);
+        clearInvocations(mMockSatelliteStats);
+        mTestCarrierRoamingSatelliteControllerStats.reportIsDeviceEntitled(TEST_SUB_ID_1, false);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    @Test
+    public void testSatelliteSessionGaps() {
+        final ExpectedCarrierRoamingSatelliteControllerStatsParam expected =
+                new ExpectedCarrierRoamingSatelliteControllerStatsParam();
+        doReturn(new int[]{TEST_SUB_ID_0}).when(
+                mMockSubscriptionManagerService).getActiveSubIdList(anyBoolean());
+        initializeStaticParams();
+        expected.initializeParams();
+        expected.setCarrierId(TEST_CARRIER_ID_0);
+        expected.setIsMultiSim(false);
+        clearInvocations(mMockSatelliteStats);
+        // first satellite session starts
+        mTestCarrierRoamingSatelliteControllerStats.setCurrentTime(0L);
+        // session counter is increased when session starts
+        expected.setCountOfSatelliteSessions(1);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionStart(TEST_SUB_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // first satellite session ends
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_TIME);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionEnd(TEST_SUB_ID_0);
+
+        // session gaps would be 0
+        expected.setSatelliteSessionGapMinSec(0);
+        expected.setSatelliteSessionGapAvgSec(0);
+        expected.setSatelliteSessionGapMaxSec(0);
+        // session counter is not reported when session ends
+        expected.setCountOfSatelliteSessions(0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // second session starts, gap between 1st and 2nd session is 1000sec
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_GAP_1);
+        expected.setCountOfSatelliteSessions(1);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionStart(TEST_SUB_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // second session end
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_TIME);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionEnd(TEST_SUB_ID_0);
+
+        // session gap min / avg / max would be 1000 each
+        expected.setSatelliteSessionGapMinSec(1000);
+        expected.setSatelliteSessionGapAvgSec(1000);
+        expected.setSatelliteSessionGapMaxSec(1000);
+        expected.setCountOfSatelliteSessions(0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // 3rd session starts, gap between 2nd and 3rd session is 2000
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_GAP_2);
+        expected.setCountOfSatelliteSessions(1);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionStart(TEST_SUB_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // 3rd session end
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_TIME);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionEnd(TEST_SUB_ID_0);
+
+        // session gap min would be 1000
+        expected.setSatelliteSessionGapMinSec(1000);
+        // session gap avg would be 1500
+        int avgGapSec = (int) ((SESSION_GAP_1 + SESSION_GAP_2) / (2 * 1000));
+        expected.setSatelliteSessionGapAvgSec(avgGapSec);
+        // session gap max would be 2000
+        expected.setSatelliteSessionGapMaxSec(2000);
+        expected.setCountOfSatelliteSessions(0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // 4th session starts, gap between 3rd and 4th session is 4000
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_GAP_3);
+        expected.setCountOfSatelliteSessions(1);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionStart(TEST_SUB_ID_0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+
+        clearInvocations(mMockSatelliteStats);
+        // 4th session end
+        mTestCarrierRoamingSatelliteControllerStats.increaseCurrentTime(SESSION_TIME);
+        mTestCarrierRoamingSatelliteControllerStats.onSessionEnd(TEST_SUB_ID_0);
+
+        // session gap min would be 1000
+        expected.setSatelliteSessionGapMinSec(1000);
+        // session gap avg would be 2333
+        avgGapSec = (int) ((SESSION_GAP_1 + SESSION_GAP_2 + SESSION_GAP_3) / (3 * 1000));
+        expected.setSatelliteSessionGapAvgSec(avgGapSec);
+        // session gap max would be 4000
+        expected.setSatelliteSessionGapMaxSec(4000);
+        expected.setCountOfSatelliteSessions(0);
+        verify(mMockSatelliteStats, times(1)).onCarrierRoamingSatelliteControllerStatsMetrics(
+                ArgumentMatchers.argThat(argument -> verifyAssets(expected, argument)));
+    }
+
+    private static class BackupAndRestoreCarrierRoamContParam {
+        private static int sSatelliteSessionGapMinSec;
+        private static int sSatelliteSessionGapAvgSec;
+        private static int sSatelliteSessionGapMaxSec;
+        private static int sCarrierId;
+        private static boolean sIsDeviceEntitled;
+        private static boolean sIsMultiSim;
+
+        public static void backUpStaticParams() {
+            SatelliteStats.CarrierRoamingSatelliteControllerStatsParams param =
+                    new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
+                            .build();
+            sSatelliteSessionGapMinSec = param.getSatelliteSessionGapMinSec();
+            sSatelliteSessionGapAvgSec = param.getSatelliteSessionGapAvgSec();
+            sSatelliteSessionGapMaxSec = param.getSatelliteSessionGapMaxSec();
+            sCarrierId = param.getCarrierId();
+            sIsDeviceEntitled = param.isDeviceEntitled();
+            sIsMultiSim = param.isMultiSim();
+        }
+
+        public static void restoreStaticParams() {
+            SatelliteStats.getInstance().onCarrierRoamingSatelliteControllerStatsMetrics(
+                    new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
+                            .setSatelliteSessionGapMinSec(sSatelliteSessionGapMinSec)
+                            .setSatelliteSessionGapAvgSec(sSatelliteSessionGapAvgSec)
+                            .setSatelliteSessionGapMaxSec(sSatelliteSessionGapMaxSec)
+                            .setCarrierId(sCarrierId)
+                            .setIsDeviceEntitled(sIsDeviceEntitled)
+                            .setIsMultiSim(sIsMultiSim)
+                            .build());
+        }
+    }
+
+    private void initializeStaticParams() {
+        SatelliteStats.getInstance().onCarrierRoamingSatelliteControllerStatsMetrics(
+                new SatelliteStats.CarrierRoamingSatelliteControllerStatsParams.Builder()
+                        .setSatelliteSessionGapMinSec(0)
+                        .setSatelliteSessionGapAvgSec(0)
+                        .setSatelliteSessionGapMaxSec(0)
+                        .setCarrierId(UNKNOWN_CARRIER_ID)
+                        .setIsDeviceEntitled(false)
+                        .setIsMultiSim(false)
+                        .build());
+    }
+
+    private boolean verifyAssets(ExpectedCarrierRoamingSatelliteControllerStatsParam expected,
+            SatelliteStats.CarrierRoamingSatelliteControllerStatsParams actual) {
+        assertEquals(expected.getConfigDataSource(), actual.getConfigDataSource());
+        assertEquals(expected.getCountOfEntitlementStatusQueryRequest(),
+                actual.getCountOfEntitlementStatusQueryRequest());
+        assertEquals(expected.getCountOfSatelliteConfigUpdateRequest(),
+                actual.getCountOfSatelliteConfigUpdateRequest());
+        assertEquals(expected.getCountOfSatelliteNotificationDisplayed(),
+                actual.getCountOfSatelliteNotificationDisplayed());
+        assertEquals(expected.getSatelliteSessionGapMinSec(),
+                actual.getSatelliteSessionGapMinSec());
+        assertEquals(expected.getSatelliteSessionGapAvgSec(),
+                actual.getSatelliteSessionGapAvgSec());
+        assertEquals(expected.getSatelliteSessionGapMaxSec(),
+                actual.getSatelliteSessionGapMaxSec());
+        assertEquals(expected.getCarrierId(), actual.getCarrierId());
+        assertEquals(expected.isDeviceEntitled(), actual.isDeviceEntitled());
+        assertEquals(expected.isMultiSim(), actual.isMultiSim());
+        assertEquals(expected.getCountOfSatelliteSessions(), actual.getCountOfSatelliteSessions());
+        return true;
+    }
+
+    private static class ExpectedCarrierRoamingSatelliteControllerStatsParam {
+        private int mConfigDataSource;
+        private int mCountOfEntitlementStatusQueryRequest;
+        private int mCountOfSatelliteConfigUpdateRequest;
+        private int mCountOfSatelliteNotificationDisplayed;
+        private int mSatelliteSessionGapMinSec;
+        private int mSatelliteSessionGapAvgSec;
+        private int mSatelliteSessionGapMaxSec;
+        private int mCarrierId;
+        private boolean mIsDeviceEntitled;
+        private boolean mIsMultiSim;
+        private int mCountOfSatelliteSessions;
+
+        public int getConfigDataSource() {
+            return mConfigDataSource;
+        }
+
+        public int getCountOfEntitlementStatusQueryRequest() {
+            return mCountOfEntitlementStatusQueryRequest;
+        }
+
+        public int getCountOfSatelliteConfigUpdateRequest() {
+            return mCountOfSatelliteConfigUpdateRequest;
+        }
+
+        public int getCountOfSatelliteNotificationDisplayed() {
+            return mCountOfSatelliteNotificationDisplayed;
+        }
+
+        public int getSatelliteSessionGapMinSec() {
+            return mSatelliteSessionGapMinSec;
+        }
+
+        public int getSatelliteSessionGapAvgSec() {
+            return mSatelliteSessionGapAvgSec;
+        }
+
+        public int getSatelliteSessionGapMaxSec() {
+            return mSatelliteSessionGapMaxSec;
+        }
+
+        public int getCarrierId() {
+            return mCarrierId;
+        }
+
+        public boolean isDeviceEntitled() {
+            return mIsDeviceEntitled;
+        }
+
+        public boolean isMultiSim() {
+            return mIsMultiSim;
+        }
+
+        public int getCountOfSatelliteSessions() {
+            return mCountOfSatelliteSessions;
+        }
+
+
+        public void setConfigDataSource(int configDataSource) {
+            mConfigDataSource = configDataSource;
+        }
+
+        public void setCountOfEntitlementStatusQueryRequest(
+                int countOfEntitlementStatusQueryRequest) {
+            mCountOfEntitlementStatusQueryRequest = countOfEntitlementStatusQueryRequest;
+        }
+
+        public void setCountOfSatelliteConfigUpdateRequest(
+                int countOfSatelliteConfigUpdateRequest) {
+            mCountOfSatelliteConfigUpdateRequest = countOfSatelliteConfigUpdateRequest;
+        }
+
+        public void setCountOfSatelliteNotificationDisplayed(
+                int countOfSatelliteNotificationDisplayed) {
+            mCountOfSatelliteNotificationDisplayed = countOfSatelliteNotificationDisplayed;
+        }
+
+        public void setSatelliteSessionGapMinSec(int satelliteSessionGapMinSec) {
+            mSatelliteSessionGapMinSec = satelliteSessionGapMinSec;
+        }
+
+        public void setSatelliteSessionGapAvgSec(int satelliteSessionGapAvgSec) {
+            mSatelliteSessionGapAvgSec = satelliteSessionGapAvgSec;
+        }
+
+        public void setSatelliteSessionGapMaxSec(int satelliteSessionGapMaxSec) {
+            mSatelliteSessionGapMaxSec = satelliteSessionGapMaxSec;
+        }
+
+        public void setCarrierId(int carrierId) {
+            mCarrierId = carrierId;
+        }
+
+        public void setIsDeviceEntitled(boolean isDeviceEntitled) {
+            mIsDeviceEntitled = isDeviceEntitled;
+        }
+
+        public void setIsMultiSim(boolean isMultiSim) {
+            mIsMultiSim = isMultiSim;
+        }
+
+        public void setCountOfSatelliteSessions(int countOfSatelliteSessions) {
+            mCountOfSatelliteSessions = countOfSatelliteSessions;
+        }
+
+        public void initializeParams() {
+            mConfigDataSource = SatelliteConstants.CONFIG_DATA_SOURCE_UNKNOWN;
+            mCountOfEntitlementStatusQueryRequest = 0;
+            mCountOfSatelliteConfigUpdateRequest = 0;
+            mCountOfSatelliteNotificationDisplayed = 0;
+            mSatelliteSessionGapMinSec = 0;
+            mSatelliteSessionGapAvgSec = 0;
+            mSatelliteSessionGapMaxSec = 0;
+            mCarrierId = UNKNOWN_CARRIER_ID;
+            mIsDeviceEntitled = false;
+            mIsMultiSim = false;
+            mCountOfSatelliteSessions = 0;
+        }
+    }
+
+    static class TestCarrierRoamingSatelliteControllerStats extends
+            CarrierRoamingSatelliteControllerStats {
+        private long mCurrentTime;
+        TestCarrierRoamingSatelliteControllerStats() {
+            super();
+            logd("constructing TestCarrierRoamingSatelliteControllerStats");
+        }
+
+        @Override
+        public int getCarrierIdFromSubscription(int subId) {
+            logd("getCarrierIdFromSubscription()");
+            if (subId == TEST_SUB_ID_0) {
+                return TEST_CARRIER_ID_0;
+            } else if (subId == TEST_SUB_ID_1) {
+                return TEST_CARRIER_ID_1;
+            } else {
+                return UNKNOWN_CARRIER_ID;
+            }
+        }
+
+        @Override
+        public long getCurrentTime() {
+            return mCurrentTime;
+        }
+
+        public void setCurrentTime(long currentTime) {
+            mCurrentTime = currentTime;
+        }
+
+        public void increaseCurrentTime(long incTime) {
+            mCurrentTime += incTime;
+        }
+    }
+}