Merge 25Q1 (ab/BP1A.250305.020) to AOSP main

Bug: 385190204
Merged-In: Icaf5f09913292d86db2a3e0fc8457aad4cff740a
Change-Id: Ib3488fcca8d6594987f1e573e02fe63f650e9f9a
diff --git a/TEST_MAPPING b/TEST_MAPPING
index ad814c8..d1cf886 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,7 +1,7 @@
 {
   "cellbroadcast-mainline-presubmit": [
     {
-      "name": "GoogleCellBroadcastReceiverUnitTests",
+      "name": "CellBroadcastReceiverMTS",
       "options": [
         {
           "exclude-annotation": "androidx.test.filters.FlakyTest"
@@ -11,7 +11,7 @@
   ],
   "mainline-presubmit": [
     {
-      "name": "GoogleCellBroadcastReceiverUnitTests[com.google.android.cellbroadcast.apex]",
+      "name": "CellBroadcastReceiverMTS[com.google.android.cellbroadcast.apex]",
       "options": [
         {
           "exclude-annotation": "androidx.test.filters.FlakyTest"
@@ -30,7 +30,7 @@
       "keywords": ["internal"]
     },
     {
-      "name": "GoogleCellBroadcastReceiverUnitTests",
+      "name": "CellBroadcastReceiverMTS",
       "options": [
         {
           "exclude-annotation": "androidx.test.filters.FlakyTest"
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index fe1d1f5..569bed0 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -105,7 +105,7 @@
     <string name="cmas_category_heading" msgid="3923503130776640717">"Categoría de la alerta:"</string>
     <string name="cmas_category_geo" msgid="4979494217069688527">"Geofísicas"</string>
     <string name="cmas_category_met" msgid="7563732573851773537">"Meteorológicas"</string>
-    <string name="cmas_category_safety" msgid="2986472639641883453">"Seguridad"</string>
+    <string name="cmas_category_safety" msgid="2986472639641883453">"Emergencias"</string>
     <string name="cmas_category_security" msgid="2549520159044403704">"Seguridad"</string>
     <string name="cmas_category_rescue" msgid="4907571719983321086">"Rescates"</string>
     <string name="cmas_category_fire" msgid="3331981591918341119">"Incendios"</string>
diff --git a/res/values-mcc234-iw/strings.xml b/res/values-mcc234-iw/strings.xml
index 9406d8e..ef183d5 100644
--- a/res/values-mcc234-iw/strings.xml
+++ b/res/values-mcc234-iw/strings.xml
@@ -36,5 +36,5 @@
     <string name="enable_cmas_test_alerts_summary" msgid="2931455154355509465">"קבלת התראות בדיקה ממערכת ההתראה על מקרה חירום"</string>
     <string name="cmas_opt_out_dialog_text" msgid="1972978578760513449">"ההגדרה שלך עכשיו היא לקבל התרעות על מקרי חירום. האם ברצונך להמשיך לקבל התרעות על מקרי חירום?"</string>
     <string name="emergency_alert_settings_title_watches" msgid="5299419351642118203">"התרעות על מצב חירום"</string>
-    <string name="notification_cb_settings_changed_text" msgid="6861845802821634203">"יש להקיש כדי לראות את ההגדרות של ההתרעות על מקרי חירום"</string>
+    <string name="notification_cb_settings_changed_text" msgid="6861845802821634203">"יש ללחוץ כדי לראות את ההגדרות של ההתרעות על מקרי חירום"</string>
 </resources>
diff --git a/res/values-mcc270-en-rAU/strings.xml b/res/values-mcc270-en-rAU/strings.xml
index bc799db..cc8e5ab 100644
--- a/res/values-mcc270-en-rAU/strings.xml
+++ b/res/values-mcc270-en-rAU/strings.xml
@@ -16,17 +16,17 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="cmas_presidential_level_alert" msgid="6712775293264329163">"LU-alert"</string>
-    <string name="cmas_extreme_alert" msgid="5707699462404036561">"LU-alert"</string>
-    <string name="cmas_severe_alert" msgid="3403847334974558596">"LU-alert"</string>
-    <string name="public_safety_message" msgid="7178887441252495779">"LU-alert"</string>
-    <string name="cmas_amber_alert" msgid="1934668428381380827">"LU-alert: Kidnapping alert"</string>
-    <string name="cmas_required_monthly_test" msgid="7364077592345886483">"LU-alert test"</string>
-    <string name="cmas_exercise_alert" msgid="8651116593061990582">"LU-alert exercise"</string>
+    <string name="cmas_presidential_level_alert" msgid="6712775293264329163">"LU-Alert"</string>
+    <string name="cmas_extreme_alert" msgid="5707699462404036561">"LU-Alert"</string>
+    <string name="cmas_severe_alert" msgid="3403847334974558596">"LU-Alert"</string>
+    <string name="public_safety_message" msgid="7178887441252495779">"LU-Alert"</string>
+    <string name="cmas_amber_alert" msgid="1934668428381380827">"LU-Alert: Kidnapping alert"</string>
+    <string name="cmas_required_monthly_test" msgid="7364077592345886483">"LU-Alert Test"</string>
+    <string name="cmas_exercise_alert" msgid="8651116593061990582">"LU-Alert Exercise"</string>
     <string name="enable_cmas_amber_alerts_title" msgid="3426998226619316792">"Kidnapping alert"</string>
     <string name="enable_cmas_amber_alerts_summary" msgid="5532453981233187282">"Show alert messages for child abductions"</string>
-    <string name="enable_cmas_test_alerts_title" msgid="6503578245169569633">"LU-alert test"</string>
+    <string name="enable_cmas_test_alerts_title" msgid="6503578245169569633">"LU-Alert Test"</string>
     <string name="enable_cmas_test_alerts_summary" msgid="4393658967042119261">"Show test messages"</string>
-    <string name="enable_exercise_test_alerts_title" msgid="8642537980920870855">"LU-alert exercise"</string>
+    <string name="enable_exercise_test_alerts_title" msgid="8642537980920870855">"LU-Alert Exercise"</string>
     <string name="enable_exercise_test_alerts_summary" msgid="7365706865492962183">"Show exercise messages"</string>
 </resources>
diff --git a/res/values-mcc270-en-rGB/strings.xml b/res/values-mcc270-en-rGB/strings.xml
index bc799db..cc8e5ab 100644
--- a/res/values-mcc270-en-rGB/strings.xml
+++ b/res/values-mcc270-en-rGB/strings.xml
@@ -16,17 +16,17 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="cmas_presidential_level_alert" msgid="6712775293264329163">"LU-alert"</string>
-    <string name="cmas_extreme_alert" msgid="5707699462404036561">"LU-alert"</string>
-    <string name="cmas_severe_alert" msgid="3403847334974558596">"LU-alert"</string>
-    <string name="public_safety_message" msgid="7178887441252495779">"LU-alert"</string>
-    <string name="cmas_amber_alert" msgid="1934668428381380827">"LU-alert: Kidnapping alert"</string>
-    <string name="cmas_required_monthly_test" msgid="7364077592345886483">"LU-alert test"</string>
-    <string name="cmas_exercise_alert" msgid="8651116593061990582">"LU-alert exercise"</string>
+    <string name="cmas_presidential_level_alert" msgid="6712775293264329163">"LU-Alert"</string>
+    <string name="cmas_extreme_alert" msgid="5707699462404036561">"LU-Alert"</string>
+    <string name="cmas_severe_alert" msgid="3403847334974558596">"LU-Alert"</string>
+    <string name="public_safety_message" msgid="7178887441252495779">"LU-Alert"</string>
+    <string name="cmas_amber_alert" msgid="1934668428381380827">"LU-Alert: Kidnapping alert"</string>
+    <string name="cmas_required_monthly_test" msgid="7364077592345886483">"LU-Alert Test"</string>
+    <string name="cmas_exercise_alert" msgid="8651116593061990582">"LU-Alert Exercise"</string>
     <string name="enable_cmas_amber_alerts_title" msgid="3426998226619316792">"Kidnapping alert"</string>
     <string name="enable_cmas_amber_alerts_summary" msgid="5532453981233187282">"Show alert messages for child abductions"</string>
-    <string name="enable_cmas_test_alerts_title" msgid="6503578245169569633">"LU-alert test"</string>
+    <string name="enable_cmas_test_alerts_title" msgid="6503578245169569633">"LU-Alert Test"</string>
     <string name="enable_cmas_test_alerts_summary" msgid="4393658967042119261">"Show test messages"</string>
-    <string name="enable_exercise_test_alerts_title" msgid="8642537980920870855">"LU-alert exercise"</string>
+    <string name="enable_exercise_test_alerts_title" msgid="8642537980920870855">"LU-Alert Exercise"</string>
     <string name="enable_exercise_test_alerts_summary" msgid="7365706865492962183">"Show exercise messages"</string>
 </resources>
diff --git a/res/values-mcc270-en-rIN/strings.xml b/res/values-mcc270-en-rIN/strings.xml
index bc799db..cc8e5ab 100644
--- a/res/values-mcc270-en-rIN/strings.xml
+++ b/res/values-mcc270-en-rIN/strings.xml
@@ -16,17 +16,17 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="cmas_presidential_level_alert" msgid="6712775293264329163">"LU-alert"</string>
-    <string name="cmas_extreme_alert" msgid="5707699462404036561">"LU-alert"</string>
-    <string name="cmas_severe_alert" msgid="3403847334974558596">"LU-alert"</string>
-    <string name="public_safety_message" msgid="7178887441252495779">"LU-alert"</string>
-    <string name="cmas_amber_alert" msgid="1934668428381380827">"LU-alert: Kidnapping alert"</string>
-    <string name="cmas_required_monthly_test" msgid="7364077592345886483">"LU-alert test"</string>
-    <string name="cmas_exercise_alert" msgid="8651116593061990582">"LU-alert exercise"</string>
+    <string name="cmas_presidential_level_alert" msgid="6712775293264329163">"LU-Alert"</string>
+    <string name="cmas_extreme_alert" msgid="5707699462404036561">"LU-Alert"</string>
+    <string name="cmas_severe_alert" msgid="3403847334974558596">"LU-Alert"</string>
+    <string name="public_safety_message" msgid="7178887441252495779">"LU-Alert"</string>
+    <string name="cmas_amber_alert" msgid="1934668428381380827">"LU-Alert: Kidnapping alert"</string>
+    <string name="cmas_required_monthly_test" msgid="7364077592345886483">"LU-Alert Test"</string>
+    <string name="cmas_exercise_alert" msgid="8651116593061990582">"LU-Alert Exercise"</string>
     <string name="enable_cmas_amber_alerts_title" msgid="3426998226619316792">"Kidnapping alert"</string>
     <string name="enable_cmas_amber_alerts_summary" msgid="5532453981233187282">"Show alert messages for child abductions"</string>
-    <string name="enable_cmas_test_alerts_title" msgid="6503578245169569633">"LU-alert test"</string>
+    <string name="enable_cmas_test_alerts_title" msgid="6503578245169569633">"LU-Alert Test"</string>
     <string name="enable_cmas_test_alerts_summary" msgid="4393658967042119261">"Show test messages"</string>
-    <string name="enable_exercise_test_alerts_title" msgid="8642537980920870855">"LU-alert exercise"</string>
+    <string name="enable_exercise_test_alerts_title" msgid="8642537980920870855">"LU-Alert Exercise"</string>
     <string name="enable_exercise_test_alerts_summary" msgid="7365706865492962183">"Show exercise messages"</string>
 </resources>
diff --git a/res/values-mcc310-kn/strings.xml b/res/values-mcc310-kn/strings.xml
index 31006ef..c37d289 100644
--- a/res/values-mcc310-kn/strings.xml
+++ b/res/values-mcc310-kn/strings.xml
@@ -21,8 +21,8 @@
     <string name="emergency_alert_settings_title_watches" msgid="5702555089013313773">"ವೈರ್‌ಲೆಸ್ ತುರ್ತು ಅಲರ್ಟ್‌ಗಳು"</string>
     <string name="receive_cmas_in_second_language_title" msgid="7539080017840218665">"ಸ್ಪ್ಯಾನಿಶ್"</string>
     <string name="receive_cmas_in_second_language_summary" msgid="4482209573334686904">"ಸಾಧ್ಯವಾದಾಗ ಸ್ಪ್ಯಾನಿಶ್ ಭಾಷೆಯಲ್ಲಿ ತುರ್ತು ಎಚ್ಚರಿಕೆಗಳನ್ನು ಸ್ವೀಕರಿಸಿ"</string>
-    <string name="confirm_delete_broadcast" msgid="6808374217554967811">"ಈ ಅಲರ್ಟ್ ಅನ್ನು ಅಳಿಸುವುದೇ?"</string>
-    <string name="confirm_delete_all_broadcasts" msgid="4748571670736214158">"ಸ್ವೀಕರಿಸಿದ ಎಲ್ಲಾ ಅಲರ್ಟ್‌ಗಳನ್ನು ಅಳಿಸುವುದೇ?"</string>
+    <string name="confirm_delete_broadcast" msgid="6808374217554967811">"ಈ ಅಲರ್ಟ್ ಅನ್ನು ಅಳಿಸಬೇಕೆ?"</string>
+    <string name="confirm_delete_all_broadcasts" msgid="4748571670736214158">"ಸ್ವೀಕರಿಸಿದ ಎಲ್ಲಾ ಅಲರ್ಟ್‌ಗಳನ್ನು ಅಳಿಸಬೇಕೆ?"</string>
     <string name="menu_delete" msgid="2691868773984777519">"ಅಲರ್ಟ್ ಅನ್ನು ಅಳಿಸಿ"</string>
     <string name="menu_delete_all" msgid="8991615021908376216">"ಅಲರ್ಟ್‌ಗಳನ್ನು ಅಳಿಸಿ"</string>
     <!-- no translation found for enable_cmas_test_alerts_title (3722503121618497385) -->
diff --git a/res/values-mcc334/config.xml b/res/values-mcc334/config.xml
index 8782f11..4b23f02 100644
--- a/res/values-mcc334/config.xml
+++ b/res/values-mcc334/config.xml
@@ -17,50 +17,50 @@
 <resources>
     <!-- Channel 4370, 4383, 919 -->
     <string-array name="cmas_presidential_alerts_channels_range_strings" translatable="false">
-        <item>0x1112:rat=gsm, emergency=true, alert_duration=8000, always_on=true</item>
-        <item>0x111F:rat=gsm, emergency=true, alert_duration=8000, always_on=true</item>
+        <item>0x1112:rat=gsm, emergency=true, always_on=true</item>
+        <item>0x111F:rat=gsm, emergency=true, always_on=true</item>
         <!-- Channel 919 is the secondary channel for level 1-3, following the highest level config -->
-        <item>0x397:rat=gsm, emergency=true, alert_duration=8000, always_on=true</item>
+        <item>0x397:rat=gsm, emergency=true, always_on=true</item>
     </string-array>
 
     <!-- 4371~4372, 4384~4385 -->
     <string-array name="cmas_alert_extreme_channels_range_strings" translatable="false">
-        <item>0x1113-0x1114:rat=gsm, alert_duration=8000, emergency=true</item>
-        <item>0x1120-0x1121:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x1113-0x1114:rat=gsm, emergency=true</item>
+        <item>0x1120-0x1121:rat=gsm, emergency=true</item>
     </string-array>
 
     <!-- 4373~4378, 4386~4391 -->
     <string-array name="cmas_alerts_severe_range_strings" translatable="false">
-        <item>0x1115-0x111A:rat=gsm, alert_duration=8000, emergency=true</item>
-        <item>0x1122-0x1127:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x1115-0x111A:rat=gsm, emergency=true</item>
+        <item>0x1122-0x1127:rat=gsm, emergency=true</item>
     </string-array>
 
     <!-- 4379 -->
     <string-array name="cmas_amber_alerts_channels_range_strings" translatable="false">
-        <item>0x111B:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x111B:rat=gsm, emergency=true</item>
     </string-array>
 
     <!-- 4380, 519 -->
     <string-array name="required_monthly_test_range_strings" translatable="false">
-        <item>0x111C:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x111C:rat=gsm, emergency=true</item>
         <!-- Channel 519 is the secondary channel for test and exercise alert -->
-        <item>0x207:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x207:rat=gsm, emergency=true</item>
     </string-array>
 
     <!-- 4381 -->
     <string-array name="exercise_alert_range_strings" translatable="false">
-        <item>0x111D:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x111D:rat=gsm, emergency=true</item>
     </string-array>
 
     <!-- Channel 6400 -->
     <string-array name="public_safety_messages_channels_range_strings" translatable="false">
-        <item>0x1900:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x1900:rat=gsm, emergency=true</item>
     </string-array>
 
     <!-- Channel 4396-4399 -->
     <string-array name="emergency_alerts_channels_range_strings" translatable="false">
         <!-- Channel 4396-4399 reserved for future -->
-        <item>0x112C-0x112F:rat=gsm, alert_duration=8000, emergency=true</item>
+        <item>0x112C-0x112F:rat=gsm, emergency=true</item>
     </string-array>
 
     <string-array name="operator_defined_alert_range_strings" translatable="false" />
diff --git a/res/values-mcc420-in/strings.xml b/res/values-mcc420-in/strings.xml
index 4f4f2c1..a67b155 100644
--- a/res/values-mcc420-in/strings.xml
+++ b/res/values-mcc420-in/strings.xml
@@ -14,7 +14,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="cmas_presidential_level_alert" msgid="5922755396541728069">"Notifikasi Peringatan Nasional"</string>
-    <string name="cmas_extreme_alert" msgid="2666370743728576543">"Notifikasi Peringatan Darurat Ekstrim"</string>
+    <string name="cmas_extreme_alert" msgid="2666370743728576543">"Notifikasi Peringatan Darurat Ekstrem"</string>
     <!-- no translation found for cmas_extreme_immediate_observed_alert (9214912512697774351) -->
     <skip />
     <!-- no translation found for cmas_extreme_immediate_likely_alert (5872678423468023949) -->
diff --git a/res/values-mcc440-mnc20/config.xml b/res/values-mcc440-mnc20/config.xml
index ee877aa..fc8c1e0 100644
--- a/res/values-mcc440-mnc20/config.xml
+++ b/res/values-mcc440-mnc20/config.xml
@@ -19,13 +19,7 @@
     <string-array name="etws_test_alerts_range_strings" translatable="false">
         <item>0x1103:rat=gsm, emergency=true, debug_build=true</item>
     </string-array>
-    <string-array name="additional_cbs_channels_strings" translatable="false">
-        <item>0xA800:type=etws_earthquake, emergency=true, scope=carrier</item>
-        <item>0xAFEE:type=etws_tsunami, emergency=true, scope=carrier</item>
-        <item>0xAC00-0xAFED:type=other, emergency=true, scope=carrier</item>
-        <item>0xA802:type=test, emergency=true, scope=carrier</item>
-        <item>0xA804:type=test, emergency=true, scope=carrier</item>
-    </string-array>
+
     <!-- Whether to show test settings -->
     <bool name="show_test_settings">false</bool>
     <bool name="allow_testing_mode_on_user_build">false</bool>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index de6e091..588496e 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -56,7 +56,7 @@
     <string name="public_safety_message" msgid="9119928798786998252">"பொதுமக்களுக்கான பாதுகாப்புச் செய்தி"</string>
     <string name="state_local_test_alert" msgid="8003145745857480200">"மாநில/உள்ளூர் சோதனை மெசேஜ்கள்"</string>
     <string name="emergency_alert" msgid="624783871477634263">"அவசரகால எச்சரிக்கை"</string>
-    <string name="emergency_alerts_title" msgid="6605036374197485429">"எச்சரிக்கைகள்"</string>
+    <string name="emergency_alerts_title" msgid="6605036374197485429">"விழிப்பூட்டல்கள்"</string>
     <string name="notification_channel_broadcast_messages" msgid="880704362482824524">"வலைபரப்புச் செய்திகள்"</string>
     <string name="notification_channel_emergency_alerts" msgid="5008287980979183617">"அவசரகால எச்சரிக்கைகள்"</string>
     <string name="notification_channel_emergency_alerts_high_priority" msgid="3937475297436439073">"உறுதிசெய்யப்படாத அவசரகால எச்சரிக்கைகள்"</string>
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java
index 4d896ae..fa754b5 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java
@@ -490,7 +490,9 @@
         if (channelManager.isEmergencyMessage(cbm) && !sRemindAfterCallFinish) {
             // start alert sound / vibration / TTS and display full-screen alert
             openEmergencyAlertNotification(cbm);
-            Resources res = CellBroadcastSettings.getResources(mContext, cbm.getSubscriptionId());
+            Resources res = CellBroadcastSettings.getResourcesByOperator(mContext,
+                    cbm.getSubscriptionId(),
+                    CellBroadcastReceiver.getRoamingOperatorSupported(mContext));
 
             CellBroadcastChannelRange range = channelManager
                     .getCellBroadcastChannelRangeFromMessage(cbm);
@@ -618,14 +620,20 @@
 
         if (resourcesKey == R.array.exercise_alert_range_strings
                 && res.getBoolean(R.bool.show_separate_exercise_settings)) {
-            return emergencyAlertEnabled && checkAlertConfigEnabled(
+            return emergencyAlertEnabled
+                    && CellBroadcastSettings.isExerciseTestAlertsToggleVisible(
+                    res, getApplicationContext(), channelManager)
+                    && checkAlertConfigEnabled(
                     subId, CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS,
                     res.getBoolean(R.bool.test_exercise_alerts_enabled_default));
         }
 
         if (resourcesKey == R.array.operator_defined_alert_range_strings
                 && res.getBoolean(R.bool.show_separate_operator_defined_settings)) {
-            return emergencyAlertEnabled && checkAlertConfigEnabled(
+            return emergencyAlertEnabled
+                    && CellBroadcastSettings.isOperatorTestAlertsToggleVisible(
+                    res, getApplicationContext(), channelManager)
+                    && checkAlertConfigEnabled(
                     subId, CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS,
                     res.getBoolean(R.bool.test_operator_defined_alerts_enabled_default));
         }
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
index 78e31b6..b64ff88 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
@@ -301,17 +301,28 @@
                         && prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS,
                         false)));
 
+        CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager(
+                getApplicationContext(), SubscriptionManager.getDefaultSubscriptionId(),
+                roamingOperator);
         boolean enableExerciseAlerts = enableAlertsMasterToggle && (isRoaming
                 ? (res.getBoolean(R.bool.show_separate_exercise_settings)
+                && CellBroadcastSettings.isExerciseTestAlertsToggleVisible(
+                        res, getApplicationContext(), channelManager)
                 && res.getBoolean(R.bool.test_exercise_alerts_enabled_default))
                 : (res.getBoolean(R.bool.show_separate_exercise_settings)
+                        && CellBroadcastSettings.isExerciseTestAlertsToggleVisible(
+                                res, getApplicationContext(), channelManager)
                         && prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS,
                         false)));
 
         boolean enableOperatorDefined = enableAlertsMasterToggle && (isRoaming
                 ? (res.getBoolean(R.bool.show_separate_operator_defined_settings)
+                && CellBroadcastSettings.isOperatorTestAlertsToggleVisible(
+                        res, getApplicationContext(), channelManager)
                 && res.getBoolean(R.bool.test_operator_defined_alerts_enabled_default))
                 : (res.getBoolean(R.bool.show_separate_operator_defined_settings)
+                        && CellBroadcastSettings.isOperatorTestAlertsToggleVisible(
+                                res, getApplicationContext(), channelManager)
                         && prefs.getBoolean(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS,
                         false)));
 
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastSearchIndexableProvider.java b/src/com/android/cellbroadcastreceiver/CellBroadcastSearchIndexableProvider.java
index e6c5ec5..3d2da1f 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastSearchIndexableProvider.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastSearchIndexableProvider.java
@@ -42,6 +42,7 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.MatrixCursor;
+import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.provider.SearchIndexablesProvider;
 import android.telephony.SubscriptionManager;
@@ -106,6 +107,32 @@
 
     /**
      * this method is to make this class unit-testable, because
+     * CellBroadcastSettings.isExerciseTestAlertsToggleVisible is a static method and
+     * therefore not mockable
+     *
+     * @return true if test alerts toggle is Visible
+     */
+    @VisibleForTesting
+    public boolean isExerciseTestAlertsToggleVisible(CellBroadcastChannelManager channelManager) {
+        return CellBroadcastSettings.isExerciseTestAlertsToggleVisible(
+                getResourcesMethod(), getContext(), channelManager);
+    }
+
+    /**
+     * this method is to make this class unit-testable, because
+     * CellBroadcastSettings.isOperatorTestAlertsToggleVisible is a static method and
+     * therefore not mockable
+     *
+     * @return true if test alerts toggle is Visible
+     */
+    @VisibleForTesting
+    public boolean isOperatorTestAlertsToggleVisible(CellBroadcastChannelManager channelManager) {
+        return CellBroadcastSettings.isOperatorTestAlertsToggleVisible(
+                getResourcesMethod(), getContext(), channelManager);
+    }
+
+    /**
+     * this method is to make this class unit-testable, because
      * CellBroadcastSettings.isShowFullScreenMessageVisible is a static method and therefore not
      * able to mock
      *
@@ -199,15 +226,52 @@
 
         Resources res = getResourcesMethod();
         Object[] ref;
+        final UserManager userManager = getContextMethod().getSystemService(UserManager.class);
+        boolean isAdminUser = userManager.isAdminUser();
 
-        if (!res.getBoolean(R.bool.show_presidential_alerts_settings)) {
+        if (!isAdminUser) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.class.getSimpleName();
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser || !res.getBoolean(R.bool.show_main_switch_settings)) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE;
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.KEY_EMERGENCY_ALERT_HISTORY;
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.KEY_ALERT_REMINDER_INTERVAL;
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser || !res.getBoolean(R.bool.show_override_dnd_settings)) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.KEY_OVERRIDE_DND;
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser || !res.getBoolean(R.bool.show_presidential_alerts_settings)) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_ENABLE_CMAS_PRESIDENTIAL_ALERTS;
             cursor.addRow(ref);
         }
 
-        if (!CellBroadcastSettings.getResources(getContextMethod(),
+        if (!isAdminUser || !CellBroadcastSettings.getResources(getContextMethod(),
                         SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)
                 .getBoolean(R.bool.show_alert_speech_setting)) {
             ref = new Object[1];
@@ -216,7 +280,7 @@
             cursor.addRow(ref);
         }
 
-        if (!res.getBoolean(R.bool.show_extreme_alert_settings)) {
+        if (!isAdminUser || !res.getBoolean(R.bool.show_extreme_alert_settings)) {
             // Remove CMAS preference items in emergency alert category.
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
@@ -224,7 +288,7 @@
             cursor.addRow(ref);
         }
 
-        if (!res.getBoolean(R.bool.show_severe_alert_settings)) {
+        if (!isAdminUser || !res.getBoolean(R.bool.show_severe_alert_settings)) {
 
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
@@ -232,14 +296,14 @@
             cursor.addRow(ref);
         }
 
-        if (!res.getBoolean(R.bool.show_amber_alert_settings)) {
+        if (!isAdminUser || !res.getBoolean(R.bool.show_amber_alert_settings)) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS;
             cursor.addRow(ref);
         }
 
-        if (!res.getBoolean(R.bool.config_showAreaUpdateInfoSettings)) {
+        if (!isAdminUser || !res.getBoolean(R.bool.config_showAreaUpdateInfoSettings)) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_ENABLE_AREA_UPDATE_INFO_ALERTS;
@@ -248,7 +312,7 @@
 
         CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager(
                 getContextMethod(), SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
-        if (channelManager.getCellBroadcastChannelRanges(
+        if (!isAdminUser || channelManager.getCellBroadcastChannelRanges(
                 R.array.cmas_amber_alerts_channels_range_strings).isEmpty()) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
@@ -256,7 +320,7 @@
             cursor.addRow(ref);
         }
 
-        if (channelManager.getCellBroadcastChannelRanges(
+        if (!isAdminUser || channelManager.getCellBroadcastChannelRanges(
                 R.array.emergency_alerts_channels_range_strings).isEmpty()) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
@@ -264,7 +328,7 @@
             cursor.addRow(ref);
         }
 
-        if (channelManager.getCellBroadcastChannelRanges(
+        if (!isAdminUser || channelManager.getCellBroadcastChannelRanges(
                 R.array.public_safety_messages_channels_range_strings).isEmpty()) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
@@ -272,7 +336,7 @@
             cursor.addRow(ref);
         }
 
-        if (channelManager.getCellBroadcastChannelRanges(
+        if (!isAdminUser || channelManager.getCellBroadcastChannelRanges(
                 R.array.state_local_test_alert_range_strings).isEmpty()) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
@@ -280,14 +344,29 @@
             cursor.addRow(ref);
         }
 
-        if (!isTestAlertsToggleVisible()) {
+        if (!isAdminUser || !isTestAlertsToggleVisible()) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS;
             cursor.addRow(ref);
         }
 
-        if (res.getString(R.string.emergency_alert_second_language_code).isEmpty()) {
+        if (!isAdminUser || !isExerciseTestAlertsToggleVisible(channelManager)) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS;
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser || !isOperatorTestAlertsToggleVisible(channelManager)) {
+            ref = new Object[1];
+            ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
+                    CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS;
+            cursor.addRow(ref);
+        }
+
+        if (!isAdminUser
+                || res.getString(R.string.emergency_alert_second_language_code).isEmpty()) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_RECEIVE_CMAS_IN_SECOND_LANGUAGE;
@@ -296,14 +375,14 @@
 
         boolean isVisibleVibrationSetting = CellBroadcastSettings
                 .isVibrationToggleVisible(getContextMethod(), res);
-        if (!isVisibleVibrationSetting) {
+        if (!isAdminUser || !isVisibleVibrationSetting) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_ENABLE_ALERT_VIBRATE;
             cursor.addRow(ref);
         }
 
-        if (!isShowFullScreenMessageVisible(res)) {
+        if (!isAdminUser || !isShowFullScreenMessageVisible(res)) {
             ref = new Object[1];
             ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] =
                     CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES_FULL_SCREEN;
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java
index 106a284..116f9a8 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java
@@ -669,31 +669,13 @@
             }
 
             if (mExerciseTestCheckBox != null) {
-                boolean visible = false;
-                if (res.getBoolean(R.bool.show_separate_exercise_settings)) {
-                    if (res.getBoolean(R.bool.show_exercise_settings)
-                            || CellBroadcastReceiver.isTestingMode(getContext())) {
-                        if (!channelManager.getCellBroadcastChannelRanges(
-                                R.array.exercise_alert_range_strings).isEmpty()) {
-                            visible = true;
-                        }
-                    }
-                }
-                mExerciseTestCheckBox.setVisible(visible);
+                mExerciseTestCheckBox.setVisible(
+                        isExerciseTestAlertsToggleVisible(res, getContext(), channelManager));
             }
 
             if (mOperatorDefinedCheckBox != null) {
-                boolean visible = false;
-                if (res.getBoolean(R.bool.show_separate_operator_defined_settings)) {
-                    if (res.getBoolean(R.bool.show_operator_defined_settings)
-                            || CellBroadcastReceiver.isTestingMode(getContext())) {
-                        if (!channelManager.getCellBroadcastChannelRanges(
-                                R.array.operator_defined_alert_range_strings).isEmpty()) {
-                            visible = true;
-                        }
-                    }
-                }
-                mOperatorDefinedCheckBox.setVisible(visible);
+                mOperatorDefinedCheckBox.setVisible(
+                        isOperatorTestAlertsToggleVisible(res, getContext(), channelManager));
             }
 
             if (mEmergencyAlertsCheckBox != null) {
@@ -967,6 +949,36 @@
         return false;
     }
 
+    /**
+     * Check whether exercise test alert toggle is visible
+     * @param res Resources
+     * @param context Context
+     * @param channelManager ChannelManager
+     */
+    public static boolean isExerciseTestAlertsToggleVisible(Resources res, Context context,
+            CellBroadcastChannelManager channelManager) {
+        return res.getBoolean(R.bool.show_separate_exercise_settings)
+                && (res.getBoolean(R.bool.show_exercise_settings)
+                || CellBroadcastReceiver.isTestingMode(context))
+                && !channelManager.getCellBroadcastChannelRanges(
+                R.array.exercise_alert_range_strings).isEmpty();
+    }
+
+    /**
+     * Check whether operator test alert toggle is visible
+     * @param res Resources
+     * @param context Context
+     * @param channelManager ChannelManager
+     */
+    public static boolean isOperatorTestAlertsToggleVisible(Resources res, Context context,
+            CellBroadcastChannelManager channelManager) {
+        return res.getBoolean(R.bool.show_separate_operator_defined_settings)
+                && (res.getBoolean(R.bool.show_operator_defined_settings)
+                || CellBroadcastReceiver.isTestingMode(context))
+                && !channelManager.getCellBroadcastChannelRanges(
+                R.array.operator_defined_alert_range_strings).isEmpty();
+    }
+
     public static boolean isTestAlertsToggleVisible(Context context) {
         return isTestAlertsToggleVisible(context, null);
     }
diff --git a/tests/compliancetests/Android.bp b/tests/compliancetests/Android.bp
index 22dd985..77fcf72 100644
--- a/tests/compliancetests/Android.bp
+++ b/tests/compliancetests/Android.bp
@@ -31,7 +31,7 @@
         "mockito-target-minus-junit4",
         "truth",
         "ub-uiautomator",
-        "android.telephony.mockmodem",
+        "cellbroadcast.mockmodem",
         "modules-utils-build_system",
         "junit-params",
     ],
@@ -40,6 +40,22 @@
     platform_apis: true,
 }
 
+java_import {
+    name: "prebuilt_cellbroadcast_mockmodem",
+    jars: ["mockmodem/classes.jar"],
+}
+
+android_library {
+    name: "cellbroadcast.mockmodem",
+    asset_dirs: ["mockmodem/assets"],
+    manifest: "mockmodem/AndroidManifest.xml",
+    static_libs: [
+        "prebuilt_cellbroadcast_mockmodem",
+    ],
+    min_sdk_version: "30",
+    platform_apis: true,
+}
+
 android_test {
     name: "CellBroadcastReceiverComplianceTests",
     defaults: ["CellBroadcastTestCommonComplianceTest"],
diff --git a/tests/compliancetests/assets/emergency_alert_channels.json b/tests/compliancetests/assets/emergency_alert_channels.json
index fe2915b..ed2de49 100644
--- a/tests/compliancetests/assets/emergency_alert_channels.json
+++ b/tests/compliancetests/assets/emergency_alert_channels.json
@@ -693,43 +693,6 @@
       "title": "子供の誘拐(誘拐事件速報)", //"Child abduction (Amber alert)",
       "default_value": "true",
       "toggle_avail": "true"
-    },
-    "43008": {
-      "title": "緊急地震速報", //"Earthquake warning",
-      "default_value": "true",
-      "toggle_avail": "false"
-    },
-    "45038": {
-      "title": "津波警報", //"Tsunami warning",
-      "default_value": "true",
-      "toggle_avail": "false",
-      "warning_type": "02"
-    },
-    "44032": {
-      "title": "緊急速報メール", //"Emergency warning",
-      "default_value": "true",
-      "toggle_avail": "false",
-      "end_channel": "45037"
-    },
-    "45000": {
-      "title": "緊急速報メール", //"Emergency warning",
-      "default_value": "true",
-      "toggle_avail": "false"
-    },
-    "45037": {
-      "title": "緊急速報メール", //"Emergency warning",
-      "default_value": "true",
-      "toggle_avail": "false"
-    },
-    "43010": {
-      "title": "ETWS 試験メッセージ", //"ETWS test message",
-      "default_value": "false",
-      "toggle_avail": "false"
-    },
-    "43012": {
-      "title": "ETWS 試験メッセージ", //"ETWS test message",
-      "default_value": "false",
-      "toggle_avail": "false"
     }
   },
   "hongkong": {
diff --git a/tests/compliancetests/mockmodem/AndroidManifest.xml b/tests/compliancetests/mockmodem/AndroidManifest.xml
new file mode 100644
index 0000000..71fdccd
--- /dev/null
+++ b/tests/compliancetests/mockmodem/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+     package="android.telephony.mockmodem">
+
+    <!-- Must be debuggable for compat shell commands to work on user builds -->
+    <application android:debuggable="true">
+        <service android:name="android.telephony.mockmodem.MockModemService"
+             android:directBootAware="true"
+             android:persistent="true"
+             android:exported="true">
+            <intent-filter>
+                <action android:name="android.telephony.mockmodem.iradioconfig"/>
+                <action android:name="android.telephony.mockmodem.iradiomodem"/>
+                <action android:name="android.telephony.mockmodem.iradiosim"/>
+                <action android:name="android.telephony.mockmodem.iradionetwork"/>
+                <action android:name="android.telephony.mockmodem.iradiodata"/>
+                <action android:name="android.telephony.mockmodem.iradiomessaging"/>
+                <action android:name="android.telephony.mockmodem.iradiovoice"/>
+                <action android:name="android.telephony.mockmodem.iradioims"/>
+            </intent-filter>
+        </service>
+    </application>
+</manifest>
diff --git a/tests/compliancetests/mockmodem/assets/mock_network_tw_cht.xml b/tests/compliancetests/mockmodem/assets/mock_network_tw_cht.xml
new file mode 100644
index 0000000..1a0e8c6
--- /dev/null
+++ b/tests/compliancetests/mockmodem/assets/mock_network_tw_cht.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MockNetwork carrierid="1">
+    <MockCellProperty>
+        <EHPLMNLIST>46692</EHPLMNLIST>
+        <AllowRoamingList>310026</AllowRoamingList>
+    </MockCellProperty>
+
+    <MockNetworkProfile id="0" rat="LTE" connection="primary">
+        <MockCellIdentity>
+            <MCC>466</MCC>
+            <MNC>92</MNC>
+            <CI>101</CI>
+            <PCI>273</PCI>
+            <TAC>13100</TAC>
+            <EARFCN>9260</EARFCN>
+            <OperatorInfo>
+                <AlphaLong>Chung Hwa Telecom</AlphaLong>
+                <AlphaShort>CHT</AlphaShort>
+                <OperatorNumeric>46692</OperatorNumeric>
+            </OperatorInfo>
+        </MockCellIdentity>
+
+        <MockCellSignalStrength>
+            <SignalStrength>20</SignalStrength>
+            <RSRP>71</RSRP>
+            <RSRQ>6</RSRQ>
+            <RSSNR>100</RSSNR>
+            <CQI>13</CQI>
+            <TimingAdvance>0</TimingAdvance>
+            <CqiTableIndex>1</CqiTableIndex>
+        </MockCellSignalStrength>
+    </MockNetworkProfile>
+
+    <MockNetworkProfile id="1" rat="WCDMA">
+        <MockCellIdentity>
+            <MCC>466</MCC>
+            <MNC>92</MNC>
+            <LAC>9222</LAC>
+            <CID>14549</CID>
+            <PSC>413</PSC>
+            <UARFCN>10613</UARFCN>
+            <OperatorInfo>
+                <AlphaLong>Chung Hwa Telecom</AlphaLong>
+                <AlphaShort>CHT</AlphaShort>
+                <OperatorNumeric>46692</OperatorNumeric>
+            </OperatorInfo>
+        </MockCellIdentity>
+
+        <MockCellSignalStrength>
+            <SignalStrength>20</SignalStrength>
+            <BitErrorRate>3</BitErrorRate>
+            <RSCP>45</RSCP>
+            <ECNO>25</ECNO>
+        </MockCellSignalStrength>
+    </MockNetworkProfile>
+</MockNetwork>
diff --git a/tests/compliancetests/mockmodem/assets/mock_network_tw_fet.xml b/tests/compliancetests/mockmodem/assets/mock_network_tw_fet.xml
new file mode 100644
index 0000000..140768e
--- /dev/null
+++ b/tests/compliancetests/mockmodem/assets/mock_network_tw_fet.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MockNetwork carrierid="2">
+    <MockCellProperty>
+        <EHPLMNLIST>46601,46605</EHPLMNLIST>
+        <AllowRoamingList>310026</AllowRoamingList>
+    </MockCellProperty>
+
+    <MockNetworkProfile id="0" rat="WCDMA" connection="primary">
+        <MockCellIdentity>
+            <MCC>466</MCC>
+            <MNC>01</MNC>
+            <LAC>8122</LAC>
+            <CID>16249</CID>
+            <PSC>413</PSC>
+            <UARFCN>10613</UARFCN>
+            <OperatorInfo>
+                <AlphaLong>Far EasTone</AlphaLong>
+                <AlphaShort>FET</AlphaShort>
+                <OperatorNumeric>46601</OperatorNumeric>
+            </OperatorInfo>
+        </MockCellIdentity>
+
+        <MockCellSignalStrength>
+            <SignalStrength>10</SignalStrength>
+            <BitErrorRate>6</BitErrorRate>
+            <RSCP>55</RSCP>
+            <ECNO>15</ECNO>
+        </MockCellSignalStrength>
+    </MockNetworkProfile>
+</MockNetwork>
diff --git a/tests/compliancetests/mockmodem/assets/mock_network_us_fi.xml b/tests/compliancetests/mockmodem/assets/mock_network_us_fi.xml
new file mode 100644
index 0000000..bf194c4
--- /dev/null
+++ b/tests/compliancetests/mockmodem/assets/mock_network_us_fi.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MockNetwork carrierid="3">
+    <MockCellProperty>
+        <EHPLMNLIST>312580</EHPLMNLIST>
+        <AllowRoamingList>310026</AllowRoamingList>
+    </MockCellProperty>
+
+    <MockNetworkProfile id="0" rat="LTE" connection="primary">
+        <MockCellIdentity>
+            <MCC>312</MCC>
+            <MNC>580</MNC>
+            <CI>101</CI>
+            <PCI>273</PCI>
+            <TAC>13100</TAC>
+            <EARFCN>9260</EARFCN>
+            <OperatorInfo>
+                <AlphaLong>Google Fi</AlphaLong>
+                <AlphaShort>Fi</AlphaShort>
+                <OperatorNumeric>312580</OperatorNumeric>
+            </OperatorInfo>
+        </MockCellIdentity>
+
+        <MockCellSignalStrength>
+            <SignalStrength>20</SignalStrength>
+            <RSRP>71</RSRP>
+            <RSRQ>6</RSRQ>
+            <RSSNR>100</RSSNR>
+            <CQI>13</CQI>
+            <TimingAdvance>0</TimingAdvance>
+            <CqiTableIndex>1</CqiTableIndex>
+        </MockCellSignalStrength>
+    </MockNetworkProfile>
+
+    <MockNetworkProfile id="1" rat="WCDMA">
+        <MockCellIdentity>
+            <MCC>312</MCC>
+            <MNC>580</MNC>
+            <LAC>9222</LAC>
+            <CID>14549</CID>
+            <PSC>413</PSC>
+            <UARFCN>10613</UARFCN>
+            <OperatorInfo>
+                <AlphaLong>Google Fi</AlphaLong>
+                <AlphaShort>Fi</AlphaShort>
+                <OperatorNumeric>312580</OperatorNumeric>
+            </OperatorInfo>
+        </MockCellIdentity>
+
+        <MockCellSignalStrength>
+            <SignalStrength>20</SignalStrength>
+            <BitErrorRate>3</BitErrorRate>
+            <RSCP>45</RSCP>
+            <ECNO>25</ECNO>
+        </MockCellSignalStrength>
+    </MockNetworkProfile>
+</MockNetwork>
diff --git a/tests/compliancetests/mockmodem/assets/mock_sim_tw_cht.xml b/tests/compliancetests/mockmodem/assets/mock_sim_tw_cht.xml
new file mode 100644
index 0000000..6125c2d
--- /dev/null
+++ b/tests/compliancetests/mockmodem/assets/mock_sim_tw_cht.xml
@@ -0,0 +1,32 @@
+<MockSim numofapp="2" atr="3B9F96801FC78031E073FE2111634082918307900099">
+<MockSimProfile id="0" type="APPTYPE_USIM">
+    <PinProfile appstate="APPSTATE_READY">
+        <Pin1State>PINSTATE_DISABLED</Pin1State>
+        <Pin2State>PINSTATE_ENABLED_NOT_VERIFIED</Pin2State>
+    </PinProfile>
+
+    <FacilityLock>
+        <FD>LOCK_DISABLED</FD>
+        <SC>LOCK_DISABLED</SC>
+    </FacilityLock>
+
+    <MF name="MF" path="3F00">
+        <EFDIR name="ADF1" curr_active="true">A0000000871002F886FF9289050B00FE</EFDIR>
+    </MF>
+
+    <ADF aid="A0000000871002F886FF9289050B00FE">
+        <EF name="EF_IMSI" id="6F07" command="" mnc-digit="2">466920123456789</EF>
+        <EF name="EF_ICCID" id="2FE2" command="0xb0">89886920042507847155</EF>
+        <EF name="EF_ICCID" id="2FE2" command="0xc0">0000000A2FE2040000FFFF01020002</EF>
+        <EF name="EF_GID1" id="6F3E" command="0xb0">BA01270000000000</EF>
+        <EF name="EF_GID1" id="6F3E" command="0xc0">000000086F3E040000FFFF01020002</EF>
+    </ADF>
+</MockSimProfile>
+
+<MockSimProfile id="1" type="APPTYPE_ISIM">
+    <PinProfile appstate="APPSTATE_DETECTED">
+        <Pin1State>PINSTATE_DISABLED</Pin1State>
+        <Pin2State>PINSTATE_ENABLED_NOT_VERIFIED</Pin2State>
+    </PinProfile>
+</MockSimProfile>
+</MockSim>
diff --git a/tests/compliancetests/mockmodem/assets/mock_sim_tw_fet.xml b/tests/compliancetests/mockmodem/assets/mock_sim_tw_fet.xml
new file mode 100644
index 0000000..4463d88
--- /dev/null
+++ b/tests/compliancetests/mockmodem/assets/mock_sim_tw_fet.xml
@@ -0,0 +1,23 @@
+<MockSim numofapp="1" atr="3B9E95801FC78031E073FE211B66D001A0E50F0048">
+<MockSimProfile id="0" type="APPTYPE_USIM">
+    <PinProfile appstate="APPSTATE_READY">
+        <Pin1State>PINSTATE_DISABLED</Pin1State>
+        <Pin2State>PINSTATE_ENABLED_NOT_VERIFIED</Pin2State>
+    </PinProfile>
+
+    <FacilityLock>
+        <FD>LOCK_DISABLED</FD>
+        <SC>LOCK_DISABLED</SC>
+    </FacilityLock>
+
+    <MF name="MF" path="3F00">
+        <EFDIR name="ADF1" curr_active="true">A0000000871002FF33FFFF8901010100</EFDIR>
+    </MF>
+
+    <ADF aid="A0000000871002FF33FFFF8901010100">
+        <EF name="EF_IMSI" id="6F07" command="" mnc-digit="2">466011122334455</EF>
+        <EF name="EF_ICCID" id="2FE2" command="0xb0">89886021157300856597</EF>
+        <EF name="EF_ICCID" id="2FE2" command="0xc0">0000000A2FE2040000FFFF01020002</EF>
+    </ADF>
+</MockSimProfile>
+</MockSim>
\ No newline at end of file
diff --git a/tests/compliancetests/mockmodem/assets/mock_sim_us_fi.xml b/tests/compliancetests/mockmodem/assets/mock_sim_us_fi.xml
new file mode 100644
index 0000000..0e4ccc3
--- /dev/null
+++ b/tests/compliancetests/mockmodem/assets/mock_sim_us_fi.xml
@@ -0,0 +1,32 @@
+<MockSim numofapp="2" atr="3B9F97C00A3FC6828031E073FE211F65D002341512810F51">
+<MockSimProfile id="0" type="APPTYPE_USIM">
+    <PinProfile appstate="APPSTATE_READY">
+        <Pin1State>PINSTATE_DISABLED</Pin1State>
+        <Pin2State>PINSTATE_ENABLED_NOT_VERIFIED</Pin2State>
+    </PinProfile>
+
+    <FacilityLock>
+        <FD>LOCK_DISABLED</FD>
+        <SC>LOCK_DISABLED</SC>
+    </FacilityLock>
+
+    <MF name="MF" path="3F00">
+        <EFDIR name="ADF1" curr_active="true">A0000000871002F310FFFF89190417FF</EFDIR>
+    </MF>
+
+    <ADF aid="A0000000871002F310FFFF89190417FF">
+        <EF name="EF_IMSI" id="6F07" command="" mnc-digit="3">312580123456789</EF>
+        <EF name="EF_ICCID" id="2FE2" command="0xb0">89015801000037773143</EF>
+        <EF name="EF_ICCID" id="2FE2" command="0xc0">0000000A2FE2040000FFFF01020002</EF>
+        <EF name="EF_GID1" id="6F3E" command="0xb0">0001</EF>
+        <EF name="EF_GID1" id="6F3E" command="0xc0">000000026F3E040000FFFF01020002</EF>
+    </ADF>
+</MockSimProfile>
+
+<MockSimProfile id="1" type="APPTYPE_ISIM">
+    <PinProfile appstate="APPSTATE_DETECTED">
+        <Pin1State>PINSTATE_DISABLED</Pin1State>
+        <Pin2State>PINSTATE_ENABLED_NOT_VERIFIED</Pin2State>
+    </PinProfile>
+</MockSimProfile>
+</MockSim>
diff --git a/tests/compliancetests/mockmodem/classes.jar b/tests/compliancetests/mockmodem/classes.jar
new file mode 100644
index 0000000..961422a
--- /dev/null
+++ b/tests/compliancetests/mockmodem/classes.jar
Binary files differ
diff --git a/tests/compliancetests/src/com/android/cellbroadcastreceiver/compliancetests/CellBroadcastBaseTest.java b/tests/compliancetests/src/com/android/cellbroadcastreceiver/compliancetests/CellBroadcastBaseTest.java
index d805fc2..a364dec 100644
--- a/tests/compliancetests/src/com/android/cellbroadcastreceiver/compliancetests/CellBroadcastBaseTest.java
+++ b/tests/compliancetests/src/com/android/cellbroadcastreceiver/compliancetests/CellBroadcastBaseTest.java
@@ -144,9 +144,7 @@
     @BeforeClass
     public static void beforeAllTests() throws Exception {
         logd("CellBroadcastBaseTest#beforeAllTests()");
-        // TODO: Make cellbroadcastcompliancetest use old mockmodem lib so that test can be
-        // run on the previous platform as well.
-        if (!SdkLevel.isAtLeastV()) {
+        if (!SdkLevel.isAtLeastT()) {
             Log.i(TAG, "sdk level is below the latest platform");
             sPreconditionError = ERROR_SDK_VERSION;
             return;
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index d09d94b..046bc12 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -82,7 +82,6 @@
     instrumentation_for: "CellBroadcastApp",
     test_suites: [
         "device-tests",
-        "mts-cellbroadcast",
     ],
     manifest: "AndroidManifest.xml",
     test_config: "AndroidTest.xml",
@@ -96,9 +95,9 @@
     instrumentation_for: "CellBroadcastApp",
     test_suites: [
         "general-tests",
-        "mts-cellbroadcast",
     ],
     manifest: "AndroidManifest.xml",
+    target_sdk_version: "10000",
     test_config: "AndroidTest_PixelExperience.xml",
 }
 
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java
index cfb8962..02043dc 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java
@@ -20,7 +20,9 @@
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -41,11 +43,13 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.IBinder;
 import android.os.IPowerManager;
 import android.os.IThermalService;
 import android.os.Looper;
 import android.os.Message;
 import android.os.PowerManager;
+import android.os.RemoteException;
 import android.telephony.SmsCbMessage;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -76,6 +80,8 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -147,6 +153,10 @@
         // PowerManager is a final class so we can't use Mockito to mock it, but we can mock
         // its underlying service.
         doReturn(true).when(mMockedPowerManagerService).isInteractive();
+        if (SdkLevel.isAtLeastU()) {
+            doReturn(true).when(
+                    mMockedPowerManagerService).isDisplayInteractive(anyInt());
+        }
         mPowerManager = new PowerManager(mContext, mMockedPowerManagerService,
                 mMockedThermalService, null);
         injectSystemService(PowerManager.class, mPowerManager);
@@ -286,6 +296,23 @@
         };
         mMockedActivityManagerHelper = new MockedServiceManager();
         mMockedActivityManagerHelper.replaceService("window", mWindowManagerService);
+        Field fieldHandler = ActivityManager.class.getDeclaredField("IActivityManagerSingleton");
+        fieldHandler.setAccessible(true);
+        Singleton<IActivityManager> activityManager =
+                (Singleton<IActivityManager>) fieldHandler.get(null);
+        IActivityManager realInstance = activityManager.get();
+        doAnswer(new Answer() {
+            public Void answer(InvocationOnMock invocation) throws RemoteException {
+                if (realInstance != null) {
+                    realInstance.finishReceiver(invocation.getArgument(0),
+                            invocation.getArgument(1), invocation.getArgument(2),
+                            invocation.getArgument(3), invocation.getArgument(4),
+                            invocation.getArgument(5));
+                }
+                return null;
+            }
+        }).when(mMockedActivityManager).finishReceiver(nullable(IBinder.class), anyInt(),
+                nullable(String.class), nullable(Bundle.class), anyBoolean(), anyInt());
         mMockedActivityManagerHelper.replaceInstance(ActivityManager.class,
                 "IActivityManagerSingleton", null, activityManagerSingleton);
     }
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertServiceTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertServiceTest.java
index a7f5df8..54dfe35 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertServiceTest.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertServiceTest.java
@@ -67,6 +67,8 @@
 
 import com.android.cellbroadcastreceiver.CellBroadcastAlertAudio;
 import com.android.cellbroadcastreceiver.CellBroadcastAlertService;
+import com.android.cellbroadcastreceiver.CellBroadcastChannelManager;
+import com.android.cellbroadcastreceiver.CellBroadcastReceiver;
 import com.android.cellbroadcastreceiver.CellBroadcastSettings;
 import com.android.internal.telephony.gsm.SmsCbConstants;
 import com.android.modules.utils.build.SdkLevel;
@@ -141,6 +143,8 @@
 
     @After
     public void tearDown() throws Exception {
+        CellBroadcastSettings.resetResourcesCache();
+        CellBroadcastChannelManager.clearAllCellBroadcastChannelRanges();
         super.tearDown();
     }
 
@@ -365,6 +369,86 @@
         compareCellBroadCastMessage(message, newMessageList.get(0));
     }
 
+    public void testShowNewAlertWithNotification() {
+        if (!SdkLevel.isAtLeastS()) {
+            return;
+        }
+        doReturn("").when(mMockedSharedPreferences).getString(
+                eq("roaming_operator_supported"), any());
+        doReturn(false).when(mResources).getBoolean(
+                com.android.cellbroadcastreceiver.R.bool.show_alert_dialog_with_notification);
+
+        Intent intent = new Intent(mContext, CellBroadcastAlertService.class);
+        intent.setAction(SHOW_NEW_ALERT_ACTION);
+        SmsCbMessage message = createMessage(34788612);
+        intent.putExtra("message", message);
+        startService(intent);
+        waitForServiceIntent();
+
+        verify(mMockedNotificationManager, times(0))
+                .notify(anyInt(), any());
+
+        doReturn(true).when(mResources).getBoolean(
+                com.android.cellbroadcastreceiver.R.bool.show_alert_dialog_with_notification);
+
+        intent = new Intent(mContext, CellBroadcastAlertService.class);
+        intent.setAction(SHOW_NEW_ALERT_ACTION);
+        message = createMessage(34788612);
+        intent.putExtra("message", message);
+        startService(intent);
+        waitForServiceIntent();
+
+        ArgumentCaptor<Notification> notificationCaptor =
+                ArgumentCaptor.forClass(Notification.class);
+        ArgumentCaptor<Integer> mInt = ArgumentCaptor.forClass(Integer.class);
+        verify(mMockedNotificationManager, times(1))
+                .notify(mInt.capture(), notificationCaptor.capture());
+        assertEquals(1, (int) mInt.getValue());
+    }
+
+    public void testShowNewAlertWithNotificationInRoaming() {
+        if (!SdkLevel.isAtLeastS()) {
+            return;
+        }
+        doReturn(false).when(mResources).getBoolean(
+                com.android.cellbroadcastreceiver.R.bool.show_alert_dialog_with_notification);
+        doReturn("123456").when(mMockedSharedPreferences).getString(
+                eq("roaming_operator_supported"), any());
+        Resources mockResources2 = mock(Resources.class);
+        CellBroadcastSettings.sResourcesCacheByOperator.put("123456", mockResources2);
+        doReturn("").when(mockResources2).getText(anyInt());
+
+        doReturn(false).when(mockResources2).getBoolean(
+                com.android.cellbroadcastreceiver.R.bool.show_alert_dialog_with_notification);
+
+        Intent intent = new Intent(mContext, CellBroadcastAlertService.class);
+        intent.setAction(SHOW_NEW_ALERT_ACTION);
+        SmsCbMessage message = createMessage(34788612);
+        intent.putExtra("message", message);
+        startService(intent);
+        waitForServiceIntent();
+
+        verify(mMockedNotificationManager, times(0))
+                .notify(anyInt(), any());
+
+        doReturn(true).when(mockResources2).getBoolean(
+                com.android.cellbroadcastreceiver.R.bool.show_alert_dialog_with_notification);
+
+        intent = new Intent(mContext, CellBroadcastAlertService.class);
+        intent.setAction(SHOW_NEW_ALERT_ACTION);
+        message = createMessage(34788612);
+        intent.putExtra("message", message);
+        startService(intent);
+        waitForServiceIntent();
+
+        ArgumentCaptor<Notification> notificationCaptor =
+                ArgumentCaptor.forClass(Notification.class);
+        ArgumentCaptor<Integer> intCaptor = ArgumentCaptor.forClass(Integer.class);
+        verify(mMockedNotificationManager, times(1))
+                .notify(intCaptor.capture(), notificationCaptor.capture());
+        assertEquals(1, (int) intCaptor.getValue());
+    }
+
     // Test showNewAlert method with a CMAS child abduction alert, using the default language code
     @InstrumentationTest
     // This test has a module dependency, so it is disabled for OEM testing because it is not a true
@@ -430,6 +514,7 @@
 
         putResources(com.android.cellbroadcastreceiver.R.bool.show_separate_exercise_settings,
                 true);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, true);
         putResources(com.android.cellbroadcastreceiver.R.array.exercise_alert_range_strings,
                 new String[]{
                     "0x111D:rat=gsm, emergency=true",
@@ -602,6 +687,285 @@
         ((TestContextWrapper) mContext).injectCreateConfigurationContext(null);
     }
 
+    public void testShouldDisplayMessageForExerciseAlerts() {
+        putResources(com.android.cellbroadcastreceiver.R.array
+                .exercise_alert_range_strings, new String[]{
+                    "0x111D:rat=gsm, emergency=true",
+                });
+        sendMessage(1);
+
+        CellBroadcastAlertService cellBroadcastAlertService =
+                (CellBroadcastAlertService) getService();
+        SmsCbMessage message = new SmsCbMessage(1, 2, 3, new SmsCbLocation(),
+                SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE,
+                "language", "body",
+                SmsCbMessage.MESSAGE_PRIORITY_NORMAL, null,
+                null, 0, 1);
+
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_separate_exercise_settings, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .test_exercise_alerts_enabled_default, false);
+        // disable testing mode
+        disablePreference(CellBroadcastReceiver.TESTING_MODE);
+
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, true);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, false);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, true);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, false);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        // enable testing mode
+        enablePreference(CellBroadcastReceiver.TESTING_MODE);
+
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, true);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, false);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, true);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, false);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        // roaming case
+        Context mockContext = mock(Context.class);
+        Resources mockResources = mock(Resources.class);
+        doReturn(mockResources).when(mockContext).getResources();
+        ((TestContextWrapper) mContext).injectCreateConfigurationContext(mockContext);
+        // inject roaming operator
+        doReturn("123").when(mMockedSharedPreferences)
+                .getString(anyString(), anyString());
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.show_separate_exercise_settings));
+
+        // disable testing mode
+        disablePreference(CellBroadcastReceiver.TESTING_MODE);
+
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings));
+        doReturn(false).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.test_exercise_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.test_exercise_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(false).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings));
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(false).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.test_exercise_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        // enable testing mode
+        enablePreference(CellBroadcastReceiver.TESTING_MODE);
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertFalse("Should disable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.test_exercise_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        assertTrue("Should enable exercise test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        ((TestContextWrapper) mContext).injectCreateConfigurationContext(null);
+    }
+
+    public void testShouldDisplayMessageForOperatorAlerts() {
+        putResources(com.android.cellbroadcastreceiver.R.array
+                .operator_defined_alert_range_strings, new String[]{
+                    "0x111E:rat=gsm, emergency=true",
+                });
+        sendMessage(1);
+
+        CellBroadcastAlertService cellBroadcastAlertService =
+                (CellBroadcastAlertService) getService();
+        SmsCbMessage message = new SmsCbMessage(1, 2, 3, new SmsCbLocation(),
+                SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE,
+                "language", "body",
+                SmsCbMessage.MESSAGE_PRIORITY_NORMAL, null,
+                null, 0, 1);
+
+        enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_separate_operator_defined_settings, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .test_operator_defined_alerts_enabled_default, false);
+        // disable testing mode
+        disablePreference(CellBroadcastReceiver.TESTING_MODE);
+
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_operator_defined_settings, true);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_operator_defined_settings, false);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_operator_defined_settings, true);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_operator_defined_settings, false);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        // enable testing mode
+        enablePreference(CellBroadcastReceiver.TESTING_MODE);
+
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_operator_defined_settings, true);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_operator_defined_settings, false);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_operator_defined_settings, true);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_operator_defined_settings, false);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        // roaming case
+        Context mockContext = mock(Context.class);
+        Resources mockResources = mock(Resources.class);
+        doReturn(mockResources).when(mockContext).getResources();
+        ((TestContextWrapper) mContext).injectCreateConfigurationContext(mockContext);
+        // inject roaming operator
+        doReturn("123").when(mMockedSharedPreferences)
+                .getString(anyString(), anyString());
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool
+                        .show_separate_operator_defined_settings));
+
+        // disable testing mode
+        disablePreference(CellBroadcastReceiver.TESTING_MODE);
+
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.show_operator_defined_settings));
+        doReturn(false).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool
+                        .test_operator_defined_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool
+                        .test_operator_defined_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(false).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool.show_operator_defined_settings));
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(false).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool
+                        .test_operator_defined_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        // enable testing mode
+        enablePreference(CellBroadcastReceiver.TESTING_MODE);
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertFalse("Should disable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        doReturn(true).when(mockResources).getBoolean(
+                eq(com.android.cellbroadcastreceiver.R.bool
+                        .test_operator_defined_alerts_enabled_default));
+        disablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+        enablePreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+        assertTrue("Should enable operator test channel",
+                cellBroadcastAlertService.shouldDisplayMessage(message));
+
+        ((TestContextWrapper) mContext).injectCreateConfigurationContext(null);
+    }
+
     public void testShouldDisplayMessageWithMasterToggleState() {
         Context mockContext = mock(Context.class);
         doReturn(mResources).when(mockContext).getResources();
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastConfigServiceTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastConfigServiceTest.java
index 86898cc..2808abe 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastConfigServiceTest.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastConfigServiceTest.java
@@ -21,10 +21,13 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
@@ -46,6 +49,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
+import android.os.IBinder;
 import android.os.RemoteException;
 import android.telephony.CellBroadcastIdRange;
 import android.telephony.SmsCbMessage;
@@ -60,6 +64,7 @@
 
 import com.android.cellbroadcastreceiver.CellBroadcastAlertService;
 import com.android.cellbroadcastreceiver.CellBroadcastConfigService;
+import com.android.cellbroadcastreceiver.CellBroadcastReceiver;
 import com.android.cellbroadcastreceiver.CellBroadcastSettings;
 import com.android.internal.telephony.ISms;
 import com.android.internal.telephony.cdma.sms.SmsEnvelope;
@@ -72,7 +77,10 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
@@ -761,6 +769,157 @@
     }
 
     /**
+     * Test enabling channels for exercise test channels
+     */
+    @Test
+    @SmallTest
+    public void testEnablingExerciseTestChannels() throws Exception {
+        setPreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, true);
+
+        // check enable when setting is shown and preference is true
+        setPreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_separate_exercise_settings, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_exercise_settings, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .test_exercise_alerts_enabled_default, true);
+
+        CbConfig[] enableConfigs = new CbConfig[]{
+                new CbConfig(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE,
+                        SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE,
+                        SmsCbMessage.MESSAGE_FORMAT_3GPP, true),
+        };
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(enableConfigs, 1, 1);
+
+        // check disable when preference is false
+        setPreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, false);
+
+        CbConfig[] disableConfigs = new CbConfig[]{
+                new CbConfig(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE,
+                        SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE,
+                        SmsCbMessage.MESSAGE_FORMAT_3GPP, false),
+        };
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 2, 1);
+
+        // check disable when setting is not shown
+        putResources(com.android.cellbroadcastreceiver.R.bool.show_exercise_settings, false);
+
+        setPreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, true);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 3, 2);
+
+        // check disable when setting is not shown and preference is off
+        setPreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, false);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 4, 3);
+
+        // testingmode is on
+        // check disable when setting is shown and preference is off
+        setPreference(CellBroadcastReceiver.TESTING_MODE, true);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 5, 4);
+
+        // check enable when setting is shown and preference is on
+        setPreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, true);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(enableConfigs, 6, 2);
+
+        // roaming case
+        Context mockContext = mock(Context.class);
+        doReturn(mResources).when(mockContext).getResources();
+        doReturn(mockContext).when(mContext).createConfigurationContext(any());
+        doReturn("123").when(mMockedSharedPreferences).getString(anyString(), anyString());
+        doReturn(mResources).when(mConfigService).getResources(anyInt(), anyString());
+
+        setPreference(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, false);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(enableConfigs, 7, 3);
+
+        setPreference(CellBroadcastReceiver.TESTING_MODE, false);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 8, 5);
+    }
+
+    /**
+     * Test enabling channels for operator test channels
+     */
+    @Test
+    @SmallTest
+    public void testEnablingOperatorTestChannels() throws Exception {
+        setPreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, true);
+
+        // check enable when setting is shown and preference is true
+        setPreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_separate_operator_defined_settings, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_operator_defined_settings, true);
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .test_operator_defined_alerts_enabled_default, true);
+
+        CbConfig[] enableConfigs = new CbConfig[]{
+                new CbConfig(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE,
+                        SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE,
+                        SmsCbMessage.MESSAGE_FORMAT_3GPP, true),
+        };
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(enableConfigs, 1, 1);
+
+        // check disable when preference is false
+        setPreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, false);
+
+        CbConfig[] disableConfigs = new CbConfig[]{
+                new CbConfig(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE,
+                        SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE,
+                        SmsCbMessage.MESSAGE_FORMAT_3GPP, false),
+        };
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 2, 1);
+
+        // check disable when setting is not shown
+        putResources(com.android.cellbroadcastreceiver.R.bool
+                .show_operator_defined_settings, false);
+
+        setPreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, true);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 3, 2);
+
+        // check disable when setting is not shown and preference is off
+        setPreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, false);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 4, 3);
+
+        // testingmode is on
+        // check disable when setting is shown and preference is off
+        setPreference(CellBroadcastReceiver.TESTING_MODE, true);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 5, 4);
+
+        // check enable when setting is shown and preference is on
+        setPreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, true);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(enableConfigs, 6, 2);
+
+        // roaming case
+        Context mockContext = mock(Context.class);
+        doReturn(mResources).when(mockContext).getResources();
+        doReturn(mockContext).when(mContext).createConfigurationContext(any());
+        doReturn("123").when(mMockedSharedPreferences).getString(anyString(), anyString());
+        doReturn(mResources).when(mConfigService).getResources(anyInt(), anyString());
+
+        setPreference(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, false);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(enableConfigs, 7, 3);
+
+        setPreference(CellBroadcastReceiver.TESTING_MODE, false);
+        mConfigService.enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        verifySetRanges(disableConfigs, 8, 5);
+    }
+
+    /**
      * Test handling the intent to enable channels
      */
     @Test
