diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
index 8531b507a92fdd0e8550fe4708f82c2d74b9cbb8..6482432f4049c25ee7c91cf8e446b7fbb44f028d 100644
--- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
@@ -33,6 +33,7 @@ import android.util.ArrayMap;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.Flags;
 import com.android.internal.telephony.util.TelephonyUtils;
 
 import java.util.ArrayList;
@@ -41,7 +42,7 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * Utilities for handling carrier applications.
+ * Utilities to control the states of the system bundled (preinstalled) carrier applications.
  * @hide
  */
 public final class CarrierAppUtils {
@@ -246,17 +247,27 @@ public final class CarrierAppUtils {
                     // Always re-grant default permissions to carrier apps w/ privileges.
                     enabledCarrierPackages.add(ai.packageName);
                 } else {  // No carrier privileges
-                    // Only update enabled state for the app on /system. Once it has been
-                    // updated we shouldn't touch it.
-                    if (!isUpdatedSystemApp(ai) && enabledSetting
-                            == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
-                            && (ai.flags & ApplicationInfo.FLAG_INSTALLED) != 0) {
-                        Log.i(TAG, "Update state (" + packageName
-                                + "): DISABLED_UNTIL_USED for user " + userId);
-                        context.createContextAsUser(UserHandle.of(userId), 0)
-                                .getPackageManager()
-                                .setSystemAppState(
-                                        packageName, PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
+                    // Only uninstall system carrier apps that fulfill ALL conditions below:
+                    // 1. It has no carrier privileges
+                    // 2. It has never been uninstalled before (i.e. we uninstall at most once)
+                    // 3. It has not been installed as an update from its system built-in version
+                    // 4. It is in default state (not explicitly DISABLED/DISABLED_BY_USER/ENABLED)
+                    // 5. It is currently installed for the calling user
+                    // TODO(b/329739019):
+                    // 1. Merge the nested if conditions below during flag cleaning up phase
+                    // 2. Support user case that NEW carrier app is added during OTA, when emerge.
+                    if (!Flags.hidePreinstalledCarrierAppAtMostOnce() || !hasRunEver) {
+                        if (!isUpdatedSystemApp(ai) && enabledSetting
+                                == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+                                && (ai.flags & ApplicationInfo.FLAG_INSTALLED) != 0) {
+                            Log.i(TAG, "Update state (" + packageName
+                                    + "): DISABLED_UNTIL_USED for user " + userId);
+                            context.createContextAsUser(UserHandle.of(userId), 0)
+                                    .getPackageManager()
+                                    .setSystemAppState(
+                                            packageName,
+                                            PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
+                        }
                     }
 
                     // Associated apps are more brittle, because we can't rely on the distinction