Add "isNtnOnlyCarrier" field into metrics atoms for satellite sessions.


Bug: 383033991
Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
Test: manually test
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:9bd323131eaba07c4ee536ddd28984e2ec9e7e75)
Merged-In: I72014af9c675f515cac193dc96ba72df4b4d552f
Change-Id: I72014af9c675f515cac193dc96ba72df4b4d552f
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index a675886..ca68912 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -747,6 +747,7 @@
     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;
+    optional bool is_ntn_only_carrier = 19;
 }
 
 message SatelliteIncomingDatagram {
@@ -755,6 +756,7 @@
     optional int64 datagram_transfer_time_millis = 3;
     optional bool is_demo_mode = 4;
     optional int32 carrier_id = 5;
+    optional bool is_ntn_only_carrier = 6;
 }
 
 message SatelliteOutgoingDatagram {
@@ -764,6 +766,7 @@
     optional int64 datagram_transfer_time_millis = 4;
     optional bool is_demo_mode = 5;
     optional int32 carrier_id = 6;
+    optional bool is_ntn_only_carrier = 7;
 }
 
 message SatelliteProvision {
@@ -772,6 +775,7 @@
     optional bool is_provision_request = 3;
     optional bool is_canceled = 4;
     optional int32 carrier_id = 5;
+    optional bool is_ntn_only_carrier = 6;
 }
 
 message SatelliteSosMessageRecommender {
@@ -785,6 +789,7 @@
     optional bool is_satellite_allowed_in_current_location = 8;
     optional bool is_wifi_connected = 9;
     optional int32 carrier_id = 10;
+    optional bool is_ntn_only_carrier = 11;
 }
 
 message DataNetworkValidation {
@@ -855,4 +860,5 @@
     optional int32 config_data_source = 9;
     optional int32 carrier_id = 10;
     optional int32 triggering_event = 11;
+    optional bool is_ntn_only_carrier = 12;
 }
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index 82b8bec..5ef4c5b 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -1506,7 +1506,8 @@
                 satelliteSession.countOfSatelliteNotificationDisplayed,
                 satelliteSession.countOfAutoExitDueToScreenOff,
                 satelliteSession.countOfAutoExitDueToTnNetwork,
-                satelliteSession.isEmergency);
+                satelliteSession.isEmergency,
+                satelliteSession.isNtnOnlyCarrier);
     }
 
     private static StatsEvent buildStatsEvent(SatelliteIncomingDatagram stats) {
@@ -1516,7 +1517,8 @@
                 stats.datagramSizeBytes,
                 stats.datagramTransferTimeMillis,
                 stats.isDemoMode,
-                stats.carrierId);
+                stats.carrierId,
+                stats.isNtnOnlyCarrier);
     }
 
     private static StatsEvent buildStatsEvent(SatelliteOutgoingDatagram stats) {
@@ -1527,7 +1529,8 @@
                 stats.datagramSizeBytes,
                 stats.datagramTransferTimeMillis,
                 stats.isDemoMode,
-                stats.carrierId);
+                stats.carrierId,
+                stats.isNtnOnlyCarrier);
     }
 
     private static StatsEvent buildStatsEvent(SatelliteProvision stats) {
@@ -1537,7 +1540,8 @@
                 stats.provisioningTimeSec,
                 stats.isProvisionRequest,
                 stats.isCanceled,
-                stats.carrierId);
+                stats.carrierId,
+                stats.isNtnOnlyCarrier);
     }
 
     private static StatsEvent buildStatsEvent(SatelliteSosMessageRecommender stats) {
@@ -1552,7 +1556,8 @@
                 stats.recommendingHandoverType,
                 stats.isSatelliteAllowedInCurrentLocation,
                 stats.isWifiConnected,
-                stats.carrierId);
+                stats.carrierId,
+                stats.isNtnOnlyCarrier);
     }
 
     private static StatsEvent buildStatsEvent(DataNetworkValidation stats) {
@@ -1633,7 +1638,8 @@
                 stats.countryCodes,
                 stats.configDataSource,
                 stats.carrierId,
-                stats.triggeringEvent);
+                stats.triggeringEvent,
+                stats.isNtnOnlyCarrier);
     }
 
     /** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */
