diff --git a/res/values/strings.xml b/res/values/strings.xml
index 408ba8c..8abd6be 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10142,6 +10142,9 @@
     <!-- Format for a summary describing the amount of data before the user is warned or limited [CHAR LIMIT=NONE] -->
     <string name="cell_data_warning_and_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data warning / <xliff:g name="amount" example="2 GB">^2</xliff:g> data limit</string>
 
+    <!-- A summary shown on data usage screens to indicate inaccuracy of data tracking [CHAR LIMIT=NONE] -->
+    <string name="operator_warning">Carrier data accounting may differ from device accounting</string>
+
     <!-- A summary shown on data usage screens to indicate data tracking excluded from carrier networks [CHAR LIMIT=NONE] -->
     <string name="non_carrier_data_usage_warning">Excludes data used by carrier networks</string>
 
diff --git a/res/xml/data_usage_list.xml b/res/xml/data_usage_list.xml
index 62456ed..292d729 100644
--- a/res/xml/data_usage_list.xml
+++ b/res/xml/data_usage_list.xml
@@ -27,8 +27,7 @@
             />
 
         <Preference
-            android:key="non_carrier_data_usage_warning"
-            android:summary="@string/non_carrier_data_usage_warning"
+            android:key="warning"
             android:selectable="false" />
 
     </PreferenceCategory>
diff --git a/src/com/android/settings/datausage/DataUsageList.kt b/src/com/android/settings/datausage/DataUsageList.kt
index 3083fb7..1995097 100644
--- a/src/com/android/settings/datausage/DataUsageList.kt
+++ b/src/com/android/settings/datausage/DataUsageList.kt
@@ -34,6 +34,7 @@
 import com.android.settings.datausage.lib.BillingCycleRepository
 import com.android.settings.datausage.lib.NetworkUsageData
 import com.android.settings.network.MobileNetworkRepository
+import com.android.settings.network.SubscriptionUtil
 import com.android.settings.network.mobileDataEnabledFlow
 import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity
 import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
@@ -95,6 +96,18 @@
         }
         chartDataUsagePreferenceController = use(ChartDataUsagePreferenceController::class.java)
             .apply { init(template) }
+
+        updateWarning()
+    }
+
+    private fun updateWarning() {
+        val template = template ?: return
+        val warningPreference = findPreference<Preference>(KEY_WARNING)!!
+        if (template.matchRule != NetworkTemplate.MATCH_WIFI) {
+            warningPreference.setSummary(R.string.operator_warning)
+        } else if (SubscriptionUtil.isSimHardwareVisible(context)) {
+            warningPreference.setSummary(R.string.non_carrier_data_usage_warning)
+        }
     }
 
     override fun onViewCreated(v: View, savedInstanceState: Bundle?) {
@@ -188,5 +201,8 @@
 
         private const val TAG = "DataUsageList"
         private const val KEY_USAGE_AMOUNT = "usage_amount"
+
+        @VisibleForTesting
+        const val KEY_WARNING = "warning"
     }
 }
diff --git a/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt b/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt
index 29ec0ee..7274eaa 100644
--- a/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt
+++ b/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt
@@ -26,8 +26,11 @@
 import androidx.fragment.app.testing.launchFragment
 import androidx.fragment.app.testing.withFragment
 import androidx.lifecycle.Lifecycle
+import androidx.preference.Preference
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.settings.datausage.DataUsageList.Companion.KEY_WARNING
 import com.android.settingslib.spaprivileged.framework.common.userManager
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
@@ -38,12 +41,14 @@
 import org.mockito.kotlin.spy
 import org.mockito.kotlin.stub
 
-private val mockUserManager: UserManager = mock<UserManager>()
+private val mockUserManager = mock<UserManager>()
 
-private val mockContext: Context = spy(ApplicationProvider.getApplicationContext()) {
+private val spyContext: Context = spy(ApplicationProvider.getApplicationContext()) {
     on { userManager } doReturn mockUserManager
 }
 
+private val spyResources = spy(spyContext.resources)
+
 private var fakeIntent = Intent()
 
 @RunWith(AndroidJUnit4::class)
@@ -51,6 +56,9 @@
 
     @Before
     fun setUp() {
+        spyContext.stub {
+            on { resources } doReturn spyResources
+        }
         mockUserManager.stub {
             on { isGuestUser } doReturn false
         }
@@ -122,10 +130,60 @@
             assertThat(activity!!.isFinishing).isFalse()
         }
     }
+
+    @Test
+    fun warning_wifiAndHasSim_displayNonCarrierWarning() {
+        val template = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build()
+        spyResources.stub {
+            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
+        }
+        fakeIntent = Intent().apply {
+            putExtra(Settings.EXTRA_NETWORK_TEMPLATE, template)
+        }
+
+        val scenario = launchFragment<TestDataUsageList>(initialState = Lifecycle.State.CREATED)
+
+        scenario.withFragment {
+            assertThat(findPreference<Preference>(KEY_WARNING)!!.summary)
+                .isEqualTo(context.getString(R.string.non_carrier_data_usage_warning))
+        }
+    }
+
+    @Test
+    fun warning_wifiAndNoSim_noWarning() {
+        val template = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build()
+        spyResources.stub {
+            on { getBoolean(R.bool.config_show_sim_info) } doReturn false
+        }
+        fakeIntent = Intent().apply {
+            putExtra(Settings.EXTRA_NETWORK_TEMPLATE, template)
+        }
+
+        val scenario = launchFragment<TestDataUsageList>(initialState = Lifecycle.State.CREATED)
+
+        scenario.withFragment {
+            assertThat(findPreference<Preference>(KEY_WARNING)!!.summary).isNull()
+        }
+    }
+
+    @Test
+    fun warning_mobile_operatorWarning() {
+        val template = NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).build()
+        fakeIntent = Intent().apply {
+            putExtra(Settings.EXTRA_NETWORK_TEMPLATE, template)
+        }
+
+        val scenario = launchFragment<TestDataUsageList>(initialState = Lifecycle.State.CREATED)
+
+        scenario.withFragment {
+            assertThat(findPreference<Preference>(KEY_WARNING)!!.summary)
+                .isEqualTo(context.getString(R.string.operator_warning))
+        }
+    }
 }
 
 class TestDataUsageList : DataUsageList() {
-    override fun getContext() = mockContext
+    override fun getContext() = spyContext
 
     override fun getIntent() = fakeIntent
 }