@@ -1546,6 +1705,23 @@
             }
         };
         mMockedServiceManager.replaceService("window", mWindowManagerService);
+        Field fieldHandler = ActivityManager.class.getDeclaredField("IActivityManagerSingleton");
+        fieldHandler.setAccessible(true);
+        Singleton<IActivityManager> activityManager =
+                (Singleton<IActivityManager>) fieldHandler.get(null);
+        IActivityManager realInstance = activityManager.get();
+        doAnswer(new Answer() {
+            public Void answer(InvocationOnMock invocation) throws RemoteException {
+                if (realInstance != null) {
+                    realInstance.finishReceiver(invocation.getArgument(0),
+                            invocation.getArgument(1), invocation.getArgument(2),
+                            invocation.getArgument(3), invocation.getArgument(4),
+                            invocation.getArgument(5));
+                }
+                return null;
+            }
+        }).when(mMockedActivityManager).finishReceiver(nullable(IBinder.class), anyInt(),
+                nullable(String.class), nullable(Bundle.class), anyBoolean(), anyInt());
         mMockedServiceManager.replaceInstance(ActivityManager.class,
                 "IActivityManagerSingleton", null, activityManagerSingleton);
         doNothing().when(mConfigService).resetAllPreferences();
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSearchIndexableProviderTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSearchIndexableProviderTest.java
index b34d4f0..458c18f 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSearchIndexableProviderTest.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSearchIndexableProviderTest.java
@@ -18,13 +18,16 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
+import android.content.Context;
 import android.database.Cursor;