diff --git a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
index 015bc05..4513f6c 100644
--- a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
@@ -804,7 +804,7 @@
         private final int mCountOfAutoExitDueToScreenOff;
         private final int mCountOfAutoExitDueToTnNetwork;
         private final boolean mIsEmergency;
-
+        private final boolean mIsNtnOnlyCarrier;
 
         private SatelliteSessionParams(Builder builder) {
             this.mSatelliteServiceInitializationResult =
@@ -827,6 +827,7 @@
             this.mCountOfAutoExitDueToScreenOff = builder.mCountOfAutoExitDueToScreenOff;
             this.mCountOfAutoExitDueToTnNetwork = builder.mCountOfAutoExitDueToTnNetwork;
             this.mIsEmergency = builder.mIsEmergency;
+            this.mIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier;
         }
 
         public int getSatelliteServiceInitializationResult() {
@@ -897,6 +898,10 @@
             return mIsEmergency;
         }
 
+        public boolean isNtnOnlyCarrier() {
+            return mIsNtnOnlyCarrier;
+        }
+
         /**
          * A builder class to create {@link SatelliteSessionParams} data structure class
          */
@@ -919,6 +924,7 @@
             private int mCountOfAutoExitDueToScreenOff = -1;
             private int mCountOfAutoExitDueToTnNetwork = -1;
             private boolean mIsEmergency = false;
+            private boolean mIsNtnOnlyCarrier = false;
 
             /**
              * Sets satelliteServiceInitializationResult value of {@link SatelliteSession}
@@ -1044,6 +1050,15 @@
             }
 
             /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteSession} atom
+             * then returns Builder class
+            */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+                return this;
+            }
+
+            /**
              * Returns SessionParams, which contains whole component of
              * {@link SatelliteSession} atom
              */
@@ -1074,6 +1089,7 @@
                     + ", CountOfAutoExitDueToScreenOff" + mCountOfAutoExitDueToScreenOff
                     + ", CountOfAutoExitDueToTnNetwork" + mCountOfAutoExitDueToTnNetwork
                     + ", IsEmergency=" + mIsEmergency
+                    + ", IsNtnOnlyCarrier=" + mIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -1088,6 +1104,7 @@
         private final long mDatagramTransferTimeMillis;
         private final boolean mIsDemoMode;
         private final int mCarrierId;
+        private final boolean mIsNtnOnlyCarrier;
 
         private SatelliteIncomingDatagramParams(Builder builder) {
             this.mResultCode = builder.mResultCode;
@@ -1095,6 +1112,7 @@
             this.mDatagramTransferTimeMillis = builder.mDatagramTransferTimeMillis;
             this.mIsDemoMode = builder.mIsDemoMode;
             this.mCarrierId = builder.mCarrierId;
+            this.mIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier;
         }
 
         public int getResultCode() {
@@ -1117,6 +1135,10 @@
             return mCarrierId;
         }
 
+        public boolean isNtnOnlyCarrier() {
+            return mIsNtnOnlyCarrier;
+        }
+
         /**
          * A builder class to create {@link SatelliteIncomingDatagramParams} data structure class
          */
@@ -1126,6 +1148,7 @@
             private long mDatagramTransferTimeMillis = -1;
             private boolean mIsDemoMode = false;
             private int mCarrierId = UNKNOWN_CARRIER_ID;
+            private boolean mIsNtnOnlyCarrier = false;
 
             /**
              * Sets resultCode value of {@link SatelliteIncomingDatagram} atom
@@ -1170,6 +1193,15 @@
             }
 
             /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteIncomingDatagram} atom
+             * then returns Builder class
+            */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+                return this;
+            }
+
+            /**
              * Returns IncomingDatagramParams, which contains whole component of
              * {@link SatelliteIncomingDatagram} atom
              */
@@ -1187,6 +1219,7 @@
                     + ", datagramTransferTimeMillis=" + mDatagramTransferTimeMillis
                     + ", isDemoMode=" + mIsDemoMode
                     + ", CarrierId=" + mCarrierId
+                    + ", isNtnOnlyCarrier=" + mIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -1202,6 +1235,7 @@
         private final long mDatagramTransferTimeMillis;
         private final boolean mIsDemoMode;
         private final int mCarrierId;
