Enhance satellite metrics

1. In addition to the carrier id, is_privision become a factor for dimension for satellite controller atom to distinguish metrics where provisined devices and not provisioned devices.
2. Added counter for notification shown / removal event for P2P SMS via satellite per day.
3. Added is_emergency field into satellite session atom, so that we can see if the session was established for emergency purpose.
4. Adjust start transfer time for outgoing datagram just before request to modem interface in real mode and before sending message delayed for demo mode.
5. In case provisioned satellite is not exist or skylo sim is not active, SatelliteServiceUtils.getPhone() returns the phone of currently active subscription, which reports wrong phone id and wrong carrier id information, therefore removed set default phone to satellite phone logic.
6. Set isSatelliteAllowedInCurrentLocation in SatellitesosMessageRecommender as dimension field.

Bug: 383033991
Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
Test: atest PersistAtomsStorageTest SatelliteStatsTest
Test: manually regression test
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d56d4233c2334420714de3f7d947477d050c83bb)
Merged-In: I4e2fb89db1312b86d8b656a59a256e85fa57547f
Change-Id: I4e2fb89db1312b86d8b656a59a256e85fa57547f
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index 9dbdcb0..a675886 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -723,6 +723,9 @@
     optional int32 count_of_satellite_allowed_state_changed_events = 31;
     optional int32 count_of_successful_location_queries = 32;
     optional int32 count_of_failed_location_queries = 33;