+import android.os.UserManager;
 import android.os.Vibrator;
 
 import com.android.cellbroadcastreceiver.CellBroadcastSearchIndexableProvider;
@@ -37,6 +40,9 @@
 public class CellBroadcastSearchIndexableProviderTest extends CellBroadcastTest {
     CellBroadcastSearchIndexableProvider mSearchIndexableProvider;
 
+    @Mock
+    UserManager mUserManager;
+
     @Before
     public void setUp() throws Exception {
         super.setUp(getClass().getSimpleName());
@@ -48,6 +54,9 @@
         doReturn(mResources).when(mSearchIndexableProvider).getResourcesMethod();
         doReturn("testString").when(mResources).getString(anyInt());
         doReturn(null).when(mSearchIndexableProvider).queryRawData(null);
+        doReturn(Context.USER_SERVICE).when(mContext).getSystemServiceName(UserManager.class);
+        doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
+        doReturn(true).when(mUserManager).isAdminUser();
     }
 
     @Test
@@ -79,6 +88,67 @@
         doReturn(mVibrator).when(mContext).getSystemService("test");
         doReturn(true).when(mVibrator).hasVibrator();
         doReturn(false).when(mSearchIndexableProvider).isShowFullScreenMessageVisible(mResources);
+        doReturn(false).when(mSearchIndexableProvider)
+                .isExerciseTestAlertsToggleVisible(any());
+        doReturn(false).when(mSearchIndexableProvider)
+                .isOperatorTestAlertsToggleVisible(any());
+        Cursor cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
+
+        //KEY_RECEIVE_CMAS_IN_SECOND_LANGUAGE
+        //KEY_ENABLE_TEST_ALERTS
+        //KEY_ENABLE_STATE_LOCAL_TEST_ALERTS
+        //KEY_ENABLE_PUBLIC_SAFETY_MESSAGES
+        //KEY_ENABLE_EMERGENCY_ALERTS
+        //KEY_ENABLE_CMAS_AMBER_ALERTS
+        //KEY_ENABLE_AREA_UPDATE_INFO_ALERTSf
+        //KEY_ENABLE_CMAS_AMBER_ALERTS
+        //KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS
+        //KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS
+        //KEY_ENABLE_ALERT_SPEECH
+        //KEY_ENABLE_CMAS_PRESIDENTIAL_ALERTS
+        //KEY_ENABLE_ALERTS_MASTER_TOGGLE
+        //KEY_OVERRIDE_DND
+        //KEY_ENABLE_EXERCISE_ALERTS
+        //KEY_OPERATOR_DEFINED_ALERTS
+        assertThat(cursor.getCount()).isEqualTo(17);
+
+        doReturn(false).when(mVibrator).hasVibrator();
+        //KEY_ENABLE_ALERT_VIBRATE
+        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
+        assertThat(cursor.getCount()).isEqualTo(18);
+
+        doReturn(true).when(mSearchIndexableProvider).isTestAlertsToggleVisible();
+        //KEY_ENABLE_TEST_ALERTS
+        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
+        assertThat(cursor.getCount()).isEqualTo(17);
+
+        doReturn(true).when(mSearchIndexableProvider).isShowFullScreenMessageVisible(mResources);
+        //KEY_ENABLE_TEST_ALERTS
+        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
+        assertThat(cursor.getCount()).isEqualTo(16);
+
+        doReturn(true).when(mSearchIndexableProvider)
+                .isExerciseTestAlertsToggleVisible(any());
+        doReturn(true).when(mSearchIndexableProvider)
+                .isOperatorTestAlertsToggleVisible(any());
+        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
+        assertThat(cursor.getCount()).isEqualTo(14);
+    }
+
+    @Test
+    public void testQueryNonIndexableKeysWithNonAdminMode() {
+        doReturn(false).when(mSearchIndexableProvider).isTestAlertsToggleVisible();
+        doReturn(false).when(mResources).getBoolean(anyInt());
+        doReturn("").when(mResources).getString(anyInt());
+        doReturn("test").when(mContext).getSystemServiceName(Vibrator.class);
+        doReturn(mVibrator).when(mContext).getSystemService("test");
+        doReturn(true).when(mVibrator).hasVibrator();
+        doReturn(false).when(mSearchIndexableProvider).isShowFullScreenMessageVisible(mResources);
+        doReturn(false).when(mSearchIndexableProvider)
+                .isExerciseTestAlertsToggleVisible(any());
+        doReturn(false).when(mSearchIndexableProvider)
+                .isOperatorTestAlertsToggleVisible(any());
+        doReturn(false).when(mUserManager).isAdminUser();
         Cursor cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
 
         //KEY_RECEIVE_CMAS_IN_SECOND_LANGUAGE
@@ -93,21 +163,13 @@
         //KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS
         //KEY_ENABLE_ALERT_SPEECH
         //KEY_ENABLE_CMAS_PRESIDENTIAL_ALERTS
-        assertThat(cursor.getCount()).isEqualTo(13);
-
-        doReturn(false).when(mVibrator).hasVibrator();
-        //KEY_ENABLE_ALERT_VIBRATE
-        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
-        assertThat(cursor.getCount()).isEqualTo(14);
-
-        doReturn(true).when(mSearchIndexableProvider).isTestAlertsToggleVisible();
-        //KEY_ENABLE_TEST_ALERTS
-        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
-        assertThat(cursor.getCount()).isEqualTo(13);
-
-        doReturn(true).when(mSearchIndexableProvider).isShowFullScreenMessageVisible(mResources);
-        //KEY_ENABLE_TEST_ALERTS
-        cursor = mSearchIndexableProvider.queryNonIndexableKeys(new String[]{""});
-        assertThat(cursor.getCount()).isEqualTo(12);
+        //KEY_ENABLE_ALERTS_MASTER_TOGGLE
+        //KEY_OVERRIDE_DND
+        //KEY_ENABLE_EXERCISE_ALERTS
+        //KEY_OPERATOR_DEFINED_ALERTS
+        //KEY_EMERGENCY_ALERT_HISTORY
+        //KEY_ALERT_REMINDER_INTERVAL
+        //TITLE
+        assertThat(cursor.getCount()).isEqualTo(21);
     }
 }
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java
index 7402059..57821b8 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java
@@ -30,7 +30,6 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -65,7 +64,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
-import java.lang.reflect.Field;
 import java.util.Locale;
 
 