+        private final boolean mIsNtnOnlyCarrier;
 
         private SatelliteOutgoingDatagramParams(Builder builder) {
             this.mDatagramType = builder.mDatagramType;
@@ -1210,6 +1244,7 @@
             this.mDatagramTransferTimeMillis = builder.mDatagramTransferTimeMillis;
             this.mIsDemoMode = builder.mIsDemoMode;
             this.mCarrierId = builder.mCarrierId;
+            this.mIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier;
         }
 
         public int getDatagramType() {
@@ -1236,6 +1271,10 @@
             return mCarrierId;
         }
 
+        public boolean isNtnOnlyCarrier() {
+            return mIsNtnOnlyCarrier;
+        }
+
         /**
          * A builder class to create {@link SatelliteOutgoingDatagramParams} data structure class
          */
@@ -1246,6 +1285,7 @@
             private long mDatagramTransferTimeMillis = -1;
             private boolean mIsDemoMode = false;
             private int mCarrierId = UNKNOWN_CARRIER_ID;
+            private boolean mIsNtnOnlyCarrier = false;
 
             /**
              * Sets datagramType value of {@link SatelliteOutgoingDatagram} atom
@@ -1299,6 +1339,15 @@
             }
 
             /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteOutgoingDatagram} atom
+             * then returns Builder class
+            */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+                return this;
+            }
+
+            /**
              * Returns OutgoingDatagramParams, which contains whole component of
              * {@link SatelliteOutgoingDatagram} atom
              */
@@ -1317,6 +1366,7 @@
                     + ", datagramTransferTimeMillis=" + mDatagramTransferTimeMillis
                     + ", isDemoMode=" + mIsDemoMode
                     + ", CarrierId=" + mCarrierId
+                    + ", isNtnOnlyCarrier=" + mIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -1331,6 +1381,7 @@
         private final boolean mIsProvisionRequest;
         private final boolean mIsCanceled;
         private final int mCarrierId;
+        private final boolean mIsNtnOnlyCarrier;
 
         private SatelliteProvisionParams(Builder builder) {
             this.mResultCode = builder.mResultCode;
@@ -1338,6 +1389,7 @@
             this.mIsProvisionRequest = builder.mIsProvisionRequest;
             this.mIsCanceled = builder.mIsCanceled;
             this.mCarrierId = builder.mCarrierId;
+            this.mIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier;
         }
 
         public int getResultCode() {
@@ -1360,6 +1412,10 @@
             return mCarrierId;
         }
 
+        public boolean isNtnOnlyCarrier() {
+            return mIsNtnOnlyCarrier;
+        }
+
         /**
          * A builder class to create {@link SatelliteProvisionParams} data structure class
          */
@@ -1369,6 +1425,7 @@
             private boolean mIsProvisionRequest = false;
             private boolean mIsCanceled = false;
             private int mCarrierId = UNKNOWN_CARRIER_ID;
+            private boolean mIsNtnOnlyCarrier = false;
 
             /**
              * Sets resultCode value of {@link SatelliteProvision} atom
@@ -1413,6 +1470,15 @@
             }
 
             /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteProvision} atom
+             * then returns Builder class
+            */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+                return this;
+            }
+
+            /**
              * Returns ProvisionParams, which contains whole component of
              * {@link SatelliteProvision} atom
              */
@@ -1430,6 +1496,7 @@
                     + ", isProvisionRequest=" + mIsProvisionRequest
                     + ", isCanceled" + mIsCanceled
                     + ", CarrierId=" + mCarrierId
+                    + ", isNtnOnlyCarrier=" + mIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -1448,6 +1515,7 @@
         private final boolean mIsSatelliteAllowedInCurrentLocation;
         private final boolean mIsWifiConnected;
         private final int mCarrierId;
+        private final boolean mIsNtnOnlyCarrier;
 
         private SatelliteSosMessageRecommenderParams(Builder builder) {
             this.mIsDisplaySosMessageSent = builder.mIsDisplaySosMessageSent;
@@ -1460,6 +1528,7 @@
                     builder.mIsSatelliteAllowedInCurrentLocation;
             this.mIsWifiConnected = builder.mIsWifiConnected;
             this.mCarrierId = builder.mCarrierId;
+            this.mIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier;
         }
 
         public boolean isDisplaySosMessageSent() {
@@ -1498,8 +1567,12 @@
             return mCarrierId;
         }
 
