diff --git a/src/com/android/settings/network/telephony/SatelliteSetting.java b/src/com/android/settings/network/telephony/SatelliteSetting.java
index a6e2f82..52957d9 100644
--- a/src/com/android/settings/network/telephony/SatelliteSetting.java
+++ b/src/com/android/settings/network/telephony/SatelliteSetting.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.network.telephony;
 
+import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC;
+import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL;
+import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT;
 import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL;
 import static android.telephony.CarrierConfigManager.KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING;
 
@@ -68,14 +71,15 @@
 
     static final String SUB_ID = "sub_id";
     static final String EXTRA_IS_SERVICE_DATA_TYPE = "is_service_data_type";
+    static final String EXTRA_IS_SMS_AVAILABLE_FOR_MANUAL_TYPE = "is_sms_available";
 
     private Activity mActivity;
-    private CarrierConfigManager mCarrierConfigManager;
     private SatelliteManager mSatelliteManager;
     private PersistableBundle mConfigBundle;
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     private String mSimOperatorName = "";
     private boolean mIsServiceDataType = false;
+    private boolean mIsSmsAvailableForManualType = false;
 
     public SatelliteSetting() {
         super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
@@ -108,8 +112,8 @@
 
         mSubId = mActivity.getIntent().getIntExtra(SUB_ID,
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        mConfigBundle = fetchCarrierConfigData(mSubId);
 
-        mCarrierConfigManager = mActivity.getSystemService(CarrierConfigManager.class);
         if (!isSatelliteAttachSupported(mSubId)) {
             Log.d(TAG, "SatelliteSettings: KEY_SATELLITE_ATTACH_SUPPORTED_BOOL is false, "
                     + "do nothing.");
@@ -118,6 +122,8 @@
         }
 
         mIsServiceDataType = getIntent().getBooleanExtra(EXTRA_IS_SERVICE_DATA_TYPE, false);
+        mIsSmsAvailableForManualType = getIntent().getBooleanExtra(
+                EXTRA_IS_SMS_AVAILABLE_FOR_MANUAL_TYPE, false);
         mSimOperatorName = getSystemService(TelephonyManager.class).getSimOperatorName(mSubId);
     }
 
@@ -171,11 +177,13 @@
                the check icon with guidance that satellite is included in user's mobile plan */
             messagingPreference.setTitle(R.string.title_have_satellite_plan);
             if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) {
-                Preference connectivityPreference = findPreference(
-                        PREF_KEY_YOUR_SATELLITE_DATA_PLAN);
-                connectivityPreference.setTitle(R.string.title_have_satellite_data_plan);
-                connectivityPreference.setIcon(icon);
-                connectivityPreference.setVisible(true);
+                if (mIsServiceDataType) {
+                    Preference connectivityPreference = findPreference(
+                            PREF_KEY_YOUR_SATELLITE_DATA_PLAN);
+                    connectivityPreference.setTitle(R.string.title_have_satellite_data_plan);
+                    connectivityPreference.setIcon(icon);
+                    connectivityPreference.setVisible(true);
+                }
             }
         } else {
             /* Or, it will show the blocked icon with the guidance that satellite is not included
@@ -191,7 +199,7 @@
             messagingPreference.setSummary(spannable);
             /* The link will lead users to a guide page */
             messagingPreference.setOnPreferenceClickListener(pref -> {
-                String url = readSatelliteMoreInfoString(mSubId);
+                String url = readSatelliteMoreInfoString();
                 if (!url.isEmpty()) {
                     Uri uri = Uri.parse(url);
                     Intent intent = new Intent(Intent.ACTION_VIEW, uri);
@@ -224,7 +232,7 @@
                             getSubjectString(), mSimOperatorName));
 
             final String[] link = new String[1];
-            link[0] = readSatelliteMoreInfoString(mSubId);
+            link[0] = readSatelliteMoreInfoString();
             if (link[0] != null && !link[0].isEmpty()) {
                 footerPreference.setLearnMoreAction(view -> {
                     if (!link[0].isEmpty()) {
@@ -243,6 +251,9 @@
     }
 
     private boolean isSatelliteEligible() {
+        if (isCarrierRoamingNtnConnectedTypeManual()) {
+            return mIsSmsAvailableForManualType;
+        }
         try {
             Set<Integer> restrictionReason =
                     mSatelliteManager.getAttachRestrictionReasonsForCarrier(mSubId);
@@ -254,26 +265,37 @@
         }
     }
 
-    private String readSatelliteMoreInfoString(int subId) {
-        if (mConfigBundle == null) {
-            mConfigBundle = mCarrierConfigManager.getConfigForSubId(subId,
-                    KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING);
-            if (mConfigBundle.isEmpty()) {
+    private PersistableBundle fetchCarrierConfigData(int subId) {
+        CarrierConfigManager carrierConfigManager = mActivity.getSystemService(
+                CarrierConfigManager.class);
+        PersistableBundle bundle = CarrierConfigManager.getDefaultConfig();
+        try {
+            bundle = carrierConfigManager.getConfigForSubId(subId,
+                    KEY_SATELLITE_ATTACH_SUPPORTED_BOOL,
+                    KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING,
+                    KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT);
+            if (bundle.isEmpty()) {
                 Log.d(TAG, "SatelliteSettings: getDefaultConfig");
-                mConfigBundle = CarrierConfigManager.getDefaultConfig();
+                bundle = CarrierConfigManager.getDefaultConfig();
             }
+        } catch (IllegalStateException exception) {
+            Log.d(TAG, "SatelliteSettings exception : " + exception);
         }
+        return bundle;
+    }
+
+    private String readSatelliteMoreInfoString() {
         return mConfigBundle.getString(KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING, "");
     }
 
+    private boolean isCarrierRoamingNtnConnectedTypeManual() {
+        return CARRIER_ROAMING_NTN_CONNECT_MANUAL == mConfigBundle.getInt(
+                KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC);
+    }
+
     private boolean isSatelliteAttachSupported(int subId) {
-        PersistableBundle bundle = mCarrierConfigManager.getConfigForSubId(subId,
-                KEY_SATELLITE_ATTACH_SUPPORTED_BOOL);
-        if (bundle.isEmpty()) {
-            Log.d(TAG, "SatelliteSettings: getDefaultConfig");
-            bundle = CarrierConfigManager.getDefaultConfig();
-        }
-        return bundle.getBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, false);
+
+        return mConfigBundle.getBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, false);
     }
 
     // This is for a word which first letter is uppercase. e.g. Satellite messaging.
diff --git a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java
index 017d478..b84c780 100644
--- a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.network.telephony;
 
+import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC;
+import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL;
+import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT;
+import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL;
 import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_DATA;
 import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_SMS;
 
@@ -23,7 +27,6 @@
 import android.content.Intent;
 import android.os.PersistableBundle;
 import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.telephony.satellite.NtnSignalStrength;
@@ -53,17 +56,18 @@
 public class SatelliteSettingPreferenceController extends
         TelephonyBasePreferenceController implements DefaultLifecycleObserver {
     private static final String TAG = "SatelliteSettingPreferenceController";
-
-    CarrierConfigCache mCarrierConfigCache;
-    SatelliteManager mSatelliteManager;
-    private TelephonyManager mTelephonyManager = null;
     @VisibleForTesting
     final CarrierRoamingNtnModeCallback mCarrierRoamingNtnModeCallback =
             new CarrierRoamingNtnModeCallback();
-
+    CarrierConfigCache mCarrierConfigCache;
+    SatelliteManager mSatelliteManager;
+    private TelephonyManager mTelephonyManager = null;
     @Nullable
     private Boolean mIsSatelliteEligible = null;
     private boolean mIsServiceDataType = false;
+    private boolean mIsSatelliteSmsAvailableForManualType = false;
+    private boolean mIsCarrierSatelliteAttachSupported = false;
+    private boolean mIsCarrierRoamingNtnConnectedTypeManual = false;
 
     public SatelliteSettingPreferenceController(@NonNull Context context, @NonNull String key) {
         super(context, key);
@@ -72,6 +76,14 @@
         mTelephonyManager = context.getSystemService(TelephonyManager.class);
     }
 
+    private static void logd(String message) {
+        Log.d(TAG, message);
+    }
+
+    private static void loge(String message) {
+        Log.e(TAG, message);
+    }
+
     @Override
     public int getAvailabilityStatus(int subId) {
         if (!Flags.carrierEnabledSatelliteFlag()) {
@@ -83,11 +95,7 @@
             return UNSUPPORTED_ON_DEVICE;
         }
 
-        final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId);
-        final boolean isSatelliteAttachSupported = carrierConfig.getBoolean(
-                CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL);
-
-        return isSatelliteAttachSupported ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+        return mIsCarrierSatelliteAttachSupported ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
     }
 
     @Override
@@ -130,6 +138,8 @@
             intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, true);
             intent.putExtra(SatelliteSetting.SUB_ID, mSubId);
             intent.putExtra(SatelliteSetting.EXTRA_IS_SERVICE_DATA_TYPE, mIsServiceDataType);
+            intent.putExtra(SatelliteSetting.EXTRA_IS_SMS_AVAILABLE_FOR_MANUAL_TYPE,
+                    mIsSatelliteSmsAvailableForManualType);
             mContext.startActivity(intent);
             return true;
         }
@@ -146,39 +156,54 @@
         logd("init(), subId=" + subId);
         mSubId = subId;
         mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId);
+
+        final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId);
+        if (carrierConfig == null) {
+            logd("init(), no carrier config data");
+            return;
+        }
+        mIsCarrierSatelliteAttachSupported = carrierConfig.getBoolean(
+                KEY_SATELLITE_ATTACH_SUPPORTED_BOOL);
+        mIsCarrierRoamingNtnConnectedTypeManual =
+                CARRIER_ROAMING_NTN_CONNECT_MANUAL == carrierConfig.getInt(
+                        KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT,
+                        CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC);
     }
 
     private void updateSummary(Preference preference) {
+        if (preference == null) {
+            logd("updateSummary - no Preference");
+            return;
+        }
         if (mSatelliteManager == null) {
             logd("updateSummary - no SatelliteManager");
             return;
         }
-        try {
-            Set<Integer> restrictionReason =
-                    mSatelliteManager.getAttachRestrictionReasonsForCarrier(mSubId);
-            boolean isSatelliteEligible = !restrictionReason.contains(
-                    SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_ENTITLEMENT);
-            if (mIsSatelliteEligible == null || mIsSatelliteEligible != isSatelliteEligible) {
-                mIsSatelliteEligible = isSatelliteEligible;
-                String summary = mContext.getString(
-                        mIsSatelliteEligible ? R.string.satellite_setting_enabled_summary
-                                : R.string.satellite_setting_disabled_summary);
-                preference.setSummary(summary);
+
+        if (mIsCarrierRoamingNtnConnectedTypeManual) {
+            preference.setSummary(mIsSatelliteSmsAvailableForManualType
+                    ? R.string.satellite_setting_enabled_summary
+                    : R.string.satellite_setting_disabled_summary);
+        } else {
+            try {
+                Set<Integer> restrictionReason =
+                        mSatelliteManager.getAttachRestrictionReasonsForCarrier(mSubId);
+                boolean isSatelliteEligible = !restrictionReason.contains(
+                        SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_ENTITLEMENT);
+                if (mIsSatelliteEligible == null || mIsSatelliteEligible != isSatelliteEligible) {
+                    mIsSatelliteEligible = isSatelliteEligible;
+                    String summary = mContext.getString(
+                            mIsSatelliteEligible ? R.string.satellite_setting_enabled_summary
+                                    : R.string.satellite_setting_disabled_summary);
+                    preference.setSummary(summary);
+                }
+            } catch (SecurityException | IllegalStateException | IllegalArgumentException ex) {
+                loge(ex.toString());
+                preference.setSummary(R.string.satellite_setting_disabled_summary);
             }
-        } catch (SecurityException | IllegalStateException | IllegalArgumentException ex) {
-            loge(ex.toString());
-            preference.setSummary(R.string.satellite_setting_disabled_summary);
         }
     }
 
-    private static void logd(String message) {
-        Log.d(TAG, message);
-    }
-
-    private static void loge(String message) {
-        Log.e(TAG, message);
-    }
-
     @VisibleForTesting
     class CarrierRoamingNtnModeCallback extends TelephonyCallback implements
             TelephonyCallback.CarrierRoamingNtnModeListener {
@@ -197,12 +222,11 @@
                 logd("Satellite preference is not initialized yet");
                 return;
             }
-            if (isDataAvailable) {
-                mIsServiceDataType = true;
-                mPref.setTitle(R.string.title_satellite_setting_connectivity);
-            } else if (isSmsAvailable) {
-                mPref.setTitle(R.string.satellite_setting_title);
-            }
+            mIsServiceDataType = isDataAvailable;
+            mIsSatelliteSmsAvailableForManualType = isSmsAvailable;
+            mPref.setTitle(isDataAvailable ? R.string.title_satellite_setting_connectivity
+                    : R.string.satellite_setting_title);
+            updateSummary(mPref);
         }
 
         @Override