+    optional int32 count_of_p2p_sms_available_notification_shown = 34;
+    optional int32 count_of_p2p_sms_available_notification_removed = 35;
+    optional bool is_ntn_only_carrier = 36;
 }
 
 message SatelliteSession {
@@ -743,6 +746,7 @@
     optional int32 count_of_satellite_notification_displayed = 15;
     optional int32 count_of_auto_exit_due_to_screen_off = 16;
     optional int32 count_of_auto_exit_due_to_tn_network = 17;
+    optional bool is_emergency = 18;
 }
 
 message SatelliteIncomingDatagram {
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index e43bf3c..82b8bec 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -1480,7 +1480,10 @@
                 satelliteController.carrierId,
                 satelliteController.countOfSatelliteAllowedStateChangedEvents,
                 satelliteController.countOfSuccessfulLocationQueries,
-                satelliteController.countOfFailedLocationQueries);
+                satelliteController.countOfFailedLocationQueries,
+                satelliteController.countOfP2PSmsAvailableNotificationShown,
+                satelliteController.countOfP2PSmsAvailableNotificationRemoved,
+                satelliteController.isNtnOnlyCarrier);
     }
 
     private static StatsEvent buildStatsEvent(SatelliteSession satelliteSession) {
@@ -1502,7 +1505,8 @@
                 satelliteSession.carrierId,
                 satelliteSession.countOfSatelliteNotificationDisplayed,
                 satelliteSession.countOfAutoExitDueToScreenOff,
-                satelliteSession.countOfAutoExitDueToTnNetwork);
+                satelliteSession.countOfAutoExitDueToTnNetwork,
+                satelliteSession.isEmergency);
     }
 
     private static StatsEvent buildStatsEvent(SatelliteIncomingDatagram stats) {
diff --git a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
index fdd0c0a..f828876 100644
--- a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
+++ b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
@@ -766,14 +766,17 @@
             existingStats.countOfDisallowedSatelliteAccess
                     += stats.countOfDisallowedSatelliteAccess;
             existingStats.countOfSatelliteAccessCheckFail += stats.countOfSatelliteAccessCheckFail;
-
-            existingStats.isProvisioned = stats.isProvisioned;
-
+            // Does not update isProvisioned and carrierId due to they are dimension fields.
             existingStats.countOfSatelliteAllowedStateChangedEvents
                     += stats.countOfSatelliteAllowedStateChangedEvents;
             existingStats.countOfSuccessfulLocationQueries +=
                     stats.countOfSuccessfulLocationQueries;
             existingStats.countOfFailedLocationQueries += stats.countOfFailedLocationQueries;
+            existingStats.countOfP2PSmsAvailableNotificationShown
+                    += stats.countOfP2PSmsAvailableNotificationShown;
+            existingStats.countOfP2PSmsAvailableNotificationRemoved
+                    += stats.countOfP2PSmsAvailableNotificationRemoved;
+            // Does not update isNtnOnlyCarrier due to it is a dimension field.
         } else {
             mAtoms.satelliteController = insertAtRandomPlace(mAtoms.satelliteController, stats,
                     mMaxNumSatelliteStats);
@@ -861,7 +864,6 @@
             CarrierRoamingSatelliteControllerStats stats) {
         CarrierRoamingSatelliteControllerStats existingStats = find(stats);
         if (existingStats != null) {
-            existingStats.configDataSource = stats.configDataSource;
             existingStats.countOfEntitlementStatusQueryRequest +=
                     stats.countOfEntitlementStatusQueryRequest;
             existingStats.countOfSatelliteConfigUpdateRequest +=
@@ -871,6 +873,8 @@
             existingStats.satelliteSessionGapMinSec = stats.satelliteSessionGapMinSec;
             existingStats.satelliteSessionGapAvgSec = stats.satelliteSessionGapAvgSec;
             existingStats.satelliteSessionGapMaxSec = stats.satelliteSessionGapMaxSec;
+            // Does not update configDataSource, carrierId, isDeviceEntitled, due to  they are
+            // dimension fields.
             existingStats.isDeviceEntitled = stats.isDeviceEntitled;
         } else {
             mAtoms.carrierRoamingSatelliteControllerStats = insertAtRandomPlace(
@@ -2342,7 +2346,8 @@
                     && stats.countOfSatelliteNotificationDisplayed
                     == key.countOfSatelliteNotificationDisplayed
                     && stats.countOfAutoExitDueToScreenOff == key.countOfAutoExitDueToScreenOff
-                    && stats.countOfAutoExitDueToTnNetwork == key.countOfAutoExitDueToTnNetwork) {
+                    && stats.countOfAutoExitDueToTnNetwork == key.countOfAutoExitDueToTnNetwork
+                    && stats.isEmergency == key.isEmergency) {
                 return stats;
             }
         }
@@ -2362,6 +2367,8 @@
                     && stats.cellularServiceState == key.cellularServiceState
                     && stats.isMultiSim == key.isMultiSim
                     && stats.recommendingHandoverType == key.recommendingHandoverType
+                    && stats.isSatelliteAllowedInCurrentLocation
+                    == key.isSatelliteAllowedInCurrentLocation
                     && stats.isWifiConnected == key.isWifiConnected
                     && stats.carrierId == key.carrierId) {
                 return stats;
@@ -2388,12 +2395,14 @@
     }
 
     /**
-     * Returns SatelliteController atom that has same carrier_id value or
-     * {@code null} if does not exist.
+     * Returns the SatelliteController atom with the matching `carrier_id`, `is_provisioned`, and
+     * `is_ntn_only_carrier` values, or {@code null} if does not exist.
      */
     private @Nullable SatelliteController find(SatelliteController key) {
         for (SatelliteController stats : mAtoms.satelliteController) {
-            if (stats.carrierId == key.carrierId) {
+            if (stats.carrierId == key.carrierId
+                    && stats.isProvisioned == key.isProvisioned
+                    && stats.isNtnOnlyCarrier == key.isNtnOnlyCarrier) {
                 return stats;
             }
         }
@@ -2408,7 +2417,9 @@
             CarrierRoamingSatelliteControllerStats key) {
         for (CarrierRoamingSatelliteControllerStats stats :
                 mAtoms.carrierRoamingSatelliteControllerStats) {
-            if (stats.carrierId == key.carrierId) {
+            if (stats.carrierId == key.carrierId
+                    && stats.configDataSource == key.configDataSource
+                    && stats.isDeviceEntitled == key.isDeviceEntitled) {
                 return stats;
             }
         }
diff --git a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
index 71c1bf3..015bc05 100644
--- a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
@@ -100,6 +100,9 @@
         private final int mCountOfSatelliteAllowedStateChangedEvents;
         private final int mCountOfSuccessfulLocationQueries;
         private final int mCountOfFailedLocationQueries;
+        private final int mCountOfP2PSmsAvailableNotificationShown;
+        private final int mCountOfP2PSmsAvailableNotificationRemoved;
+        private static boolean sIsNtnOnlyCarrier;
 
         private SatelliteControllerParams(Builder builder) {
             this.mCountOfSatelliteServiceEnablementsSuccess =
@@ -162,6 +165,15 @@
                     builder.mCountOfSuccessfulLocationQueries;
             this.mCountOfFailedLocationQueries =
                     builder.mCountOfFailedLocationQueries;
+            this.mCountOfP2PSmsAvailableNotificationShown =
+                    builder.mCountOfP2PSmsAvailableNotificationShown;
+            this.mCountOfP2PSmsAvailableNotificationRemoved =
+                    builder.mCountOfP2PSmsAvailableNotificationRemoved;
+
+            // Carrier ID value should be updated only when it is meaningful.
+            if (builder.mIsNtnOnlyCarrier.isPresent()) {
+                this.sIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier.get();
+            }
         }
 
         public int getCountOfSatelliteServiceEnablementsSuccess() {
@@ -276,11 +288,11 @@
             return mCountOfSatelliteAccessCheckFail;
         }
 
-        public boolean isProvisioned() {
+        public static boolean isProvisioned() {
             return sIsProvisioned;
         }
 
-        public int getCarrierId() {
+        public static int getCarrierId() {
             return sCarrierId;
         }
 
@@ -296,6 +308,18 @@
             return mCountOfFailedLocationQueries;
         }
 
+        public int getCountOfP2PSmsAvailableNotificationShown() {
+            return mCountOfP2PSmsAvailableNotificationShown;
+        }
+
+        public int getCountOfP2PSmsAvailableNotificationRemoved() {
+            return mCountOfP2PSmsAvailableNotificationRemoved;
+        }
+
+        public static boolean isNtnOnlyCarrier() {
+            return sIsNtnOnlyCarrier;
+        }
+
         /**
          * A builder class to create {@link SatelliteControllerParams} data structure class
          */
@@ -333,6 +357,9 @@
             private int mCountOfSatelliteAllowedStateChangedEvents = 0;
             private int mCountOfSuccessfulLocationQueries = 0;
             private int mCountOfFailedLocationQueries = 0;
+            private int mCountOfP2PSmsAvailableNotificationShown = 0;
+            private int mCountOfP2PSmsAvailableNotificationRemoved = 0;
+            private Optional<Boolean> mIsNtnOnlyCarrier = Optional.empty();
 
             /**
              * Sets countOfSatelliteServiceEnablementsSuccess value of {@link SatelliteController}
@@ -661,6 +688,37 @@
             }
 
             /**
+             * Sets countOfP2PSmsAvailableNotificationShown value of {@link SatelliteController}
+             * atom then returns Builder class
+             */
+            public Builder setCountOfP2PSmsAvailableNotificationShown(
+                    int countOfP2PSmsAvailableNotificationShown) {
+                this.mCountOfP2PSmsAvailableNotificationShown =
+                        countOfP2PSmsAvailableNotificationShown;
+                return this;
+            }
+
+            /**
+             * Sets countOfP2PSmsAvailableNotificationRemoved value of {@link SatelliteController}
+             * atom then returns Builder class
+             */
+            public Builder setCountOfP2PSmsAvailableNotificationRemoved(
+                    int countOfP2PSmsAvailableNotificationRemoved) {
+                this.mCountOfP2PSmsAvailableNotificationRemoved =
+                        countOfP2PSmsAvailableNotificationRemoved;
+                return this;
+            }
+
+            /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteController} atom
+             * then returns Builder class
+             */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = Optional.of(isNtnOnlyCarrier);
+                return this;
+            }
+
+            /**
              * Returns ControllerParams, which contains whole component of
              * {@link SatelliteController} atom
              */
@@ -715,6 +773,11 @@
                     + mCountOfSatelliteAllowedStateChangedEvents
                     + ", countOfSuccessfulLocationQueries=" + mCountOfSuccessfulLocationQueries
                     + ", countOfFailedLocationQueries=" + mCountOfFailedLocationQueries
+                    + ", countOfP2PSmsAvailableNotificationShown="
+                    + mCountOfP2PSmsAvailableNotificationShown
+                    + ", countOfP2PSmsAvailableNotificationRemoved="
+                    + mCountOfP2PSmsAvailableNotificationRemoved
+                    + ", isNtnOnlyCarrier=" + sIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -740,6 +803,7 @@
         private final int mCountOfSatelliteNotificationDisplayed;
         private final int mCountOfAutoExitDueToScreenOff;
         private final int mCountOfAutoExitDueToTnNetwork;
+        private final boolean mIsEmergency;
 
 
         private SatelliteSessionParams(Builder builder) {
@@ -762,6 +826,7 @@
                     builder.mCountOfSatelliteNotificationDisplayed;
             this.mCountOfAutoExitDueToScreenOff = builder.mCountOfAutoExitDueToScreenOff;
             this.mCountOfAutoExitDueToTnNetwork = builder.mCountOfAutoExitDueToTnNetwork;
+            this.mIsEmergency = builder.mIsEmergency;
         }
 
         public int getSatelliteServiceInitializationResult() {
@@ -828,6 +893,10 @@
             return mCountOfAutoExitDueToTnNetwork;
         }
 
+        public boolean getIsEmergency() {
+            return mIsEmergency;
+        }
+
         /**
          * A builder class to create {@link SatelliteSessionParams} data structure class
          */
@@ -849,6 +918,7 @@
             private int mCountOfSatelliteNotificationDisplayed = -1;
             private int mCountOfAutoExitDueToScreenOff = -1;
             private int mCountOfAutoExitDueToTnNetwork = -1;
+            private boolean mIsEmergency = false;
 
             /**
              * Sets satelliteServiceInitializationResult value of {@link SatelliteSession}
@@ -967,6 +1037,12 @@
                 return this;
             }
 
+            /** Sets whether enabled satellite session is for emergency or not. */
+            public Builder setIsEmergency(boolean isEmergency) {
+                this.mIsEmergency = isEmergency;
+                return this;
+            }
+
             /**
              * Returns SessionParams, which contains whole component of
              * {@link SatelliteSession} atom
@@ -997,6 +1073,7 @@
                     + mCountOfSatelliteNotificationDisplayed
                     + ", CountOfAutoExitDueToScreenOff" + mCountOfAutoExitDueToScreenOff
                     + ", CountOfAutoExitDueToTnNetwork" + mCountOfAutoExitDueToTnNetwork
+                    + ", IsEmergency=" + mIsEmergency
                     + ")";
         }
     }
@@ -2505,6 +2582,11 @@
                 param.getCountOfSatelliteAllowedStateChangedEvents();
         proto.countOfSuccessfulLocationQueries = param.getCountOfSuccessfulLocationQueries();
         proto.countOfFailedLocationQueries = param.getCountOfFailedLocationQueries();
+        proto.countOfP2PSmsAvailableNotificationShown =
+                param.getCountOfP2PSmsAvailableNotificationShown();
+        proto.countOfP2PSmsAvailableNotificationRemoved =
+                param.getCountOfP2PSmsAvailableNotificationRemoved();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
 
         mAtomsStorage.addSatelliteControllerStats(proto);
     }
@@ -2531,6 +2613,7 @@
                 param.getCountOfSatelliteNotificationDisplayed();
         proto.countOfAutoExitDueToScreenOff = param.getCountOfAutoExitDueToScreenOff();
         proto.countOfAutoExitDueToTnNetwork = param.getCountOfAutoExitDueToTnNetwork();
+        proto.isEmergency = param.getIsEmergency();
         mAtomsStorage.addSatelliteSessionStats(proto);
     }
 
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index e21d560..c647bd1 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -274,6 +274,7 @@
                 request = (DatagramDispatcherHandlerRequest) msg.obj;
                 SendSatelliteDatagramArgument argument =
                         (SendSatelliteDatagramArgument) request.argument;
+                argument.setDatagramStartTime();
                 onCompleted = obtainMessage(EVENT_SEND_SATELLITE_DATAGRAM_DONE, request);
 
                 synchronized (mLock) {
@@ -482,7 +483,6 @@
                 // Modem can be busy receiving datagrams, so send datagram only when modem is
                 // not busy.
                 mSendingInProgress = true;
-                datagramArgs.setDatagramStartTime();
                 mDatagramController.updateSendStatus(subId, datagramType,
                         SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING,
                         getPendingMessagesCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
@@ -641,7 +641,6 @@
 
             mSendingInProgress = true;
             // Sets the trigger time for getting pending datagrams
-            datagramArg.setDatagramStartTime();
             mDatagramController.updateSendStatus(datagramArg.subId, datagramArg.datagramType,
                     SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING,
                     getPendingMessagesCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
@@ -1363,9 +1362,8 @@
         if (!mIsAligned) return false;
 
         boolean isModemStateConnectedOrTransferring =
-                mModemState == SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED
-                        || mModemState
-                                == SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
+                mModemState == SATELLITE_MODEM_STATE_CONNECTED
+                        || mModemState == SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
         if (!isModemStateConnectedOrTransferring && !allowCheckMessageInNotConnected()) {
             plogd("EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT:"
                     + " allow_check_message_in_not_connected is disabled");
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 7198538..da1298a 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -1474,7 +1474,8 @@
                             .setInitializationProcessingTime(
                                     System.currentTimeMillis() - mSessionProcessingTimeStamp)
                             .setIsDemoMode(mIsDemoModeEnabled)
-                            .setCarrierId(getSatelliteCarrierId());
+                            .setCarrierId(getSatelliteCarrierId())
+                            .setIsEmergency(argument.isEmergency);
                     mSessionProcessingTimeStamp = 0;
 
                     if (error == SATELLITE_RESULT_SUCCESS) {
@@ -2028,6 +2029,15 @@
                         mLastConfiguredIccId = argument.getIccId();
                     }
                 }
+                mProvisionMetricsStats.setResultCode(error)
+                        .setIsProvisionRequest(argument.mProvisioned)
+                        .setCarrierId(getSatelliteCarrierId())
+                        .reportProvisionMetrics();
+                if (argument.mProvisioned) {
+                    mControllerMetricsStats.reportProvisionCount(error);
+                } else {
+                    mControllerMetricsStats.reportDeprovisionCount(error);
+                }
                 logd("updateSatelliteSubscription result=" + error);
                 break;
             }
@@ -6164,6 +6174,8 @@
 
         if (mOverrideNtnEligibility != null) {
             satellitePhone.notifyCarrierRoamingNtnEligibleStateChanged(currentNtnEligibility);
+            mControllerMetricsStats.reportP2PSmsEligibilityNotificationsCount(
+                    currentNtnEligibility);
             return;
         }
 
@@ -7404,6 +7416,18 @@
             mSelectedSatelliteSubId = selectedSubId;
         }
         setSatellitePhone(selectedSubId);
+        if (selectedSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            int carrierId = getSatelliteCarrierId();
+            if (carrierId != UNKNOWN_CARRIER_ID) {
+                mControllerMetricsStats.setCarrierId(carrierId);
+            } else {
+                logd("selectBindingSatelliteSubscription: Carrier ID is UNKNOWN_CARRIER_ID");
+            }
+            synchronized (mSatelliteTokenProvisionedLock) {
+                mControllerMetricsStats.setIsNtnOnlyCarrier(
+                        mSelectedSatelliteSubId == getNtnOnlySubscriptionId());
+            }
+        }
         plogd("selectBindingSatelliteSubscription: SelectedSatelliteSubId=" + selectedSubId);
         handleEventSelectedNbIotSatelliteSubscriptionChanged(selectedSubId);
     }
@@ -7674,22 +7698,12 @@
     protected void setSatellitePhone(int subId) {
         synchronized (mSatellitePhoneLock) {
             mSatellitePhone = SatelliteServiceUtils.getPhone(subId);
-            if (mSatellitePhone == null) {
-                mSatellitePhone = SatelliteServiceUtils.getPhone();
-            }
             plogd("mSatellitePhone: phoneId=" + (mSatellitePhone != null
                       ? mSatellitePhone.getPhoneId() : "null") + ", subId=" + subId);
-            int carrierId = mSatellitePhone.getCarrierId();
-            if (carrierId != UNKNOWN_CARRIER_ID) {
-                mControllerMetricsStats.setCarrierId(carrierId);
-            } else {
-                logd("setSatellitePhone: Carrier ID is UNKNOWN_CARRIER_ID");
-            }
         }
     }
 
     /** Return the carrier ID of the binding satellite subscription. */
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
     public int getSatelliteCarrierId() {
         synchronized (mSatelliteTokenProvisionedLock) {
             SubscriptionInfo subInfo = mSubscriptionManagerService.getSubscriptionInfo(
@@ -7741,7 +7755,7 @@
 
         int subId = phone.getSubId();
         if (!isSatelliteRoamingP2pSmSSupported(subId)) {
-            plogd("isCarrierRoamingNtnEligible: doesn't support P2P SMS");
+            plogd("isCarrierRoamingNtnEligible(" + subId + "): doesn't support P2P SMS");
             return false;
         }
 
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java
index 56c3431..608d91f 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java
@@ -35,7 +35,6 @@
 public class ControllerMetricsStats {
     private static final int ADD_COUNT = 1;
     private static final String TAG = ControllerMetricsStats.class.getSimpleName();
-    private static final boolean DBG = false;
 
     private static ControllerMetricsStats sInstance;
 
@@ -112,7 +111,6 @@
         mSatelliteStats = satelliteStats;
     }
 
-
     /** Report a counter when an attempt for satellite service on is successfully done */
     public void reportServiceEnablementSuccessCount() {
         logd("reportServiceEnablementSuccessCount()");
@@ -124,7 +122,7 @@
 
     /** Report a counter when an attempt for satellite service on is failed */
     public void reportServiceEnablementFailCount() {
-        logd("reportServiceEnablementSuccessCount()");
+        logd("reportServiceEnablementFailCount()");
         mSatelliteStats.onSatelliteControllerMetrics(
                 new SatelliteStats.SatelliteControllerParams.Builder()
                         .setCountOfSatelliteServiceEnablementsFail(ADD_COUNT)
@@ -380,7 +378,6 @@
     }
 
     /** Capture the NB-IoT NTN carrier ID */
-    @VisibleForTesting
     public void setCarrierId(int carrierId) {
         logd("setCarrierId:" + carrierId);
         mSatelliteStats.onSatelliteControllerMetrics(
@@ -417,6 +414,33 @@
         mSatelliteStats.onSatelliteControllerMetrics(controllerParam);
     }
 
+    /**
+     * Add count when the notification for P2P SMS over satellite avaibility is shown or removed.
+     */
+    public void reportP2PSmsEligibilityNotificationsCount(boolean isEligible) {
+        SatelliteStats.SatelliteControllerParams.Builder builder;
+        if (isEligible) {
+            builder = new SatelliteStats.SatelliteControllerParams.Builder()
+                    .setCountOfP2PSmsAvailableNotificationShown(ADD_COUNT);
+        } else {
+            builder = new SatelliteStats.SatelliteControllerParams.Builder()
+                    .setCountOfP2PSmsAvailableNotificationRemoved(ADD_COUNT);
+
+        }
+        SatelliteStats.SatelliteControllerParams controllerParam = builder.build();
+        logd("reportP2PSmsEligibilityNotificationsCount:" + controllerParam);
+        mSatelliteStats.onSatelliteControllerMetrics(controllerParam);
+    }
+
+    /** Capture the latest provisioned state for satellite service */
+    public void setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+        logd("setIsNtnOnlyCarrier:" + isNtnOnlyCarrier);
+        mSatelliteStats.onSatelliteControllerMetrics(
+                new SatelliteStats.SatelliteControllerParams.Builder()
+                        .setIsNtnOnlyCarrier(isNtnOnlyCarrier)
+                        .build());
+    }
+
     /** Receives the battery status whether it is in charging or not, update interval is 60 sec. */
     private final BroadcastReceiver mBatteryStatusReceiver = new BroadcastReceiver() {
         private long mLastUpdatedTime = 0;
@@ -446,9 +470,7 @@
     }
 
     private static void logd(@NonNull String log) {
-        if (DBG) {
-            Log.d(TAG, log);
-        }
+        Log.d(TAG, log);
     }
 
     private static void loge(@NonNull String log) {
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
index 73be042..c1ac689 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
@@ -29,7 +29,6 @@
  */
 public class ProvisionMetricsStats {
     private static final String TAG = ProvisionMetricsStats.class.getSimpleName();
-    private static final boolean DBG = false;
 
     private static ProvisionMetricsStats sInstance = null;
 
@@ -114,8 +113,6 @@
     }
 
     private static void logd(@NonNull String log) {
-        if (DBG) {
-            Log.d(TAG, log);
-        }
+        Log.d(TAG, log);
     }
 }
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
index 4faacdc..48674b0 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
@@ -37,7 +37,6 @@
  */
 public class SessionMetricsStats {
     private static final String TAG = SessionMetricsStats.class.getSimpleName();
-    private static final boolean DBG = true;
 
     private static SessionMetricsStats sInstance = null;
     private @SatelliteManager.SatelliteResult int mInitializationResult;
@@ -62,6 +61,7 @@
     private int mCountOfSatelliteNotificationDisplayed;
     private int mCountOfAutoExitDueToScreenOff;
     private int mCountOfAutoExitDueToTnNetwork;
+    private boolean mIsEmergency;
     private SatelliteSessionStats mDatagramStats;
 
     private SessionMetricsStats() {
@@ -260,6 +260,13 @@
         return this;
     }
 
+    /** Sets whether the session is enabled for emergency or not. */
+    public SessionMetricsStats setIsEmergency(boolean isEmergency) {
+        mIsEmergency = isEmergency;
+        logd("setIsEmergency(" + mIsEmergency + ")");
+        return this;
+    }
+
     /** Report the session metrics atoms to PersistAtomsStorage in telephony. */
     public void reportSessionMetrics() {
         SatelliteStats.SatelliteSessionParams sessionParams =
@@ -281,6 +288,7 @@
                                 mCountOfSatelliteNotificationDisplayed)
                         .setCountOfAutoExitDueToScreenOff(mCountOfAutoExitDueToScreenOff)
                         .setCountOfAutoExitDueToTnNetwork(mCountOfAutoExitDueToTnNetwork)
+                        .setIsEmergency(mIsEmergency)
                         .build();
         logd("reportSessionMetrics: " + sessionParams.toString());
         SatelliteStats.getInstance().onSatelliteSessionMetrics(sessionParams);
@@ -305,7 +313,7 @@
 
         DatagramDispatcher.getInstance().updateSessionStatsWithPendingUserMsgCount(mDatagramStats);
         bundle.putParcelable(KEY_SESSION_STATS_V2, mDatagramStats);
-        Log.i(TAG, "[END] DatagramStats = " +mDatagramStats);
+        Log.i(TAG, "[END] DatagramStats = " + mDatagramStats);
         result.send(SATELLITE_RESULT_SUCCESS, bundle);
     }
 
@@ -338,6 +346,7 @@
         mCountOfSatelliteNotificationDisplayed = 0;
         mCountOfAutoExitDueToScreenOff = 0;
         mCountOfAutoExitDueToTnNetwork = 0;
+        mIsEmergency = false;
     }
 
     public void resetSessionStatsShadowCounters() {
@@ -350,9 +359,7 @@
     }
 
     private static void logd(@NonNull String log) {
-        if (DBG) {
-            Log.d(TAG, log);
-        }
+        Log.d(TAG, log);
     }
 
     private static void loge(@NonNull String log) {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
index e6e4c30..2645dbf 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
@@ -1148,6 +1148,11 @@
         mSatelliteController1.countOfDatagramTypeKeepAliveFail = 2;
         mSatelliteController1.isProvisioned = true;
         mSatelliteController1.carrierId = 1;
+        mSatelliteController1.countOfSuccessfulLocationQueries = 3;
+        mSatelliteController1.countOfFailedLocationQueries = 5;
+        mSatelliteController1.countOfP2PSmsAvailableNotificationShown = 3;
+        mSatelliteController1.countOfP2PSmsAvailableNotificationRemoved = 5;
+        mSatelliteController1.isNtnOnlyCarrier = false;
 
         mSatelliteController2 = new SatelliteController();
         mSatelliteController2.countOfSatelliteServiceEnablementsSuccess = 2 + 1;
@@ -1177,6 +1182,11 @@
         mSatelliteController2.countOfDatagramTypeKeepAliveFail = 5;
         mSatelliteController2.isProvisioned = false;
         mSatelliteController2.carrierId = 10;
+        mSatelliteController2.countOfSuccessfulLocationQueries = 30;
+        mSatelliteController2.countOfFailedLocationQueries = 50;
+        mSatelliteController2.countOfP2PSmsAvailableNotificationShown = 30;
+        mSatelliteController2.countOfP2PSmsAvailableNotificationRemoved = 50;
+        mSatelliteController2.isNtnOnlyCarrier = true;
 
         // SatelliteController atom has one data point
         mSatelliteControllers =
@@ -1205,6 +1215,7 @@
         mSatelliteSession1.countOfSatelliteNotificationDisplayed = 4;
         mSatelliteSession1.countOfAutoExitDueToScreenOff = 6;
         mSatelliteSession1.countOfAutoExitDueToTnNetwork = 7;
+        mSatelliteSession1.isEmergency = true;
 
         mSatelliteSession2 = new SatelliteSession();
         mSatelliteSession2.satelliteServiceInitializationResult =
@@ -1227,6 +1238,7 @@
         mSatelliteSession2.countOfSatelliteNotificationDisplayed = 40;
         mSatelliteSession2.countOfAutoExitDueToScreenOff = 60;
         mSatelliteSession2.countOfAutoExitDueToTnNetwork = 70;
+        mSatelliteSession2.isEmergency = false;
 
         mSatelliteSessions =
                 new SatelliteSession[] {
@@ -4433,6 +4445,11 @@
                 mSatelliteController1.countOfSuccessfulLocationQueries * 2;
         expected.countOfFailedLocationQueries =
                 mSatelliteController1.countOfFailedLocationQueries * 2;
+        expected.countOfP2PSmsAvailableNotificationShown =
+                mSatelliteController1.countOfP2PSmsAvailableNotificationShown * 2;
+        expected.countOfP2PSmsAvailableNotificationRemoved =
+                mSatelliteController1.countOfP2PSmsAvailableNotificationRemoved * 2;
+        expected.isNtnOnlyCarrier = mSatelliteController1.isNtnOnlyCarrier;
 
         // Service state and service switch should be added successfully
         verifyCurrentStateSavedToFileOnce();
@@ -4462,6 +4479,139 @@
     }
 
     @Test
+    public void addSatelliteControllerStats_addNewProvisionId() throws Exception {
+        createEmptyTestFile();
+        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
+        mPersistAtomsStorage.addSatelliteControllerStats(mSatelliteController1);
+        mPersistAtomsStorage.addSatelliteControllerStats(mSatelliteController2);
+        mPersistAtomsStorage.incTimeMillis(100L);
+
+        SatelliteController expected1 = mSatelliteController1;
+        SatelliteController expected2 = mSatelliteController2;
+
+        // Service state and service switch should be added successfully
+        verifyCurrentStateSavedToFileOnce();
+        SatelliteController[] output =
+                mPersistAtomsStorage.getSatelliteControllerStats(0L);
+
+        assertHasStats(output, expected1, 1);
+        assertHasStats(output, expected2, 1);
+    }
+
+    @Test
+    public void addSatelliteControllerStats_addSameDimension() throws Exception {
+        createEmptyTestFile();
+        mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
+
+        SatelliteController satelliteController1 = copyOf(mSatelliteController1);
+        SatelliteController satelliteController2 = copyOf(mSatelliteController2);
+
+        // set same provisioned and carrier id so that they are in same dimension.
+        satelliteController1.isProvisioned = true;
+        satelliteController2.isProvisioned = true;
+        satelliteController1.carrierId = 1589;
+        satelliteController2.carrierId = 1589;
+        satelliteController1.isNtnOnlyCarrier = false;
+        satelliteController2.isNtnOnlyCarrier = false;
+
+        mPersistAtomsStorage.addSatelliteControllerStats(copyOf(satelliteController1));
+        mPersistAtomsStorage.addSatelliteControllerStats(copyOf(satelliteController2));
+        mPersistAtomsStorage.incTimeMillis(100L);
+
+        SatelliteController expected = new SatelliteController();
+        expected.countOfSatelliteServiceEnablementsSuccess =
+                satelliteController1.countOfSatelliteServiceEnablementsSuccess
+                        + satelliteController2.countOfSatelliteServiceEnablementsSuccess;
+        expected.countOfSatelliteServiceEnablementsFail =
+                satelliteController1.countOfSatelliteServiceEnablementsFail
+                        + satelliteController2.countOfSatelliteServiceEnablementsFail;
+        expected.countOfOutgoingDatagramSuccess =
+                satelliteController1.countOfOutgoingDatagramSuccess
+                        + satelliteController2.countOfOutgoingDatagramSuccess;
+        expected.countOfOutgoingDatagramFail = satelliteController1.countOfOutgoingDatagramFail
+                + satelliteController2.countOfOutgoingDatagramFail;
+        expected.countOfIncomingDatagramSuccess =
+                satelliteController1.countOfIncomingDatagramSuccess
+                        + satelliteController2.countOfIncomingDatagramSuccess;
+        expected.countOfIncomingDatagramFail = satelliteController1.countOfIncomingDatagramFail
+                + satelliteController2.countOfIncomingDatagramFail;
+        expected.countOfDatagramTypeSosSmsSuccess =
+                satelliteController1.countOfDatagramTypeSosSmsSuccess
+                        + satelliteController2.countOfDatagramTypeSosSmsSuccess;
+        expected.countOfDatagramTypeSosSmsFail = satelliteController1.countOfDatagramTypeSosSmsFail
+                + satelliteController2.countOfDatagramTypeSosSmsFail;
+        expected.countOfDatagramTypeLocationSharingSuccess =
+                satelliteController1.countOfDatagramTypeLocationSharingSuccess
+                        + satelliteController2.countOfDatagramTypeLocationSharingSuccess;
+        expected.countOfDatagramTypeLocationSharingFail =
+                satelliteController1.countOfDatagramTypeLocationSharingFail
+                        + satelliteController2.countOfDatagramTypeLocationSharingFail;
+        expected.countOfProvisionSuccess = satelliteController1.countOfProvisionSuccess
+                + satelliteController2.countOfProvisionSuccess;
+        expected.countOfProvisionFail = satelliteController1.countOfProvisionFail
+                + satelliteController2.countOfProvisionFail;
+        expected.countOfDeprovisionSuccess = satelliteController1.countOfDeprovisionSuccess
+                + satelliteController2.countOfDeprovisionSuccess;
+        expected.countOfDeprovisionFail = satelliteController1.countOfDeprovisionFail
+                + satelliteController2.countOfDeprovisionFail;
+        expected.totalServiceUptimeSec = satelliteController1.totalServiceUptimeSec
+                + satelliteController2.totalServiceUptimeSec;
+        expected.totalBatteryConsumptionPercent =
+                satelliteController1.totalBatteryConsumptionPercent
+                        + satelliteController2.totalBatteryConsumptionPercent;
+        expected.totalBatteryChargedTimeSec = satelliteController1.totalBatteryChargedTimeSec
+                + satelliteController2.totalBatteryChargedTimeSec;
+        expected.countOfDemoModeSatelliteServiceEnablementsSuccess =
+                satelliteController1.countOfDemoModeSatelliteServiceEnablementsSuccess
+                        + satelliteController2.countOfDemoModeSatelliteServiceEnablementsSuccess;
+        expected.countOfDemoModeSatelliteServiceEnablementsFail =
+                satelliteController1.countOfDemoModeSatelliteServiceEnablementsFail
+                        + satelliteController2.countOfDemoModeSatelliteServiceEnablementsFail;
+        expected.countOfDemoModeOutgoingDatagramSuccess =
+                satelliteController1.countOfDemoModeOutgoingDatagramSuccess
+                        + satelliteController2.countOfDemoModeOutgoingDatagramSuccess;
+        expected.countOfDemoModeOutgoingDatagramFail =
+                satelliteController1.countOfDemoModeOutgoingDatagramFail
+                        + satelliteController2.countOfDemoModeOutgoingDatagramFail;
+        expected.countOfDemoModeIncomingDatagramSuccess =
+                satelliteController1.countOfDemoModeIncomingDatagramSuccess
+                        + satelliteController2.countOfDemoModeIncomingDatagramSuccess;
+        expected.countOfDemoModeIncomingDatagramFail =
+                satelliteController1.countOfDemoModeIncomingDatagramFail
+                        + satelliteController2.countOfDemoModeIncomingDatagramFail;
+        expected.countOfDatagramTypeKeepAliveSuccess =
+                satelliteController1.countOfDatagramTypeKeepAliveSuccess
+                        + satelliteController2.countOfDatagramTypeKeepAliveSuccess;
+        expected.countOfDatagramTypeKeepAliveFail =
+                satelliteController1.countOfDatagramTypeKeepAliveFail
+                        + satelliteController2.countOfDatagramTypeKeepAliveFail;
+        expected.isProvisioned = true;
+        expected.carrierId = 1589;
+        expected.countOfSatelliteAllowedStateChangedEvents =
+                satelliteController1.countOfSatelliteAllowedStateChangedEvents
+                        + satelliteController2.countOfSatelliteAllowedStateChangedEvents;
+        expected.countOfSuccessfulLocationQueries =
+                satelliteController1.countOfSuccessfulLocationQueries
+                        + satelliteController2.countOfSuccessfulLocationQueries;
+        expected.countOfFailedLocationQueries = satelliteController1.countOfFailedLocationQueries
+                + satelliteController2.countOfFailedLocationQueries;
+        expected.countOfP2PSmsAvailableNotificationShown =
+                satelliteController1.countOfP2PSmsAvailableNotificationShown
+                        + satelliteController2.countOfP2PSmsAvailableNotificationShown;
+        expected.countOfP2PSmsAvailableNotificationRemoved =
+                satelliteController1.countOfP2PSmsAvailableNotificationRemoved
+                        + satelliteController2.countOfP2PSmsAvailableNotificationRemoved;
+        expected.isNtnOnlyCarrier = false;
+
+        // Service state and service switch should be added successfully
+        verifyCurrentStateSavedToFileOnce();
+        SatelliteController[] output =
+                mPersistAtomsStorage.getSatelliteControllerStats(0L);
+
+        assertHasStats(output, expected, 1);
+    }
+
+    @Test
     public void getSatelliteControllerStats_tooFrequent() throws Exception {
         createTestFile(START_TIME_MILLIS);
 
@@ -5834,9 +5984,10 @@
             @Nullable SatelliteController expectedStats, int expectedCount) {
         assertNotNull(tested);
         int actualCount = 0;
-        int i = 0;
         for (SatelliteController stats : tested) {
-            if (expectedStats.carrierId == stats.carrierId) {
+            if (expectedStats.carrierId == stats.carrierId
+                    && expectedStats.isProvisioned == stats.isProvisioned
+                    && expectedStats.isNtnOnlyCarrier == stats.isNtnOnlyCarrier) {
                 assertEquals(expectedStats.countOfSatelliteServiceEnablementsSuccess,
                         stats.countOfSatelliteServiceEnablementsSuccess);
                 assertEquals(expectedStats.countOfSatelliteServiceEnablementsFail,
@@ -5885,12 +6036,17 @@
                 assertEquals(expectedStats.countOfSatelliteAccessCheckFail,
                         stats.countOfSatelliteAccessCheckFail);
                 assertEquals(expectedStats.isProvisioned, stats.isProvisioned);
+                assertEquals(expectedStats.carrierId, stats.carrierId);
                 assertEquals(expectedStats.countOfSatelliteAllowedStateChangedEvents,
                         stats.countOfSatelliteAllowedStateChangedEvents);
                 assertEquals(expectedStats.countOfSuccessfulLocationQueries,
                         stats.countOfSuccessfulLocationQueries);
                 assertEquals(expectedStats.countOfFailedLocationQueries,
                         stats.countOfFailedLocationQueries);
+                assertEquals(expectedStats.countOfP2PSmsAvailableNotificationShown,
+                        stats.countOfP2PSmsAvailableNotificationShown);
+                assertEquals(expectedStats.countOfP2PSmsAvailableNotificationRemoved,
+                        stats.countOfP2PSmsAvailableNotificationRemoved);
                 actualCount++;
             }
         }
@@ -5928,7 +6084,8 @@
                     && stats.countOfAutoExitDueToScreenOff
                     == expectedStats.countOfAutoExitDueToScreenOff
                     && stats.countOfAutoExitDueToTnNetwork
-                    == expectedStats.countOfAutoExitDueToTnNetwork) {
+                    == expectedStats.countOfAutoExitDueToTnNetwork
+                    && stats.isEmergency == expectedStats.isEmergency) {
                 actualCount = stats.count;
             }
         }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
index 5740336..51ae7a7 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
@@ -107,6 +107,9 @@
                         .setCountOfDisallowedSatelliteAccess(2)
                         .setCountOfSatelliteAccessCheckFail(3)
                         .setIsProvisioned(true)
+                        .setCountOfP2PSmsAvailableNotificationShown(3)
+                        .setCountOfP2PSmsAvailableNotificationRemoved(3)
+                        .setIsNtnOnlyCarrier(false)
                         .build();
 
         mSatelliteStats.onSatelliteControllerMetrics(param);
@@ -170,7 +173,14 @@
                 stats.countOfDisallowedSatelliteAccess);
         assertEquals(param.getCountOfSatelliteAccessCheckFail(),
                 stats.countOfSatelliteAccessCheckFail);
-        assertEquals(param.isProvisioned(), stats.isProvisioned);
+        assertEquals(SatelliteStats.SatelliteControllerParams.isProvisioned(), stats.isProvisioned);
+        assertEquals(SatelliteStats.SatelliteControllerParams.getCarrierId(), stats.carrierId);
+        assertEquals(param.getCountOfP2PSmsAvailableNotificationShown(),
+                stats.countOfP2PSmsAvailableNotificationShown);
+        assertEquals(param.getCountOfP2PSmsAvailableNotificationRemoved(),
+                stats.countOfP2PSmsAvailableNotificationRemoved);
+        assertEquals(SatelliteStats.SatelliteControllerParams.isNtnOnlyCarrier(),
+                stats.isNtnOnlyCarrier);
 
         verifyNoMoreInteractions(mPersistAtomsStorage);
     }
@@ -239,6 +249,11 @@
                         .setCountOfIncomingDatagramFailed(0)
                         .setIsDemoMode(false)
                         .setMaxNtnSignalStrengthLevel(NTN_SIGNAL_STRENGTH_GOOD)
+                        .setCarrierId(1589)
+                        .setCountOfSatelliteNotificationDisplayed(5)
+                        .setCountOfAutoExitDueToScreenOff(7)
+                        .setCountOfAutoExitDueToTnNetwork(3)
+                        .setIsEmergency(true)
                         .build();
 
         mSatelliteStats.onSatelliteSessionMetrics(param);
@@ -262,6 +277,12 @@
         assertEquals(param.getCountOfIncomingDatagramFailed(), stats.countOfIncomingDatagramFailed);
         assertEquals(param.getIsDemoMode(), stats.isDemoMode);
         assertEquals(param.getMaxNtnSignalStrengthLevel(), stats.maxNtnSignalStrengthLevel);
+        assertEquals(param.getCarrierId(), stats.carrierId);
+        assertEquals(param.getCountOfSatelliteNotificationDisplayed(),
+                stats.countOfSatelliteNotificationDisplayed);
+        assertEquals(param.getCountOfAutoExitDueToScreenOff(), stats.countOfAutoExitDueToScreenOff);
+        assertEquals(param.getCountOfAutoExitDueToTnNetwork(), stats.countOfAutoExitDueToTnNetwork);
+        assertEquals(param.getIsEmergency(), stats.isEmergency);
 
         verifyNoMoreInteractions(mPersistAtomsStorage);
     }