+        public boolean isNtnOnlyCarrier() {
+            return mIsNtnOnlyCarrier;
+        }
+
         /**
-         * A builder class to create {@link SatelliteProvisionParams} data structure class
+         * A builder class to create {@link SatelliteSosMessageRecommender} data structure class
          */
         public static class Builder {
             private boolean mIsDisplaySosMessageSent = false;
@@ -1511,7 +1584,7 @@
             private boolean mIsSatelliteAllowedInCurrentLocation = false;
             private boolean mIsWifiConnected = false;
             private int mCarrierId = UNKNOWN_CARRIER_ID;
-
+            private boolean mIsNtnOnlyCarrier = false;
 
             /**
              * Sets resultCode value of {@link SatelliteSosMessageRecommender} atom
@@ -1597,6 +1670,15 @@
             }
 
             /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteSosMessageRecommender} atom
+             * then returns Builder class
+            */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+                return this;
+            }
+
+            /**
              * Returns SosMessageRecommenderParams, which contains whole component of
              * {@link SatelliteSosMessageRecommenderParams} atom
              */
@@ -1619,6 +1701,7 @@
                     + mIsSatelliteAllowedInCurrentLocation
                     + ", isWifiConnected=" + mIsWifiConnected
                     + ", carrierId=" + mCarrierId
+                    + ", isNtnOnlyCarrier=" + mIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -2360,6 +2443,7 @@
         private final @SatelliteConstants.ConfigDataSource int mConfigDataSource;
         private final int mCarrierId;
         private final int mTriggeringEvent;
+        private final boolean mIsNtnOnlyCarrier;
 
         private SatelliteAccessControllerParams(Builder builder) {
             this.mAccessControlType = builder.mAccessControlType;
@@ -2373,6 +2457,7 @@
             this.mConfigDataSource = builder.mConfigDataSource;
             this.mCarrierId = builder.mCarrierId;
             this.mTriggeringEvent = builder.mTriggeringEvent;
+            this.mIsNtnOnlyCarrier = builder.mIsNtnOnlyCarrier;
         }
 
         public @SatelliteConstants.AccessControlType int getAccessControlType() {
@@ -2419,6 +2504,10 @@
             return mTriggeringEvent;
         }
 
+        public boolean isNtnOnlyCarrier() {
+            return mIsNtnOnlyCarrier;
+        }
+
         /**
          * A builder class to create {@link SatelliteAccessControllerParams} data structure class
          */
@@ -2435,6 +2524,7 @@
             private int mCarrierId = UNKNOWN_CARRIER_ID;
             private @SatelliteConstants.TriggeringEvent int mTriggeringEvent =
                     TRIGGERING_EVENT_UNKNOWN;
+            private boolean mIsNtnOnlyCarrier = false;
 
             /**
              * Sets AccessControlType value of {@link #SatelliteAccessController}
@@ -2510,6 +2600,15 @@
             }
 
             /**
+             * Sets isNtnOnlyCarrier value of {@link SatelliteAccessController} atom
+             * then returns Builder class
+            */
+            public Builder setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+                this.mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+                return this;
+            }
+
+            /**
              * Returns AccessControllerParams, which contains whole component of
              * {@link #SatelliteAccessController} atom
              */
@@ -2533,6 +2632,7 @@
                     + ", ConfigDataSource=" + mConfigDataSource
                     + ", CarrierId=" + mCarrierId
                     + ", TriggeringEvent=" + mTriggeringEvent
+                    + ", IsNtnOnlyCarrier=" + mIsNtnOnlyCarrier
                     + ")";
         }
     }
@@ -2614,6 +2714,7 @@
         proto.countOfAutoExitDueToScreenOff = param.getCountOfAutoExitDueToScreenOff();
         proto.countOfAutoExitDueToTnNetwork = param.getCountOfAutoExitDueToTnNetwork();
         proto.isEmergency = param.getIsEmergency();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
         mAtomsStorage.addSatelliteSessionStats(proto);
     }
 
@@ -2626,6 +2727,7 @@
         proto.datagramTransferTimeMillis = param.getDatagramTransferTimeMillis();
         proto.isDemoMode = param.getIsDemoMode();
         proto.carrierId = param.getCarrierId();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
         mAtomsStorage.addSatelliteIncomingDatagramStats(proto);
     }
 