@@ -104,6 +102,10 @@
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         MockitoAnnotations.initMocks(this);
         CellBroadcastSettings.resetResourcesCache();
+        SubscriptionManager mockSubManager = mock(SubscriptionManager.class);
+        injectSystemService(SubscriptionManager.class, mockSubManager);
+        SubscriptionInfo mockSubInfo = mock(SubscriptionInfo.class);
+        doReturn(mockSubInfo).when(mockSubManager).getActiveSubscriptionInfo(anyInt());
     }
 
     @After
@@ -371,7 +373,6 @@
         String topIntroRoamingText = "test";
         doReturn(topIntroRoamingText).when(mContext.getResources()).getString(
                 eq(R.string.top_intro_roaming_text));
-        setSubscriptionManager();
         setPreference(PREFERENCE_PUT_TYPE_STRING, ROAMING_OPERATOR_SUPPORTED, "XXX");
 
         CellBroadcastSettings settings = startActivity();
@@ -383,7 +384,6 @@
 
     @Test
     public void testDoNotShowTestCheckBox() throws Throwable {
-        setSubscriptionManager();
         setPreference(PREFERENCE_PUT_TYPE_BOOL, TESTING_MODE, "false");
         doReturn(false).when(mContext.getResources()).getBoolean(
                 eq(R.bool.show_separate_exercise_settings));
@@ -394,6 +394,7 @@
         doReturn(new String[]{"0x111E:rat=gsm, emergency=true"}).when(mContext.getResources())
                 .getStringArray(eq(R.array.operator_defined_alert_range_strings));
         CellBroadcastSettings settings = startActivity();
+        waitForMs(100);
 
         TwoStatePreference exerciseTestCheckBox =
                 settings.mCellBroadcastSettingsFragment.findPreference(
@@ -402,24 +403,12 @@
                 settings.mCellBroadcastSettingsFragment.findPreference(
                         CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
 
-        // received the ACTION_TESTING_MODE_CHANGED, do not show exerciseTestCheckBox &
-        // operatorDefinedCheckBox
-        Field fieldTestingModeChangedReceiver =
-                CellBroadcastSettings.CellBroadcastSettingsFragment.class.getDeclaredField(
-                        "mTestingModeChangedReceiver");
-        fieldTestingModeChangedReceiver.setAccessible(true);
-        BroadcastReceiver broadcastReceiver =
-                (BroadcastReceiver) fieldTestingModeChangedReceiver.get(
-                        settings.mCellBroadcastSettingsFragment);
-        broadcastReceiver.onReceive(mContext, new Intent().setAction(ACTION_TESTING_MODE_CHANGED));
-
         assertFalse(exerciseTestCheckBox.isVisible());
         assertFalse(operatorDefinedCheckBox.isVisible());
     }
 
     @Test
-    public void testShowTestCheckBox() throws Throwable {
-        setSubscriptionManager();
+    public void testShowTestCheckBoxWithTestingMode() throws Throwable {
         setPreference(PREFERENCE_PUT_TYPE_BOOL, TESTING_MODE, "true");
         doReturn(true).when(mContext.getResources()).getBoolean(
                 eq(R.bool.show_separate_exercise_settings));
@@ -430,6 +419,7 @@
         doReturn(new String[]{"0x111E:rat=gsm, emergency=true"}).when(mContext.getResources())
                 .getStringArray(eq(R.array.operator_defined_alert_range_strings));
         CellBroadcastSettings settings = startActivity();
+        waitForMs(100);
 
         TwoStatePreference exerciseTestCheckBox =
                 settings.mCellBroadcastSettingsFragment.findPreference(
@@ -438,28 +428,37 @@
                 settings.mCellBroadcastSettingsFragment.findPreference(
                         CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
 
-        // received the ACTION_TESTING_MODE_CHANGED, show exerciseTestCheckBox &
-        // operatorDefinedCheckBox
-        Field fieldTestingModeChangedReceiver =
-                CellBroadcastSettings.CellBroadcastSettingsFragment.class.getDeclaredField(
-                        "mTestingModeChangedReceiver");
-        fieldTestingModeChangedReceiver.setAccessible(true);
-        BroadcastReceiver broadcastReceiver =
-                (BroadcastReceiver) fieldTestingModeChangedReceiver.get(
-                        settings.mCellBroadcastSettingsFragment);
-        broadcastReceiver.onReceive(mContext, new Intent().setAction(ACTION_TESTING_MODE_CHANGED));
-
-        waitForChange(() -> exerciseTestCheckBox.isVisible(), TEST_TIMEOUT_MILLIS);
         assertTrue(exerciseTestCheckBox.isVisible());
-        waitForChange(() -> operatorDefinedCheckBox.isVisible(), TEST_TIMEOUT_MILLIS);
         assertTrue(operatorDefinedCheckBox.isVisible());
     }
 
-    private void setSubscriptionManager() {
-        SubscriptionManager mockSubManager = mock(SubscriptionManager.class);
-        injectSystemService(SubscriptionManager.class, mockSubManager);
-        SubscriptionInfo mockSubInfo = mock(SubscriptionInfo.class);
-        doReturn(mockSubInfo).when(mockSubManager).getActiveSubscriptionInfo(anyInt());
+    @Test
+    public void testShowTestCheckBox() throws Throwable {
+        setPreference(PREFERENCE_PUT_TYPE_BOOL, TESTING_MODE, "false");
+        doReturn(true).when(mContext.getResources()).getBoolean(
+                eq(R.bool.show_separate_exercise_settings));
+        doReturn(true).when(mContext.getResources()).getBoolean(
+                eq(R.bool.show_separate_operator_defined_settings));
+        doReturn(true).when(mContext.getResources()).getBoolean(
+                eq(R.bool.show_exercise_settings));
+        doReturn(true).when(mContext.getResources()).getBoolean(
+                eq(R.bool.show_operator_defined_settings));
+        doReturn(new String[]{"0x111D:rat=gsm, emergency=true"}).when(mContext.getResources())
+                .getStringArray(eq(R.array.exercise_alert_range_strings));
+        doReturn(new String[]{"0x111E:rat=gsm, emergency=true"}).when(mContext.getResources())
+                .getStringArray(eq(R.array.operator_defined_alert_range_strings));
+        CellBroadcastSettings settings = startActivity();
+        waitForMs(100);
+
+        TwoStatePreference exerciseTestCheckBox =
+                settings.mCellBroadcastSettingsFragment.findPreference(
+                        CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS);
+        TwoStatePreference operatorDefinedCheckBox =
+                settings.mCellBroadcastSettingsFragment.findPreference(
+                        CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS);
+
+        assertTrue(exerciseTestCheckBox.isVisible());
+        assertTrue(operatorDefinedCheckBox.isVisible());
     }
 
     private void setPreference(int putType, String key, String value) {