diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 02e18c5..219d1ff 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -126,6 +126,9 @@
     @ChecksSdkIntAtLeast(api = VERSION_CODES.TIRAMISU, codename = "T")
     public static final boolean ATLEAST_T = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU;
 
+    @ChecksSdkIntAtLeast(api = VERSION_CODES.UPSIDE_DOWN_CAKE, codename = "U")
+    public static final boolean ATLEAST_U = Build.VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE;
+
     /**
      * Set on a motion event dispatched from the nav bar. See {@link MotionEvent#setEdgeFlags(int)}.
      */
diff --git a/src/com/android/launcher3/model/StringCache.java b/src/com/android/launcher3/model/StringCache.java
index 9859ddc..8209043 100644
--- a/src/com/android/launcher3/model/StringCache.java
+++ b/src/com/android/launcher3/model/StringCache.java
@@ -18,6 +18,7 @@
 
 import android.annotation.SuppressLint;
 import android.app.admin.DevicePolicyManager;
+import android.app.admin.ManagedSubscriptionsPolicy;
 import android.content.Context;
 import android.os.Build;
 
@@ -26,6 +27,8 @@
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 
+import java.util.function.Supplier;
+
 /**
  *
  * Cache for the device policy strings used in Launcher.
@@ -192,7 +195,9 @@
         workProfilePausedTitle = getEnterpriseString(
                 context, WORK_PROFILE_PAUSED_TITLE, R.string.work_apps_paused_title);
         workProfilePausedDescription = getEnterpriseString(
-                context, WORK_PROFILE_PAUSED_DESCRIPTION, R.string.work_apps_paused_body);
+                context,
+                WORK_PROFILE_PAUSED_DESCRIPTION,
+                () -> getDefaultWorkProfilePausedDescriptionString(context));
         workProfilePauseButton = getEnterpriseString(
                 context, WORK_PROFILE_PAUSE_BUTTON, R.string.work_apps_pause_btn_text);
         workProfileEnableButton = getEnterpriseString(
@@ -216,20 +221,41 @@
                 context, DISABLED_BY_ADMIN_MESSAGE, R.string.msg_disabled_by_admin);
     }
 
+    private String getDefaultWorkProfilePausedDescriptionString(Context context) {
+        if (Utilities.ATLEAST_U) {
+            DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+            boolean telephonyIsUnavailable =
+                    dpm.getManagedSubscriptionsPolicy().getPolicyType()
+                            == ManagedSubscriptionsPolicy.TYPE_ALL_MANAGED_SUBSCRIPTIONS;
+            return telephonyIsUnavailable
+                    ? context.getString(R.string.work_apps_paused_telephony_unavailable_body)
+                    : context.getString(R.string.work_apps_paused_info_body);
+        }
+        return context.getString(R.string.work_apps_paused_body);
+    }
+
     @SuppressLint("NewApi")
     private String getEnterpriseString(
             Context context, String updatableStringId, int defaultStringId) {
+        return getEnterpriseString(
+                context,
+                updatableStringId,
+                () -> context.getString(defaultStringId));
+    }
+
+    @SuppressLint("NewApi")
+    private String getEnterpriseString(
+            Context context, String updateableStringId, Supplier<String> defaultStringSupplier) {
         return Utilities.ATLEAST_T
-                ? getUpdatableEnterpriseSting(context, updatableStringId, defaultStringId)
-                : context.getString(defaultStringId);
+                ? getUpdatableEnterpriseString(context, updateableStringId, defaultStringSupplier)
+                : defaultStringSupplier.get();
     }
 
     @RequiresApi(Build.VERSION_CODES.TIRAMISU)
-    private String getUpdatableEnterpriseSting(
-            Context context, String updatableStringId, int defaultStringId) {
+    private String getUpdatableEnterpriseString(
+            Context context, String updatableStringId, Supplier<String> defaultStringSupplier) {
         DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
-        return dpm.getResources().getString(
-                updatableStringId, () -> context.getString(defaultStringId));
+        return dpm.getResources().getString(updatableStringId, defaultStringSupplier);
     }
 
     @Override