@@ -2639,6 +2741,7 @@
         proto.datagramTransferTimeMillis = param.getDatagramTransferTimeMillis();
         proto.isDemoMode = param.getIsDemoMode();
         proto.carrierId = param.getCarrierId();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
         mAtomsStorage.addSatelliteOutgoingDatagramStats(proto);
     }
 
@@ -2650,6 +2753,7 @@
         proto.isProvisionRequest = param.getIsProvisionRequest();
         proto.isCanceled = param.getIsCanceled();
         proto.carrierId = param.getCarrierId();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
         mAtomsStorage.addSatelliteProvisionStats(proto);
     }
 
@@ -2666,6 +2770,7 @@
         proto.isSatelliteAllowedInCurrentLocation = param.isSatelliteAllowedInCurrentLocation();
         proto.isWifiConnected = param.isWifiConnected();
         proto.carrierId = param.getCarrierId();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
         proto.count = 1;
         mAtomsStorage.addSatelliteSosMessageRecommenderStats(proto);
     }
@@ -2745,6 +2850,7 @@
         proto.configDataSource = param.getConfigDataSource();
         proto.carrierId = param.getCarrierId();
         proto.triggeringEvent = param.getTriggeringEvent();
+        proto.isNtnOnlyCarrier = param.isNtnOnlyCarrier();
         mAtomsStorage.addSatelliteAccessControllerStats(proto);
     }
 }
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index c647bd1..2de820d 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -768,6 +768,7 @@
                         .setDatagramTransferTimeMillis(datagramTransmissionTime)
                         .setIsDemoMode(mIsDemoMode)
                         .setCarrierId(SatelliteController.getInstance().getSatelliteCarrierId())
+                        .setIsNtnOnlyCarrier(SatelliteController.getInstance().isNtnOnlyCarrier())
                         .build());
         if (resultCode == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
             mControllerMetricsStats.reportOutgoingDatagramSuccessCount(argument.datagramType,
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
index 75771d0..c01f10d 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
@@ -758,6 +758,7 @@
                         .setDatagramTransferTimeMillis(datagramTransferTime)
                         .setIsDemoMode(mIsDemoMode)
                         .setCarrierId(SatelliteController.getInstance().getSatelliteCarrierId())
+                        .setIsNtnOnlyCarrier(SatelliteController.getInstance().isNtnOnlyCarrier())
                         .build());
 
         mControllerMetricsStats.reportIncomingDatagramCount(resultCode, mIsDemoMode);
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index da1298a..e7f6cdf 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -2032,6 +2032,7 @@
                 mProvisionMetricsStats.setResultCode(error)
                         .setIsProvisionRequest(argument.mProvisioned)
                         .setCarrierId(getSatelliteCarrierId())
+                        .setIsNtnOnlyCarrier(isNtnOnlyCarrier())
                         .reportProvisionMetrics();
                 if (argument.mProvisioned) {
                     mControllerMetricsStats.reportProvisionCount(error);
@@ -4395,6 +4396,7 @@
                     .setResultCode(SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE)
                     .setIsProvisionRequest(true)
                     .setCarrierId(getSatelliteCarrierId())
+                    .setIsNtnOnlyCarrier(isNtnOnlyCarrier())
                     .reportProvisionMetrics();
             mControllerMetricsStats.reportProvisionCount(
                     SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE);
@@ -4414,6 +4416,7 @@
         mProvisionMetricsStats.setResultCode(result)
                 .setIsProvisionRequest(true)
                 .setCarrierId(getSatelliteCarrierId())
+                .setIsNtnOnlyCarrier(isNtnOnlyCarrier())
                 .reportProvisionMetrics();
         mControllerMetricsStats.reportProvisionCount(result);
     }
@@ -4444,6 +4447,7 @@
         mProvisionMetricsStats.setResultCode(result)
                 .setIsProvisionRequest(false)
                 .setCarrierId(getSatelliteCarrierId())
+                .setIsNtnOnlyCarrier(isNtnOnlyCarrier())
                 .reportProvisionMetrics();
         mControllerMetricsStats.reportDeprovisionCount(result);
     }
@@ -5960,11 +5964,21 @@
                 .setSatelliteTechnology(getSupportedNtnRadioTechnology())
                 .setIsDemoMode(mIsDemoModeEnabled)
                 .setCarrierId(getSatelliteCarrierId())
+                .setIsNtnOnlyCarrier(isNtnOnlyCarrier())
                 .reportSessionMetrics();
         mSessionStartTimeStamp = 0;
         mSessionProcessingTimeStamp = 0;
     }
 
+    public boolean isNtnOnlyCarrier() {
+        synchronized (mSatelliteTokenProvisionedLock) {
+            if (mSelectedSatelliteSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+                return false;
+            }
+            return mSelectedSatelliteSubId == getNtnOnlySubscriptionId();
+        }
+    }
+
     private void registerForServiceStateChanged() {
         if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
             return;
@@ -7423,10 +7437,7 @@
             } else {
                 logd("selectBindingSatelliteSubscription: Carrier ID is UNKNOWN_CARRIER_ID");
             }
-            synchronized (mSatelliteTokenProvisionedLock) {
-                mControllerMetricsStats.setIsNtnOnlyCarrier(
-                        mSelectedSatelliteSubId == getNtnOnlySubscriptionId());
-            }
+            mControllerMetricsStats.setIsNtnOnlyCarrier(isNtnOnlyCarrier());
         }
         plogd("selectBindingSatelliteSubscription: SelectedSatelliteSubId=" + selectedSubId);
         handleEventSelectedNbIotSatelliteSubscriptionChanged(selectedSubId);
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
index ea6dedd..fc79c49 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
@@ -445,7 +445,8 @@
                         .setRecommendingHandoverType(getEmergencyCallToSatelliteHandoverType())
                         .setIsSatelliteAllowedInCurrentLocation(isSatelliteAllowed())
                         .setIsWifiConnected(mCountryDetector.isWifiNetworkConnected())
-                        .setCarrierId(mSatelliteController.getSatelliteCarrierId()).build());
+                        .setCarrierId(mSatelliteController.getSatelliteCarrierId())
+                        .setIsNtnOnlyCarrier(mSatelliteController.isNtnOnlyCarrier()).build());
     }
 
     private void cleanUpResources(boolean isDialerNotified) {
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java
index 4333253..12de4ac 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java
@@ -47,6 +47,8 @@
     private @SatelliteConstants.ConfigDataSource int mConfigDataSource;
     private int mCarrierId;
     private @SatelliteConstants.TriggeringEvent int mTriggeringEvent;
+    private boolean mIsNtnOnlyCarrier;
+
     private AccessControllerMetricsStats() {
         initializeAccessControllerMetricsParam();
     }
@@ -77,6 +79,7 @@
         mConfigDataSource = CONFIG_DATA_SOURCE_UNKNOWN;
         mCarrierId = UNKNOWN_CARRIER_ID;
         mTriggeringEvent = TRIGGERING_EVENT_UNKNOWN;
+        mIsNtnOnlyCarrier = false;
     }
     /**
      * Sets the Access Control Type for current satellite enablement.
@@ -188,6 +191,16 @@
         return this;
     }
 
+    /**
+     * Sets the value of isNtnOnlyCarrier for current satellite enablement.
+     * @param isNtnOnlyCarrier {@code true} if the carrier is NTN only carrier.
+    */
+    public AccessControllerMetricsStats setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+        mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+        logd("setIsNtnOnlyCarrier: isNtnOnlyCarrier = " + mIsNtnOnlyCarrier);
+        return this;
+    }
+
     /** Report the access controller metrics atoms to PersistAtomsStorage in telephony. */
     public void reportAccessControllerMetrics() {
         SatelliteStats.SatelliteAccessControllerParams accessControllerParams =
@@ -203,6 +216,7 @@
                         .setConfigDatasource(mConfigDataSource)
                         .setCarrierId(mCarrierId)
                         .setTriggeringEvent(mTriggeringEvent)
+                        .setIsNtnOnlyCarrier(mIsNtnOnlyCarrier)
                         .build();
         logd("reportAccessControllerMetrics: " + accessControllerParams.toString());
         SatelliteStats.getInstance().onSatelliteAccessControllerMetrics(accessControllerParams);
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 c1ac689..e355078 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
@@ -39,6 +39,7 @@
     private boolean mIsProvisionRequest;
     private boolean mIsCanceled;
     private int mCarrierId;
+    private boolean mIsNtnOnlyCarrier;
 
     private ProvisionMetricsStats() {
         initializeProvisionParams();
@@ -88,6 +89,12 @@
         return this;
     }
 
+    /** Capture the latest provisioned state for satellite service */
+    public ProvisionMetricsStats setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+        mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+        return this;
+    }
+
     /** Report the provision metrics atoms to PersistAtomsStorage in telephony */
     public void reportProvisionMetrics() {
         SatelliteStats.SatelliteProvisionParams provisionParams =
@@ -98,6 +105,7 @@
                         .setIsProvisionRequest(mIsProvisionRequest)
                         .setIsCanceled(mIsCanceled)
                         .setCarrierId(mCarrierId)
+                        .setIsNtnOnlyCarrier(mIsNtnOnlyCarrier)
                         .build();
         SatelliteStats.getInstance().onSatelliteProvisionMetrics(provisionParams);
         logd("reportProvisionMetrics: " + provisionParams);
@@ -110,6 +118,7 @@
         mIsProvisionRequest = false;
         mIsCanceled = false;
         mCarrierId = UNKNOWN_CARRIER_ID;
+        mIsNtnOnlyCarrier = false;
     }
 
     private static void logd(@NonNull String 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 48674b0..c0f8cc1 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
@@ -62,6 +62,7 @@
     private int mCountOfAutoExitDueToScreenOff;
     private int mCountOfAutoExitDueToTnNetwork;
     private boolean mIsEmergency;
+    private boolean mIsNtnOnlyCarrier;
     private SatelliteSessionStats mDatagramStats;
 
     private SessionMetricsStats() {
@@ -267,6 +268,13 @@
         return this;
     }
 
+    /** Capture the latest provisioned state for satellite service */
+    public SessionMetricsStats setIsNtnOnlyCarrier(boolean isNtnOnlyCarrier) {
+        mIsNtnOnlyCarrier = isNtnOnlyCarrier;
+        logd("setIsNtnOnlyCarrier(" + mIsNtnOnlyCarrier + ")");
+        return this;
+    }
+
     /** Report the session metrics atoms to PersistAtomsStorage in telephony. */
     public void reportSessionMetrics() {
         SatelliteStats.SatelliteSessionParams sessionParams =
@@ -289,6 +297,7 @@
                         .setCountOfAutoExitDueToScreenOff(mCountOfAutoExitDueToScreenOff)
                         .setCountOfAutoExitDueToTnNetwork(mCountOfAutoExitDueToTnNetwork)
                         .setIsEmergency(mIsEmergency)
+                        .setIsNtnOnlyCarrier(mIsNtnOnlyCarrier)
                         .build();
         logd("reportSessionMetrics: " + sessionParams.toString());
         SatelliteStats.getInstance().onSatelliteSessionMetrics(sessionParams);
@@ -347,6 +356,7 @@
         mCountOfAutoExitDueToScreenOff = 0;
         mCountOfAutoExitDueToTnNetwork = 0;
         mIsEmergency = false;
+        mIsNtnOnlyCarrier = false;
     }
 
     public void resetSessionStatsShadowCounters() {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index c7c7748..a50565c 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -679,6 +679,8 @@
                 .when(mMockSessionMetricsStats).setIsDemoMode(anyBoolean());
         doReturn(mMockSessionMetricsStats)
                 .when(mMockSessionMetricsStats).setCarrierId(anyInt());
+        doReturn(mMockSessionMetricsStats)
+                .when(mMockSessionMetricsStats).setIsNtnOnlyCarrier(anyBoolean());
         doNothing().when(mMockSessionMetricsStats).reportSessionMetrics();
 
         doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
@@ -687,6 +689,8 @@
                 .setIsProvisionRequest(anyBoolean());
         doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
                 .setCarrierId(anyInt());
+        doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
+                .setIsNtnOnlyCarrier(anyBoolean());
         doNothing().when(mMockProvisionMetricsStats).reportProvisionMetrics();
         doNothing().when(mMockControllerMetricsStats).reportDeprovisionCount(anyInt());
         when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);