Merge "Add flag to enable enhanced mac randomization" into rvc-dev
diff --git a/libs/WifiTrackerLib/res/values-af/strings.xml b/libs/WifiTrackerLib/res/values-af/strings.xml
index 763f1a3..b426051 100644
--- a/libs/WifiTrackerLib/res/values-af/strings.xml
+++ b/libs/WifiTrackerLib/res/values-af/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Beperk"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Onbeperk"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Gekoppel via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Beskikbaar deur <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Outomaties gekoppel deur <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Outomaties deur netwerkgraderingverskaffer gekoppel"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Beperkte verbinding"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Geen"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Verval"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Tik om aan te meld"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Tik om intekening te hernu en te koppel"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Maak tans <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> oop"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Kon nie koppel nie"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Voltooi tans aanmelding …"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Kon nie aanmelding voltooi nie. Tik om weer te probeer."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Aanmelding is voltooi. Koppel tans …"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Hierdie netwerk ontvang \'n unieke ID wat gebruik kan word om toestelligging na te spoor.\n"<annotation id="url">"Kom meer te wete"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-am/strings.xml b/libs/WifiTrackerLib/res/values-am/strings.xml
index 8d8eec4..52fbdf1 100644
--- a/libs/WifiTrackerLib/res/values-am/strings.xml
+++ b/libs/WifiTrackerLib/res/values-am/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"የሚለካ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"ያልተለካ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"በ <xliff:g id="NAME">%1$s</xliff:g> በኩል ተገናኝተዋል"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"በ<xliff:g id="NAME">%1$s</xliff:g> በኩል የሚገኝ"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"በ<xliff:g id="NAME">%1$s</xliff:g> በኩል በራስ-ሰር ተገናኝቷል"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"በአውታረ መረብ ደረጃ ሰጪ አቅራቢ በኩል በራስ-ሰር ተገናኝቷል"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"የተገደበ ግንኙነት"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"የለም"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ጊዜው አልፏል"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ለመመዝገብ መታ ያድርጉ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"የደንበኝነት ምዝገባን ዳግም ለማደስ እና ለማገናኘት መታ ይድርጉ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>ን በመክፈት ላይ"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"መገናኘት አልተቻለም"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"መመዝገብን በማጠናቀቅ ላይ…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ምዝገባን ማጠናቀቅ አልተቻለም። እንደገና ለመሞከር መታ ያድርጉ።"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ምዝገባ ተጠናቋል። በማገናኘት ላይ…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ይህ አውታረ መረብ የመሣሪያ አካባቢን ለመከታተል ሥራ ላይ ሊውል የሚችል ልዩ መታወቂያ ተቀብሏል።\n"<annotation id="url">"የበለጠ ለመረዳት"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ar/strings.xml b/libs/WifiTrackerLib/res/values-ar/strings.xml
index 35cdc09..7fdda62 100644
--- a/libs/WifiTrackerLib/res/values-ar/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ar/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"تفرض تكلفة استخدام"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"بدون قياس"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"تم الاتصال عبر <xliff:g id="NAME">%1$s</xliff:g>."</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"متاحة من خلال <xliff:g id="NAME">%1$s</xliff:g>."</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"تم تلقائيًا توصيل الجهاز بشبكة <xliff:g id="NAME">%1$s</xliff:g>."</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"تم الاتصال تلقائيًا عبر مقدم خدمة تقييم الشبكة"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"اتصال محدود"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"بلا أمان"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"منتهية الصلاحية"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"انقر للاشتراك."</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"انقر لتجديد الاشتراك والاتصال بالشبكة."</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"جارٍ فتح <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"تعذّر الاتصال بالإنترنت."</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"جارٍ إكمال الاشتراك…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"تعذّر إكمال الاشتراك. انقر لإعادة المحاولة."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"اكتمل الاشتراك. جارٍ الاتصال…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"تتلقّى هذه الشبكة معرّفًا فريدًا يمكن استخدامه لتتبُّع الموقع الجغرافي للجهاز.\n"<annotation id="url">"مزيد من المعلومات"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-as/strings.xml b/libs/WifiTrackerLib/res/values-as/strings.xml
index d7fc329..18cb039 100644
--- a/libs/WifiTrackerLib/res/values-as/strings.xml
+++ b/libs/WifiTrackerLib/res/values-as/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"নিৰিখ-নিৰ্দিষ্ট"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"নিৰিখ অনিৰ্দিষ্ট"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g>ৰ জৰিয়তে সংযুক্ত"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g>ৰ জৰিয়তে উপলব্ধ"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g>ৰ জৰিয়তে স্বয়ংক্ৰিয়ভাৱে সংযুক্ত"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"নেটৱৰ্ক ৰেটিং প্ৰদানকাৰীৰ জৰিয়তে স্বয়ং সংয়োগ কৰা হ’ল"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ইণ্টাৰনেট সংযোগ সীমিত"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"নাই"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ম্যাদ উকলিছে"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ছাইন আপ কৰিবলৈ টিপক"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ছাবস্ক্ৰিপশ্বন নৱীকৰণ আৰু সংযোগ কৰিবলৈ টিপক"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> খুলি থকা হৈছে"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"সংযোগ কৰিব পৰা নগ’ল"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"ছাইন আপ সম্পূৰ্ণ কৰি থকা হৈছে…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ছাইন আপ সম্পূৰ্ণ কৰিব পৰা নগ’ল। পুনৰ চেষ্টা কৰিবলৈ টিপক।"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ছাইন আপ সম্পূৰ্ণ হৈছে। সংযোগ কৰি থকা হৈছে…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"এই নেটৱৰ্কটোৱে এটা অদ্বৈত আইডি পায়, যিটো ডিভাইচৰ অৱস্থান ট্ৰেক কৰিবলৈ ব্যৱহাৰ কৰিব পৰা যায়।\n"<annotation id="url">"অধিক জানক"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-az/strings.xml b/libs/WifiTrackerLib/res/values-az/strings.xml
index 6565ac8..be3d8d5 100644
--- a/libs/WifiTrackerLib/res/values-az/strings.xml
+++ b/libs/WifiTrackerLib/res/values-az/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Ödənişli"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Limitsiz"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> ilə qoşulub"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> vasitəsilə əlçatandır"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> vasitəsilə avtomatik qoşulub"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Avtomatik olaraq şəbəkə reytinq provayderi ilə qoşuludur"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Məhdud bağlantı"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Heç biri"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Vaxtı keçib"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Qeydiyyatdan keçmək üçün toxunun"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Abunəliyi yeniləmək və qoşulmaq üçün toxunun"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> açılır"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Qoşulmaq mümkün olmadı"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Qeydiyyat tamamlanır…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Qeydiyyat tamamlanmadı. Yenidən cəhd etmək üçün toxunun."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Qeydiyyat tamamlandı. Qoşulur…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Bu şəbəkə cihaz məkanını izləmək üçün istifadə edilə biləcək unikal ID qəbul edir.\n"<annotation id="url">"Ətraflı məlumat"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-b+sr+Latn/strings.xml b/libs/WifiTrackerLib/res/values-b+sr+Latn/strings.xml
index 330672d..376ec6c 100644
--- a/libs/WifiTrackerLib/res/values-b+sr+Latn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-b+sr+Latn/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Sa ograničenjem"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Bez ograničenja"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Povezano preko: <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Dostupno preko aplikacije <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatski povezano preko: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatski povezano preko dobavljača ocene mreže"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ograničena veza"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nema"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Isteklo"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Dodirnite da biste se registrovali"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Dodirnite da biste obnovili pretplatu i povezali"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Otvara se <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Povezivanje nije uspelo"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Registracija se dovršava…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Dovršavanje registracije nije uspelo. Dodirnite da biste probali ponovo."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registracija je dovršena. Povezuje se…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ova mreža zahteva jedinstveni ID koji može da se koristi za praćenje lokacije uređaja.\n"<annotation id="url">"Saznajte više"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-be/strings.xml b/libs/WifiTrackerLib/res/values-be/strings.xml
index 247a55a..adda3a8 100644
--- a/libs/WifiTrackerLib/res/values-be/strings.xml
+++ b/libs/WifiTrackerLib/res/values-be/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Сетка з улікам трафіка"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Сетка без уліку трафіка"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Падключана праз праграму \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Даступна праз: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Аўтаматычна падключана праз: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Аўтаматычна падключана праз пастаўшчыка паслугі ацэнкі сеткі"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Абмежаваныя магчымасці падключэння"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Няма"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Тэрмін скончыўся"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Націсніце, каб зарэгістравацца"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Націсніце, каб падоўжыць падпіску і падключыцца"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Адкрываецца <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Не ўдалося падключыцца"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Рэгістрацыя завяршаецца…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Не ўдалося выканаць рэгістрацыю. Дакраніцеся, каб паўтарыць спробу."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Рэгістрацыя завершана. Ідзе падключэнне…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Гэта сетка атрымлівае ўнікальны ідэнтыфікатар, які можа выкарыстоўвацца для адсочвання месцазнаходжання прылады.\n"<annotation id="url">"Даведацца больш"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-bg/strings.xml b/libs/WifiTrackerLib/res/values-bg/strings.xml
index 2993be9..d98f4fc 100644
--- a/libs/WifiTrackerLib/res/values-bg/strings.xml
+++ b/libs/WifiTrackerLib/res/values-bg/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"С отчитане"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Без отчитане"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Установена е връзка през <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Достъпно чрез <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Автоматично бе установена връзка през <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Автоматично е установена връзка чрез доставчик на услуги за оценяване на мрежите"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ограничена връзка"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Няма"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Изтекло"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Докоснете, за да се регистрирате"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Докоснете, за да подновите абонамента и да установите връзка"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> се отваря"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Не можа да се установи връзка"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Регистрацията се завършва…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Регистрацията не можа да бъде завършена. Докоснете, за да опитате отново."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Регистрацията е завършена. Установява се връзка…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Тази мрежа получава уникален идентификатор, който може да се използва за проследяване на местоположението на устройството.\n"<annotation id="url">"Научете повече"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-bn/strings.xml b/libs/WifiTrackerLib/res/values-bn/strings.xml
index b7610f9..d34c815 100644
--- a/libs/WifiTrackerLib/res/values-bn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-bn/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"মিটার্ড"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"পরিমাপ করা নয়"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g>-এর মাধ্যমে কানেক্ট করা আছে"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g>-এর মাধ্যমে উপলভ্য"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g>-এর মাধ্যমে অটোমেটিক কানেক্ট করা আছে"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"নেটওয়ার্কের রেটিং প্রদানকারীর মাধ্যমে অটোমেটিক কানেক্ট"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"সীমিত কানেকশন"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"কোনো কিছুই নয়"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"মেয়াদ শেষ হয়ে গেছে"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"সাইন-আপ করতে ট্যাপ করুন"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"সাবস্ক্রিপশন রিনিউ করে কানেক্ট করতে ট্যাপ করুন"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> খোলা হচ্ছে"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"কানেক্ট করা যায়নি"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"সাইন-আপ করা হচ্ছে…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"সাইন-আপ করা যায়নি। আবার চেষ্টা করতে ট্যাপ করুন।"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"সাইন-আপ করা হয়ে গেছে। কানেক্ট করা হচ্ছে…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"এই নেটওয়ার্ক একটি অনন্য আইডি পায় যেটি ব্যবহার করে ডিভাইস লোকেশন ট্র্যাক করা যায়।\n"<annotation id="url">"আরও জানুন"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-bs/strings.xml b/libs/WifiTrackerLib/res/values-bs/strings.xml
index 635239a..5e3d540 100644
--- a/libs/WifiTrackerLib/res/values-bs/strings.xml
+++ b/libs/WifiTrackerLib/res/values-bs/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"S naplatom"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Mreža bez naplate"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Povezano preko <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Dostupno putem mreže <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatski povezano putem mreže <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatski povezano putem ocjenjivača mreže"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ograničena veza"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ništa"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Istekao"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Dodirnite za registraciju"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Dodirnite da obnovite pretplatu i povežete se"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Otvaranje <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Povezivanje nije uspjelo"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Završavanje registracije…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registraciju nije moguće izvršiti. Dodirnite da pokušate ponovo."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registracija je završena. Povezivanje…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ova mreža prima jedinstveni ID koji se može koristiti za praćenje lokacije uređaja.\n"<annotation id="url">"Saznajte više"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ca/strings.xml b/libs/WifiTrackerLib/res/values-ca/strings.xml
index d3ed654..92dfe52 100644
--- a/libs/WifiTrackerLib/res/values-ca/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ca/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"D\'ús mesurat"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"D\'ús no mesurat"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Connectat mitjançant <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponible mitjançant <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Connectada automàticament a través de: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Connectada automàticament a través d\'un proveïdor de valoració de xarxes"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Connexió limitada"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Cap"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Caducat"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toca per registrar-te"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Toca per renovar la subscripció i connectar-te"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"S\'està obrint <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"No s\'ha pogut connectar"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"S\'està completant el registre…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"No s\'ha pogut completar el registre. Toca per tornar-ho a provar."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"S\'ha completat el registre. S\'està connectant…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Aquesta xarxa rep un identificador únic que es pot utilitzar per fer el seguiment de la ubicació del dispositiu.\n"<annotation id="url">"Més informació"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-cs/strings.xml b/libs/WifiTrackerLib/res/values-cs/strings.xml
index d3f902f..488194a 100644
--- a/libs/WifiTrackerLib/res/values-cs/strings.xml
+++ b/libs/WifiTrackerLib/res/values-cs/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Měřená"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Neměřená"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Připojeno přes <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Dostupné přes <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automaticky připojeno přes <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automaticky připojeno přes poskytovatele hodnocení sítí"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Omezené připojení"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Žádné"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Platnost vypršela"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Klepnutím se zaregistrujete"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Klepnutím obnovíte předplatné a připojíte se"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Spouštění aplikace <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nelze se připojit"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Dokončování registrace…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registraci se nepodařilo dokončit. Klepnutím opakujte akci."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registrace byla dokončena. Připojování…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Tato síť dostane jedinečný identifikátor, pomocí kterého lze sledovat polohu zařízení.\n"<annotation id="url">"Další informace"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-da/strings.xml b/libs/WifiTrackerLib/res/values-da/strings.xml
index b27f71c..9657b91 100644
--- a/libs/WifiTrackerLib/res/values-da/strings.xml
+++ b/libs/WifiTrackerLib/res/values-da/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Forbrugsafregnet"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Ikke forbrugsafregnet"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Forbundet via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Tilgængeligt via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Der er oprettet automatisk forbindelse via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatisk forbundet via udbyder af netværksvurdering"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Begrænset forbindelse"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ingen"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Udløbet"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Tryk for at registrere"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Tryk for at forny abonnementet, og opret forbindelse"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Åbner <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Der kunne ikke oprettes forbindelse"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Fuldfører registrering…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registreringen kunne ikke fuldføres. Tryk for at prøve igen."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registreringen er fuldført. Opretter forbindelse…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Dette netværk kræver et unikt id, der kan bruges til at spore enhedens placering.\n"<annotation id="url">"Få flere oplysninger"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-de/strings.xml b/libs/WifiTrackerLib/res/values-de/strings.xml
index 5fb09a2..afaaeec 100644
--- a/libs/WifiTrackerLib/res/values-de/strings.xml
+++ b/libs/WifiTrackerLib/res/values-de/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Kostenpflichtig"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Kostenlos"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Verbunden über <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Über <xliff:g id="NAME">%1$s</xliff:g> verfügbar"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatisch verbunden über <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatisch über Anbieter von Netzwerkbewertungen verbunden"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Eingeschränkte Verbindung"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Keine"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Abgelaufen"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Zum Registrieren tippen"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Tippen, um das Abo zu verlängern und eine Verbindung herzustellen"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> wird geöffnet"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Verbindung nicht möglich"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Registrierung wird abgeschlossen…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registrierung konnte nicht abgeschlossen werden. Tippe, um es noch einmal zu versuchen."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registrierung abgeschlossen. Verbindung wird hergestellt…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Dieses Netz empfängt eine eindeutige ID, mit der der Gerätestandort erfasst werden kann.\n"<annotation id="url">"Weitere Informationen"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-el/strings.xml b/libs/WifiTrackerLib/res/values-el/strings.xml
index f9bedef..86bde63 100644
--- a/libs/WifiTrackerLib/res/values-el/strings.xml
+++ b/libs/WifiTrackerLib/res/values-el/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Μέτρηση με βάση τη χρήση"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Χωρίς μέτρηση με βάση τη χρήση"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Συνδέθηκε μέσω <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Διαθέσιμο μέσω <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Συνδέθηκε αυτόματα μέσω <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Συνδέθηκε αυτόματα μέσω παρόχου αξιολόγησης δικτύου"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Περιορισμένη σύνδεση"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Καμία"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Έληξε"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Πατήστε για εγγραφή"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Πατήστε για να ανανεώσετε τη συνδρομή σας και να συνδεθείτε."</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Άνοιγμα <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Αδυναμία σύνδεσης"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Ολοκλήρωση εγγραφής…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Δεν ήταν δυνατή η ολοκλήρωση της εγγραφής. Πατήστε για να δοκιμάσετε ξανά."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Η εγγραφή ολοκληρώθηκε. Σύνδεση…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Αυτό το δίκτυο λαμβάνει ένα μοναδικό αναγνωριστικό που μπορεί να χρησιμοποιηθεί για τον εντοπισμό της τοποθεσίας της συσκευής.\n"<annotation id="url">"Μάθετε περισσότερα"</annotation>"."</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-es-rUS/strings.xml b/libs/WifiTrackerLib/res/values-es-rUS/strings.xml
index 14adda0..2286225 100644
--- a/libs/WifiTrackerLib/res/values-es-rUS/strings.xml
+++ b/libs/WifiTrackerLib/res/values-es-rUS/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Con uso medido"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Sin tarifa plana"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Conexión a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponible a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Se conectó automáticamente a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Conectado automáticamente mediante proveedor de calificación de red"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Conexión limitada"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ninguna"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Vencido"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Presiona para registrarte"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Presiona para renovar la suscripción y conectarte"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Abriendo <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"No se pudo establecer conexión"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Completando registro…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"No se pudo completar el registro. Presiona para volver a intentarlo."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Se completó el registro. Conectando…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Esta red recibe un ID único con el que se puede realizar el seguimiento de la ubicación del dispositivo.\n"<annotation id="url">"Más información"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-es/strings.xml b/libs/WifiTrackerLib/res/values-es/strings.xml
index f0b4360..f3ad17b 100644
--- a/libs/WifiTrackerLib/res/values-es/strings.xml
+++ b/libs/WifiTrackerLib/res/values-es/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Medida"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"No medida"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Conectado a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponible a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Conectada automáticamente mediante <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Conectado automáticamente a través de un proveedor de valoración de redes"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Conexión limitada"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ninguna"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Caducado"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toca para registrarte"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Toca para renovar la suscripción y conectarte"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Abriendo <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"No se ha podido conectar"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Completando registro…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"No se ha podido completar el registro. Toca para volver a intentarlo."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Se ha completado el registro. Conectando…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Esta red recibe un ID único con el que se puede rastrear la ubicación del dispositivo.\n"<annotation id="url">"Más información"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-et/strings.xml b/libs/WifiTrackerLib/res/values-et/strings.xml
index 99d6f1b..bbc6aee 100644
--- a/libs/WifiTrackerLib/res/values-et/strings.xml
+++ b/libs/WifiTrackerLib/res/values-et/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Mahupõhine"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Mittemahupõhine"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Ühendatud võrgu <xliff:g id="NAME">%1$s</xliff:g> kaudu"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Saadaval teenuse <xliff:g id="NAME">%1$s</xliff:g> kaudu"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automaatselt ühendatud teenusepakkuja <xliff:g id="NAME">%1$s</xliff:g> kaudu"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Ühendus loodi automaatselt võrgukvaliteedi hinnangute pakkuja kaudu"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Piiratud ühendus"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Puudub"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Aegunud"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Puudutage registreerimiseks"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Puudutage tellimuse uuendamiseks ja ühenduse loomiseks"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Teenuse <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> avamine"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Ühendust ei saanud luua"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Registreerimise lõpuleviimine …"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registreerimist ei saanud lõpule viia. Puudutage, et uuesti proovida."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registreerimine on lõpule viidud. Ühendamine …"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"See võrk saab kordumatu ID, mida saab kasutada seadme asukoha jälgimiseks.\n"<annotation id="url">"Lisateave"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-eu/strings.xml b/libs/WifiTrackerLib/res/values-eu/strings.xml
index fc3b6ef..dd85cfe 100644
--- a/libs/WifiTrackerLib/res/values-eu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-eu/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Sare neurtua"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Neurtu gabeko sarea"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> bidez konektatuta"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> bidez erabilgarri"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatikoki konektatu da <xliff:g id="NAME">%1$s</xliff:g> bidez"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatikoki konektatuta sareen balorazioen hornitzailearen bidez"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Konexio mugatua"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Bat ere ez"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Iraungita"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Sakatu izena emateko"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Sakatu harpidetza berritzeko eta konektatu ahal izateko"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> irekitzen"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Ezin izan da konektatu"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Izena ematen…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Ezin izan da eman izena. Berriro saiatzeko, ukitu hau."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Eman da izena. Konektatzen…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Gailuaren kokapenaren jarraipena egiteko balio duen ID esklusibo bat jasotzen du sare honek.\n"<annotation id="url">"Lortu informazio gehiago"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fa/strings.xml b/libs/WifiTrackerLib/res/values-fa/strings.xml
index 2826f07..97cc7a7 100644
--- a/libs/WifiTrackerLib/res/values-fa/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fa/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"محدودشده"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"محدودنشده"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"متصل شده ازطریق <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"در دسترس ازطریق <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"به‌طور خودکار ازطریق <xliff:g id="NAME">%1$s</xliff:g> متصل شد"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"اتصال خودکار ازطریق ارائه‌دهنده رتبه‌بندی شبکه"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"اتصال محدود"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"خالی"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"منقضی‌شده"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"برای ثبت‌نام ضربه بزنید"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"برای تمدید اشتراک و متصل شدن، ضربه بزنید"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"درحال بازکردن <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"متصل نشد"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"درحال تکمیل ثبت‌نام…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ثبت‌نام تکمیل نشد. برای امتحان مجدد ضربه بزنید."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ثبت‌نام کامل شد. درحال اتصال…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"این شبکه شناسه یکتایی دریافت می‌کند که می‌توان از آن برای ردیابی مکان دستگاه استفاده کرد.\n"<annotation id="url">"بیشتر بدانید"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fi/strings.xml b/libs/WifiTrackerLib/res/values-fi/strings.xml
index 71e8429..9efd7b1 100644
--- a/libs/WifiTrackerLib/res/values-fi/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fi/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Maksullinen"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Maksuton"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Yhdistetty (<xliff:g id="NAME">%1$s</xliff:g>)"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Saatavilla tämän kautta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automaattisesti yhdistetty tämän kautta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Yhdistetty automaattisesti verkon arviointipalvelun kautta"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Rajallinen yhteys"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ei mitään"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Vanhentunut"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Rekisteröidy napauttamalla"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Kosketa, jos haluat uusia tilauksen ja muodostaa yhteyden"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Avataan <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Ei yhteyttä"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Viimeistellään rekisteröitymistä…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Rekisteröityminen ei onnistunut. Yritä uudelleen napauttamalla."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Rekisteröityminen valmis. Yhdistetään…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Tälle verkolle lähetetään yksilöllinen tunnus, jolla voidaan seurata laitteen sijaintia.\n"<annotation id="url">"Lue lisää"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml b/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml
index 88d3634..eac36cb 100644
--- a/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Facturé à l\'usage"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Non mesuré"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Connecté sur le réseau <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Accessible dans <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Connecté automatiquement par le réseau <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Connecté automatiquement par le fournisseur d\'avis sur le réseau"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Connexion limitée"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Aucune"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Expiré"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toucher pour vous inscrire"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Touchez pour renouveler l\'abonnement et vous connecter"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Ouverture de <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> en cours…"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Impossible de se connecter"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Finalisation de l\'inscription en cours…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Impossible de terminer l\'inscription. Touchez pour réessayer."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Inscription terminée. Connexion en cours…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ce réseau reçoit un identifiant unique qui peut être utilisé pour faire le suivi de la position de l\'appareil.\n"<annotation id="url">"En savoir plus"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fr/strings.xml b/libs/WifiTrackerLib/res/values-fr/strings.xml
index 52d0c41..82aea86 100644
--- a/libs/WifiTrackerLib/res/values-fr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fr/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Facturé à l\'usage"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Non facturé à l\'usage"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Connecté via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponible via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Connecté automatiquement via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Connecté automatiquement via un fournisseur d\'évaluation de l\'état du réseau"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Connexion limitée"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Aucune"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Arrivé à expiration"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Appuyez ici pour vous connecter"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Appuyez pour renouveler l\'abonnement et vous connecter"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Ouverture de <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>…"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Impossible de se connecter"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Finalisation de l\'inscription…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Impossible de finaliser l\'inscription. Appuyez ici pour réessayer."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Inscription terminée. Connexion…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ce réseau reçoit un identifiant unique qui peut être utilisé pour suivre la position de l\'appareil.\n"<annotation id="url">"Plus d\'infos"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-gl/strings.xml b/libs/WifiTrackerLib/res/values-gl/strings.xml
index e8dc0b0..ea86e58 100644
--- a/libs/WifiTrackerLib/res/values-gl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-gl/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Sen tarifa plana"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Con tarifa plana"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Wifi conectada a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Dispoñible a través de <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Wifi conectada automaticamente a través de: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Conectada automaticamente a través dun provedor de valoración de rede"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Pouca conexión"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ningunha"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Caducou"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toca para rexistrarte"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Toca para renovar a subscrición e conectarte"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Abrindo <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Non se puido conectar"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Completando rexistro…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Non se puido completar o rexistro. Toca para tentalo de novo."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Completouse o rexistro. Conectando…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Esta rede recibe un código exclusivo que se pode utilizar para realizar un seguimento da localización do dispositivo.\n"<annotation id="url">"Máis información"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-gu/strings.xml b/libs/WifiTrackerLib/res/values-gu/strings.xml
index 2a032a5..5094a5c 100644
--- a/libs/WifiTrackerLib/res/values-gu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-gu/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"મીટર કરેલ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"મીટર ન કરેલ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> દ્વારા કનેક્ટ થયેલ"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> મારફતે ઉપલબ્ધ"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> મારફતે ઑટોમૅટિક રીતે કનેક્ટ કર્યું છે"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"નેટવર્ક રેટિંગ પ્રદાતા દ્વારા આપમેળે કનેક્ટ થયું"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"મર્યાદિત કનેક્શન"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"કોઈ નહીં"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"સમય સમાપ્ત થયો"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"સાઇન અપ કરવા માટે ટૅપ કરો"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"સબ્સ્ક્રિપ્શનને રિન્યૂ કરવા માટે ટૅપ કરો અને કનેક્ટ કરો"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ખોલી રહ્યાં છીએ"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"કનેક્ટ કરી શક્યા નથી"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"સાઇન અપ પૂર્ણ કરી રહ્યા છીએ…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"સાઇન અપ પૂર્ણ કરી શકાયું નથી. ફરી પ્રયાસ કરવા માટે ટૅપ કરો."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"સાઇન અપ પૂર્ણ. કનેક્ટ કરી રહ્યાં છીએ…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"આ નેટવર્ક એક અજોડ ID મેળવે છે જેનો ઉપયોગ ડિવાઇસનું સ્થાન ટ્રૅક કરવા માટે થઈ શકે છે.\n"<annotation id="url">"વધુ જાણો"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hi/strings.xml b/libs/WifiTrackerLib/res/values-hi/strings.xml
index 0dd899f..476f18a 100644
--- a/libs/WifiTrackerLib/res/values-hi/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hi/strings.xml
@@ -19,8 +19,7 @@
     <string name="summary_separator" msgid="6533720408587140819">" / "</string>
     <string name="auto_connect_disable" msgid="1078319396240632542">"अपने-आप कनेक्ट होने की सुविधा बंद है"</string>
     <string name="saved_network" msgid="6241977554502802914">"<xliff:g id="NAME">%1$s</xliff:g> के द्वारा सहेजा गया"</string>
-    <!-- no translation found for wifi_no_internet_no_reconnect (3089980800841926268) -->
-    <skip />
+    <string name="wifi_no_internet_no_reconnect" msgid="3089980800841926268">"अपने-आप कनेक्ट नहीं होगा"</string>
     <string name="wifi_no_internet" msgid="4461212237521310895">"इंटरनेट नहीं है"</string>
     <string name="wifi_disabled_password_failure" msgid="3015007143699702403">"पुष्टि नहीं हो सकी"</string>
     <string name="wifi_check_password_try_again" msgid="2643230209986217827">"पासवर्ड जाँचें और दोबारा कोशिश करें"</string>
@@ -32,10 +31,8 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"डेटा इस्तेमाल करने की सीमा तय की गई है"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"डेटा इस्तेमाल करने की सीमा तय नहीं की गई है"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> के ज़रिए कनेक्ट किया गया"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
-    <!-- no translation found for connected_via_network_scorer (209764314005159012) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"यह <xliff:g id="NAME">%1$s</xliff:g> के ज़रिए उपलब्ध है"</string>
+    <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> के ज़रिए अपने-आप कनेक्ट किया गया"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"नेटवर्क रेटिंग कंपनी के ज़रिए अपने आप कनेक्ट है"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"सीमित कनेक्शन"</string>
     <string name="private_dns_broken" msgid="2212227512243587416">"निजी डीएनएस सर्वर को ऐक्सेस नहीं किया जा सकता"</string>
@@ -43,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"कोई नहीं"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"समयसीमा खत्म हो गई"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"साइन अप करने के लिए टैप करें"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"सदस्यता रिन्यू करने के लिए टैप करें और कनेक्ट करें"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> खोला जा रहा है"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"कनेक्ट नहीं किया जा सका"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"साइन अप किया जा रहा है…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"साइन अप नहीं हो सका. फिर से कोशिश करने के लिए टैप करें."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"साइन अप की प्रक्रिया पूरी हो गई. कनेक्ट हो रहा है…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"इस नेटवर्क को एक विशेष आईडी दिया जाता है. इसका इस्तेमाल डिवाइस की जगह की जानकारी का पता लगाने के लिए किया जा सकता है.\n"<annotation id="url">"ज़्यादा जानें"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hr/strings.xml b/libs/WifiTrackerLib/res/values-hr/strings.xml
index 2554de6..10a0d82 100644
--- a/libs/WifiTrackerLib/res/values-hr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hr/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"S ograničenim prometom"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Bez ograničenja prometa"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Povezan putem mreže <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Dostupno putem mreže <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatski povezano putem mreže <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatski povezan putem ocjenjivača mreže"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ograničena veza"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nema"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Isteklo"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Dodirnite da biste se registrirali"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Dodirnite da biste obnovili pretplatu i povezali se"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Otvaranje usluge <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Povezivanje nije uspjelo"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Dovršavanje registracije…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registracija nije dovršena. Dodirnite za ponovni pokušaj."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registracija je dovršena. Povezivanje…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ta mreža prima jedinstveni ID koji se može koristiti za praćenje lokacije uređaja.\n"<annotation id="url">"Saznajte više"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hu/strings.xml b/libs/WifiTrackerLib/res/values-hu/strings.xml
index 80129e1..3fb09f2 100644
--- a/libs/WifiTrackerLib/res/values-hu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hu/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Forgalomkorlátos"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Nem forgalomkorlátos"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Kapcsolódva a következőn keresztül: <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Rendelkezésre áll a(z) <xliff:g id="NAME">%1$s</xliff:g> alkalmazáson keresztül"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatikusan csatlakozva a következőn keresztül: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatikusan csatlakozott a hálózatértékelés szolgáltatóján keresztül"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Korlátozott kapcsolat"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nincs"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Lejárt"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Koppintson a regisztrációhoz"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Koppintson az előfizetés megújításához és a csatlakozáshoz"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> megnyitása"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nem sikerült csatlakozni"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Regisztráció befejezése…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Nem sikerült a regisztráció befejezése. Koppintással újrapróbálkozhat."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"A regisztráció befejeződött. Csatlakozás…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ez a hálózat egyedi azonosítót kap, amely felhasználható az eszköz helyadatainak követésére.\n"<annotation id="url">"További információ."</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hy/strings.xml b/libs/WifiTrackerLib/res/values-hy/strings.xml
index ad297dc..6d2c40c 100644
--- a/libs/WifiTrackerLib/res/values-hy/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hy/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Վճարովի թրաֆիկ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Անսահմանափակ թրաֆիկ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Միացված է <xliff:g id="NAME">%1$s</xliff:g>-ի միջոցով"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Հասանելի է հետևյալ հավելվածի միջոցով՝ <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Ավտոմատ միացված է <xliff:g id="NAME">%1$s</xliff:g>-ի միջոցով"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Ավտոմատ կերպով միացել է ցանցի վարկանիշի ծառայության մատակարարի միջոցով"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Սահմանափակ կապ"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ոչ մեկը"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Սպառվել է"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Հպեք՝ գրանցվելու համար"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Հպեք՝ բաժանորդագրությունը նորացնելու և միանալու համար"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>, բացվում է"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Չհաջողվեց միանալ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Գրանցումն ավարտվում է…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Չհաջողվեց ավարտել գրանցումը։ Հպեք՝ նորից փորձելու համար։"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Գրանցումն ավարտված է։ Միացում…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Այս ցանցը ստանում է եզակի ID, որի օգնությամբ հնարավոր է հետագծել սարքի տեղադրությունը։\n"<annotation id="url">"Իմանալ ավելին"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-in/strings.xml b/libs/WifiTrackerLib/res/values-in/strings.xml
index 4279e46..9278842 100644
--- a/libs/WifiTrackerLib/res/values-in/strings.xml
+++ b/libs/WifiTrackerLib/res/values-in/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Berbayar"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Tidak berbayar"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Tersambung melalui <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Tersedia melalui <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Terhubung otomatis melalui <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Otomatis tersambung melalui penyedia rating jaringan"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Koneksi terbatas"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Tidak ada"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Sudah tidak berlaku"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Ketuk untuk mendaftar"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Ketuk untuk memperpanjang langganan dan menyambungkan"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Membuka <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Tidak dapat terhubung"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Menyelesaikan pendaftaran…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Tidak dapat menyelesaikan pendaftaran. Ketuk untuk mencoba lagi."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Pendaftaran selesai. Menyambungkan…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Jaringan ini menerima ID unik yang dapat digunakan untuk melacak lokasi perangkat.\n"<annotation id="url">"Pelajari lebih lanjut"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-is/strings.xml b/libs/WifiTrackerLib/res/values-is/strings.xml
index 47adba6..6d294c1 100644
--- a/libs/WifiTrackerLib/res/values-is/strings.xml
+++ b/libs/WifiTrackerLib/res/values-is/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Mæld notkun"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Notkun ekki mæld"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Tenging í gegnum <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Í boði með <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Tengt sjálfkrafa með <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Sjálfkrafa tengt um netgæðaveitu"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Takmörkuð tenging"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ekkert"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Útrunninn"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Ýttu til að skrá þig"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Ýttu til að endurnýja áskrift og tengjast"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Opnar <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Ekki tókst að tengjast"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Gengur frá skráningu…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Ekki tókst að ljúka við skráningu. Ýttu til að reyna aftur."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Skráningu lokið. Tengist…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Þetta net fær einkvæmt auðkenni sem hægt er að nota til að rekja staðsetningu tækisins.\n"<annotation id="url">"Frekari upplýsingar"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-it/strings.xml b/libs/WifiTrackerLib/res/values-it/strings.xml
index 50acba3..62264a9 100644
--- a/libs/WifiTrackerLib/res/values-it/strings.xml
+++ b/libs/WifiTrackerLib/res/values-it/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"A consumo"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Non a consumo"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Connesso tramite <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponibile tramite <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Connessa automaticamente tramite <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Collegato automaticamente tramite fornitore di servizi di valutazione rete"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Connessione limitata"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nessuna"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Scaduto"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Tocca per registrarti"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Tocca per rinnovare l\'abbonamento e connetterti"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Apertura di <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Impossibile connettersi"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Completamento della registrazione…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Impossibile completare la registrazione. Tocca per riprovare."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registrazione completata. Connessione…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Questa rete riceve un ID univoco che può essere utilizzato per tracciare la posizione del dispositivo.\n"<annotation id="url">"Ulteriori informazioni"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-iw/strings.xml b/libs/WifiTrackerLib/res/values-iw/strings.xml
index 054943e..a9a1917 100644
--- a/libs/WifiTrackerLib/res/values-iw/strings.xml
+++ b/libs/WifiTrackerLib/res/values-iw/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"נמדדת"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"לא נמדדת"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"מחוברת באמצעות <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"זמינה דרך <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"מחוברת אוטומטית באמצעות <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"מחובר אוטומטית דרך ספק של דירוג רשת"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"חיבור מוגבל"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ללא"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"התוקף פג"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"יש להקיש כדי להירשם"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"יש להקיש כדי לחדש את המינוי ולהתחבר"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"מתבצעת פתיחה של <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"לא ניתן להתחבר"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"מתבצעת השלמה של ההרשמה…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"לא ניתן היה להשלים את ההרשמה. יש להקיש כדי לנסות שוב."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"תהליך ההרשמה הסתיים. בתהליך התחברות…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"הרשת הזו מקבלת מזהה ייחודי שיכול לשמש למעקב אחר מיקום המכשיר.\n"<annotation id="url">"למידע נוסף"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ja/strings.xml b/libs/WifiTrackerLib/res/values-ja/strings.xml
index 355c661..e1232db 100644
--- a/libs/WifiTrackerLib/res/values-ja/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ja/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"従量制"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"定額制"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> で接続しました"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g>で利用可能"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> で自動的に接続しました"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ネットワーク評価プロバイダ経由で自動的に接続しています"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"接続が制限されています"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"なし"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"期限切れ"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"タップして登録してください"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"タップして定期購入を更新し、接続してください"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> を開いています"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"接続できませんでした"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"登録を完了しています…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"登録を完了できませんでした。タップしてもう一度お試しください。"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"登録が完了しました。接続しています…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"このネットワークは一意の ID を受信します。この ID を使ってデバイスの位置情報が追跡される可能性があります。\n"<annotation id="url">"詳細"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ka/strings.xml b/libs/WifiTrackerLib/res/values-ka/strings.xml
index 6fbb8b6..e7d010b 100644
--- a/libs/WifiTrackerLib/res/values-ka/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ka/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"ლიმიტირებული"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"არალიმიტირებული"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"დაკავშირებულია <xliff:g id="NAME">%1$s</xliff:g>-ით"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"ხელმისაწვდომია <xliff:g id="NAME">%1$s</xliff:g>-ის მეშვეობით"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"ავტომატურად დაკავშირებულია <xliff:g id="NAME">%1$s</xliff:g>-ით"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ავტომატურად დაკავშირდა ქსელის ხარისხის შეფასების პროვაიდერის მეშვეობით"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"შეზღუდული კავშირი"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"არცერთი"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ვადაგასულია"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"შეეხეთ რეგისტრაციისთვის"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"შეეხეთ, რათა გაანაახლოთ გამოწერა და დაუკავშირდეთ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"მიმდინარეობს <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>-ის გახსნა"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"დაკავშირება ვერ მოხერხდა"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"მიმდინარეობს რეგისტრაციის დასრულება…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"რეგისტრაციის დასრულება ვერ მოხერხდა. შეეხეთ ხელახლა საცდელად."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"რეგისტრაცია დასრულდა. მიმდინარეობს დაკავშირება…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ეს ქსელი მიიღებს უნიკალურ ID-ს, რომლის მეშვეობითაც შესაძლებელია მოწყობილობის მდებარეობის აღნუსხვა.\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-kk/strings.xml b/libs/WifiTrackerLib/res/values-kk/strings.xml
index 5a7152a..5326ee3 100644
--- a/libs/WifiTrackerLib/res/values-kk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-kk/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Трафик саналады"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Трафик саналмайды"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> арқылы жалғанған"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> арқылы қолжетімді"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> арқылы автоматты байланыстырылды."</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Желі рейтингі провайдері арқылы автоматты түрде қосылған"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Шектеулі байланыс"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ешқандай"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Мерзімі өтті."</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Тіркелу үшін түртіңіз."</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Жазылымды қайта жаңартып, қосылу үшін түртіңіз."</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ашылуда."</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Байланыстырылмады."</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Тіркелу аяқталуда…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Тіркелу аяқталмады. Әрекетті қайталау үшін түртіңіз."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Тіркелу аяқталды. Байланыс орнатылуда…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Бұл желіге бірегей идентификатор беріледі, оның көмегімен құрылғының орналасқан жері қадағаланады.\n"<annotation id="url">"Толығырақ"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-km/strings.xml b/libs/WifiTrackerLib/res/values-km/strings.xml
index ff5d4fd..1c0791c 100644
--- a/libs/WifiTrackerLib/res/values-km/strings.xml
+++ b/libs/WifiTrackerLib/res/values-km/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"មានការកំណត់"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"មិនមានការកំណត់"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"ភ្ជាប់​តាម <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"អាចប្រើបាន​តាមរយៈ <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"បានភ្ជាប់ដោយស្វ័យប្រវត្តិតាមរយៈ <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"បានភ្ជាប់​ដោយស្វ័យប្រវត្តិ​តាម​រយៈក្រុមហ៊ុនផ្តល់​ការ​វាយ​តម្លៃលើ​បណ្តាញ"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ការតភ្ជាប់មានកម្រិត"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"គ្មាន"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ផុតកំណត់"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ចុច​ដើម្បី​ចុះឈ្មោះ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ចុច ដើម្បី​បន្តការ​ជាវជាថ្មី និង​ភ្ជាប់"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"កំពុង​បើក <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"មិន​អាចភ្ជាប់​បានទេ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"កំពុង​បញ្ចប់​ការចុះឈ្មោះ…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"មិនអាច​បញ្ចប់​ការចុះឈ្មោះ​បានទេ។ សូមចុច ដើម្បី​ព្យាយាម​ម្ដង​ទៀត។"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ការចុះ​ឈ្មោះ​បានបញ្ចប់។ កំពុងភ្ជាប់…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"បណ្ដាញនេះ​ទទួលបាន​លេខសម្គាល់​ពិសេស ដែល​អាចប្រើ​ដើម្បី​តាមដាន​ទីតាំង​ឧបករណ៍។\n"<annotation id="url">"ស្វែងយល់​បន្ថែម"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-kn/strings.xml b/libs/WifiTrackerLib/res/values-kn/strings.xml
index 0833ae1..2972dc0 100644
--- a/libs/WifiTrackerLib/res/values-kn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-kn/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"ಮೀಟರ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> ಆ್ಯಪ್ ಮೂಲಕ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ನೆಟ್‌ವರ್ಕ್ ರೇಟಿಂಗ್ ಒದಗಿಸುವವರ ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ಸೀಮಿತ ಸಂಪರ್ಕ"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ಯಾವುದೂ ಇಲ್ಲ"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ಅವಧಿ ಮುಕ್ತಾಯವಾಗಿದೆ"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ಸೈನ್ ಅಪ್ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ಸಬ್‌ಸ್ಕ್ರಿಪ್ಶನ್ ನವೀಕರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಸಂಪರ್ಕಿಸಿ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ಅನ್ನು ತೆರೆಯಲಾಗುತ್ತಿದೆ"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"ಸೈನ್-ಅಪ್ ಪೂರ್ಣಗೊಳಿಸಲಾಗುತ್ತಿದೆ…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ಸೈನ್-ಅಪ್ ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ಸೈನ್-ಅಪ್ ಪೂರ್ಣಗೊಂಡಿದೆ. ಕನೆಕ್ಟ್ ಆಗುತ್ತಿದೆ…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ಸಾಧನದ ಸ್ಥಳವನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಬಳಸಬಹುದಾದ ಅನನ್ಯ ಐಡಿ ಒಂದನ್ನು ಈ ನೆಟ್‌ವರ್ಕ್ ಸ್ವೀಕರಿಸುತ್ತದೆ.\n"<annotation id="url">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ko/strings.xml b/libs/WifiTrackerLib/res/values-ko/strings.xml
index c56b33a..5347e12 100644
--- a/libs/WifiTrackerLib/res/values-ko/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ko/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"종량제 네트워크"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"무제한 네트워크"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g>을(를) 통해 연결됨"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g>을(를) 통해 사용 가능"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g>을(를) 통해 자동으로 연결됨"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"네트워크 평가 제공업체를 통해 자동으로 연결됨"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"제한된 연결"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"없음"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"만료됨"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"가입하려면 탭하세요."</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"가입을 갱신하고 연결하려면 탭하세요."</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> 여는 중"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"연결할 수 없습니다."</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"가입 완료 중…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"가입을 완료할 수 없습니다. 다시 시도하려면 탭하세요."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"가입이 완료되었습니다. 연결 중…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"이 네트워크는 기기 위치 추적에 사용될 수 있는 고유 ID를 수신합니다.\n"<annotation id="url">"자세히 알아보기"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ky/strings.xml b/libs/WifiTrackerLib/res/values-ky/strings.xml
index 8c374f9..9e5f799 100644
--- a/libs/WifiTrackerLib/res/values-ky/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ky/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Трафик ченелет"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Чектелбеген тармак"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> аркылуу туташты"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> аркылуу жеткиликтүү"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> аркылуу автоматтык түрдө туташты"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Тармактар рейтингинин автору аркылуу автоматтык түрдө туташты"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Байланыш чектелген"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Жок"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Мөөнөтү бүткөн"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Катталуу үчүн таптап коюңуз"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Жазылууну жаңыртып, туташуу үчүн таптап коюңуз"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ачылууда"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Туташпай койду"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Катталуу аяктоодо…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Катталуу аягына чыккан жок. Кайра аракет кылуу үчүн таптап коюңуз."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Катталуу аягына чыкты. Туташууда…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Бул тармактарга өзгөчө идентификатор берилип, анын жардамы менен түзмөктүн жайгашкан жерин аныктоого болот.\n"<annotation id="url">"Кеңири маалымат"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-lo/strings.xml b/libs/WifiTrackerLib/res/values-lo/strings.xml
index d996a50..c28ecf9 100644
--- a/libs/WifiTrackerLib/res/values-lo/strings.xml
+++ b/libs/WifiTrackerLib/res/values-lo/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"ມີການວັດແທກ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"ບໍ່ໄດ້ວັດແທກ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"ເຊື່ອມ​ຕໍ່​ຜ່ານ <xliff:g id="NAME">%1$s</xliff:g> ແລ້ວ"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"ສາມາດໃຊ້ໄດ້ຜ່ານ <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"ເຊື່ອມຕໍ່ອັດຕະໂນມັດຜ່ານ <xliff:g id="NAME">%1$s</xliff:g> ແລ້ວ"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ເຊື່ອມຕໍ່ກັບອັດຕະໂນມັດແລ້ວຜ່ານຜູ້ໃຫ້ບໍລິການຄະແນນເຄືອຂ່າຍ"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ການເຊື່ອມຕໍ່ຈຳກັດ"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ບໍ່ໃຊ້"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ໝົດອາຍຸແລ້ວ"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ແຕະເພື່ອສະໝັກ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ແຕະເພື່ອຕໍ່ອາຍຸການສະໝັກໃຊ້ ແລະ ເຊື່ອມຕ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"ກຳລັງເປີດ <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"ກຳລັງສຳເລັດການສະໝັກ…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ບໍ່ສາມາດສຳເລັດການສະໝັກໄດ້. ແຕະເພື່ອລອງໃໝ່."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ສະໝັກສຳເລັດແລ້ວ. ກຳລັງເຊື່ອມຕໍ່…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ເຄືອຂ່າຍນີ້ຈະໄດ້ຮັບ unique ID ທີ່ສາມາດໃຊ້ເພື່ອຕິດຕາມສະຖານທີ່ອຸປະກອນໄດ້.\n"<annotation id="url">"ສຶກສາເພີ່ມເຕີມ"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-lt/strings.xml b/libs/WifiTrackerLib/res/values-lt/strings.xml
index 8f07c1d..51a8525 100644
--- a/libs/WifiTrackerLib/res/values-lt/strings.xml
+++ b/libs/WifiTrackerLib/res/values-lt/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Matuojamas"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Neišmatuotas"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Prisijungta naudojant programą „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Pasiekiama naudojant „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatiškai prisijungta per „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatiškai prisijungta naudojant tinklo įvertinimo paslaugos teikėjo paslaugomis"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ribotas ryšys"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nėra"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Baigėsi galiojimo laikas"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Palieskite, kad prisiregistruotumėte"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Palieskite, kad atnaujintumėte prenumeratą ir prisijungtumėte"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Atidaroma: „<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>“"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nepavyko prisijungti"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Baigiamas prisiregistravimas…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Nepavyko užbaigti prisiregistravimo. Jei norite bandyti dar kartą, palieskite."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Prisiregistravimas baigtas. Prijungiama…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Šis tinklas gauna unikalų ID, kurį galima naudoti įrenginio vietovei stebėti.\n"<annotation id="url">"Sužinokite daugiau"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-lv/strings.xml b/libs/WifiTrackerLib/res/values-lv/strings.xml
index f07845f..f89491e 100644
--- a/libs/WifiTrackerLib/res/values-lv/strings.xml
+++ b/libs/WifiTrackerLib/res/values-lv/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Maksas"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Bezmaksas"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Savienojums ar <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Pieejams, izmantojot <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automātiski izveidots savienojums, izmantojot <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automātiski izveidots savienojums, izmantojot tīkla vērtējuma sniedzēju"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ierobežots savienojums"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nav"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Beidzies derīguma termiņš"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Pieskarieties, lai reģistrētos."</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Pieskarieties, lai atjaunotu abonementu un izveidotu savienojumu"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Notiek nodrošinātāja <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> atvēršana."</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nevarēja izveidot savienojumu."</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Notiek reģistrācijas pabeigšana…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Nevarēja pabeigt reģistrāciju. Pieskarieties, lai mēģinātu vēlreiz."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Reģistrācija ir pabeigta. Notiek savienojuma izveide…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Šis tīkls saņem unikālo ID, ko var izmantot, lai izsekotu ierīces atrašanās vietu.\n"<annotation id="url">"Uzzināt vairāk"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-mk/strings.xml b/libs/WifiTrackerLib/res/values-mk/strings.xml
index 818d0bc..5c5960e 100644
--- a/libs/WifiTrackerLib/res/values-mk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-mk/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Со ограничен интернет"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Без ограничен интернет"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Поврзано преку <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Достапна преку <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Автоматски поврзано преку <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Автоматски поврзано преку оператор за оценување мрежа"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ограничена врска"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ниедна"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Истечено"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Допрете за да се регистрирате"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Допрете за обновување на претплатата и поврзување"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Се отвора <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Не може да се поврзе"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Се завршува регистрацијата…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Не можеше да се заврши регистрацијата. Допрете за да се обидете повторно."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Регистрацијата е завршена. Се поврзува…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Мрежава добива уникатен ID што може да се користи за следење на локацијата на уредот.\n"<annotation id="url">"Дознајте повеќе"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ml/strings.xml b/libs/WifiTrackerLib/res/values-ml/strings.xml
index 57209bb..fafc099 100644
--- a/libs/WifiTrackerLib/res/values-ml/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ml/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"മീറ്റർചെയ്ത"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"മീറ്റർമാപകമല്ലാത്തത്"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> മുഖേന കണക്‌റ്റ് ചെയ്‌തു"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> വഴി ലഭ്യമാണ്"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> മുഖേന സ്വയമേവ കണക്‌റ്റ് ചെയ്തിരിക്കുന്നു"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"നെറ്റ്‌വർക്ക് റേറ്റിംഗ് ദാതാവുമായി സ്വയം കണക്‌റ്റുചെയ്‌തു"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"പരിമിത കണക്‌ഷൻ"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ഒന്നുമില്ല"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"കാലഹരണപ്പെട്ടത്"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"സൈൻ അപ്പ് ചെയ്യാൻ ടാപ്പ് ചെയ്യുക"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"സബ്‌സ്ക്രിപ്ഷൻ പുതുക്കാൻ ടാപ്പ് ചെയ്ത് കണക്റ്റ് ചെയ്യുക"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> തുറക്കുന്നു"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"കണക്റ്റ് ചെയ്യാനായില്ല"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"സൈൻ അപ്പ് പൂർത്തിയാക്കുന്നു…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"സൈൻ അപ്പ് പൂർത്തിയാക്കാനായില്ല. വീണ്ടും ശ്രമിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"സൈൻ അപ്പ് പൂർത്തിയായി. കണക്റ്റ് ചെയ്യുന്നു…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ഉപകരണ ലൊക്കേഷൻ ട്രാക്ക് ചെയ്യാൻ ഉപയോഗിക്കാവുന്ന തനത് ഐഡി ഈ നെറ്റ്‌വർക്കിന് ലഭിക്കും.\n"<annotation id="url">"കൂടുതലറിയുക"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-mn/strings.xml b/libs/WifiTrackerLib/res/values-mn/strings.xml
index bcc136f..b149125 100644
--- a/libs/WifiTrackerLib/res/values-mn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-mn/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Хязгаартай"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Хязгааргүй"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g>-р холбогдсон"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g>-р боломжтой байна"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g>-р автоматаар холбогдсон"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Сүлжээний үнэлгээ үзүүлэгчээр автоматаар холбогдох"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Хязгаарлагдмал холболт"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Байхгүй"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Хугацаа дууссан"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Бүртгүүлэхийн тулд товшино уу"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Захиалгыг шинэчилж, холбогдохын тулд товшино уу"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>-г нээж байна"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Холбогдож чадсангүй"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Бүртгэлийг дуусгаж байна…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Бүртгэлийг дуусгаж чадсангүй. Дахин оролдохын тулд товшино уу."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Бүртгэлийг дуусгалаа. Холбогдож байна…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Энэ сүлжээ нь төхөөрөмжийн байршлыг тандахад ашиглах боломжтой цор ганц дугаарыг хүлээн авдаг.\n"<annotation id="url">"Нэмэлт мэдээлэл авах"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-mr/strings.xml b/libs/WifiTrackerLib/res/values-mr/strings.xml
index 954bcef..a569334 100644
--- a/libs/WifiTrackerLib/res/values-mr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-mr/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"मीटरने मोजलेले"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"मीटरने न मोजलेले"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> द्वारे कनेक्ट केले"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> द्वारे उपलब्ध"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> वरून आपोआप कनेक्ट केले आहे"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"नेटवर्क रेटिंग प्रदात्याद्वारे स्वयंचलितपणे कनेक्ट केले"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"मर्यादित कनेक्शन"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"काहीही नाही"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"मुदत संपली"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"साइन अप करण्यासाठी टॅप करा"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"सदस्यत्व रिन्यू करण्यासाठी टॅप करा आणि कनेक्ट करा"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> उघडत आहे"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"कनेक्ट करता आले नाही"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"साइन-अप पूर्ण होत आहे…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"साइन-अप पूर्ण करता आले नाही. पुन्हा प्रयत्न करण्यासाठी टॅप करा."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"साइन-अप पूर्ण झाले आहे. कनेक्ट करत आहे…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"हे नेटवर्क डिव्हाइसचे स्थान ट्रॅक करण्यासाठी वापरता येणारा युनिक आयडी मिळवते.\n"<annotation id="url">"अधिक जाणून घ्या"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ms/strings.xml b/libs/WifiTrackerLib/res/values-ms/strings.xml
index 34f4b53..0cfd1e2 100644
--- a/libs/WifiTrackerLib/res/values-ms/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ms/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Bermeter"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Tidak bermeter"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Disambungkan melalui <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Tersedia melalui <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Disambungkan secara automatik melalui <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Disambungkan secara automatik melalui pembekal penilaian rangkaian"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Sambungan terhad"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Tiada"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Tamat tempoh"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Ketik untuk daftar"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Ketik untuk membaharui langganan dan sambung"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Membuka <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Tidak dapat menyambung"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Menyelesaikan pendaftaran…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Tidak dapat menyelesaikan pendaftaran. Ketik untuk mencuba lagi."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Pendaftaran selesai. Menyambung…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Rangkaian ini menerima ID unik yang boleh digunakan untuk menjejaki lokasi peranti.\n"<annotation id="url">"Ketahui lebih lanjut"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-my/strings.xml b/libs/WifiTrackerLib/res/values-my/strings.xml
index 738829d..930dd27 100644
--- a/libs/WifiTrackerLib/res/values-my/strings.xml
+++ b/libs/WifiTrackerLib/res/values-my/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"အခမဲ့ မဟုတ်ပါ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"အခမဲ့"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g>မှတစ်ဆင့် ရနိုင်သည်"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားသည်"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ကွန်ရက်အဆင့်သတ်မှတ်ပေးသူ မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ချိတ်ဆက်မှု ကန့်သတ်ထားသည်"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"မရှိ"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"သက်တမ်းကုန်သွားပါပြီ"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"အကောင့်ဖွင့်ရန် တို့ပါ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"စာရင်းသွင်းမှာယူမှုကို သက်တမ်းတိုးပြီး ချိတ်ဆက်ရန် တို့ပါ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ကို ဖွင့်နေသည်"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"ချိတ်ဆက်၍ မရပါ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"အကောင့်ဖွင့်ခြင်း အပြီးသတ်နေသည်…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"အကောင့်ဖွင့်ခြင်း အပြီးသတ်၍ မရပါ။ ထပ်စမ်းကြည့်ရန် တို့ပါ။"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"အကောင့်ဖွင့်ပြီးပါပြီ။ ချိတ်ဆက်နေသည်…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ဤကွန်ရက်က စက်တည်နေရာကို ခြေရာခံရန် အသုံးပြုနိုင်သည့် သီးသန့် ID ကို ရရှိပါသည်။\n"<annotation id="url">"ပိုမိုလေ့လာရန်"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-nb/strings.xml b/libs/WifiTrackerLib/res/values-nb/strings.xml
index bc283ad..b987fe2 100644
--- a/libs/WifiTrackerLib/res/values-nb/strings.xml
+++ b/libs/WifiTrackerLib/res/values-nb/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Med datamåling"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Uten datamåling"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Tilkoblet via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Tilgjengelig via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatisk tilkoblet via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatisk tilkoblet via leverandør av nettverksvurdering"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Begrenset tilkobling"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ingen"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Utløpt"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Trykk for å registrere deg"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Trykk for å fornye abonnementet og koble til"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Åpner <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Kunne ikke koble til"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Fullfører registreringen …"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Kunne ikke fullføre registreringen. Trykk for å prøve på nytt."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registreringen er fullført. Kobler til …"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Dette nettverket mottar en unik ID som kan brukes til å spore enhetsposisjonen.\n"<annotation id="url">"Finn ut mer"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ne/strings.xml b/libs/WifiTrackerLib/res/values-ne/strings.xml
index c0fe2f0..9cffaf2 100644
--- a/libs/WifiTrackerLib/res/values-ne/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ne/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"सशुल्क वाइफाइ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"मिटर नगरिएको"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> मार्फत जडान गरिएको"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> मार्फत उपलब्ध"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> मार्फत स्वतः जोडियो"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"नेटवर्कको दर्जा प्रदायक मार्फत स्वत: जडान गरिएको"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"सीमित जडान"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"कुनै पनि होइन"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"म्याद सकियो"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"साइन अप गर्न ट्याप गर्नुहोस्"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ट्याप गरेर सदस्यता नवीकरण गर्नुहोस् र इन्टरनेटमा कनेक्ट गर्नुहोस्"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> खोल्दै"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"जोडिन सकिएन"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"साइन अप गर्ने कार्य सम्पन्न गर्दै…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"साइन अप गर्ने कार्य सम्पन्न गर्न सकिएन। फेरि प्रयास गर्न ट्याप गर्नुहोस्।"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"साइन अप गर्ने कार्य सम्पन्न भयो। जोड्दै…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"यो नेटवर्कले यन्त्रको स्थान पत्ता लगाउन प्रयोग गर्न सकिने एउटा अद्वित्तीय ID प्राप्त गर्छ।\n"<annotation id="url">"थप जान्नुहोस्"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-nl/strings.xml b/libs/WifiTrackerLib/res/values-nl/strings.xml
index 4b88489..0e655e0 100644
--- a/libs/WifiTrackerLib/res/values-nl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-nl/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Met datalimiet"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Gratis"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Verbonden via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Beschikbaar via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatisch verbonden via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatisch verbonden via netwerkbeoordelaar"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Beperkte verbinding"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Geen"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Verlopen"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Tik om aan te melden"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Tik om het abonnement te verlengen en verbinding te maken"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> openen"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Kan geen verbinding maken"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Aanmelding voltooien…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Kan aanmelding niet voltooien. Tik om het opnieuw te proberen."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Aanmelding voltooid. Verbinden…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Dit netwerk ontvangt een unieke ID die kan worden gebruikt om de apparaatlocatie bij te houden.\n"<annotation id="url">"Meer informatie"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-or/strings.xml b/libs/WifiTrackerLib/res/values-or/strings.xml
index a2c7c87..858eb06 100644
--- a/libs/WifiTrackerLib/res/values-or/strings.xml
+++ b/libs/WifiTrackerLib/res/values-or/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"ମପାଯାଉଥିବା"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"ମପାଯାଉନଥିବା"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> ଦ୍ବାରା ସଂଯୋଗ କରାଯାଇଛି"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ ଉପଲବ୍ଧ ଅଛି"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ ସ୍ୱଚାଳିତ ଭାବେ ସଂଯୋଗ କରାଯାଇଛି"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ନେଟୱର୍କ ମୂଲ୍ୟାୟନ ପ୍ରଦାତାଙ୍କ ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲ୍ୟ ସଂଯୁକ୍ତ"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ସୀମିତ ସଂଯୋଗ"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"କିଛି ନାହିଁ"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ମିଆଦ ଶେଷ ହୋଇଯାଇଛି"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ସାଇନ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ସଦସ୍ୟତାକୁ ନବୀକରଣ କରି ସଂଯୋଗ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ଖୋଲୁଛି"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"ସଂଯୋଗ କରିହେଲା ନାହିଁ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"ସାଇନ୍ ଅପ୍ ଶେଷ ହେଉଛି…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ସାଇନ୍ ଅପ୍ ଶେଷ ହୋଇପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ସାଇନ୍ ଅପ୍ ଶେଷ ହୋଇଛି। ସଂଯୋଗ କରୁଛି…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ଡିଭାଇସର ଲୋକେସନ୍ ଟ୍ରାକ୍ କରିବାକୁ ବ୍ୟବହାର କରାଯାଇପାରୁଥିବା ଏକ ସ୍ୱତନ୍ତ୍ର ID ଏହି ନେଟୱାର୍କ ପାଇଥାଏ।\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pa/strings.xml b/libs/WifiTrackerLib/res/values-pa/strings.xml
index df14186..8d61fe6 100644
--- a/libs/WifiTrackerLib/res/values-pa/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pa/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"ਗੈਰ-ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> ਰਾਹੀਂ ਉਪਲਬਧ"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> ਰਾਹੀਂ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ਨੈੱਟਵਰਕ ਰੇਟਿੰਗ ਪ੍ਰਦਾਨਕ ਰਾਹੀਂ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਹੋਇਆ"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"ਸੀਮਤ ਕਨੈਕਸ਼ਨ"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ਕੋਈ ਨਹੀਂ"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"ਮਿਆਦ ਮੁੱਕ ਗਈ"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ਸਾਈਨ-ਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"ਗਾਹਕੀ ਦੇ ਨਵੀਨੀਕਰਨ ਲਈ ਅਤੇ ਕਨੈਕਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"ਸਾਈਨ-ਅੱਪ ਮੁਕੰਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ਸਾਈਨ-ਅੱਪ ਮੁਕੰਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ਸਾਈਨ-ਅੱਪ ਮੁਕੰਮਲ ਹੋਇਆ। ਕਨੈਕਟ ਹੋ ਰਿਹਾ ਹੈ…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"ਇਹ ਨੈੱਟਵਰਕ ਇੱਕ ਵਿਲੱਖਣ ਆਈਡੀ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ ਜਿਸ ਨੂੰ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਨੂੰ ਟਰੈਕ ਕਰਨ ਲਈ ਵਰਤਿਆ ਦਾ ਸਕਦਾ ਹੈ।\n"<annotation id="url">"ਹੋਰ ਜਾਣੋ"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pl/strings.xml b/libs/WifiTrackerLib/res/values-pl/strings.xml
index 161b827..e2b7b20 100644
--- a/libs/WifiTrackerLib/res/values-pl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pl/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Użycie danych jest mierzone"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Użycie danych nie jest mierzone"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Połączenie przez: <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Dostęp przez aplikację <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatyczne połączenie przez <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatycznie połączono przez dostawcę ocen jakości sieci"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ograniczone połączenie"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Brak"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Ważność wygasła"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Kliknij, by się zarejestrować"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Kliknij, by odnowić subskrypcję i nawiązać połączenie"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Otwieram: <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nie udało się połączyć"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Kończę rejestrować…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Nie udało się dokończyć rejestracji. Kliknij, by spróbować ponownie."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Rejestracja zakończona. Łączę…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ta sieć wymaga unikalnego identyfikatora, którego można użyć do śledzenia lokalizacji urządzenia.\n"<annotation id="url">"Więcej informacji"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml b/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml
index 64ebcce..657ba2e 100644
--- a/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Limitada"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Ilimitada"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Conectado via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponível via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Conectada automaticamente via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Conectado automaticamente via provedor de avaliação de rede"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Conexão limitada"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nenhuma"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Expirado"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toque para se inscrever"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Toque para renovar a assinatura e se conectar"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Abrindo <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Não foi possível conectar"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Concluindo inscrição…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Não foi possível concluir a inscrição. Toque para tentar novamente."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Inscrição concluída. Conectando…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Essa rede recebe um código exclusivo que pode ser usado para rastrear a localização do dispositivo.\n"<annotation id="url">"Saiba mais"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml b/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml
index d385c81..a117a8f 100644
--- a/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Acesso limitado"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Acesso ilimitado"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Ligado via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponível através da app <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Ligado automaticamente através de <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Ligado automaticamente através do fornecedor de classificação de rede"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ligação limitada"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nenhuma"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Expirado"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toque para se inscrever."</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Toque para renovar a subscrição e estabelecer ligação."</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"A abrir <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>…"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Não foi possível estabelecer ligação."</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"A concluir a inscrição…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Não foi possível concluir a inscrição. Toque para tentar novamente."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Inscrição concluída. A estabelecer ligação…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Esta rede recebe um ID exclusivo que pode ser utilizado para monitorizar a localização do dispositivo.\n"<annotation id="url">"Saber mais"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pt/strings.xml b/libs/WifiTrackerLib/res/values-pt/strings.xml
index 64ebcce..657ba2e 100644
--- a/libs/WifiTrackerLib/res/values-pt/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pt/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Limitada"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Ilimitada"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Conectado via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponível via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Conectada automaticamente via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Conectado automaticamente via provedor de avaliação de rede"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Conexão limitada"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Nenhuma"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Expirado"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Toque para se inscrever"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Toque para renovar a assinatura e se conectar"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Abrindo <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Não foi possível conectar"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Concluindo inscrição…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Não foi possível concluir a inscrição. Toque para tentar novamente."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Inscrição concluída. Conectando…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Essa rede recebe um código exclusivo que pode ser usado para rastrear a localização do dispositivo.\n"<annotation id="url">"Saiba mais"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ro/strings.xml b/libs/WifiTrackerLib/res/values-ro/strings.xml
index b7c4d11..39630e8 100644
--- a/libs/WifiTrackerLib/res/values-ro/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ro/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Contorizată"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Necontorizată"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Conectat prin <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Disponibil prin <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Conectată automat prin <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Conectată automat prin furnizor de evaluări ale rețelei"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Conexiune limitată"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Niciuna"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Expirat"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Atingeți pentru a vă înscrie"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Atingeți pentru a reînnoi abonamentul și a vă conecta"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Se deschide <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nu s-a putut conecta"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Se finalizează înscrierea…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Nu s-a putut finaliza înscrierea. Atingeți pentru a încerca din nou."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Înscrierea a fost finalizată. Se conectează…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Această rețea primește un ID unic care se poate folosi pentru a urmări locația dispozitivului.\n"<annotation id="url">"Aflați mai multe"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ru/strings.xml b/libs/WifiTrackerLib/res/values-ru/strings.xml
index 5d23acd..efb5ce3 100644
--- a/libs/WifiTrackerLib/res/values-ru/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ru/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Сеть с тарификацией трафика"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Сеть без тарификации трафика"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Подключено через приложение \"<xliff:g id="NAME">%1$s</xliff:g>\"."</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Доступно через приложение \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Автоматически подключено через <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Автоматически подключено через автора рейтинга сетей"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Подключение к сети ограничено."</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Нет"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Срок действия истек"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Нажмите, чтобы зарегистрироваться."</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Нажмите, чтобы обновить подписку и установить подключение"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Открывается <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>…"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Не удалось подключиться."</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Завершение регистрации…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Не удалось завершить регистрацию. Нажмите, чтобы повторить попытку."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Регистрация завершена. Подключение…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Эта сеть получит доступ к уникальному идентификатору, с помощью которого можно отслеживать местоположение устройства.\n"<annotation id="url">"Подробнее…"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-si/strings.xml b/libs/WifiTrackerLib/res/values-si/strings.xml
index ab6279a..a2937df 100644
--- a/libs/WifiTrackerLib/res/values-si/strings.xml
+++ b/libs/WifiTrackerLib/res/values-si/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"මනිනු ලැබේ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"මනින්නේ නැත"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> හරහා සම්බන්ධයි"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> හරහා ලබා ගත හැකිය"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> හරහා ස්වයංක්‍රියව සම්බන්ධ විය"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"ජාල ශ්‍රේණිගත සපයන්නා හරහා ස්වයංක්‍රියව සම්බන්ධ විය"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"සීමිත සම්බන්ධතාව"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"කිසිවක් නැත"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"කල් ඉකුත් විය"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"ලියාපදිංචි වීමට තට්ටු කරන්න"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"දායකත්වය අලුත් කිරීමට තට්ටු කර සම්බන්ධ වන්න"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> විවෘත කරමින්"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"සබැඳීමට නොහැකි විය"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"ලියාපදිංචිය සම්පූර්ණ කරමින්…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ලියාපදිංචිය සම්පූර්ණ කළ නොහැකි විය. නැවත උත්සාහ කිරීමට තට්ටු කරන්න."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"ලියාපදිංචිය සම්පූර්ණයි. සබැඳෙමින්…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"මෙම ජාලය උපාංග ස්ථානය නිරීක්ෂණය කිරීමට භාවිත කළ හැකි අනන්‍ය ID එකක් ලැබේ.\n"<annotation id="url">"තව දැන ගන්න"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sk/strings.xml b/libs/WifiTrackerLib/res/values-sk/strings.xml
index 040a16d..0b527f2 100644
--- a/libs/WifiTrackerLib/res/values-sk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sk/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Merané"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Bez merania dát"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Pripojené prostredníctvom siete <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"K dispozícii prostredníctvom aplikácie <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automaticky pripojené prostredníctvom poskytovateľa <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automaticky pripojené prostredníctvom poskytovateľa hodnotenia siete"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Obmedzené pripojenie"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Žiadne"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Platnosť vypršala"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Prihláste sa klepnutím"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Klepnutím obnovíte odber a pripojíte sa"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Otvára sa <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nepodarilo sa pripojiť"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Dokončuje sa registrácia…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registráciu sa nepodarilo dokončiť. Klepnutím to skúste znova."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registrácia je dokončená. Pripája sa…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Táto sieť prijíma jedinečný identifikátor, pomocou ktorého je možné sledovať polohu zariadenia.\n"<annotation id="url">"Ďalšie informácie"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sl/strings.xml b/libs/WifiTrackerLib/res/values-sl/strings.xml
index edcd05b..fce1afd 100644
--- a/libs/WifiTrackerLib/res/values-sl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sl/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Omejen prenos podatkov"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Z neomejenim prenosom podatkov"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Povezava vzpostavljena prek omrežja <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Na voljo prek aplikacije <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Povezava je samodejno vzpostavljena prek: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Samodejno vzpostavljena povezava prek ponudnika ocenjevanja omrežij"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Omejena povezava"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Brez"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Poteklo"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Dotaknite se, če se želite registrirati"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Dotaknite se za podaljšanje naročnine in vzpostavitev povezave"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Odpiranje ponudnika <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Povezave ni bilo mogoče vzpostaviti"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Dokončevanje registracije …"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registracije ni bilo mogoče dokončati. Če želite poskusiti znova, se dotaknite."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registracija je končana. Povezovanje …"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"To omrežje prejme enolični ID, s katerim je mogoče spremljati lokacijo naprave.\n"<annotation id="url">"Več o tem"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sq/strings.xml b/libs/WifiTrackerLib/res/values-sq/strings.xml
index 9bb01ed..f74ad93 100644
--- a/libs/WifiTrackerLib/res/values-sq/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sq/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Me matje"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Pa matje"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Lidhur përmes <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Ofrohet përmes <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Është lidhur automatikisht nëpërmjet <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Lidhur automatikisht nëpërmjet ofruesit të vlerësimit të rrjetit"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Lidhje e kufizuar"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Asnjë"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Skaduar"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Trokit për t\'u regjistruar"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Trokit për të rinovuar abonimin dhe për t\'u lidhur"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Po hapet <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Nuk mund të lidhej"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Po përfundon regjistrimin…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Regjistrimi nuk mund të përfundonte. Trokit për të provuar përsëri."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Regjistrimi përfundoi. Po lidhet…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ky rrjet merr një ID unike që mund të përdoret për të monitoruar vendndodhjen e pajisjes.\n"<annotation id="url">"Mëso më shumë"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sr/strings.xml b/libs/WifiTrackerLib/res/values-sr/strings.xml
index 8da1b28..8ca1b1c 100644
--- a/libs/WifiTrackerLib/res/values-sr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sr/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Са ограничењем"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Без ограничења"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Повезано преко: <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Доступно преко апликације <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Аутоматски повезано преко: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Аутоматски повезано преко добављача оцене мреже"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Ограничена веза"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Нема"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Истекло"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Додирните да бисте се регистровали"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Додирните да бисте обновили претплату и повезали"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Отвара се <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Повезивање није успело"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Регистрација се довршава…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Довршавање регистрације није успело. Додирните да бисте пробали поново."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Регистрација је довршена. Повезује се…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ова мрежа захтева јединствени ИД који може да се користи за праћење локације уређаја.\n"<annotation id="url">"Сазнајте више"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sv/strings.xml b/libs/WifiTrackerLib/res/values-sv/strings.xml
index f775454..8556393 100644
--- a/libs/WifiTrackerLib/res/values-sv/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sv/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Med datapriser"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Utan datapriser"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Anslutet via <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Tillgängligt via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Automatiskt ansluten via <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Automatiskt ansluten via leverantör av nätverksbetyg"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Begränsad anslutning"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Ingen"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Har upphört att gälla"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Tryck för att registrera dig"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Tryck här om du vill förnya prenumerationen och ansluta"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Öppnar <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Det gick inte att ansluta"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Registreringen slutförs …"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Det gick inte att slutföra registreringen. Tryck för att försöka igen."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registrering har slutförts. Ansluter …"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Detta nätverk får ett unikt id som kan användas till att spåra enhetens plats.\n"<annotation id="url">"Läs mer"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sw/strings.xml b/libs/WifiTrackerLib/res/values-sw/strings.xml
index 686e58f..6fd97c9 100644
--- a/libs/WifiTrackerLib/res/values-sw/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sw/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Mtandao unapima data"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Mtandao usiopima data"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Imeunganishwa kupitia <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Inapatikana kupitia <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Umeunganishwa kiotomatiki kupitia <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Imeunganishwa kiotomatiki kupitia mtoa huduma wa ukadiriaji wa mtandao"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Muunganisho hafifu"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Hamna"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Muda umeisha"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Gusa ili ujisajili"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Gusa ili usasishe usajili na uunganishe"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Inafungua <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Imeshindwa kuunganisha"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Inakamilisha usajili…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Imeshindwa kukamilisha usajili. Gusa ili ujaribu tena."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Imekamilisha usajili. Inaunganisha…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Mtandao huu hupokea kitambulisho cha kipekee kinachoweza kutumika kufuatilia mahali kifaa kilipo.\n"<annotation id="url">"Pata maelezo zaidi"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ta/strings.xml b/libs/WifiTrackerLib/res/values-ta/strings.xml
index e4eff57..7f612dc 100644
--- a/libs/WifiTrackerLib/res/values-ta/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ta/strings.xml
@@ -19,8 +19,7 @@
     <string name="summary_separator" msgid="6533720408587140819">" / "</string>
     <string name="auto_connect_disable" msgid="1078319396240632542">"தானியங்கு இணைப்பு ஆஃப் செய்யப்பட்டுள்ளது"</string>
     <string name="saved_network" msgid="6241977554502802914">"<xliff:g id="NAME">%1$s</xliff:g> சேமித்தது"</string>
-    <!-- no translation found for wifi_no_internet_no_reconnect (3089980800841926268) -->
-    <skip />
+    <string name="wifi_no_internet_no_reconnect" msgid="3089980800841926268">"தானாக இணைக்கப்படாது"</string>
     <string name="wifi_no_internet" msgid="4461212237521310895">"இணைய அணுகல் இல்லை"</string>
     <string name="wifi_disabled_password_failure" msgid="3015007143699702403">"அங்கீகரிப்புச் சிக்கல்"</string>
     <string name="wifi_check_password_try_again" msgid="2643230209986217827">"கடவுச்சொல்லைச் சரிபார்த்து, மீண்டும் முயலவும்"</string>
@@ -34,8 +33,7 @@
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> மூலம் இணைக்கப்பட்டது"</string>
     <!-- no translation found for available_via_app (9110324040292242769) -->
     <skip />
-    <!-- no translation found for connected_via_network_scorer (209764314005159012) -->
-    <skip />
+    <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> மூலம் தானாக இணைக்கப்பட்டது"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"நெட்வொர்க் மதிப்பீடு வழங்குநரால் தானாக இணைக்கப்பட்டது"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"வரம்பிற்கு உட்பட்ட இணைப்பு"</string>
     <string name="private_dns_broken" msgid="2212227512243587416">"தனிப்பட்ட DNS சேவையகத்தை அணுக இயலாது"</string>
diff --git a/libs/WifiTrackerLib/res/values-te/strings.xml b/libs/WifiTrackerLib/res/values-te/strings.xml
index 1011935..4d8c9e7 100644
--- a/libs/WifiTrackerLib/res/values-te/strings.xml
+++ b/libs/WifiTrackerLib/res/values-te/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"గణించబడుతోంది"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"గణించబడటం లేదు"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> ద్వారా కనెక్ట్ చేయబడింది"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> ద్వారా అందుబాటులో ఉంది"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> ద్వారా ఆటోమేటిక్‌గా కనెక్ట్ చేయబడింది"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"పరిమిత కనెక్షన్"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ఏదీ లేదు"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"గడువు ముగిసింది"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"సైన్ అప్ చేయడానికి ట్యాప్ చేయండి"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"సభ్యత్వాన్ని రెన్యూ చేసి, కనెక్ట్ చేయడానికి నొక్కండి"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> తెరవబడుతోంది"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"సైన్ అప్ పూర్తవుతోంది…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"సైన్ అప్‌ను పూర్తి చేయడం సాధ్యపడలేదు. మళ్ళీ ప్రయత్నించడానికి ట్యాప్ చేయండి."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"సైన్ అప్ పూర్తయింది. కనెక్ట్ చేయబడుతోంది…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"పరికర లొకేషన్‌ను ట్రాక్ చేయడానికి ఉపయోగపడే యూనిక్ IDని ఈ నెట్‌వర్క్ అందుకుంటుంది.\n"<annotation id="url">"మరింత తెలుసుకోండి"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-th/strings.xml b/libs/WifiTrackerLib/res/values-th/strings.xml
index af6a0e3..1a01ce1 100644
--- a/libs/WifiTrackerLib/res/values-th/strings.xml
+++ b/libs/WifiTrackerLib/res/values-th/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"มีการวัดปริมาณอินเทอร์เน็ต"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"ไม่มีการวัดปริมาณอินเทอร์เน็ต"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"เชื่อมต่อแล้วผ่าน <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"ใช้งานได้ผ่านทาง <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"เชื่อมต่อโดยอัตโนมัติผ่าน <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"เชื่อมต่ออัตโนมัติผ่านผู้ให้บริการการจัดอันดับเครือข่าย"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"การเชื่อมต่อที่จำกัด"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"ไม่มี"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"หมดอายุแล้ว"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"แตะเพื่อลงชื่อสมัครใช้"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"แตะเพื่อต่ออายุการสมัครใช้บริการและเชื่อมต่อ"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"กำลังเปิด <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"เชื่อมต่อไม่สำเร็จ"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"กำลังลงชื่อสมัครใช้ให้เสร็จสิ้น…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"ลงชื่อสมัครใช้ไม่สำเร็จ แตะเพื่อลองอีกครั้ง"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"การลงชื่อสมัครใช้เสร็จสมบูรณ์ กำลังเชื่อมต่อ…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"เครือข่ายนี้ได้รับรหัสที่ไม่ซ้ำกันซึ่งใช้ติดตามตำแหน่งอุปกรณ์ได้\n"<annotation id="url">"ดูข้อมูลเพิ่มเติม"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-tl/strings.xml b/libs/WifiTrackerLib/res/values-tl/strings.xml
index 7ecbf4d..e185727 100644
--- a/libs/WifiTrackerLib/res/values-tl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-tl/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Nakametro"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Hindi Nakametro"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Nakakonekta sa pamamagitan ng <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Available sa pamamagitan ng <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Awtomatikong nakakonekta sa pamamagitan ng <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Awtomatikong nakakonekta sa pamamagitan ng provider ng rating ng network"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Limitadong koneksyon"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Wala"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Nag-expire na"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"I-tap para mag-sign up"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"I-tap para i-renew ang subscription at kumonekta"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Binubuksan ang <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Hindi makakonekta"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Kinukumpleto ang pag-sign up…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Hindi makumpleto ang pag-sign up. I-tap para subukan ulit."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Kumpleto na ang pag-sign up. Kumokonekta…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Nakakatanggap ang network na ito ng natatanging ID na magagamit para sumubaybay ng lokasyon ng device.\n"<annotation id="url">"Matuto pa"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-tr/strings.xml b/libs/WifiTrackerLib/res/values-tr/strings.xml
index 165c79d..0bb41cf 100644
--- a/libs/WifiTrackerLib/res/values-tr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-tr/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Sayaçlı"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Sayaçsız"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> ile bağlandı"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> ile kullanılabilir"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> ile otomatik olarak bağlandı"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Ağ derecelendirme sağlayıcı aracılığıyla otomatik olarak bağlandı"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Sınırlı bağlantı"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Yok"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Süresi sona erdi"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Kaydolmak için dokunun"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Aboneliği yenilemek ve bağlanmak için dokunun"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> açılıyor"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Bağlanılamadı"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Kayıt işlemi tamamlanıyor…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Kayıt işlemi tamamlanamadı. Tekrar denemek için dokunun."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Kayıt tamamlandı. Bağlanıyor…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Bu ağ, cihaz konumunu izlemek için kullanılabilecek benzersiz bir kimlik alır.\n"<annotation id="url">"Daha fazla bilgi"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-uk/strings.xml b/libs/WifiTrackerLib/res/values-uk/strings.xml
index 592ae1d..48ed628 100644
--- a/libs/WifiTrackerLib/res/values-uk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-uk/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"З тарифікацією трафіку"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Без тарифікації трафіку"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Підключено через додаток <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Доступно в додатку <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Автоматично підключено через <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Автоматично під’єднано через постачальника оцінки якості мережі"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Обмежене з’єднання"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Немає"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Термін дії минув"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Торкніться, щоб зареєструватись"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Натисніть, щоб поновити підписку та підключитися"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> відкривається"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Не вдалося підключитись"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Завершення реєстрації…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Не вдалося завершити реєстрацію. Торкніться, щоб повторити спробу."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Реєстрацію завершено. Підключення…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Ця мережа має унікальний ідентифікатор, за допомогою якого можна відстежувати місцезнаходження пристрою.\n"<annotation id="url">"Докладніше"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ur/strings.xml b/libs/WifiTrackerLib/res/values-ur/strings.xml
index b29cd4f..3abcbdb 100644
--- a/libs/WifiTrackerLib/res/values-ur/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ur/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"میٹرڈ"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"غیر میٹر شدہ"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> کے ذریعے منسلک"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"دستیاب بذریعہ <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"خودکار طور پر <xliff:g id="NAME">%1$s</xliff:g> کے ذریعے منسلک"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"نیٹ ورک درجہ بندی کے فراہم کنندہ کے ذریعے از خود منسلک"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"محدود کنکشن"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"کوئی نہیں"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"میعاد ختم ہو گئی"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"سائن اپ کے لیے تھپتھپائیں"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"سبسکرپشن کی تجدید کرنے اور منسلک ہونے کے لیے تھپتھپائیں"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> کھل رہا ہے"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"منسلک نہیں کیا جا سکا"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"سائن اپ مکمل ہو رہا ہے…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"سائن اپ مکمل نہیں ہو سکا۔ دوبارہ کوشش کرنے کے لیے تھپتھپائیں۔"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"سائن اپ مکمل ہو گیا۔ منسلک ہو رہا ہے…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"‏اس نیٹ ورک کو ایک منفرد ID موصول ہوتی ہے جو آلہ کے مقام کو ٹریک کرنے کیلئے استعمال ہوسکتی ہے۔\n"<annotation id="url">"مزید جانیں"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-uz/strings.xml b/libs/WifiTrackerLib/res/values-uz/strings.xml
index a7c841b..c19bf53 100644
--- a/libs/WifiTrackerLib/res/values-uz/strings.xml
+++ b/libs/WifiTrackerLib/res/values-uz/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Trafik hisoblanadigan tarmoq"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Trafik hisobi yuritilmaydigan tarmoq"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"<xliff:g id="NAME">%1$s</xliff:g> orqali ulandi"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"<xliff:g id="NAME">%1$s</xliff:g> ilovasi orqali mavjud"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"<xliff:g id="NAME">%1$s</xliff:g> orqali avtomatik ulandi"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Tarmoqlar reytingi muallifi orqali avtomatik ulandi"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Cheklangan aloqa"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Hech qanday"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Muddati tugagan"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Registratsiya qilish uchun bosing"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Obunani davom ettirish va ulanish uchun bosing"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> ochilmoqda"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Ulanmadi"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Registratsiya tamomlanmoqda…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Registratsiya tamomlanmadi. Qayta urinish uchun tegining."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Registratsiya qilindi. Ulanmoqda…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Bu tarmoqqa qurilma joylashuvini aniqlash imkonini beruvchi maxsus identifikator beriladi.\n"<annotation id="url">"Batafsil"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-vi/strings.xml b/libs/WifiTrackerLib/res/values-vi/strings.xml
index a35c171..e9e049a 100644
--- a/libs/WifiTrackerLib/res/values-vi/strings.xml
+++ b/libs/WifiTrackerLib/res/values-vi/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Đo lượng dữ liệu"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Không đo lượng dữ liệu"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Đã kết nối qua <xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Được cung cấp qua <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Đã tự động kết nối qua <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Tự động được kết nối qua nhà cung cấp dịch vụ xếp hạng mạng"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Kết nối giới hạn"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Không"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Đã hết hạn"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Nhấn để đăng ký"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Nhấn để gia hạn gói đăng ký và kết nối"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Đang mở <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Không thể kết nối"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Đang hoàn tất việc đăng ký…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Không thể hoàn tất việc đăng ký. Hãy nhấn để thử lại."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Đã đăng ký xong. Đang kết nối…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Mạng này nhận được một mã nhận dạng có thể dùng để theo dõi vị trí thiết bị.\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml b/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml
index 38ef149..5f26a48 100644
--- a/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"按流量计费"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"不按流量计费"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"已通过<xliff:g id="NAME">%1$s</xliff:g>连接到网络"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"可通过“<xliff:g id="NAME">%1$s</xliff:g>”使用"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"已通过<xliff:g id="NAME">%1$s</xliff:g>自动连接"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"已自动连接(通过网络评分服务提供方)"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"网络连接受限"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"无"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"已失效"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"点按即可注册"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"点按即可续订并连接"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"正在打开<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"无法连接"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"正在完成注册…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"无法完成注册。点按即可重试。"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"注册完毕。正在连接…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"此网络会接收可用于追踪设备位置的唯一 ID。\n"<annotation id="url">"了解详情"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml b/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml
index cfee219..36e3d35 100644
--- a/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"按用量收費"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"不限數據用量收費"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"已透過「<xliff:g id="NAME">%1$s</xliff:g>」連線"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"可透過「<xliff:g id="NAME">%1$s</xliff:g>」連線"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"已透過「<xliff:g id="NAME">%1$s</xliff:g>」自動連線"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"已透過網絡評分供應商自動連線"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"連線受限"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"無"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"已過期"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"輕按即可登入"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"輕按即可續購訂閱並連線"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"正在開啟 <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"無法連接"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"正在完成申請…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"無法完成申請。輕按即可重試。"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"已完成申請。連接中…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"此網絡會收到可用於追蹤裝置位置的獨特 ID。\n"<annotation id="url">"瞭解詳情"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml b/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml
index 4e08a4a..8cd9a49 100644
--- a/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"計量付費"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"非計量付費"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"透過「<xliff:g id="NAME">%1$s</xliff:g>」連線"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"可透過「<xliff:g id="NAME">%1$s</xliff:g>」使用"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"透過「<xliff:g id="NAME">%1$s</xliff:g>」自動連線"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"已透過網路評分供應商自動連線"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"連線能力受限"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"無"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"已失效"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"輕觸即可註冊"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"輕觸即可續訂並連線"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"正在開啟「<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>」"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"無法連線"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"正在完成註冊程序…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"無法完成註冊程序。輕觸即可重試。"</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"註冊完成。連線中…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"這個網路會收到可用來追蹤裝置位置的唯一識別碼。\n"<annotation id="url">"瞭解詳情"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zu/strings.xml b/libs/WifiTrackerLib/res/values-zu/strings.xml
index 94290b5..821c2e7 100644
--- a/libs/WifiTrackerLib/res/values-zu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zu/strings.xml
@@ -31,8 +31,7 @@
     <string name="wifi_metered_label" msgid="1362621600006544014">"Kulinganisiwe"</string>
     <string name="wifi_unmetered_label" msgid="499466875639448350">"Akulinganiselwa"</string>
     <string name="connected_via_app" msgid="1818040967936972127">"Ixhumeke nge-<xliff:g id="NAME">%1$s</xliff:g>"</string>
-    <!-- no translation found for available_via_app (9110324040292242769) -->
-    <skip />
+    <string name="available_via_app" msgid="9110324040292242769">"Kutholakala nge-<xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="209764314005159012">"Kuxhunywe ngokuzenzekelayo nge-<xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer_default" msgid="3084818437004202462">"Kuxhunywe ngokuzenzakalelayo ngomhlinzeki wesilinganiso wenethiwekhi"</string>
     <string name="wifi_limited_connection" msgid="3646701342701276239">"Iqoqo elikhawulelwe"</string>
@@ -41,13 +40,11 @@
     <string name="wifi_security_none" msgid="6680263031386719053">"Lutho"</string>
     <string name="wifi_passpoint_expired" msgid="3257021415099577815">"Iphelelwe isikhathi"</string>
     <string name="tap_to_sign_up" msgid="2409214576606918295">"Thepha ukuze ubhalisele"</string>
-    <!-- no translation found for tap_to_renew_subscription_and_connect (375976298920840105) -->
-    <skip />
+    <string name="tap_to_renew_subscription_and_connect" msgid="375976298920840105">"Thepha ukuze wenze kabusha okubhalisile futhi uxhume"</string>
     <string name="osu_opening_provider" msgid="5633521771769175139">"Ivula i-<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string>
     <string name="osu_connect_failed" msgid="8503501619299851793">"Ayikwazanga ukuxhumeka"</string>
     <string name="osu_completing_sign_up" msgid="7188493241442946231">"Iqedela ukubhalisa…"</string>
     <string name="osu_sign_up_failed" msgid="2725057866968590279">"Ayikwazanga ukuqedelela ukubhalisa. Thepha ukuze uzame futhi."</string>
     <string name="osu_sign_up_complete" msgid="7013805426618985953">"Ukubhalisa kuqediwe. Iyaxhuma…"</string>
-    <!-- no translation found for imsi_protection_warning (3771878632537231149) -->
-    <skip />
+    <string name="imsi_protection_warning" msgid="3771878632537231149">"Le nethiwekhi ithola i-ID ehlukile engasetshenziselwa ukulandelela indawo yedivayisi.\n"<annotation id="url">"Funda kabanzi"</annotation></string>
 </resources>
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
index 9aaf346..b3b99e0 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
@@ -35,6 +35,7 @@
 import android.text.TextUtils;
 import android.util.Pair;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
@@ -50,6 +51,9 @@
 class OsuWifiEntry extends WifiEntry {
     static final String KEY_PREFIX = "OsuWifiEntry:";
 
+    private final Object mLock = new Object();
+    // Scan result list must be thread safe for generating the verbose scan summary
+    @GuardedBy("mLock")
     @NonNull private final List<ScanResult> mCurrentScanResults = new ArrayList<>();
 
     @NonNull private final String mKey;
@@ -265,10 +269,12 @@
             throws IllegalArgumentException {
         if (scanResults == null) scanResults = new ArrayList<>();
 
-        mCurrentScanResults.clear();
-        mCurrentScanResults.addAll(scanResults);
+        synchronized (mLock) {
+            mCurrentScanResults.clear();
+            mCurrentScanResults.addAll(scanResults);
+        }
 
-        final ScanResult bestScanResult = getBestScanResultByLevel(mCurrentScanResults);
+        final ScanResult bestScanResult = getBestScanResultByLevel(scanResults);
         if (bestScanResult == null) {
             mLevel = WIFI_LEVEL_UNREACHABLE;
         } else {
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
index b26d035..e7ed153 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
@@ -40,6 +40,7 @@
 import android.os.Handler;
 import android.text.TextUtils;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
@@ -57,7 +58,11 @@
 public class PasspointWifiEntry extends WifiEntry {
     static final String KEY_PREFIX = "PasspointWifiEntry:";
 
+    private final Object mLock = new Object();
+    // Scan result list must be thread safe for generating the verbose scan summary
+    @GuardedBy("mLock")
     private final List<ScanResult> mCurrentHomeScanResults = new ArrayList<>();
+    @GuardedBy("mLock")
     private final List<ScanResult> mCurrentRoamingScanResults = new ArrayList<>();
 
     @NonNull private final String mKey;
@@ -405,13 +410,15 @@
             throws IllegalArgumentException {
         mIsRoaming = false;
         mWifiConfig = wifiConfig;
-        mCurrentHomeScanResults.clear();
-        mCurrentRoamingScanResults.clear();
-        if (homeScanResults != null) {
-            mCurrentHomeScanResults.addAll(homeScanResults);
-        }
-        if (roamingScanResults != null) {
-            mCurrentRoamingScanResults.addAll(roamingScanResults);
+        synchronized (mLock) {
+            mCurrentHomeScanResults.clear();
+            mCurrentRoamingScanResults.clear();
+            if (homeScanResults != null) {
+                mCurrentHomeScanResults.addAll(homeScanResults);
+            }
+            if (roamingScanResults != null) {
+                mCurrentRoamingScanResults.addAll(roamingScanResults);
+            }
         }
         if (mWifiConfig != null) {
             mSecurity = getSecurityTypeFromWifiConfiguration(wifiConfig);
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java
index d30fcc4..68f58dd 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java
@@ -45,7 +45,6 @@
 
 import java.time.Clock;
 import java.util.Collections;
-import java.util.Optional;
 
 /**
  * Implementation of NetworkDetailsTracker that tracks a single StandardWifiEntry.
@@ -107,7 +106,8 @@
         checkNotNull(intent, "Intent cannot be null!");
         final WifiConfiguration updatedConfig =
                 (WifiConfiguration) intent.getExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
-        if (updatedConfig != null && TextUtils.equals(
+        if (updatedConfig != null && !updatedConfig.isPasspoint()
+                && !updatedConfig.fromWifiNetworkSuggestion && TextUtils.equals(
                 wifiConfigToStandardWifiEntryKey(updatedConfig), mChosenEntry.getKey())) {
             final int changeReason = intent.getIntExtra(WifiManager.EXTRA_CHANGE_REASON,
                     -1 /* defaultValue*/);
@@ -172,11 +172,15 @@
      * null if it does not exist.
      */
     private void conditionallyUpdateConfig() {
-        Optional<WifiConfiguration> optionalConfig = mWifiManager.getConfiguredNetworks()
-                .stream().filter(config -> TextUtils.equals(
-                        wifiConfigToStandardWifiEntryKey(config), mChosenEntry.getKey()))
-                .findAny();
-        mChosenEntry.updateConfig(optionalConfig.orElse(null));
+        WifiConfiguration config = mWifiManager.getConfiguredNetworks().stream()
+                .filter(savedConfig -> TextUtils.equals(
+                        wifiConfigToStandardWifiEntryKey(savedConfig), mChosenEntry.getKey()))
+                .findAny().orElse(mWifiManager.getPrivilegedConfiguredNetworks().stream()
+                        .filter(suggestedConfig -> TextUtils.equals(
+                                wifiConfigToStandardWifiEntryKey(suggestedConfig),
+                                mChosenEntry.getKey()))
+                        .findAny().orElse(null));
+        mChosenEntry.updateConfig(config);
     }
 
     /**
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java
index 642313a..a6c3226 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java
@@ -22,14 +22,17 @@
 
 import static com.android.wifitrackerlib.Utils.getAppLabel;
 import static com.android.wifitrackerlib.Utils.getAppLabelForSavedNetwork;
+import static com.android.wifitrackerlib.Utils.getAppLabelForWifiConfiguration;
 import static com.android.wifitrackerlib.Utils.getAutoConnectDescription;
 import static com.android.wifitrackerlib.Utils.getBestScanResultByLevel;
+import static com.android.wifitrackerlib.Utils.getCarrierNameForSubId;
 import static com.android.wifitrackerlib.Utils.getCurrentNetworkCapabilitiesInformation;
 import static com.android.wifitrackerlib.Utils.getDisconnectedStateDescription;
 import static com.android.wifitrackerlib.Utils.getMeteredDescription;
 import static com.android.wifitrackerlib.Utils.getNetworkDetailedState;
 import static com.android.wifitrackerlib.Utils.getSecurityTypeFromWifiConfiguration;
 import static com.android.wifitrackerlib.Utils.getSpeedDescription;
+import static com.android.wifitrackerlib.Utils.getSubIdForConfig;
 import static com.android.wifitrackerlib.Utils.getVerboseLoggingDescription;
 
 import android.content.Context;
@@ -46,6 +49,7 @@
 import android.os.SystemClock;
 import android.text.TextUtils;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -98,7 +102,10 @@
     private static final int PSK_WPA_WPA2 = 2;
     private static final int PSK_UNKNOWN = 3;
 
-    private final List<ScanResult> mCurrentScanResults = new ArrayList<>();
+    private final Object mLock = new Object();
+    // Scan result list must be thread safe for generating the verbose scan summary
+    @GuardedBy("mLock")
+    @NonNull private final List<ScanResult> mCurrentScanResults = new ArrayList<>();
 
     @NonNull private final String mKey;
     @NonNull private final String mSsid;
@@ -107,6 +114,7 @@
     private @EapType int mEapType = EAP_UNKNOWN;
     private @PskType int mPskType = PSK_UNKNOWN;
     @Nullable private WifiConfiguration mWifiConfig;
+    private boolean mIsUserShareable = false;
     @Nullable private String mRecommendationServiceLabel;
 
     private boolean mShouldAutoOpenCaptivePortal = false;
@@ -189,8 +197,17 @@
             if (TextUtils.isEmpty(disconnectDescription)) {
                 if (concise) {
                     sj.add(mContext.getString(R.string.wifi_disconnected));
-                } else if (!mForSavedNetworksPage && isSaved()) {
-                    sj.add(mContext.getString(R.string.wifi_remembered));
+                } else if (!mForSavedNetworksPage) {
+                    // Summary for unconnected suggested network
+                    if (mWifiConfig != null && mWifiConfig.fromWifiNetworkSuggestion) {
+                        String carrierName = getCarrierNameForSubId(mContext,
+                                getSubIdForConfig(mContext, mWifiConfig));
+                        sj.add(mContext.getString(R.string.available_via_app, carrierName != null
+                                ? carrierName
+                                : getAppLabelForWifiConfiguration(mContext, mWifiConfig)));
+                    } else if (isSaved()) {
+                        sj.add(mContext.getString(R.string.wifi_remembered));
+                    }
                 }
             } else {
                 sj.add(disconnectDescription);
@@ -225,14 +242,6 @@
     private String getConnectStateDescription() {
         if (getConnectedState() == CONNECTED_STATE_CONNECTED) {
             if (!isSaved()) {
-                // For ephemeral networks.
-                final String suggestionOrSpecifierPackageName = mWifiInfo != null
-                        ? mWifiInfo.getRequestingPackageName() : null;
-                if (!TextUtils.isEmpty(suggestionOrSpecifierPackageName)) {
-                    return mContext.getString(R.string.connected_via_app,
-                            getAppLabel(mContext, suggestionOrSpecifierPackageName));
-                }
-
                 // Special case for connected + ephemeral networks.
                 if (!TextUtils.isEmpty(mRecommendationServiceLabel)) {
                     return String.format(mContext.getString(R.string.connected_via_network_scorer),
@@ -241,6 +250,18 @@
                 return mContext.getString(R.string.connected_via_network_scorer_default);
             }
 
+            // For network suggestions
+            final String suggestionOrSpecifierPackageName = mWifiInfo != null
+                    ? mWifiInfo.getRequestingPackageName() : null;
+            if (!TextUtils.isEmpty(suggestionOrSpecifierPackageName)) {
+                String carrierName = mWifiConfig != null
+                        ? getCarrierNameForSubId(mContext, getSubIdForConfig(mContext, mWifiConfig))
+                        : null;
+                return mContext.getString(R.string.connected_via_app, carrierName != null
+                        ? carrierName
+                        : getAppLabel(mContext, suggestionOrSpecifierPackageName));
+            }
+
             String networkCapabilitiesinformation =
                     getCurrentNetworkCapabilitiesInformation(mContext, mNetworkCapabilities);
             if (!TextUtils.isEmpty(networkCapabilitiesinformation)) {
@@ -300,7 +321,10 @@
 
     @Override
     public WifiConfiguration getWifiConfiguration() {
-        return mWifiConfig;
+        if (mWifiConfig != null && !mWifiConfig.fromWifiNetworkSuggestion) {
+            return mWifiConfig;
+        }
+        return null;
     }
 
     @Override
@@ -373,12 +397,12 @@
 
     @Override
     public boolean canForget() {
-        return isSaved();
+        return getWifiConfiguration() != null;
     }
 
     @Override
     public void forget(@Nullable ForgetCallback callback) {
-        if (mWifiConfig != null) {
+        if (canForget()) {
             mForgetCallback = callback;
             mWifiManager.forget(mWifiConfig.networkId, new ForgetActionListener());
         }
@@ -407,7 +431,7 @@
      */
     @Override
     public boolean canShare() {
-        if (!isSaved()) {
+        if (getWifiConfiguration() == null) {
             return false;
         }
 
@@ -429,7 +453,7 @@
      */
     @Override
     public boolean canEasyConnect() {
-        if (!isSaved()) {
+        if (getWifiConfiguration() == null) {
             return false;
         }
 
@@ -467,8 +491,8 @@
     @Override
     @MeteredChoice
     public int getMeteredChoice() {
-        if (mWifiConfig != null) {
-            final int meteredOverride = mWifiConfig.meteredOverride;
+        if (getWifiConfiguration() != null) {
+            final int meteredOverride = getWifiConfiguration().meteredOverride;
             if (meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED) {
                 return METERED_CHOICE_METERED;
             } else if (meteredOverride == WifiConfiguration.METERED_OVERRIDE_NOT_METERED) {
@@ -480,12 +504,12 @@
 
     @Override
     public boolean canSetMeteredChoice() {
-        return isSaved();
+        return getWifiConfiguration() != null;
     }
 
     @Override
     public void setMeteredChoice(int meteredChoice) {
-        if (mWifiConfig == null) {
+        if (!canSetMeteredChoice()) {
             return;
         }
 
@@ -501,17 +525,14 @@
 
     @Override
     public boolean canSetPrivacy() {
-        return isSaved();
+        return getWifiConfiguration() != null;
     }
 
     @Override
     @Privacy
     public int getPrivacy() {
-        if (mWifiConfig == null) {
-            return PRIVACY_UNKNOWN;
-        }
-
-        if (mWifiConfig.macRandomizationSetting == WifiConfiguration.RANDOMIZATION_NONE) {
+        if (mWifiConfig != null
+                && mWifiConfig.macRandomizationSetting == WifiConfiguration.RANDOMIZATION_NONE) {
             return PRIVACY_DEVICE_MAC;
         } else {
             return PRIVACY_RANDOMIZED_MAC;
@@ -531,7 +552,7 @@
 
     @Override
     public boolean isAutoJoinEnabled() {
-        if (mWifiConfig == null) {
+        if (!isSaved()) {
             return false;
         }
 
@@ -616,10 +637,12 @@
             }
         }
 
-        mCurrentScanResults.clear();
-        mCurrentScanResults.addAll(scanResults);
+        synchronized (mLock) {
+            mCurrentScanResults.clear();
+            mCurrentScanResults.addAll(scanResults);
+        }
 
-        final ScanResult bestScanResult = getBestScanResultByLevel(mCurrentScanResults);
+        final ScanResult bestScanResult = getBestScanResultByLevel(scanResults);
         if (bestScanResult == null) {
             mLevel = WIFI_LEVEL_UNREACHABLE;
         } else {
@@ -697,6 +720,22 @@
         notifyOnUpdated();
     }
 
+    /**
+     * Sets whether the suggested config for this entry is shareable to the user or not.
+     */
+    @WorkerThread
+    void setUserShareable(boolean isUserShareable) {
+        mIsUserShareable = isUserShareable;
+    }
+
+    /**
+     * Returns whether the suggested config for this entry is shareable to the user or not.
+     */
+    @WorkerThread
+    boolean isUserShareable() {
+        return mIsUserShareable;
+    }
+
     @WorkerThread
     protected boolean connectionInfoMatches(@NonNull WifiInfo wifiInfo,
             @NonNull NetworkInfo networkInfo) {
@@ -704,7 +743,16 @@
             return false;
         }
 
-        return mWifiConfig != null && mWifiConfig.networkId == wifiInfo.getNetworkId();
+        if (mWifiConfig != null) {
+            if (mWifiConfig.fromWifiNetworkSuggestion) {
+                // Match network suggestions with SSID since the net id is prone to change.
+                return TextUtils.equals(mSsid, sanitizeSsid(wifiInfo.getSSID()));
+            }
+            if (mWifiConfig.networkId == wifiInfo.getNetworkId()) {
+                return true;
+            }
+        }
+        return false;
     }
 
     private void updateRecommendationServiceLabel() {
@@ -731,8 +779,10 @@
 
     @Override
     String getScanResultDescription() {
-        if (mCurrentScanResults.size() == 0) {
-            return "";
+        synchronized (mLock) {
+            if (mCurrentScanResults.size() == 0) {
+                return "";
+            }
         }
 
         final StringBuilder description = new StringBuilder();
@@ -745,11 +795,14 @@
     }
 
     private String getScanResultDescription(int minFrequency, int maxFrequency) {
-        final List<ScanResult> scanResults = mCurrentScanResults.stream()
-                .filter(scanResult -> scanResult.frequency >= minFrequency
-                        && scanResult.frequency <= maxFrequency)
-                .sorted(Comparator.comparingInt(scanResult -> -1 * scanResult.level))
-                .collect(Collectors.toList());
+        final List<ScanResult> scanResults;
+        synchronized (mLock) {
+            scanResults = mCurrentScanResults.stream()
+                    .filter(scanResult -> scanResult.frequency >= minFrequency
+                            && scanResult.frequency <= maxFrequency)
+                    .sorted(Comparator.comparingInt(scanResult -> -1 * scanResult.level))
+                    .collect(Collectors.toList());
+        }
 
         final int scanResultCount = scanResults.size();
         if (scanResultCount == 0) {
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
index ef658f0..382fe02 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
@@ -245,6 +245,8 @@
                         // no OWE config.
                         if (openInRange && openConfigExists && !oweConfigExists) {
                             continue;
+                        } else {
+                            chosenSecurityTypes.add(SECURITY_OWE);
                         }
                     } else if (isOweTransition) {
                         // Map to OWE if we either
@@ -305,8 +307,12 @@
 
     static CharSequence getAppLabelForSavedNetwork(@NonNull Context context,
             @NonNull WifiEntry wifiEntry) {
-        final WifiConfiguration config = wifiEntry.getWifiConfiguration();
-        if (context == null || wifiEntry == null || config == null) {
+        return getAppLabelForWifiConfiguration(context, wifiEntry.getWifiConfiguration());
+    }
+
+    static CharSequence getAppLabelForWifiConfiguration(@NonNull Context context,
+            @NonNull WifiConfiguration config) {
+        if (context == null || config == null) {
             return "";
         }
 
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
index 2218293..afe8b5f 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
@@ -400,6 +400,16 @@
         return false;
     };
 
+    /**
+     * Return the URI string value of help, if it is not null, WifiPicker may show
+     * help icon and route the user to help page specified by the URI string.
+     * see {@link Intent#parseUri}
+     */
+    @Nullable
+    public String getHelpUriString() {
+        return null;
+    }
+
     /** Allows the user to manage their subscription via an external flow */
     public void manageSubscription() {
         // Subclasses should implement this method.
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
index 0c6d7d6..c08b47c 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
@@ -44,6 +44,7 @@
 import android.net.wifi.hotspot2.OsuProvider;
 import android.net.wifi.hotspot2.PasspointConfiguration;
 import android.os.Handler;
+import android.text.TextUtils;
 import android.util.Log;
 import android.util.Pair;
 
@@ -91,9 +92,14 @@
 
     // Cache containing saved WifiConfigurations mapped by StandardWifiEntry key
     private final Map<String, WifiConfiguration> mWifiConfigCache = new HashMap<>();
+
+    private final Map<String, WifiConfiguration> mSuggestedConfigCache = new HashMap<>();
     // Cache containing visible StandardWifiEntries. Must be accessed only by the worker thread.
     private final Map<String, StandardWifiEntry> mStandardWifiEntryCache = new HashMap<>();
-
+    // Cache containing available suggested StandardWifiEntries. These entries may be already
+    // represented in mStandardWifiEntryCache, so filtering must be done before they are returned in
+    // getWifiEntry() and getConnectedWifiEntry().
+    private final Map<String, StandardWifiEntry> mSuggestedWifiEntryCache = new HashMap<>();
     // Cache containing saved PasspointConfigurations mapped by PasspointWifiEntry key.
     private final Map<String, PasspointConfiguration> mPasspointConfigCache = new HashMap<>();
     // Cache containing visible PasspointWifiEntries. Must be accessed only by the worker thread.
@@ -173,6 +179,8 @@
     @Override
     protected void handleOnStart() {
         updateStandardWifiEntryConfigs(mWifiManager.getConfiguredNetworks());
+        updateSuggestedWifiEntryConfigs(mWifiManager.getPrivilegedConfiguredNetworks().stream()
+                .filter(config -> config.fromWifiNetworkSuggestion).collect(toList()));
         updatePasspointWifiEntryConfigs(mWifiManager.getPasspointConfigurations());
         mScanResultUpdater.update(mWifiManager.getScanResults());
         conditionallyUpdateScanResults(true /* lastScanSucceeded */);
@@ -181,6 +189,7 @@
         updateConnectionInfo(wifiInfo, networkInfo);
         // Create a StandardWifiEntry for the current connection if there are no scan results yet.
         conditionallyCreateConnectedStandardWifiEntry(wifiInfo, networkInfo);
+        conditionallyCreateConnectedSuggestedWifiEntry(wifiInfo, networkInfo);
         conditionallyCreateConnectedPasspointWifiEntry(wifiInfo, networkInfo);
         handleLinkPropertiesChanged(mConnectivityManager.getLinkProperties(
                 mWifiManager.getCurrentNetwork()));
@@ -213,11 +222,14 @@
 
         final WifiConfiguration config =
                 (WifiConfiguration) intent.getExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
-        if (config != null) {
+        if (config != null && !config.isPasspoint() && !config.fromWifiNetworkSuggestion) {
             updateStandardWifiEntryConfig(
                     config, (Integer) intent.getExtra(WifiManager.EXTRA_CHANGE_REASON));
         } else {
             updateStandardWifiEntryConfigs(mWifiManager.getConfiguredNetworks());
+            updateSuggestedWifiEntryConfigs(mWifiManager.getPrivilegedConfiguredNetworks().stream()
+                    .filter((privilegedConfig) -> privilegedConfig.fromWifiNetworkSuggestion)
+                    .collect(toList()));
         }
         updatePasspointWifiEntryConfigs(mWifiManager.getPasspointConfigurations());
         // Update scans since config changes may result in different entries being shown.
@@ -240,6 +252,7 @@
         updateConnectionInfo(wifiInfo, networkInfo);
         // Create a StandardWifiEntry for the current connection if there are no scan results yet.
         conditionallyCreateConnectedStandardWifiEntry(wifiInfo, networkInfo);
+        conditionallyCreateConnectedSuggestedWifiEntry(wifiInfo, networkInfo);
         conditionallyCreateConnectedPasspointWifiEntry(wifiInfo, networkInfo);
         updateWifiEntries();
     }
@@ -268,19 +281,19 @@
     @WorkerThread
     private void updateWifiEntries() {
         synchronized (mLock) {
-            mWifiEntries.clear();
-            mWifiEntries.addAll(mStandardWifiEntryCache.values().stream().filter(entry ->
-                    entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList()));
-            mWifiEntries.addAll(mPasspointWifiEntryCache.values().stream().filter(entry ->
-                    entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList()));
-            mWifiEntries.addAll(mOsuWifiEntryCache.values().stream().filter(entry ->
-                    entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList()));
             mConnectedWifiEntry = mStandardWifiEntryCache.values().stream().filter(entry -> {
                 final @WifiEntry.ConnectedState int connectedState = entry.getConnectedState();
                 return connectedState == CONNECTED_STATE_CONNECTED
                         || connectedState == CONNECTED_STATE_CONNECTING;
             }).findAny().orElse(null /* other */);
             if (mConnectedWifiEntry == null) {
+                mConnectedWifiEntry = mSuggestedWifiEntryCache.values().stream().filter(entry -> {
+                    final @WifiEntry.ConnectedState int connectedState = entry.getConnectedState();
+                    return connectedState == CONNECTED_STATE_CONNECTED
+                            || connectedState == CONNECTED_STATE_CONNECTING;
+                }).findAny().orElse(null /* other */);
+            }
+            if (mConnectedWifiEntry == null) {
                 mConnectedWifiEntry = mPasspointWifiEntryCache.values().stream().filter(entry -> {
                     final @WifiEntry.ConnectedState int connectedState = entry.getConnectedState();
                     return connectedState == CONNECTED_STATE_CONNECTED
@@ -294,6 +307,32 @@
                             || connectedState == CONNECTED_STATE_CONNECTING;
                 }).findAny().orElse(null /* other */);
             }
+            mWifiEntries.clear();
+            for (String key : mStandardWifiEntryCache.keySet()) {
+                // Continue if we're connected to this network with a non-user-shareable config.
+                if (mConnectedWifiEntry != null
+                        && TextUtils.equals(key, mConnectedWifiEntry.getKey())) {
+                    continue;
+                }
+                StandardWifiEntry entry = mStandardWifiEntryCache.get(key);
+                StandardWifiEntry suggestedEntry = mSuggestedWifiEntryCache.get(key);
+                // Return a user-shareable suggested network to the user if one exists
+                if (!entry.isSaved()
+                        && suggestedEntry != null && suggestedEntry.isUserShareable()) {
+                    if (suggestedEntry.getConnectedState() == CONNECTED_STATE_DISCONNECTED) {
+                        mWifiEntries.add(suggestedEntry);
+                    }
+                } else {
+                    if (entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED) {
+                        mWifiEntries.add(entry);
+                    }
+                }
+
+            }
+            mWifiEntries.addAll(mPasspointWifiEntryCache.values().stream().filter(entry ->
+                    entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList()));
+            mWifiEntries.addAll(mOsuWifiEntryCache.values().stream().filter(entry ->
+                    entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList()));
             Collections.sort(mWifiEntries);
             if (isVerboseLoggingEnabled()) {
                 Log.v(TAG, "Connected WifiEntry: " + mConnectedWifiEntry);
@@ -343,6 +382,59 @@
         }
     }
 
+    /**
+     * Updates or removes scan results for the corresponding StandardWifiEntries.
+     * New entries will be created for scan results without an existing entry.
+     * Unreachable entries will be removed.
+     *
+     * @param scanResults List of valid scan results to convey as StandardWifiEntries
+     */
+    @WorkerThread
+    private void updateSuggestedWifiEntryScans(@NonNull List<ScanResult> scanResults) {
+        checkNotNull(scanResults, "Scan Result list should not be null!");
+
+        // Group scans by StandardWifiEntry key
+        final Map<String, List<ScanResult>> scanResultsByKey = mapScanResultsToKey(
+                scanResults,
+                true /* chooseSingleSecurity */,
+                mWifiConfigCache,
+                mWifiManager.isWpa3SaeSupported(),
+                mWifiManager.isWpa3SuiteBSupported(),
+                mWifiManager.isEnhancedOpenSupported());
+
+        Map<String, WifiConfiguration> userSharedConfigsByKey =
+                mWifiManager.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(scanResults)
+                        .stream()
+                        .collect(Collectors.toMap(
+                                StandardWifiEntry::wifiConfigToStandardWifiEntryKey,
+                                Function.identity()));
+
+        Set<String> seenKeys = new TreeSet<>();
+        for (String key : userSharedConfigsByKey.keySet()) {
+            seenKeys.add(key);
+            if (!mSuggestedWifiEntryCache.containsKey(key)) {
+                mSuggestedWifiEntryCache.put(key, new StandardWifiEntry(mContext, mMainHandler, key,
+                        userSharedConfigsByKey.get(key), mWifiManager,
+                        false /* forSavedNetworksPage */));
+            }
+            final StandardWifiEntry entry = mSuggestedWifiEntryCache.get(key);
+            entry.setUserShareable(true);
+            entry.updateScanResultInfo(scanResultsByKey.get(key));
+        }
+
+        // Remove entries without configs
+        mSuggestedWifiEntryCache.entrySet()
+                .removeIf(entry -> {
+                    StandardWifiEntry wifiEntry = entry.getValue();
+                    String key = entry.getKey();
+                    if (!seenKeys.contains(key)) {
+                        wifiEntry.updateConfig(mSuggestedConfigCache.get(key));
+                        wifiEntry.setUserShareable(false);
+                    }
+                    return !wifiEntry.isSaved();
+                });
+    }
+
     @WorkerThread
     private void updatePasspointWifiEntryScans(@NonNull List<ScanResult> scanResults) {
         checkNotNull(scanResults, "Scan Result list should not be null!");
@@ -415,6 +507,7 @@
     private void conditionallyUpdateScanResults(boolean lastScanSucceeded) {
         if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED) {
             updateStandardWifiEntryScans(Collections.emptyList());
+            updateSuggestedWifiEntryScans(Collections.emptyList());
             updatePasspointWifiEntryScans(Collections.emptyList());
             updateOsuWifiEntryScans(Collections.emptyList());
             return;
@@ -432,6 +525,7 @@
 
         List<ScanResult> scanResults = mScanResultUpdater.getScanResults(scanAgeWindow);
         updateStandardWifiEntryScans(scanResults);
+        updateSuggestedWifiEntryScans(scanResults);
         updatePasspointWifiEntryScans(scanResults);
         updateOsuWifiEntryScans(scanResults);
     }
@@ -483,12 +577,33 @@
     }
 
     @WorkerThread
+    private void updateSuggestedWifiEntryConfigs(@NonNull List<WifiConfiguration> configs) {
+        checkNotNull(configs, "Config list should not be null!");
+        mSuggestedConfigCache.clear();
+        mSuggestedConfigCache.putAll(configs.stream().collect(Collectors.toMap(
+                StandardWifiEntry::wifiConfigToStandardWifiEntryKey,
+                Function.identity())));
+
+        // Iterate through current entries and update each entry's config
+        mSuggestedWifiEntryCache.entrySet().removeIf((entry) -> {
+            final StandardWifiEntry wifiEntry = entry.getValue();
+            final String key = wifiEntry.getKey();
+            final WifiConfiguration cachedConfig = mSuggestedConfigCache.get(key);
+            if (cachedConfig != null) {
+                wifiEntry.updateConfig(cachedConfig);
+                return false;
+            } else {
+                return true;
+            }
+        });
+    }
+
+    @WorkerThread
     private void updatePasspointWifiEntryConfigs(@NonNull List<PasspointConfiguration> configs) {
         checkNotNull(configs, "Config list should not be null!");
-
         mPasspointConfigCache.clear();
         mPasspointConfigCache.putAll(configs.stream().collect(
-                toMap((config) -> uniqueIdToPasspointWifiEntryKey(
+                toMap(config -> uniqueIdToPasspointWifiEntryKey(
                         config.getUniqueId()), Function.identity())));
 
         // Iterate through current entries and update each entry's config or remove if no config
@@ -517,6 +632,9 @@
         for (WifiEntry entry : mStandardWifiEntryCache.values()) {
             entry.updateConnectionInfo(wifiInfo, networkInfo);
         }
+        for (WifiEntry entry : mSuggestedWifiEntryCache.values()) {
+            entry.updateConnectionInfo(wifiInfo, networkInfo);
+        }
         for (WifiEntry entry : mPasspointWifiEntryCache.values()) {
             entry.updateConnectionInfo(wifiInfo, networkInfo);
         }
@@ -534,7 +652,7 @@
     @WorkerThread
     private void conditionallyCreateConnectedStandardWifiEntry(@Nullable WifiInfo wifiInfo,
             @Nullable NetworkInfo networkInfo) {
-        if (wifiInfo.isPasspointAp()) {
+        if (wifiInfo.isPasspointAp() || wifiInfo.isOsuAp()) {
             return;
         }
 
@@ -554,7 +672,37 @@
     }
 
     /**
-     * Creates and caches a StandardWifiEntry representing the current connection using the current
+     * Creates and caches a suggested StandardWifiEntry representing the current connection using
+     * the current WifiInfo and NetworkInfo if there are no scans results available for the network
+     * yet.
+     * @param wifiInfo WifiInfo of the current connection
+     * @param networkInfo NetworkInfo of the current connection
+     */
+    @WorkerThread
+    private void conditionallyCreateConnectedSuggestedWifiEntry(@Nullable WifiInfo wifiInfo,
+            @Nullable NetworkInfo networkInfo) {
+        if (wifiInfo.isPasspointAp() || wifiInfo.isOsuAp()) {
+            return;
+        }
+
+        mSuggestedConfigCache.values().stream()
+                .filter(config ->
+                        TextUtils.equals(config.SSID, wifiInfo.getSSID())
+                                && !mSuggestedWifiEntryCache.containsKey(
+                                        wifiConfigToStandardWifiEntryKey(config)))
+                .findAny().ifPresent(config -> {
+                    final StandardWifiEntry connectedEntry =
+                            new StandardWifiEntry(mContext, mMainHandler,
+                                    wifiConfigToStandardWifiEntryKey(config), config, mWifiManager,
+                                    false /* forSavedNetworksPage */);
+                    connectedEntry.updateConnectionInfo(wifiInfo, networkInfo);
+                    mSuggestedWifiEntryCache.put(connectedEntry.getKey(), connectedEntry);
+                });
+    }
+
+
+    /**
+     * Creates and caches a PasspointWifiEntry representing the current connection using the current
      * WifiInfo and NetworkInfo if there are no scans results available for the network yet.
      * @param wifiInfo WifiInfo of the current connection
      * @param networkInfo NetworkInfo of the current connection
diff --git a/service/Android.bp b/service/Android.bp
index 928f9c5..75dff32 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -58,12 +58,11 @@
         "jsr305",
         "framework-annotations-lib",
         // load the resources from the resources APK.
-        "wifi-service-resources",
+        "ServiceWifiResources",
         // need pre-jarjar symbols so that wifi-service can reference the original class names at
         // compile time
         "framework-wifi-pre-jarjar",
         "framework-statsd-stubs-module_libs_api",
-        "framework-telephony-stubs",
         "unsupportedappusage",
     ],
 
@@ -143,11 +142,9 @@
 }
 
 // APK to hold all the wifi overlayable resources.
-// TODO: This should be signed by a wifi specific certificate.
 // ============================================================
 android_app {
-    // TODO: Rename to service-wifi-resources? What about b/151678653?
-    name: "wifi-service-resources",
+    name: "ServiceWifiResources",
     defaults: ["wifi-service-common"],
     resource_dirs: [
         "res",
@@ -156,6 +153,16 @@
     sdk_version: "system_current",
     export_package_resources: true,
     manifest: "AndroidManifest_Resources.xml",
+    apex_available: [
+        "com.android.wifi",
+        "test_com.android.wifi",
+    ],
+    certificate: ":com.android.wifi.resources.certificate",
+}
+
+android_app_certificate {
+    name: "com.android.wifi.resources.certificate",
+    certificate: "resources-certs/com.android.wifi.resources"
 }
 
 // Prebuilt for the wifi.rc file.
diff --git a/service/AndroidManifest_Resources.xml b/service/AndroidManifest_Resources.xml
index 4585721..a6b2a58 100644
--- a/service/AndroidManifest_Resources.xml
+++ b/service/AndroidManifest_Resources.xml
@@ -26,5 +26,12 @@
         android:defaultToDeviceProtectedStorage="true"
         android:directBootAware="true"
         android:usesCleartextTraffic="true">
+        <!-- This is only used to identify this app by resolving the action.
+             The activity is never actually triggered. -->
+        <activity android:name="android.app.Activity" android:exported="true" android:enabled="true">
+            <intent-filter>
+                <action android:name="com.android.server.wifi.intent.action.SERVICE_WIFI_RESOURCES_APK" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
diff --git a/service/apex/Android.bp b/service/apex/Android.bp
index 65cd6d5..e23d9cc 100644
--- a/service/apex/Android.bp
+++ b/service/apex/Android.bp
@@ -30,8 +30,8 @@
     key: "com.android.wifi.key",
     certificate: ":com.android.wifi.certificate",
     apps: [
-        "wifi-service-resources",
         "OsuLogin",
+        "ServiceWifiResources",
     ],
 }
 
diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java
index ef2aa9e..457b687 100644
--- a/service/java/com/android/server/wifi/ActiveModeWarden.java
+++ b/service/java/com/android/server/wifi/ActiveModeWarden.java
@@ -71,6 +71,7 @@
     private final WifiPermissionsUtil mWifiPermissionsUtil;
     private final BatteryStatsManager mBatteryStatsManager;
     private final ScanRequestProxy mScanRequestProxy;
+    private final WifiNative mWifiNative;
     private final WifiController mWifiController;
 
     private WifiManager.SoftApCallback mSoftApCallback;
@@ -117,6 +118,7 @@
         mDefaultModeManager = defaultModeManager;
         mBatteryStatsManager = batteryStatsManager;
         mScanRequestProxy = wifiInjector.getScanRequestProxy();
+        mWifiNative = wifiNative;
         mWifiController = new WifiController();
 
         wifiNative.registerStatusListener(isReady -> {
@@ -164,22 +166,8 @@
      * @return Returns whether the device can support at least one concurrent client mode manager &
      * softap manager.
      */
-    public boolean canSupportAtleastOneConcurrentClientAndSoftApManager() {
-        // We already have 1 client mode manager and 1 softap manager active, so yes.
-        if (hasAnyClientModeManager() && hasAnySoftApManager()) {
-            return true;
-        }
-        // We already have 1 client mode manager active, check if we can create a softap manager.
-        if (hasAnyClientModeManager()) {
-            return mCanRequestMoreSoftApManagers;
-        }
-        // We already have 1 softap manager active, check if we can create a client mode manager.
-        if (hasAnySoftApManager()) {
-            return mCanRequestMoreClientModeManagers;
-        }
-        // We don't have any active mode manager, this can happen if wifi is fully off. We return
-        // false here because we cannot retrieve this info from the HAL.
-        return false;
+    public boolean isStaApConcurrencySupported() {
+        return mWifiNative.isStaApConcurrencySupported();
     }
 
     /** Begin listening to broadcasts and start the internal state machine. */
diff --git a/service/java/com/android/server/wifi/BssidBlocklistMonitor.java b/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
index 897090c..2d93e30 100644
--- a/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
+++ b/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
@@ -154,13 +154,10 @@
         pw.println("BssidBlocklistMonitor - Bssid blocklist End ----");
     }
 
-    private void addToBlocklist(@NonNull BssidStatus entry, long durationMs,
-            boolean doNotClearUntilTimeout, String reasonString) {
-        entry.addToBlocklist(durationMs);
-        entry.doNotClearUntilTimeout = doNotClearUntilTimeout;
+    private void addToBlocklist(@NonNull BssidStatus entry, long durationMs, String reasonString) {
+        entry.addToBlocklist(durationMs, reasonString);
         localLog(TAG + " addToBlocklist: bssid=" + entry.bssid + ", ssid=" + entry.ssid
-                + ", durationMs=" + durationMs + ", doNotClearUntilTimeout="
-                + doNotClearUntilTimeout + ", reason=" + reasonString);
+                + ", durationMs=" + durationMs + ", reason=" + reasonString);
     }
 
     /**
@@ -223,8 +220,7 @@
             // Return because this BSSID is already being blocked for a longer time.
             return;
         }
-        addToBlocklist(status, durationMs, true,
-                FAILURE_BSSID_BLOCKED_BY_FRAMEWORK_REASON_STRING);
+        addToBlocklist(status, durationMs, FAILURE_BSSID_BLOCKED_BY_FRAMEWORK_REASON_STRING);
     }
 
     private String getFailureReasonString(@FailureReason int reasonCode) {
@@ -289,7 +285,7 @@
             }
             addToBlocklist(entry,
                     getBlocklistDurationWithExponentialBackoff(currentStreak, baseBlockDurationMs),
-                    false, getFailureReasonString(reasonCode));
+                    getFailureReasonString(reasonCode));
             mWifiScoreCard.incrementBssidBlocklistStreak(ssid, bssid, reasonCode);
             return true;
         }
@@ -403,8 +399,7 @@
      */
     public void clearBssidBlocklistForSsid(@NonNull String ssid) {
         int prevSize = mBssidStatusMap.size();
-        mBssidStatusMap.entrySet().removeIf(e -> !e.getValue().doNotClearUntilTimeout
-                && e.getValue().ssid.equals(ssid));
+        mBssidStatusMap.entrySet().removeIf(e -> e.getValue().ssid.equals(ssid));
         int diff = prevSize - mBssidStatusMap.size();
         if (diff > 0) {
             localLog(TAG + " clearBssidBlocklistForSsid: SSID=" + ssid
@@ -418,7 +413,7 @@
     public void clearBssidBlocklist() {
         if (mBssidStatusMap.size() > 0) {
             int prevSize = mBssidStatusMap.size();
-            mBssidStatusMap.entrySet().removeIf(e -> !e.getValue().doNotClearUntilTimeout);
+            mBssidStatusMap.clear();
             localLog(TAG + " clearBssidBlocklist: num BSSIDs cleared="
                     + (prevSize - mBssidStatusMap.size()));
         }
@@ -502,13 +497,11 @@
         public final String bssid;
         public final String ssid;
         public final int[] failureCount = new int[NUMBER_REASON_CODES];
+        private String mBlockReason = ""; // reason of blocking for logging only
 
         // The following are used to flag how long this BSSID stays in the blocklist.
         public boolean isInBlocklist;
         public long blocklistEndTimeMs;
-        // Indicate that this BSSID should not be removed from blacklist through other means
-        // such as |clearBssidBlocklist| and |clearBssidBlocklistForSsid|
-        public boolean doNotClearUntilTimeout;
 
         BssidStatus(String bssid, String ssid) {
             this.bssid = bssid;
@@ -527,9 +520,10 @@
          * Add this BSSID to blocklist for the specified duration.
          * @param durationMs
          */
-        public void addToBlocklist(long durationMs) {
+        public void addToBlocklist(long durationMs, String blockReason) {
             isInBlocklist = true;
             blocklistEndTimeMs = mClock.getWallClockMillis() + durationMs;
+            mBlockReason = blockReason;
         }
 
         /**
@@ -538,6 +532,7 @@
         public void removeFromBlocklist() {
             isInBlocklist = false;
             blocklistEndTimeMs = 0;
+            mBlockReason = "";
             localLog(TAG + " removeFromBlocklist BSSID=" + bssid);
         }
 
@@ -548,6 +543,7 @@
             sb.append(", SSID=" + ssid);
             sb.append(", isInBlocklist=" + isInBlocklist);
             if (isInBlocklist) {
+                sb.append(", blockReason=" + mBlockReason);
                 mCalendar.setTimeInMillis(blocklistEndTimeMs);
                 sb.append(", blocklistEndTimeMs="
                         + String.format("%tm-%td %tH:%tM:%tS.%tL", mCalendar, mCalendar,
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index 6941fbf..4ca7716 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -59,10 +59,12 @@
 import android.net.SocketKeepalive;
 import android.net.StaticIpConfiguration;
 import android.net.TcpKeepalivePacketData;
+import android.net.Uri;
 import android.net.ip.IIpClient;
 import android.net.ip.IpClientCallbacks;
 import android.net.ip.IpClientManager;
 import android.net.shared.Inet4AddressUtils;
+import android.net.shared.Layer2Information;
 import android.net.shared.ProvisioningConfiguration;
 import android.net.shared.ProvisioningConfiguration.ScanResultInfo;
 import android.net.util.NetUtils;
@@ -113,6 +115,8 @@
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
 import com.android.server.wifi.MboOceController.BtmFrameData;
+import com.android.server.wifi.WifiCarrierInfoManager.SimAuthRequestData;
+import com.android.server.wifi.WifiCarrierInfoManager.SimAuthResponseData;
 import com.android.server.wifi.hotspot2.AnqpEvent;
 import com.android.server.wifi.hotspot2.IconEvent;
 import com.android.server.wifi.hotspot2.NetworkDetail;
@@ -128,9 +132,6 @@
 import com.android.server.wifi.util.NativeUtil;
 import com.android.server.wifi.util.RssiUtil;
 import com.android.server.wifi.util.ScanResultUtil;
-import com.android.server.wifi.util.TelephonyUtil;
-import com.android.server.wifi.util.TelephonyUtil.SimAuthRequestData;
-import com.android.server.wifi.util.TelephonyUtil.SimAuthResponseData;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 import com.android.wifi.resources.R;
@@ -146,6 +147,7 @@
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -719,7 +721,7 @@
 
     private final BatteryStatsManager mBatteryStatsManager;
 
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
 
 
     // Used for debug and stats gathering
@@ -748,7 +750,8 @@
                             BatteryStatsManager batteryStatsManager,
                             SupplicantStateTracker supplicantStateTracker,
                             MboOceController mboOceController,
-                            TelephonyUtil telephonyUtil, EapFailureNotifier eapFailureNotifier,
+                            WifiCarrierInfoManager wifiCarrierInfoManager,
+                            EapFailureNotifier eapFailureNotifier,
                             SimRequiredNotifier simRequiredNotifier) {
         super(TAG, looper);
         mWifiInjector = wifiInjector;
@@ -768,7 +771,7 @@
         mWifiTrafficPoller = wifiTrafficPoller;
         mLinkProbeManager = linkProbeManager;
         mMboOceController = mboOceController;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         mNetworkAgentState = DetailedState.DISCONNECTED;
 
         mBatteryStatsManager = batteryStatsManager;
@@ -1103,12 +1106,31 @@
             mWifiNative.removeNetworkCachedData(config.networkId);
         }
 
-
         @Override
-        public void onNetworkUpdated(WifiConfiguration config) {
-            // User might have changed meteredOverride, so update capabilities
-            if (config.networkId == mLastNetworkId) {
-                updateCapabilities();
+        public void onNetworkUpdated(WifiConfiguration newConfig, WifiConfiguration oldConfig) {
+            // Check if user/app change meteredOverride for connected network.
+            if (newConfig.networkId != mLastNetworkId
+                    || newConfig.meteredOverride == oldConfig.meteredOverride) {
+                // nothing to do.
+                return;
+            }
+            boolean isMetered = WifiConfiguration.isMetered(newConfig, mWifiInfo);
+            boolean wasMetered = WifiConfiguration.isMetered(oldConfig, mWifiInfo);
+            if (isMetered == wasMetered) {
+                // no meteredness change, nothing to do.
+                if (mVerboseLoggingEnabled) {
+                    Log.v(TAG, "User/app changed meteredOverride, but no change in meteredness");
+                }
+                return;
+            }
+            // If unmetered->metered trigger a disconnect.
+            // If metered->unmetered update capabilities.
+            if (isMetered) {
+                Log.w(TAG, "Network marked metered, triggering disconnect");
+                sendMessage(CMD_DISCONNECT);
+            } else {
+                Log.i(TAG, "Network marked unmetered, triggering capabilities update");
+                updateCapabilities(newConfig);
             }
         }
 
@@ -1581,6 +1603,32 @@
         sendMessageAtFrontOfQueue(CMD_SET_OPERATIONAL_MODE);
     }
 
+    private void checkAbnormalConnectionFailureAndTakeBugReport(String ssid) {
+        if (mWifiInjector.getDeviceConfigFacade()
+                .isAbnormalConnectionFailureBugreportEnabled()) {
+            int reasonCode = mWifiScoreCard.detectAbnormalConnectionFailure(ssid);
+            if (reasonCode != WifiHealthMonitor.REASON_NO_FAILURE) {
+                String bugTitle = "Wi-Fi BugReport";
+                String bugDetail = "Detect abnormal "
+                        + WifiHealthMonitor.FAILURE_REASON_NAME[reasonCode];
+                takeBugReport(bugTitle, bugDetail);
+            }
+        }
+    }
+
+    private void checkAbnormalDisconnectionAndTakeBugReport() {
+        if (mWifiInjector.getDeviceConfigFacade()
+                .isAbnormalDisconnectionBugreportEnabled()) {
+            int reasonCode = mWifiScoreCard.detectAbnormalDisconnection();
+            if (reasonCode != WifiHealthMonitor.REASON_NO_FAILURE) {
+                String bugTitle = "Wi-Fi BugReport";
+                String bugDetail = "Detect abnormal "
+                        + WifiHealthMonitor.FAILURE_REASON_NAME[reasonCode];
+                takeBugReport(bugTitle, bugDetail);
+            }
+        }
+    }
+
     /**
      * Initiates a system-level bugreport, in a non-blocking fashion.
      */
@@ -2595,7 +2643,7 @@
             mWifiInfo.setSSID(null);
             mWifiInfo.setWifiStandard(ScanResult.WIFI_STANDARD_UNKNOWN);
         }
-        updateL2KeyAndGroupHint();
+        updateLayer2Information();
         // SSID might have been updated, so call updateCapabilities
         updateCapabilities();
 
@@ -2653,13 +2701,16 @@
     }
 
     /**
-     * Tells IpClient what L2Key and GroupHint to use for IpMemoryStore.
+     * Tells IpClient what BSSID, L2Key and GroupHint to use for IpMemoryStore.
      */
-    private void updateL2KeyAndGroupHint() {
+    private void updateLayer2Information() {
         if (mIpClient != null) {
             Pair<String, String> p = mWifiScoreCard.getL2KeyAndGroupHint(mWifiInfo);
             if (!p.equals(mLastL2KeyAndGroupHint)) {
-                if (mIpClient.setL2KeyAndGroupHint(p.first, p.second)) {
+                final Layer2Information l2Information = new Layer2Information(
+                        p.first, p.second,
+                        mLastBssid != null ? MacAddress.fromString(mLastBssid) : null);
+                if (mIpClient.updateLayer2Information(l2Information)) {
                     mLastL2KeyAndGroupHint = p;
                 } else {
                     mLastL2KeyAndGroupHint = null;
@@ -2729,9 +2780,10 @@
         mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
         mLastSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
         mLastSimBasedConnectionCarrierName = null;
+        checkAbnormalDisconnectionAndTakeBugReport();
         mWifiScoreCard.resetConnectionState();
         mWifiDataStall.reset();
-        updateL2KeyAndGroupHint();
+        updateLayer2Information();
     }
 
     void handlePreDhcpSetup() {
@@ -2899,18 +2951,7 @@
                         : configuration.networkId;
                 int scanRssi = mWifiConfigManager.findScanRssi(networkId, SCAN_RSSI_VALID_TIME_MS);
                 mWifiScoreCard.noteConnectionFailure(mWifiInfo, scanRssi, ssid, blocklistReason);
-                boolean isNonWrongPwdAuthFailure =
-                        blocklistReason == BssidBlocklistMonitor.REASON_AUTHENTICATION_FAILURE
-                        || blocklistReason == BssidBlocklistMonitor.REASON_EAP_FAILURE;
-                boolean isEnterpriseNetwork = configuration != null && configuration.isEnterprise();
-                if (isNonWrongPwdAuthFailure && isEnterpriseNetwork && mWifiInjector
-                        .getDeviceConfigFacade().isAbnormalEapAuthFailureBugreportEnabled()
-                        && mWifiScoreCard.detectAbnormalAuthFailure(ssid)) {
-                    String bugTitle = "Wi-Fi BugReport";
-                    String bugDetail = "Abnormal authentication failure with enterprise network";
-                    mWifiDiagnostics.takeBugReport(bugTitle, bugDetail);
-                }
-
+                checkAbnormalConnectionFailureAndTakeBugReport(ssid);
                 boolean isLowRssi = false;
                 int sufficientRssi = getSufficientRssi(networkId, bssid);
                 if (scanRssi != WifiInfo.INVALID_RSSI && sufficientRssi != WifiInfo.INVALID_RSSI) {
@@ -3580,6 +3621,7 @@
 
         // Let's remove any ephemeral or passpoint networks.
         mWifiConfigManager.removeAllEphemeralOrPasspointConfiguredNetworks();
+        mWifiConfigManager.clearUserTemporarilyDisabledList();
     }
 
     void registerConnected() {
@@ -3888,7 +3930,7 @@
                             && mTargetWifiConfiguration.enterpriseConfig
                                     .isAuthenticationSimBased()) {
                         // Pair<identity, encrypted identity>
-                        Pair<String, String> identityPair = mTelephonyUtil
+                        Pair<String, String> identityPair = mWifiCarrierInfoManager
                                 .getSimIdentity(mTargetWifiConfiguration);
                         Log.i(TAG, "SUP_REQUEST_IDENTITY: identityPair=["
                                 + ((identityPair.first.length() >= 7)
@@ -4122,15 +4164,15 @@
                         // We need to get the updated pseudonym from supplicant for EAP-SIM/AKA/AKA'
                         if (config.enterpriseConfig != null
                                 && config.enterpriseConfig.isAuthenticationSimBased()) {
-                            mLastSubId = mTelephonyUtil.getBestMatchSubscriptionId(config);
+                            mLastSubId = mWifiCarrierInfoManager.getBestMatchSubscriptionId(config);
                             mLastSimBasedConnectionCarrierName =
-                                mTelephonyUtil.getCarrierNameforSubId(mLastSubId);
+                                mWifiCarrierInfoManager.getCarrierNameforSubId(mLastSubId);
                             String anonymousIdentity =
                                     mWifiNative.getEapAnonymousIdentity(mInterfaceName);
                             if (!TextUtils.isEmpty(anonymousIdentity)
-                                    && !TelephonyUtil
+                                    && !WifiCarrierInfoManager
                                     .isAnonymousAtRealmIdentity(anonymousIdentity)) {
-                                String decoratedPseudonym = mTelephonyUtil
+                                String decoratedPseudonym = mWifiCarrierInfoManager
                                         .decoratePseudonymWith3GppRealm(config,
                                                 anonymousIdentity);
                                 if (decoratedPseudonym != null) {
@@ -4427,10 +4469,14 @@
     }
 
     private void updateCapabilities(WifiConfiguration currentWifiConfiguration) {
+        updateCapabilities(getCapabilities(currentWifiConfiguration));
+    }
+
+    private void updateCapabilities(NetworkCapabilities networkCapabilities) {
         if (mNetworkAgent == null) {
             return;
         }
-        mNetworkAgent.sendNetworkCapabilities(getCapabilities(currentWifiConfiguration));
+        mNetworkAgent.sendNetworkCapabilities(networkCapabilities);
     }
 
     private void handleEapAuthFailure(int networkId, int errorCode) {
@@ -4442,7 +4488,7 @@
                 case WifiEnterpriseConfig.Eap.AKA:
                 case WifiEnterpriseConfig.Eap.AKA_PRIME:
                     if (errorCode == WifiNative.EAP_SIM_VENDOR_SPECIFIC_CERT_EXPIRED) {
-                        mTelephonyUtil.resetCarrierKeysForImsiEncryption(targetedNetwork);
+                        mWifiCarrierInfoManager.resetCarrierKeysForImsiEncryption(targetedNetwork);
                     }
                     break;
 
@@ -4472,7 +4518,7 @@
         }
 
         @Override
-        public void onValidationStatus(int status, @Nullable String redirectUrl) {
+        public void onValidationStatus(int status, @Nullable Uri redirectUri) {
             if (this != mNetworkAgent) return;
             if (status == mLastNetworkStatus) return;
             mLastNetworkStatus = status;
@@ -4499,10 +4545,10 @@
         }
 
         @Override
-        public void onStartSocketKeepalive(int slot, int intervalSeconds,
+        public void onStartSocketKeepalive(int slot, @NonNull Duration interval,
                 @NonNull KeepalivePacketData packet) {
             ClientModeImpl.this.sendMessage(
-                    CMD_START_IP_PACKET_OFFLOAD, slot, intervalSeconds, packet);
+                    CMD_START_IP_PACKET_OFFLOAD, slot, (int) interval.getSeconds(), packet);
         }
 
         @Override
@@ -4633,6 +4679,10 @@
                     .build();
             final NetworkCapabilities nc = getCapabilities(getCurrentWifiConfiguration());
             synchronized (mNetworkAgentLock) {
+                // This should never happen.
+                if (mNetworkAgent != null) {
+                    Log.wtf(TAG, "mNetworkAgent is not null: " + mNetworkAgent);
+                }
                 mNetworkAgent = new WifiNetworkAgent(mContext, getHandler().getLooper(),
                         "WifiNetworkAgent", nc, mLinkProperties, 60, naConfig,
                         mNetworkFactory.getProvider());
@@ -4883,7 +4933,7 @@
                                 && config.carrierId != TelephonyManager.UNKNOWN_CARRIER_ID)
                                 || (config.enterpriseConfig != null
                                         && config.enterpriseConfig.isAuthenticationSimBased()
-                                        && !mTelephonyUtil.isSimPresent(mLastSubId))) {
+                                        && !mWifiCarrierInfoManager.isSimPresent(mLastSubId))) {
                             mWifiMetrics.logStaEvent(StaEvent.TYPE_FRAMEWORK_DISCONNECT,
                                     StaEvent.DISCONNECT_RESET_SIM_NETWORKS);
                             // remove local PMKSA cache in framework
@@ -5054,7 +5104,7 @@
     }
 
     private void sendConnectedState() {
-        mNetworkAgent.setConnected();
+        mNetworkAgent.markConnected();
         sendNetworkChangeBroadcast(DetailedState.CONNECTED);
     }
 
@@ -5238,6 +5288,7 @@
             WifiLockManager wifiLockManager = mWifiInjector.getWifiLockManager();
             wifiLockManager.updateWifiClientConnected(true);
             mWifiScoreReport.startConnectedNetworkScorer(mNetworkAgent.getNetwork().getNetId());
+            updateLinkLayerStatsRssiAndScoreReport();
         }
         @Override
         public boolean processMessage(Message message) {
@@ -5690,15 +5741,15 @@
          * 3. 3GPP TS 11.11  2G_authentication [RAND]
          *                            [SRES][Cipher Key Kc]
          */
-        String response = mTelephonyUtil
+        String response = mWifiCarrierInfoManager
                 .getGsmSimAuthResponse(requestData.data, mTargetWifiConfiguration);
         if (response == null) {
             // In case of failure, issue may be due to sim type, retry as No.2 case
-            response = mTelephonyUtil
+            response = mWifiCarrierInfoManager
                     .getGsmSimpleSimAuthResponse(requestData.data, mTargetWifiConfiguration);
             if (response == null) {
                 // In case of failure, issue may be due to sim type, retry as No.3 case
-                response = mTelephonyUtil.getGsmSimpleSimNoLengthAuthResponse(
+                response = mWifiCarrierInfoManager.getGsmSimpleSimNoLengthAuthResponse(
                                 requestData.data, mTargetWifiConfiguration);
             }
         }
@@ -5721,7 +5772,7 @@
             return;
         }
 
-        SimAuthResponseData response = mTelephonyUtil
+        SimAuthResponseData response = mWifiCarrierInfoManager
                 .get3GAuthResponse(requestData, mTargetWifiConfiguration);
         if (response != null) {
             mWifiNative.simAuthResponse(
@@ -5888,6 +5939,22 @@
     }
 
     /**
+     * Approve all access points from {@link WifiNetworkFactory} for the provided package.
+     * Used by shell commands.
+     */
+    public void setNetworkRequestUserApprovedApp(@NonNull String packageName, boolean approved) {
+        mNetworkFactory.setUserApprovedApp(packageName, approved);
+    }
+
+    /**
+     * Whether all access points are approved for the specified app.
+     * Used by shell commands.
+     */
+    public boolean hasNetworkRequestUserApprovedApp(@NonNull String packageName) {
+        return mNetworkFactory.hasUserApprovedApp(packageName);
+    }
+
+    /**
      * Remove all approved access points from {@link WifiNetworkFactory} for the provided package.
      */
     public void removeNetworkRequestUserApprovedAccessPointsForApp(@NonNull String packageName) {
@@ -6106,6 +6173,7 @@
                 & MboOceConstants.BTM_DATA_FLAG_MBO_ASSOC_RETRY_DELAY_INCLUDED)
                 != 0) {
             long duration = frameData.mBlackListDurationMs;
+            mWifiMetrics.incrementSteeringRequestCountIncludingMboAssocRetryDelay();
             if (duration == 0) {
                 /*
                  * When MBO assoc retry delay is set to zero(reserved as per spec),
@@ -6270,10 +6338,10 @@
 
         if (config.enterpriseConfig != null
                 && config.enterpriseConfig.isAuthenticationSimBased()
-                && mTelephonyUtil.isImsiEncryptionInfoAvailable(
-                mTelephonyUtil.getBestMatchSubscriptionId(config))
+                && mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(
+                mWifiCarrierInfoManager.getBestMatchSubscriptionId(config))
                 && TextUtils.isEmpty(config.enterpriseConfig.getAnonymousIdentity())) {
-            String anonAtRealm = mTelephonyUtil
+            String anonAtRealm = mWifiCarrierInfoManager
                     .getAnonymousIdentityWith3GppRealm(config);
             // Use anonymous@<realm> when pseudonym is not available
             config.enterpriseConfig.setAnonymousIdentity(anonAtRealm);
@@ -6371,7 +6439,8 @@
                             new ScanResultInfo.InformationElement(ie.getId(), ie.getBytes());
                     ies.add(scanResultInfoIe);
                 }
-                scanResultInfo = new ProvisioningConfiguration.ScanResultInfo(scanResult.SSID, ies);
+                scanResultInfo = new ProvisioningConfiguration.ScanResultInfo(scanResult.SSID,
+                        scanResult.BSSID, ies);
             }
 
             if (!isUsingStaticIp) {
diff --git a/service/java/com/android/server/wifi/ClientModeManager.java b/service/java/com/android/server/wifi/ClientModeManager.java
index fd077d3..66495ae 100644
--- a/service/java/com/android/server/wifi/ClientModeManager.java
+++ b/service/java/com/android/server/wifi/ClientModeManager.java
@@ -505,8 +505,8 @@
                 Log.d(TAG, "entering ScanOnlyModeState");
                 mClientModeImpl.setOperationalMode(ClientModeImpl.SCAN_ONLY_MODE,
                         mClientInterfaceName);
-                mModeListener.onStarted();
                 mRole = ROLE_CLIENT_SCAN_ONLY;
+                mModeListener.onStarted();
 
                 // Inform sar manager that scan only is being enabled
                 mSarManager.setScanOnlyWifiState(WifiManager.WIFI_STATE_ENABLED);
@@ -551,8 +551,12 @@
             public boolean processMessage(Message message) {
                 switch (message.what) {
                     case CMD_SWITCH_TO_CONNECT_MODE:
-                        mRole = message.arg1;
-                        // Already in connect mode, ignore this command.
+                        int newRole = message.arg1;
+                        // Already in connect mode, only switching the connectivity roles.
+                        if (newRole != mRole) {
+                            mRole = newRole;
+                            mModeListener.onStarted();
+                        }
                         break;
                     case CMD_SWITCH_TO_SCAN_ONLY_MODE:
                         updateConnectModeState(WifiManager.WIFI_STATE_DISABLING,
diff --git a/service/java/com/android/server/wifi/ConnectToNetworkNotificationBuilder.java b/service/java/com/android/server/wifi/ConnectToNetworkNotificationBuilder.java
index f4bd95f..4f7b4e8 100644
--- a/service/java/com/android/server/wifi/ConnectToNetworkNotificationBuilder.java
+++ b/service/java/com/android/server/wifi/ConnectToNetworkNotificationBuilder.java
@@ -18,7 +18,6 @@
 
 import android.app.Notification;
 import android.app.PendingIntent;
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Icon;
 import android.net.wifi.ScanResult;
@@ -51,12 +50,12 @@
     public static final String AVAILABLE_NETWORK_NOTIFIER_TAG =
             "com.android.server.wifi.ConnectToNetworkNotification.AVAILABLE_NETWORK_NOTIFIER_TAG";
 
-    private Context mContext;
+    private WifiContext mContext;
     private WifiInjector mWifiInjector;
     private FrameworkFacade mFrameworkFacade;
 
     public ConnectToNetworkNotificationBuilder(
-            Context context,
+            WifiContext context,
             WifiInjector wifiInjector,
             FrameworkFacade framework) {
         mContext = context;
@@ -158,7 +157,7 @@
             CharSequence title, CharSequence content, String extraData) {
         return mFrameworkFacade.makeNotificationBuilder(mContext,
                 WifiService.NOTIFICATION_NETWORK_AVAILABLE)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
                 .setTicker(title)
                 .setContentTitle(title)
diff --git a/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java b/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java
index a16dac2..6f0a487 100644
--- a/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java
+++ b/service/java/com/android/server/wifi/ConnectionFailureNotificationBuilder.java
@@ -21,7 +21,6 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.graphics.drawable.Icon;
@@ -44,14 +43,14 @@
     public static final String RANDOMIZATION_SETTINGS_NETWORK_SSID =
             "com.android.server.wifi.RANDOMIZATION_SETTINGS_NETWORK_SSID";
 
-    private Context mContext;
+    private WifiContext mContext;
     private String mPackageName;
     private FrameworkFacade mFrameworkFacade;
     private WifiConnectivityManager mWifiConnectivityManager;
     private NotificationManager mNotificationManager;
     private Handler mHandler;
 
-    public ConnectionFailureNotificationBuilder(Context context, String packageName,
+    public ConnectionFailureNotificationBuilder(WifiContext context, String packageName,
             FrameworkFacade framework) {
         mContext = context;
         mPackageName = packageName;
@@ -81,7 +80,7 @@
 
         return mFrameworkFacade.makeNotificationBuilder(
                 mContext, WifiService.NOTIFICATION_NETWORK_ALERTS)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
                 .setTicker(title)
                 .setContentTitle(title)
diff --git a/service/java/com/android/server/wifi/DeviceConfigFacade.java b/service/java/com/android/server/wifi/DeviceConfigFacade.java
index 7ea346c..67cc01c 100644
--- a/service/java/com/android/server/wifi/DeviceConfigFacade.java
+++ b/service/java/com/android/server/wifi/DeviceConfigFacade.java
@@ -67,12 +67,12 @@
     public static final int DEFAULT_RX_PACKET_PER_SECOND_THR = 1;
     // Default high threshold values for various connection/disconnection cases
     // All of them are in percent with respect to connection attempts
-    static final int DEFAULT_CONNECTION_FAILURE_HIGH_THR_PERCENT = 30;
-    static final int DEFAULT_ASSOC_REJECTION_HIGH_THR_PERCENT = 20;
-    static final int DEFAULT_ASSOC_TIMEOUT_HIGH_THR_PERCENT = 20;
-    static final int DEFAULT_AUTH_FAILURE_HIGH_THR_PERCENT = 20;
-    static final int DEFAULT_SHORT_CONNECTION_NONLOCAL_HIGH_THR_PERCENT = 15;
-    static final int DEFAULT_DISCONNECTION_NONLOCAL_HIGH_THR_PERCENT = 20;
+    static final int DEFAULT_CONNECTION_FAILURE_HIGH_THR_PERCENT = 40;
+    static final int DEFAULT_ASSOC_REJECTION_HIGH_THR_PERCENT = 30;
+    static final int DEFAULT_ASSOC_TIMEOUT_HIGH_THR_PERCENT = 30;
+    static final int DEFAULT_AUTH_FAILURE_HIGH_THR_PERCENT = 30;
+    static final int DEFAULT_SHORT_CONNECTION_NONLOCAL_HIGH_THR_PERCENT = 20;
+    static final int DEFAULT_DISCONNECTION_NONLOCAL_HIGH_THR_PERCENT = 25;
     // Default health monitor abnormal count minimum for various cases
     static final int DEFAULT_CONNECTION_FAILURE_COUNT_MIN = 6;
     static final int DEFAULT_ASSOC_REJECTION_COUNT_MIN  = 3;
@@ -90,6 +90,11 @@
     static final int DEFAULT_HEALTH_MONITOR_MIN_RSSI_THR_DBM = -68;
     // Default minimum number of connection attempts to qualify daily detection
     static final int DEFAULT_HEALTH_MONITOR_MIN_NUM_CONNECTION_ATTEMPT = 10;
+    // Default minimum wait time between two bug report captures
+    static final int DEFAULT_BUG_REPORT_MIN_WINDOW_MS = 3_600_000;
+    // Default report-high threshold to take-bug-report threshold ratio.
+    // It should be larger than 1 since the bar to take bugreport should be higher.
+    static final int DEFAULT_BUG_REPORT_THRESHOLD_EXTRA_RATIO = 2;
 
     // Cached values of fields updated via updateDeviceConfigFlags()
     private boolean mIsAbnormalConnectionBugreportEnabled;
@@ -122,8 +127,11 @@
     private Set<String> mRandomizationFlakySsidHotlist;
     private Set<String> mAggressiveMacRandomizationSsidAllowlist;
     private Set<String> mAggressiveMacRandomizationSsidBlocklist;
-    private boolean mIsAbnormalEapAuthFailureBugreportEnabled;
+    private boolean mIsAbnormalConnectionFailureBugreportEnabled;
+    private boolean mIsAbnormalDisconnectionBugreportEnabled;
     private int mHealthMonitorMinNumConnectionAttempt;
+    private int mBugReportMinWindowMs;
+    private int mBugReportThresholdExtraRatio;
 
     public DeviceConfigFacade(Context context, Handler handler, WifiMetrics wifiMetrics) {
         mContext = context;
@@ -224,11 +232,19 @@
         mAggressiveMacRandomizationSsidBlocklist =
                 getUnmodifiableSetQuoted("aggressive_randomization_ssid_blocklist");
 
-        mIsAbnormalEapAuthFailureBugreportEnabled = DeviceConfig.getBoolean(NAMESPACE,
-                "abnormal_eap_auth_failure_bugreport_enabled", false);
+        mIsAbnormalConnectionFailureBugreportEnabled = DeviceConfig.getBoolean(NAMESPACE,
+                "abnormal_connection_failure_bugreport_enabled", false);
+        mIsAbnormalDisconnectionBugreportEnabled = DeviceConfig.getBoolean(NAMESPACE,
+                "abnormal_disconnection_bugreport_enabled", false);
         mHealthMonitorMinNumConnectionAttempt = DeviceConfig.getInt(NAMESPACE,
                 "health_monitor_min_num_connection_attempt",
                 DEFAULT_HEALTH_MONITOR_MIN_NUM_CONNECTION_ATTEMPT);
+        mBugReportMinWindowMs = DeviceConfig.getInt(NAMESPACE,
+                "bug_report_min_window_ms",
+                DEFAULT_BUG_REPORT_MIN_WINDOW_MS);
+        mBugReportThresholdExtraRatio = DeviceConfig.getInt(NAMESPACE,
+                "report_bug_report_threshold_extra_ratio",
+                DEFAULT_BUG_REPORT_THRESHOLD_EXTRA_RATIO);
     }
 
     private Set<String> getUnmodifiableSetQuoted(String key) {
@@ -458,12 +474,18 @@
     public Set<String> getAggressiveMacRandomizationSsidBlocklist() {
         return mAggressiveMacRandomizationSsidBlocklist;
     }
+    /**
+     * Gets the feature flag for reporting abnormal connection failure.
+     */
+    public boolean isAbnormalConnectionFailureBugreportEnabled() {
+        return mIsAbnormalConnectionFailureBugreportEnabled;
+    }
 
     /**
-     * Gets the feature flag for reporting abnormal EAP authentication failure.
+     * Gets the feature flag for reporting abnormal disconnection.
      */
-    public boolean isAbnormalEapAuthFailureBugreportEnabled() {
-        return mIsAbnormalEapAuthFailureBugreportEnabled;
+    public boolean isAbnormalDisconnectionBugreportEnabled() {
+        return mIsAbnormalDisconnectionBugreportEnabled;
     }
 
     /**
@@ -472,4 +494,18 @@
     public int getHealthMonitorMinNumConnectionAttempt() {
         return mHealthMonitorMinNumConnectionAttempt;
     }
+
+    /**
+     * Gets minimum wait time between two bug report captures
+     */
+    public int getBugReportMinWindowMs() {
+        return mBugReportMinWindowMs;
+    }
+
+    /**
+     * Gets the extra ratio of threshold to trigger bug report.
+     */
+    public int getBugReportThresholdExtraRatio() {
+        return mBugReportThresholdExtraRatio;
+    }
 }
diff --git a/service/java/com/android/server/wifi/DppManager.java b/service/java/com/android/server/wifi/DppManager.java
index 11572f1..02b1191 100644
--- a/service/java/com/android/server/wifi/DppManager.java
+++ b/service/java/com/android/server/wifi/DppManager.java
@@ -489,6 +489,7 @@
             // Convert from HAL codes to WifiManager/user codes
             switch (dppStatusCode) {
                 case DppSuccessCode.CONFIGURATION_SENT:
+                    mDppMetrics.updateDppR1CapableEnrolleeResponderDevices();
                     dppSuccessCode = EasyConnectStatusCallback
                             .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT;
                     break;
@@ -540,6 +541,7 @@
                     break;
 
                 case DppProgressCode.CONFIGURATION_SENT_WAITING_RESPONSE:
+                    mDppMetrics.updateDppR2CapableEnrolleeResponderDevices();
                     dppProgressCode = EasyConnectStatusCallback
                             .EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE;
                     break;
@@ -642,6 +644,7 @@
         if (isNetworkInScanCache & !channelMatch) {
             Log.d(TAG, "Update the error code to NOT_COMPATIBLE"
                     + " as enrollee didn't scan network's operating channel");
+            mDppMetrics.updateDppR2EnrolleeResponderIncompatibleConfiguration();
             return false;
         }
         return true;
diff --git a/service/java/com/android/server/wifi/DppMetrics.java b/service/java/com/android/server/wifi/DppMetrics.java
index 231e7f1..bd62313 100644
--- a/service/java/com/android/server/wifi/DppMetrics.java
+++ b/service/java/com/android/server/wifi/DppMetrics.java
@@ -18,13 +18,17 @@
 
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_BUSY;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT;
 
 import android.net.wifi.EasyConnectStatusCallback;
@@ -90,6 +94,35 @@
     }
 
     /**
+     * Update number of DPP R1 capable enrollee responder devices.
+     */
+    public void updateDppR1CapableEnrolleeResponderDevices() {
+        synchronized (mLock) {
+            mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices++;
+        }
+    }
+
+    /**
+     * Update number of DPP R2 capable enrollee responder devices.
+     */
+    public void updateDppR2CapableEnrolleeResponderDevices() {
+        synchronized (mLock) {
+            mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices++;
+        }
+    }
+
+    /**
+     * Update number of times DPP R2 compatibility check detected
+     * that enrollee responder device is incompatible with the
+     * network.
+     */
+    public void updateDppR2EnrolleeResponderIncompatibleConfiguration() {
+        synchronized (mLock) {
+            mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration++;
+        }
+    }
+
+    /**
      * Update DPP Configurator success counter
      */
     public void updateDppConfiguratorSuccess(
@@ -102,6 +135,12 @@
                             mHistogramDppConfiguratorSuccessCode.get(WifiMetricsProto.WifiDppLog
                                     .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT) + 1);
                     break;
+                case EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED:
+                    mHistogramDppConfiguratorSuccessCode.put(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED,
+                            mHistogramDppConfiguratorSuccessCode.get(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED) + 1);
+                    break;
                 default:
                     break;
             }
@@ -168,6 +207,25 @@
                             mHistogramDppFailureCode.get(WifiMetricsProto.WifiDppLog
                                     .EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK) + 1);
                     break;
+                case EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK:
+                    mHistogramDppFailureCode.put(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK,
+                            mHistogramDppFailureCode.get(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK) + 1);
+                    break;
+                case EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION:
+                    mHistogramDppFailureCode.put(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION,
+                            mHistogramDppFailureCode.get(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION) + 1);
+                    break;
+                case EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION:
+                    mHistogramDppFailureCode.put(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION,
+                            mHistogramDppFailureCode.get(WifiMetricsProto.WifiDppLog
+                                    .EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION)
+                                    + 1);
+                    break;
                 default:
                     break;
             }
@@ -199,6 +257,12 @@
                     + mWifiDppLogProto.numDppEnrolleeInitiatorRequests);
             pw.println("mWifiDppLogProto.numDppEnrolleeSuccess="
                     + mWifiDppLogProto.numDppEnrolleeSuccess);
+            pw.println("mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices="
+                    + mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices);
+            pw.println("mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices="
+                    + mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices);
+            pw.println("mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration="
+                    + mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration);
 
             if (mHistogramDppFailureCode.size() > 0) {
                 pw.println("mHistogramDppFailureCode=");
@@ -226,6 +290,9 @@
             mWifiDppLogProto.numDppConfiguratorInitiatorRequests = 0;
             mWifiDppLogProto.numDppEnrolleeInitiatorRequests = 0;
             mWifiDppLogProto.numDppEnrolleeSuccess = 0;
+            mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices = 0;
+            mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices = 0;
+            mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration = 0;
             mHistogramDppFailureCode.clear();
             mHistogramDppOperationTime.clear();
             mHistogramDppConfiguratorSuccessCode.clear();
@@ -276,6 +343,12 @@
                     mWifiDppLogProto.numDppConfiguratorInitiatorRequests;
             log.numDppEnrolleeInitiatorRequests = mWifiDppLogProto.numDppEnrolleeInitiatorRequests;
             log.numDppEnrolleeSuccess = mWifiDppLogProto.numDppEnrolleeSuccess;
+            log.numDppR1CapableEnrolleeResponderDevices =
+                    mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices;
+            log.numDppR2CapableEnrolleeResponderDevices =
+                    mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices;
+            log.numDppR2EnrolleeResponderIncompatibleConfiguration =
+                    mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration;
             log.dppFailureCode = consolidateDppFailure(mHistogramDppFailureCode);
             log.dppConfiguratorSuccessCode =
                     consolidateDppSuccess(mHistogramDppConfiguratorSuccessCode);
diff --git a/service/java/com/android/server/wifi/EapFailureNotifier.java b/service/java/com/android/server/wifi/EapFailureNotifier.java
index 1613bbf..fe4cfbd 100644
--- a/service/java/com/android/server/wifi/EapFailureNotifier.java
+++ b/service/java/com/android/server/wifi/EapFailureNotifier.java
@@ -32,7 +32,6 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.server.wifi.util.TelephonyUtil;
 
 /**
  * This class may be used to launch notifications when EAP failure occurs.
@@ -42,20 +41,20 @@
     private static final String ERROR_MESSAGE_OVERLAY_PREFIX = "wifi_eap_error_message_code_";
 
     private static final long CANCEL_TIMEOUT_MILLISECONDS = 5 * 60 * 1000;
-    private final Context mContext;
+    private final WifiContext mContext;
     private final NotificationManager mNotificationManager;
     private final FrameworkFacade mFrameworkFacade;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     // Unique ID associated with the notification.
     public static final int NOTIFICATION_ID = SystemMessage.NOTE_WIFI_EAP_FAILURE;
     private String mCurrentShownSsid;
 
-    public EapFailureNotifier(Context context, FrameworkFacade frameworkFacade,
-            TelephonyUtil telephonyUtil) {
+    public EapFailureNotifier(WifiContext context, FrameworkFacade frameworkFacade,
+            WifiCarrierInfoManager wifiCarrierInfoManager) {
         mContext = context;
         mFrameworkFacade = frameworkFacade;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         mNotificationManager =
                 mContext.getSystemService(NotificationManager.class);
     }
@@ -74,10 +73,10 @@
             }
         }
         Resources res = getResourcesForSubId(mContext,
-                mTelephonyUtil.getBestMatchSubscriptionId(config));
+                mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
         if (res == null) return;
         int resourceId = res.getIdentifier(ERROR_MESSAGE_OVERLAY_PREFIX + errorCode,
-                "string", WifiContext.WIFI_OVERLAY_APK_PKG_NAME);
+                "string", mContext.getWifiOverlayApkPkgName());
 
         if (resourceId == 0) return;
         String errorMessage = res.getString(resourceId, config.SSID);
@@ -96,7 +95,7 @@
                 WifiService.NOTIFICATION_NETWORK_ALERTS)
                 .setAutoCancel(true)
                 .setTimeoutAfter(CANCEL_TIMEOUT_MILLISECONDS)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
                 .setContentTitle(mContext.getString(
                         com.android.wifi.resources.R.string.wifi_available_title_failed_to_connect))
@@ -114,11 +113,11 @@
      *  Returns the resources from the given context for the MCC/MNC
      *  associated with the subscription.
      */
-    private Resources getResourcesForSubId(Context context, int subId) {
+    private Resources getResourcesForSubId(WifiContext context, int subId) {
         Context resourceContext = null;
         try {
             resourceContext = context.createPackageContext(
-                    WifiContext.WIFI_OVERLAY_APK_PKG_NAME, 0);
+                    context.getWifiOverlayApkPkgName(), 0);
         } catch (PackageManager.NameNotFoundException ex) {
             return null;
         }
diff --git a/service/java/com/android/server/wifi/HalDeviceManager.java b/service/java/com/android/server/wifi/HalDeviceManager.java
index d75f489..d85c489 100644
--- a/service/java/com/android/server/wifi/HalDeviceManager.java
+++ b/service/java/com/android/server/wifi/HalDeviceManager.java
@@ -217,10 +217,6 @@
      * Create a STA interface if possible. Changes chip mode and removes conflicting interfaces if
      * needed and permitted by priority.
      *
-     * @param lowPrioritySta Indicates whether the requested STA is a low priority STA. The priority
-     *                       and preemption rules for low priority STA are:
-     *                       - Do not destroy any interface for it (even another low priority STA)
-     *                       - Destroy it for any other request
      * @param destroyedListener Optional (nullable) listener to call when the allocated interface
      *                          is removed. Will only be registered and used if an interface is
      *                          created successfully.
@@ -229,10 +225,9 @@
      *                iface destruction.
      * @return A newly created interface - or null if the interface could not be created.
      */
-    public IWifiStaIface createStaIface(boolean lowPrioritySta,
+    public IWifiStaIface createStaIface(
             @Nullable InterfaceDestroyedListener destroyedListener, @Nullable Handler handler) {
-        return (IWifiStaIface) createIface(IfaceType.STA, lowPrioritySta, destroyedListener,
-                handler);
+        return (IWifiStaIface) createIface(IfaceType.STA, destroyedListener, handler);
     }
 
     /**
@@ -240,7 +235,7 @@
      */
     public IWifiApIface createApIface(@Nullable InterfaceDestroyedListener destroyedListener,
             @Nullable Handler handler) {
-        return (IWifiApIface) createIface(IfaceType.AP, false, destroyedListener, handler);
+        return (IWifiApIface) createIface(IfaceType.AP, destroyedListener, handler);
     }
 
     /**
@@ -248,7 +243,7 @@
      */
     public IWifiP2pIface createP2pIface(@Nullable InterfaceDestroyedListener destroyedListener,
             @Nullable Handler handler) {
-        return (IWifiP2pIface) createIface(IfaceType.P2P, false, destroyedListener, handler);
+        return (IWifiP2pIface) createIface(IfaceType.P2P, destroyedListener, handler);
     }
 
     /**
@@ -256,7 +251,7 @@
      */
     public IWifiNanIface createNanIface(@Nullable InterfaceDestroyedListener destroyedListener,
             @Nullable Handler handler) {
-        return (IWifiNanIface) createIface(IfaceType.NAN, false, destroyedListener, handler);
+        return (IWifiNanIface) createIface(IfaceType.NAN, destroyedListener, handler);
     }
 
     /**
@@ -517,6 +512,29 @@
         void onRttControllerDestroyed();
     }
 
+    /**
+     * Returns whether the provided Iface combo can be supported by the device.
+     * Note: This only returns an answer based on the iface combination exposed by the HAL.
+     * The actual iface creation/deletion rules depend on the iface priorities set in
+     * {@link #allowedToDeleteIfaceTypeForRequestedType(int, int, WifiIfaceInfo[][], int)}
+     *
+     * @param ifaceCombo SparseArray keyed in by the iface type to number of ifaces needed.
+     * @return true if the device supports the provided combo, false otherwise.
+     */
+    public boolean canSupportIfaceCombo(SparseArray<Integer> ifaceCombo) {
+        if (VDBG) Log.d(TAG, "canSupportIfaceCombo: ifaceCombo=" + ifaceCombo);
+
+        synchronized (mLock) {
+            int[] ifaceComboArr = new int[IFACE_TYPES_BY_PRIORITY.length];
+            for (int type : IFACE_TYPES_BY_PRIORITY) {
+                ifaceComboArr[type] = ifaceCombo.get(type, 0);
+            }
+            WifiChipInfo[] chipInfos = getAllChipInfo();
+            if (chipInfos == null) return false;
+            return isItPossibleToCreateIfaceCombo(chipInfos, ifaceComboArr);
+        }
+    }
+
     // internal state
 
     /* This "PRIORITY" is not for deciding interface elimination (that is controlled by
@@ -548,6 +566,7 @@
      */
     private final Map<Pair<String, Integer>, InterfaceCacheEntry> mInterfaceInfoCache =
             new HashMap<>();
+    private WifiChipInfo[] mDebugChipsInfo = null;
 
     private class InterfaceCacheEntry {
         public IWifiChip chip;
@@ -556,15 +575,13 @@
         public int type;
         public Set<InterfaceDestroyedListenerProxy> destroyedListeners = new HashSet<>();
         public long creationTime;
-        public boolean isLowPriority;
 
         @Override
         public String toString() {
             StringBuilder sb = new StringBuilder();
             sb.append("{name=").append(name).append(", type=").append(type)
                     .append(", destroyedListeners.size()=").append(destroyedListeners.size())
-                    .append(", creationTime=").append(creationTime).append(
-                    ", isLowPriority=").append(isLowPriority).append("}");
+                    .append(", creationTime=").append(creationTime).append("}");
             return sb.toString();
         }
     }
@@ -1132,6 +1149,7 @@
                     chipInfo.ifaces[IfaceType.NAN] = nanIfaces;
                 }
 
+                if (mDebugChipsInfo == null) mDebugChipsInfo = chipsInfo;
                 return chipsInfo;
             } catch (RemoteException e) {
                 Log.e(TAG, "getAllChipInfoAndValidateCache exception: " + e);
@@ -1377,10 +1395,10 @@
         return results;
     }
 
-    private IWifiIface createIface(int ifaceType, boolean lowPriority,
-            InterfaceDestroyedListener destroyedListener, Handler handler) {
+    private IWifiIface createIface(int ifaceType, InterfaceDestroyedListener destroyedListener,
+            Handler handler) {
         if (mDbg) {
-            Log.d(TAG, "createIface: ifaceType=" + ifaceType + ", lowPriority=" + lowPriority);
+            Log.d(TAG, "createIface: ifaceType=" + ifaceType);
         }
 
         synchronized (mLock) {
@@ -1397,8 +1415,8 @@
                 return null;
             }
 
-            IWifiIface iface = createIfaceIfPossible(chipInfos, ifaceType, lowPriority,
-                    destroyedListener, handler);
+            IWifiIface iface = createIfaceIfPossible(chipInfos, ifaceType, destroyedListener,
+                    handler);
             if (iface != null) { // means that some configuration has changed
                 if (!dispatchAvailableForRequestListeners()) {
                     return null; // catastrophic failure - shut down
@@ -1410,10 +1428,10 @@
     }
 
     private IWifiIface createIfaceIfPossible(WifiChipInfo[] chipInfos, int ifaceType,
-            boolean lowPriority, InterfaceDestroyedListener destroyedListener, Handler handler) {
+            InterfaceDestroyedListener destroyedListener, Handler handler) {
         if (VDBG) {
             Log.d(TAG, "createIfaceIfPossible: chipInfos=" + Arrays.deepToString(chipInfos)
-                    + ", ifaceType=" + ifaceType + ", lowPriority=" + lowPriority);
+                    + ", ifaceType=" + ifaceType);
         }
         synchronized (mLock) {
             IfaceCreationData bestIfaceCreationProposal = null;
@@ -1429,7 +1447,7 @@
 
                         for (int[] expandedIfaceCombo: expandedIfaceCombos) {
                             IfaceCreationData currentProposal = canIfaceComboSupportRequest(
-                                    chipInfo, chipMode, expandedIfaceCombo, ifaceType, lowPriority);
+                                    chipInfo, chipMode, expandedIfaceCombo, ifaceType);
                             if (compareIfaceCreationData(currentProposal,
                                     bestIfaceCreationProposal)) {
                                 if (VDBG) Log.d(TAG, "new proposal accepted");
@@ -1455,7 +1473,6 @@
                                         cacheEntry.name, destroyedListener, handler));
                     }
                     cacheEntry.creationTime = mClock.getUptimeSinceBootMillis();
-                    cacheEntry.isLowPriority = lowPriority;
 
                     if (mDbg) Log.d(TAG, "createIfaceIfPossible: added cacheEntry=" + cacheEntry);
                     mInterfaceInfoCache.put(
@@ -1488,7 +1505,7 @@
 
                     for (int[] expandedIfaceCombo: expandedIfaceCombos) {
                         if (canIfaceComboSupportRequest(chipInfo, chipMode, expandedIfaceCombo,
-                                ifaceType, false) != null) {
+                                ifaceType) != null) {
                             return true;
                         }
                     }
@@ -1557,15 +1574,12 @@
      *
      * Response determined based on:
      * - Mode configuration: i.e. could the mode support the interface type in principle
-     * - Priority information: i.e. are we 'allowed' to remove interfaces in order to create the
-     *   requested interface
      */
     private IfaceCreationData canIfaceComboSupportRequest(WifiChipInfo chipInfo,
-            IWifiChip.ChipMode chipMode, int[] chipIfaceCombo, int ifaceType, boolean lowPriority) {
+            IWifiChip.ChipMode chipMode, int[] chipIfaceCombo, int ifaceType) {
         if (VDBG) {
             Log.d(TAG, "canIfaceComboSupportRequest: chipInfo=" + chipInfo + ", chipMode="
-                    + chipMode + ", chipIfaceCombo=" + chipIfaceCombo + ", ifaceType=" + ifaceType
-                    + ", lowPriority=" + lowPriority);
+                    + chipMode + ", chipIfaceCombo=" + chipIfaceCombo + ", ifaceType=" + ifaceType);
         }
 
         // short-circuit: does the chipIfaceCombo even support the requested type?
@@ -1582,13 +1596,6 @@
         if (isChipModeChangeProposed) {
             for (int type: IFACE_TYPES_BY_PRIORITY) {
                 if (chipInfo.ifaces[type].length != 0) {
-                    if (lowPriority) {
-                        if (VDBG) {
-                            Log.d(TAG, "Couldn't delete existing type " + type
-                                    + " interfaces for a low priority request");
-                        }
-                        return null;
-                    }
                     if (!allowedToDeleteIfaceTypeForRequestedType(type, ifaceType,
                             chipInfo.ifaces, chipInfo.ifaces[type].length)) {
                         if (VDBG) {
@@ -1620,14 +1627,6 @@
             }
 
             if (tooManyInterfaces > 0) { // may need to delete some
-                if (lowPriority) {
-                    if (VDBG) {
-                        Log.d(TAG, "Couldn't delete existing type " + type
-                                + " interfaces for a low priority request");
-                    }
-                    return null;
-                }
-
                 if (!allowedToDeleteIfaceTypeForRequestedType(type, ifaceType, chipInfo.ifaces,
                         tooManyInterfaces)) {
                     if (VDBG) {
@@ -1724,19 +1723,6 @@
      */
     private boolean allowedToDeleteIfaceTypeForRequestedType(int existingIfaceType,
             int requestedIfaceType, WifiIfaceInfo[][] currentIfaces, int numNecessaryInterfaces) {
-        // rule 0: check for any low priority interfaces
-        int numAvailableLowPriorityInterfaces = 0;
-        synchronized (mLock) {
-            for (InterfaceCacheEntry entry : mInterfaceInfoCache.values()) {
-                if (entry.type == existingIfaceType && entry.isLowPriority) {
-                    numAvailableLowPriorityInterfaces++;
-                }
-            }
-        }
-        if (numAvailableLowPriorityInterfaces >= numNecessaryInterfaces) {
-            return true;
-        }
-
         // rule 1
         if (existingIfaceType == requestedIfaceType) {
             return false;
@@ -1782,7 +1768,6 @@
         }
 
         boolean lookupError = false;
-        LongSparseArray<WifiIfaceInfo> orderedListLowPriority = new LongSparseArray<>();
         LongSparseArray<WifiIfaceInfo> orderedList = new LongSparseArray<>();
         for (WifiIfaceInfo info : interfaces) {
             InterfaceCacheEntry cacheEntry;
@@ -1795,11 +1780,7 @@
                 lookupError = true;
                 break;
             }
-            if (cacheEntry.isLowPriority) {
-                orderedListLowPriority.append(cacheEntry.creationTime, info);
-            } else {
-                orderedList.append(cacheEntry.creationTime, info);
-            }
+            orderedList.append(cacheEntry.creationTime, info);
         }
 
         if (lookupError) {
@@ -1808,19 +1789,60 @@
         } else {
             List<WifiIfaceInfo> result = new ArrayList<>(excessInterfaces);
             for (int i = 0; i < excessInterfaces; ++i) {
-                int lowPriorityNextIndex = orderedListLowPriority.size() - i - 1;
-                if (lowPriorityNextIndex >= 0) {
-                    result.add(orderedListLowPriority.valueAt(lowPriorityNextIndex));
-                } else {
-                    result.add(orderedList.valueAt(
-                            orderedList.size() - i + orderedListLowPriority.size() - 1));
-                }
+                result.add(orderedList.valueAt(orderedList.size() - i - 1));
             }
             return result;
         }
     }
 
     /**
+     * Checks whether the input chip-iface-combo can support the requested interface type.
+     */
+    private boolean canIfaceComboSupportRequestedIfaceCombo(
+            int[] chipIfaceCombo, int[] requestedIfaceCombo) {
+        if (VDBG) {
+            Log.d(TAG, "canIfaceComboSupportRequest: chipIfaceCombo=" + chipIfaceCombo
+                    + ", requestedIfaceCombo=" + requestedIfaceCombo);
+        }
+        for (int ifaceType : IFACE_TYPES_BY_PRIORITY) {
+            if (chipIfaceCombo[ifaceType] < requestedIfaceCombo[ifaceType]) {
+                if (VDBG) Log.d(TAG, "Requested type not supported by combo");
+                return false;
+            }
+        }
+        return true;
+    }
+
+    // Is it possible to create iface combo just looking at the device capabilities.
+    private boolean isItPossibleToCreateIfaceCombo(WifiChipInfo[] chipInfos, int[] ifaceCombo) {
+        if (VDBG) {
+            Log.d(TAG, "isItPossibleToCreateIfaceCombo: chipInfos=" + Arrays.deepToString(chipInfos)
+                    + ", ifaceType=" + ifaceCombo);
+        }
+
+        for (WifiChipInfo chipInfo: chipInfos) {
+            for (IWifiChip.ChipMode chipMode: chipInfo.availableModes) {
+                for (IWifiChip.ChipIfaceCombination chipIfaceCombo
+                        : chipMode.availableCombinations) {
+                    int[][] expandedIfaceCombos = expandIfaceCombos(chipIfaceCombo);
+                    if (VDBG) {
+                        Log.d(TAG, chipIfaceCombo + " expands to "
+                                + Arrays.deepToString(expandedIfaceCombos));
+                    }
+
+                    for (int[] expandedIfaceCombo: expandedIfaceCombos) {
+                        if (canIfaceComboSupportRequestedIfaceCombo(
+                                expandedIfaceCombo, ifaceCombo)) {
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
      * Performs chip reconfiguration per the input:
      * - Removes the specified interfaces
      * - Reconfigures the chip to the new chip mode (if necessary)
@@ -2003,6 +2025,7 @@
         return true;
     }
 
+
     private void dispatchAvailableForRequestListenersForType(int ifaceType,
             WifiChipInfo[] chipInfos) {
         if (VDBG) Log.d(TAG, "dispatchAvailableForRequestListenersForType: ifaceType=" + ifaceType);
@@ -2327,5 +2350,6 @@
         pw.println("  mInterfaceAvailableForRequestListeners: "
                 + mInterfaceAvailableForRequestListeners);
         pw.println("  mInterfaceInfoCache: " + mInterfaceInfoCache);
+        pw.println("  mDebugChipsInfo: " + Arrays.toString(mDebugChipsInfo));
     }
 }
diff --git a/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java b/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java
index acfba80..98664d0 100644
--- a/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java
+++ b/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java
@@ -172,8 +172,7 @@
 
     @Override
     public int getStoreFileId() {
-        // Suggestion Store.
-        return WifiConfigStore.STORE_FILE_USER_NETWORK_SUGGESTIONS;
+        // User general store.
+        return WifiConfigStore.STORE_FILE_USER_GENERAL;
     }
-
 }
diff --git a/service/java/com/android/server/wifi/NetworkSuggestionNominator.java b/service/java/com/android/server/wifi/NetworkSuggestionNominator.java
index a8d181f..fbc1f5f 100644
--- a/service/java/com/android/server/wifi/NetworkSuggestionNominator.java
+++ b/service/java/com/android/server/wifi/NetworkSuggestionNominator.java
@@ -24,7 +24,6 @@
 
 import com.android.server.wifi.WifiNetworkSuggestionsManager.ExtendedWifiNetworkSuggestion;
 import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -54,16 +53,16 @@
     private final WifiConfigManager mWifiConfigManager;
     private final PasspointNetworkNominateHelper mPasspointNetworkNominateHelper;
     private final LocalLog mLocalLog;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     NetworkSuggestionNominator(WifiNetworkSuggestionsManager networkSuggestionsManager,
             WifiConfigManager wifiConfigManager, PasspointNetworkNominateHelper nominateHelper,
-            LocalLog localLog, TelephonyUtil telephonyUtil) {
+            LocalLog localLog, WifiCarrierInfoManager wifiCarrierInfoManager) {
         mWifiNetworkSuggestionsManager = networkSuggestionsManager;
         mWifiConfigManager = wifiConfigManager;
         mPasspointNetworkNominateHelper = nominateHelper;
         mLocalLog = localLog;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
     }
 
     @Override
@@ -111,7 +110,7 @@
             }
 
             if (WifiConfiguration.isMetered(config, null)
-                    && mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config)) {
+                    && mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config)) {
                 continue;
             }
             if (!isSimBasedNetworkAvailableToAutoConnect(config)) {
@@ -152,7 +151,7 @@
                     continue;
                 }
                 if (WifiConfiguration.isMetered(config, null)
-                        && mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config)) {
+                        && mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config)) {
                     continue;
                 }
                 if (!ewns.isAutojoinEnabled
@@ -196,19 +195,6 @@
                 if (matchingExtNetworkSuggestionsFromSamePackage.isEmpty()) {
                     continue;
                 }
-                ExtendedWifiNetworkSuggestion matchingExtNetworkSuggestion =
-                        matchingExtNetworkSuggestionsFromSamePackage.stream().findFirst().get();
-                // Update the WifiConfigManager with the latest WifiConfig
-                WifiConfiguration config =
-                        matchingExtNetworkSuggestion.createInternalWifiConfiguration();
-                NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(
-                        config,
-                        matchingExtNetworkSuggestion.perAppInfo.uid,
-                        matchingExtNetworkSuggestion.perAppInfo.packageName);
-                if (result.isSuccess()) {
-                    wCmConfiguredNetwork = mWifiConfigManager.getConfiguredNetwork(
-                            result.getNetworkId());
-                }
                 // If the network is currently blacklisted, ignore.
                 if (!wCmConfiguredNetwork.getNetworkSelectionStatus().isNetworkEnabled()
                         && !mWifiConfigManager.tryEnableNetwork(wCmConfiguredNetwork.networkId)) {
@@ -227,13 +213,13 @@
                 || !config.enterpriseConfig.isAuthenticationSimBased()) {
             return true;
         }
-        int subId = mTelephonyUtil.getBestMatchSubscriptionId(config);
-        if (!mTelephonyUtil.isSimPresent(subId)) {
+        int subId = mWifiCarrierInfoManager.getBestMatchSubscriptionId(config);
+        if (!mWifiCarrierInfoManager.isSimPresent(subId)) {
             mLocalLog.log("SIM is not present for subId: " + subId);
             return false;
         }
-        if (mTelephonyUtil.requiresImsiEncryption(subId)) {
-            return mTelephonyUtil.isImsiEncryptionInfoAvailable(subId);
+        if (mWifiCarrierInfoManager.requiresImsiEncryption(subId)) {
+            return mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(subId);
         }
         return true;
     }
diff --git a/service/java/com/android/server/wifi/SavedNetworkNominator.java b/service/java/com/android/server/wifi/SavedNetworkNominator.java
index dd4d45f..cbc2c32 100644
--- a/service/java/com/android/server/wifi/SavedNetworkNominator.java
+++ b/service/java/com/android/server/wifi/SavedNetworkNominator.java
@@ -23,7 +23,6 @@
 import android.util.Pair;
 
 import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import java.util.List;
 
@@ -35,16 +34,16 @@
     private static final String NAME = "SavedNetworkNominator";
     private final WifiConfigManager mWifiConfigManager;
     private final LocalLog mLocalLog;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
     private final PasspointNetworkNominateHelper mPasspointNetworkNominateHelper;
 
     SavedNetworkNominator(WifiConfigManager configManager,
             PasspointNetworkNominateHelper nominateHelper,
-            LocalLog localLog, TelephonyUtil telephonyUtil) {
+            LocalLog localLog, WifiCarrierInfoManager wifiCarrierInfoManager) {
         mWifiConfigManager = configManager;
         mPasspointNetworkNominateHelper = nominateHelper;
         mLocalLog = localLog;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
     }
 
     private void localLog(String log) {
@@ -138,8 +137,8 @@
                 continue;
             } else if (network.enterpriseConfig != null
                     && network.enterpriseConfig.isAuthenticationSimBased()) {
-                int subId = mTelephonyUtil.getBestMatchSubscriptionId(network);
-                if (!mTelephonyUtil.isSimPresent(subId)) {
+                int subId = mWifiCarrierInfoManager.getBestMatchSubscriptionId(network);
+                if (!mWifiCarrierInfoManager.isSimPresent(subId)) {
                     // Don't select if security type is EAP SIM/AKA/AKA' when SIM is not present.
                     localLog("No SIM card is good for Network "
                             + WifiNetworkSelector.toNetworkString(network));
@@ -147,7 +146,7 @@
                 }
                 // Ignore metered network with non-data Sim, ignore.
                 if (WifiConfiguration.isMetered(network, null)
-                        && mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(network)) {
+                        && mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(network)) {
                     continue;
                 }
             }
@@ -173,7 +172,7 @@
             WifiConfiguration config = candidate.second;
             // Ignore metered network with non-data Sim, ignore.
             if (WifiConfiguration.isMetered(config, null)
-                    && mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config)) {
+                    && mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config)) {
                 continue;
             }
             onConnectableListener.onConnectable(candidate.first, config);
diff --git a/service/java/com/android/server/wifi/SimRequiredNotifier.java b/service/java/com/android/server/wifi/SimRequiredNotifier.java
index 19e369d..8e3d22d 100644
--- a/service/java/com/android/server/wifi/SimRequiredNotifier.java
+++ b/service/java/com/android/server/wifi/SimRequiredNotifier.java
@@ -19,7 +19,6 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Icon;
 import android.net.wifi.WifiConfiguration;
@@ -33,11 +32,11 @@
  */
 public class SimRequiredNotifier {
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final FrameworkFacade mFrameworkFacade;
     private final NotificationManager mNotificationManager;
 
-    public SimRequiredNotifier(Context context, FrameworkFacade framework) {
+    public SimRequiredNotifier(WifiContext context, FrameworkFacade framework) {
         mContext = context;
         mFrameworkFacade = framework;
         mNotificationManager =
@@ -84,7 +83,7 @@
                 .setTicker(title)
                 .setContentText(message)
                 .setStyle(new Notification.BigTextStyle().bigText(message))
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         R.drawable.stat_notify_wifi_in_range))
                 .setContentIntent(launchWirelessSettings())
                 .build();
diff --git a/service/java/com/android/server/wifi/SoftApManager.java b/service/java/com/android/server/wifi/SoftApManager.java
index 42a228e..44bbc73 100644
--- a/service/java/com/android/server/wifi/SoftApManager.java
+++ b/service/java/com/android/server/wifi/SoftApManager.java
@@ -22,7 +22,6 @@
 import static com.android.server.wifi.util.ApConfigUtil.SUCCESS;
 
 import android.annotation.NonNull;
-import android.content.Context;
 import android.content.Intent;
 import android.net.MacAddress;
 import android.net.wifi.ScanResult;
@@ -74,7 +73,7 @@
     public static final String SOFT_AP_SEND_MESSAGE_TIMEOUT_TAG = TAG
             + " Soft AP Send Message Timeout";
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final FrameworkFacade mFrameworkFacade;
     private final WifiNative mWifiNative;
 
@@ -158,7 +157,7 @@
         }
     };
 
-    public SoftApManager(@NonNull Context context,
+    public SoftApManager(@NonNull WifiContext context,
                          @NonNull Looper looper,
                          @NonNull FrameworkFacade framework,
                          @NonNull WifiNative wifiNative,
diff --git a/service/java/com/android/server/wifi/SoftApNotifier.java b/service/java/com/android/server/wifi/SoftApNotifier.java
index 741cab8..45114a5 100644
--- a/service/java/com/android/server/wifi/SoftApNotifier.java
+++ b/service/java/com/android/server/wifi/SoftApNotifier.java
@@ -19,7 +19,6 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Icon;
 
@@ -41,11 +40,11 @@
     public static final int NOTIFICATION_ID_SOFTAP_AUTO_DISABLED =
             SystemMessage.NOTE_SOFTAP_AUTO_DISABLED;
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final FrameworkFacade mFrameworkFacade;
     private final NotificationManager mNotificationManager;
 
-    public SoftApNotifier(Context context, FrameworkFacade framework) {
+    public SoftApNotifier(WifiContext context, FrameworkFacade framework) {
         mContext = context;
         mFrameworkFacade = framework;
         mNotificationManager =
@@ -76,7 +75,7 @@
 
         return mFrameworkFacade.makeNotificationBuilder(mContext,
                 WifiService.NOTIFICATION_NETWORK_STATUS)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         R.drawable.ic_wifi_settings))
                 .setContentTitle(title)
                 .setContentText(contentSummary)
diff --git a/service/java/com/android/server/wifi/WakeupNotificationFactory.java b/service/java/com/android/server/wifi/WakeupNotificationFactory.java
index 11713ba..9eb69b7 100644
--- a/service/java/com/android/server/wifi/WakeupNotificationFactory.java
+++ b/service/java/com/android/server/wifi/WakeupNotificationFactory.java
@@ -18,7 +18,6 @@
 
 import android.app.Notification;
 import android.app.PendingIntent;
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Icon;
 
@@ -41,11 +40,11 @@
     /** Notification channel ID for onboarding messages. */
     public static final int ONBOARD_ID = SystemMessage.NOTE_WIFI_WAKE_ONBOARD;
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final WifiInjector mWifiInjector;
     private final FrameworkFacade mFrameworkFacade;
 
-    WakeupNotificationFactory(Context context, WifiInjector wifiInjector,
+    WakeupNotificationFactory(WifiContext context, WifiInjector wifiInjector,
                               FrameworkFacade frameworkFacade) {
         mContext = context;
         mWifiInjector = wifiInjector;
@@ -68,7 +67,7 @@
 
         return mFrameworkFacade.makeNotificationBuilder(mContext,
                 WifiService.NOTIFICATION_NETWORK_STATUS)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         R.drawable.ic_wifi_settings))
                 .setTicker(title)
                 .setContentTitle(title)
diff --git a/service/java/com/android/server/wifi/WifiApConfigStore.java b/service/java/com/android/server/wifi/WifiApConfigStore.java
index 972cd52..4921f8c 100644
--- a/service/java/com/android/server/wifi/WifiApConfigStore.java
+++ b/service/java/com/android/server/wifi/WifiApConfigStore.java
@@ -36,7 +36,6 @@
 import java.util.Random;
 
 import javax.annotation.Nullable;
-import javax.crypto.Mac;
 
 /**
  * Provides API for reading/writing soft access point configuration.
@@ -68,7 +67,6 @@
     private final WifiMetrics mWifiMetrics;
     private final BackupManagerProxy mBackupManagerProxy;
     private final MacAddressUtil mMacAddressUtil;
-    private final Mac mMac;
     private final WifiConfigManager mWifiConfigManager;
     private final ActiveModeWarden mActiveModeWarden;
     private boolean mHasNewDataToSerialize = false;
@@ -118,11 +116,6 @@
         IntentFilter filter = new IntentFilter();
         filter.addAction(ACTION_HOTSPOT_CONFIG_USER_TAPPED_CONTENT);
         mMacAddressUtil = wifiInjector.getMacAddressUtil();
-        mMac = mMacAddressUtil.obtainMacRandHashFunctionForSap(Process.WIFI_UID);
-        if (mMac == null) {
-            Log.wtf(TAG, "Failed to obtain secret for SAP MAC randomization."
-                    + " All randomized MAC addresses are lost!");
-        }
     }
 
     /**
@@ -290,7 +283,8 @@
         SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder(config);
         if (config.getBssid() == null && context.getResources().getBoolean(
                 R.bool.config_wifi_ap_mac_randomization_supported)) {
-            MacAddress macAddress = mMacAddressUtil.calculatePersistentMac(config.getSsid(), mMac);
+            MacAddress macAddress = mMacAddressUtil.calculatePersistentMac(config.getSsid(),
+                    mMacAddressUtil.obtainMacRandHashFunctionForSap(Process.WIFI_UID));
             if (macAddress == null) {
                 Log.e(TAG, "Failed to calculate MAC from SSID. "
                         + "Generating new random MAC instead.");
diff --git a/service/java/com/android/server/wifi/WifiBackupDataParser.java b/service/java/com/android/server/wifi/WifiBackupDataParser.java
index 7699c55..e61cab2 100644
--- a/service/java/com/android/server/wifi/WifiBackupDataParser.java
+++ b/service/java/com/android/server/wifi/WifiBackupDataParser.java
@@ -42,4 +42,11 @@
      */
     List<WifiConfiguration> parseNetworkConfigurationsFromXml(XmlPullParser in, int outerTagDepth,
             int minorVersion) throws XmlPullParserException, IOException;
+
+    /**
+     * Get the highest supported minor version for this major version.
+     * This is used for generating the version code when serializing the data.
+     * @return Indicating the max supported minor version by this major version parser.
+     */
+    int getHighestSupportedMinorVersion();
 }
diff --git a/service/java/com/android/server/wifi/WifiBackupDataV1Parser.java b/service/java/com/android/server/wifi/WifiBackupDataV1Parser.java
index b787df2..89ab9a9 100644
--- a/service/java/com/android/server/wifi/WifiBackupDataV1Parser.java
+++ b/service/java/com/android/server/wifi/WifiBackupDataV1Parser.java
@@ -141,6 +141,7 @@
                 IpConfigurationXmlUtil.XML_TAG_PROXY_PAC_FILE,
             }));
 
+    @Override
     public List<WifiConfiguration> parseNetworkConfigurationsFromXml(XmlPullParser in,
             int outerTagDepth, int minorVersion) throws XmlPullParserException, IOException {
         // clamp down the minorVersion to the highest one that this parser version supports
@@ -165,6 +166,11 @@
         return configurations;
     }
 
+    @Override
+    public int getHighestSupportedMinorVersion() {
+        return HIGHEST_SUPPORTED_MINOR_VERSION;
+    }
+
     /**
      * Parses the configuration data elements from the provided XML stream to a Configuration.
      *
@@ -350,6 +356,9 @@
                 case WifiConfigurationXmlUtil.XML_TAG_METERED_OVERRIDE:
                     configuration.meteredOverride = (int) value;
                     break;
+                case WifiConfigurationXmlUtil.XML_TAG_IS_AUTO_JOIN:
+                    configuration.allowAutojoin = (boolean) value;
+                    break;
                 default:
                     // should never happen, since other tags are filtered out earlier
                     throw new XmlPullParserException(
diff --git a/service/java/com/android/server/wifi/WifiBackupRestore.java b/service/java/com/android/server/wifi/WifiBackupRestore.java
index 078cb77..c55236e 100644
--- a/service/java/com/android/server/wifi/WifiBackupRestore.java
+++ b/service/java/com/android/server/wifi/WifiBackupRestore.java
@@ -81,7 +81,7 @@
      * Note that bumping up only the minor version will still allow restoring the backup set to
      * lower versions of SDK_INT.
      */
-    private static final float CURRENT_BACKUP_DATA_VERSION = 1.1f;
+    private static final int CURRENT_BACKUP_DATA_MAJOR_VERSION = 1;
 
     /** This list of older versions will be used to restore data from older backups. */
     /**
@@ -128,12 +128,36 @@
     private byte[] mDebugLastBackupDataRetrieved;
     private byte[] mDebugLastBackupDataRestored;
     private byte[] mDebugLastSupplicantBackupDataRestored;
+    private byte[] mDebugLastIpConfigBackupDataRestored;
 
     public WifiBackupRestore(WifiPermissionsUtil wifiPermissionsUtil) {
         mWifiPermissionsUtil = wifiPermissionsUtil;
     }
 
     /**
+     * Retrieve the version for serialization.
+     */
+    private Float getVersion() {
+        WifiBackupDataParser parser =
+                getWifiBackupDataParser(CURRENT_BACKUP_DATA_MAJOR_VERSION);
+        if (parser == null) {
+            Log.e(TAG, "Major version of backup data is unknown to this Android"
+                    + " version; not backing up");
+            return null;
+        }
+        int minorVersion = parser.getHighestSupportedMinorVersion();
+        Float version;
+        try {
+            version = Float.valueOf(
+                    CURRENT_BACKUP_DATA_MAJOR_VERSION + "." + minorVersion);
+        } catch (NumberFormatException e) {
+            Log.e(TAG, "Failed to generate version", e);
+            return null;
+        }
+        return version;
+    }
+
+    /**
      * Retrieve an XML byte stream representing the data that needs to be backed up from the
      * provided configurations.
      *
@@ -154,7 +178,9 @@
             // Start writing the XML stream.
             XmlUtil.writeDocumentStart(out, XML_TAG_DOCUMENT_HEADER);
 
-            XmlUtil.writeNextValue(out, XML_TAG_VERSION, CURRENT_BACKUP_DATA_VERSION);
+            Float version = getVersion();
+            if (version == null) return null;
+            XmlUtil.writeNextValue(out, XML_TAG_VERSION, version.floatValue());
 
             writeNetworkConfigurationsToXml(out, configurations);
 
@@ -342,6 +368,7 @@
 
         if (mVerboseLoggingEnabled) {
             mDebugLastSupplicantBackupDataRestored = supplicantData;
+            mDebugLastIpConfigBackupDataRestored = ipConfigData;
         }
 
         SupplicantBackupMigration.SupplicantNetworks supplicantNetworks =
@@ -394,6 +421,7 @@
             mDebugLastBackupDataRetrieved = null;
             mDebugLastBackupDataRestored = null;
             mDebugLastSupplicantBackupDataRestored = null;
+            mDebugLastIpConfigBackupDataRestored = null;
         }
     }
 
@@ -415,10 +443,14 @@
                     + createLogFromBackupData(mDebugLastBackupDataRestored));
         }
         if (mDebugLastSupplicantBackupDataRestored != null) {
-            pw.println("Last old backup data restored: "
+            pw.println("Last old supplicant backup data restored: "
                     + SupplicantBackupMigration.createLogFromBackupData(
                             mDebugLastSupplicantBackupDataRestored));
         }
+        if (mDebugLastIpConfigBackupDataRestored != null) {
+            pw.println("Last old ipconfig backup data restored: "
+                    + mDebugLastIpConfigBackupDataRestored);
+        }
     }
 
     /**
diff --git a/service/java/com/android/server/wifi/util/TelephonyUtil.java b/service/java/com/android/server/wifi/WifiCarrierInfoManager.java
similarity index 74%
rename from service/java/com/android/server/wifi/util/TelephonyUtil.java
rename to service/java/com/android/server/wifi/WifiCarrierInfoManager.java
index 9b541db..63786f9 100644
--- a/service/java/com/android/server/wifi/util/TelephonyUtil.java
+++ b/service/java/com/android/server/wifi/WifiCarrierInfoManager.java
@@ -14,14 +14,20 @@
  * limitations under the License.
  */
 
-package com.android.server.wifi.util;
+package com.android.server.wifi;
 
 import android.annotation.NonNull;
+import android.app.AlertDialog;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.res.Resources;
 import android.database.ContentObserver;
+import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiEnterpriseConfig;
@@ -39,19 +45,21 @@
 import android.util.Log;
 import android.util.Pair;
 import android.util.SparseBooleanArray;
+import android.view.WindowManager;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.wifi.FrameworkFacade;
-import com.android.server.wifi.IMSIParameter;
-import com.android.server.wifi.WifiNative;
+import com.android.internal.messages.nano.SystemMessageProto;
+import com.android.wifi.resources.R;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.PublicKey;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.annotation.Nullable;
 import javax.crypto.BadPaddingException;
@@ -60,12 +68,12 @@
 import javax.crypto.NoSuchPaddingException;
 
 /**
- * Utilities for the Wifi Service to interact with telephony.
+ * This class provide APIs to get carrier info from telephony service.
  * TODO(b/132188983): Refactor into TelephonyFacade which owns all instances of
  *  TelephonyManager/SubscriptionManager in Wifi
  */
-public class TelephonyUtil {
-    public static final String TAG = "TelephonyUtil";
+public class WifiCarrierInfoManager {
+    public static final String TAG = "WifiCarrierInfoManager";
     public static final String DEFAULT_EAP_PREFIX = "\0";
 
     public static final int CARRIER_INVALID_TYPE = -1;
@@ -73,6 +81,24 @@
     public static final int CARRIER_MVNO_TYPE = 1; // Mobile Virtual Network Operator
     public static final String ANONYMOUS_IDENTITY = "anonymous";
     public static final String THREE_GPP_NAI_REALM_FORMAT = "wlan.mnc%s.mcc%s.3gppnetwork.org";
+    /** Intent when user tapped action button to allow the app. */
+    @VisibleForTesting
+    public static final String NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION =
+            "com.android.server.wifi.action.CarrierNetwork.USER_ALLOWED_CARRIER";
+    /** Intent when user tapped action button to disallow the app. */
+    @VisibleForTesting
+    public static final String NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION =
+            "com.android.server.wifi.action.CarrierNetwork.USER_DISALLOWED_CARRIER";
+    /** Intent when user dismissed the notification. */
+    @VisibleForTesting
+    public static final String NOTIFICATION_USER_DISMISSED_INTENT_ACTION =
+            "com.android.server.wifi.action.CarrierNetwork.USER_DISMISSED";
+    @VisibleForTesting
+    public static final String EXTRA_CARRIER_NAME =
+            "com.android.server.wifi.extra.CarrierNetwork.CARRIER_NAME";
+    @VisibleForTesting
+    public static final String EXTRA_CARRIER_ID =
+            "com.android.server.wifi.extra.CarrierNetwork.CARRIER_ID";
 
     // IMSI encryption method: RSA-OAEP with SHA-256 hash function
     private static final String IMSI_CIPHER_TRANSFORMATION =
@@ -97,27 +123,156 @@
 
     private static final Uri CONTENT_URI = Uri.parse("content://carrier_information/carrier");
 
+    private final WifiContext mContext;
+    private final Handler mHandler;
+    private final WifiInjector mWifiInjector;
+    private final Resources mResources;
     private final TelephonyManager mTelephonyManager;
     private final SubscriptionManager mSubscriptionManager;
+    private final NotificationManager mNotificationManager;
+
+    /**
+     * Intent filter for processing notification actions.
+     */
+    private final IntentFilter mIntentFilter;
+    private final FrameworkFacade mFrameworkFacade;
 
     private boolean mVerboseLogEnabled = false;
     private SparseBooleanArray mImsiEncryptionRequired = new SparseBooleanArray();
     private SparseBooleanArray mImsiEncryptionInfoAvailable = new SparseBooleanArray();
     private SparseBooleanArray mEapMethodPrefixEnable = new SparseBooleanArray();
+    private final Map<Integer, Boolean> mImsiPrivacyProtectionExemptionMap = new HashMap<>();
+    private final List<OnUserApproveCarrierListener>
+            mOnUserApproveCarrierListeners =
+            new ArrayList<>();
+
+    private boolean mUserApprovalUiActive;
+    private boolean mHasNewDataToSerialize;
 
     /**
-     * Gets the instance of TelephonyUtil.
+     * Interface for other modules to listen to the user approve IMSI protection exemption.
+     */
+    public interface OnUserApproveCarrierListener {
+
+        /**
+         * Invoke when user approve the IMSI protection exemption.
+         */
+        void onUserAllowed(int carrierId);
+    }
+
+    /**
+     * Module to interact with the wifi config store.
+     */
+    private class ImsiProtectionExemptionDataSource implements
+            ImsiPrivacyProtectionExemptionStoreData.DataSource {
+        @Override
+        public Map<Integer, Boolean> toSerialize() {
+            // Clear the flag after writing to disk.
+            // TODO(b/115504887): Don't reset the flag on write failure.
+            mHasNewDataToSerialize = false;
+            return mImsiPrivacyProtectionExemptionMap;
+        }
+
+        @Override
+        public void fromDeserialized(Map<Integer, Boolean> imsiProtectionExemptionMap) {
+            mImsiPrivacyProtectionExemptionMap.putAll(imsiProtectionExemptionMap);
+        }
+
+        @Override
+        public void reset() {
+            mImsiPrivacyProtectionExemptionMap.clear();
+        }
+
+        @Override
+        public boolean hasNewDataToSerialize() {
+            return mHasNewDataToSerialize;
+        }
+    }
+
+    private final BroadcastReceiver mBroadcastReceiver =
+            new BroadcastReceiver() {
+                @Override
+                public void onReceive(Context context, Intent intent) {
+                    String carrierName = intent.getStringExtra(EXTRA_CARRIER_NAME);
+                    int carrierId = intent.getIntExtra(EXTRA_CARRIER_ID, -1);
+                    if (carrierName == null || carrierId == -1) {
+                        Log.e(TAG, "No carrier name or carrier id found in intent");
+                        return;
+                    }
+
+                    switch (intent.getAction()) {
+                        case NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION:
+                            Log.i(TAG, "User clicked to allow carrier");
+                            sendImsiPrivacyConfirmationDialog(carrierName, carrierId);
+                            // Collapse the notification bar
+                            mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+                            break;
+                        case NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION:
+                            handleUserDisallowCarrierExemptionAction(carrierName, carrierId);
+                            break;
+                        case NOTIFICATION_USER_DISMISSED_INTENT_ACTION:
+                            handleUserDismissAction();
+                            return; // no need to cancel a dismissed notification, return.
+                        default:
+                            Log.e(TAG, "Unknown action " + intent.getAction());
+                            return;
+                    }
+                    // Clear notification once the user interacts with it.
+                    mNotificationManager.cancel(SystemMessageProto
+                            .SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
+                }
+            };
+    private void handleUserDismissAction() {
+        Log.i(TAG, "User dismissed the notification");
+        mUserApprovalUiActive = false;
+    }
+
+    private void handleUserAllowCarrierExemptionAction(String carrierName, int carrierId) {
+        Log.i(TAG, "User clicked to allow carrier:" + carrierName);
+        setHasUserApprovedImsiPrivacyExemptionForCarrier(true, carrierId);
+        mUserApprovalUiActive = false;
+    }
+
+    private void handleUserDisallowCarrierExemptionAction(String carrierName, int carrierId) {
+        Log.i(TAG, "User clicked to disallow carrier:" + carrierName);
+        setHasUserApprovedImsiPrivacyExemptionForCarrier(false, carrierId);
+        mUserApprovalUiActive = false;
+    }
+
+    /**
+     * Gets the instance of WifiCarrierInfoManager.
      * @param telephonyManager Instance of {@link TelephonyManager}
      * @param subscriptionManager Instance of {@link SubscriptionManager}
-     * @return The instance of TelephonyUtil
+     * @param WifiInjector Instance of {@link WifiInjector}
+     * @return The instance of WifiCarrierInfoManager
      */
-    public TelephonyUtil(@NonNull TelephonyManager telephonyManager,
+    public WifiCarrierInfoManager(@NonNull TelephonyManager telephonyManager,
             @NonNull SubscriptionManager subscriptionManager,
+            @NonNull WifiInjector wifiInjector,
             @NonNull FrameworkFacade frameworkFacade,
-            @NonNull Context context,
+            @NonNull WifiContext context,
+            @NonNull WifiConfigStore configStore,
             @NonNull Handler handler) {
         mTelephonyManager = telephonyManager;
+        mContext = context;
+        mResources = mContext.getResources();
+        mWifiInjector = wifiInjector;
+        mHandler = handler;
         mSubscriptionManager = subscriptionManager;
+        mFrameworkFacade = frameworkFacade;
+
+        mNotificationManager =
+                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+        // Register broadcast receiver for UI interactions.
+        mIntentFilter = new IntentFilter();
+        mIntentFilter.addAction(NOTIFICATION_USER_DISMISSED_INTENT_ACTION);
+        mIntentFilter.addAction(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION);
+        mIntentFilter.addAction(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION);
+        mUserApprovalUiActive = false;
+
+        mContext.registerReceiver(mBroadcastReceiver, mIntentFilter, null, handler);
+        configStore.registerStoreData(wifiInjector.makeImsiProtectionExemptionStoreData(
+                new ImsiProtectionExemptionDataSource()));
 
         updateImsiEncryptionInfo(context);
 
@@ -552,7 +707,7 @@
      */
     public static boolean isAnonymousAtRealmIdentity(String identity) {
         if (TextUtils.isEmpty(identity)) return false;
-        final String anonymousId = TelephonyUtil.ANONYMOUS_IDENTITY + "@";
+        final String anonymousId = WifiCarrierInfoManager.ANONYMOUS_IDENTITY + "@";
         return identity.startsWith(anonymousId)
                 || identity.substring(1).startsWith(anonymousId);
     }
@@ -1143,6 +1298,7 @@
     public int getCarrierIdForPackageWithCarrierPrivileges(String packageName) {
         List<SubscriptionInfo> subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
         if (subInfoList == null || subInfoList.isEmpty()) {
+            if (mVerboseLogEnabled) Log.v(TAG, "No subs for carrier privilege check");
             return TelephonyManager.UNKNOWN_CARRIER_ID;
         }
         for (SubscriptionInfo info : subInfoList) {
@@ -1183,4 +1339,166 @@
         int subId = getMatchingSubId(config.carrierId);
         return subId != SubscriptionManager.getDefaultDataSubscriptionId();
     }
+
+    /**
+     * Add a listener to monitor user approval IMSI protection exemption.
+     */
+    public void addImsiExemptionUserApprovalListener(
+            OnUserApproveCarrierListener listener) {
+        mOnUserApproveCarrierListeners.add(listener);
+    }
+
+    /**
+     * Clear the Imsi Privacy Exemption user approval info the target carrier.
+     */
+    public void clearImsiPrivacyExemptionForCarrier(int carrierId) {
+        mImsiPrivacyProtectionExemptionMap.remove(carrierId);
+        saveToStore();
+    }
+
+    /**
+     * Check if carrier have user approved exemption for IMSI protection
+     */
+    public boolean hasUserApprovedImsiPrivacyExemptionForCarrier(int carrierId) {
+        return  mImsiPrivacyProtectionExemptionMap.getOrDefault(carrierId, false);
+    }
+
+    /**
+     * Enable or disable exemption on IMSI protection.
+     */
+    public void setHasUserApprovedImsiPrivacyExemptionForCarrier(boolean approved, int carrierId) {
+        if (mVerboseLogEnabled) {
+            Log.v(TAG, "Setting Imsi privacy exemption for carrier " + carrierId
+                    + (approved ? " approved" : " not approved"));
+        }
+        mImsiPrivacyProtectionExemptionMap.put(carrierId, approved);
+        // If user approved the exemption restore to initial auto join configure.
+        if (approved) {
+            for (OnUserApproveCarrierListener listener : mOnUserApproveCarrierListeners) {
+                listener.onUserAllowed(carrierId);
+            }
+        }
+        saveToStore();
+    }
+
+    private void sendImsiPrivacyNotification(int carrierId) {
+        String carrierName = getCarrierNameforSubId(getMatchingSubId(carrierId));
+        Notification.Action userAllowAppNotificationAction =
+                new Notification.Action.Builder(null,
+                        mResources.getText(R.string
+                                .wifi_suggestion_action_allow_imsi_privacy_exemption_carrier),
+                        getPrivateBroadcast(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
+                                Pair.create(EXTRA_CARRIER_NAME, carrierName),
+                                Pair.create(EXTRA_CARRIER_ID, carrierId)))
+                        .build();
+        Notification.Action userDisallowAppNotificationAction =
+                new Notification.Action.Builder(null,
+                        mResources.getText(R.string
+                                .wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier),
+                        getPrivateBroadcast(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION,
+                                Pair.create(EXTRA_CARRIER_NAME, carrierName),
+                                Pair.create(EXTRA_CARRIER_ID, carrierId)))
+                        .build();
+
+        Notification notification = mFrameworkFacade.makeNotificationBuilder(
+                mContext, WifiService.NOTIFICATION_NETWORK_STATUS)
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
+                        com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
+                .setTicker(mResources.getString(
+                        R.string.wifi_suggestion_imsi_privacy_title, carrierName))
+                .setContentTitle(mResources.getString(
+                        R.string.wifi_suggestion_imsi_privacy_title, carrierName))
+                .setStyle(new Notification.BigTextStyle()
+                        .bigText(mResources.getString(
+                                R.string.wifi_suggestion_imsi_privacy_content)))
+                .setDeleteIntent(getPrivateBroadcast(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
+                        Pair.create(EXTRA_CARRIER_NAME, carrierName),
+                        Pair.create(EXTRA_CARRIER_ID, carrierId)))
+                .setShowWhen(false)
+                .setLocalOnly(true)
+                .setColor(mResources.getColor(android.R.color.system_notification_accent_color,
+                        mContext.getTheme()))
+                .addAction(userDisallowAppNotificationAction)
+                .addAction(userAllowAppNotificationAction)
+                .build();
+
+        // Post the notification.
+        mNotificationManager.notify(
+                SystemMessageProto.SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE, notification);
+        mUserApprovalUiActive = true;
+    }
+
+    private void sendImsiPrivacyConfirmationDialog(@NonNull String carrierName, int carrierId) {
+        AlertDialog dialog = mFrameworkFacade.makeAlertDialogBuilder(mContext)
+                .setTitle(mResources.getString(
+                        R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_title))
+                .setMessage(mResources.getString(
+                        R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_content,
+                        carrierName))
+                .setPositiveButton(mResources.getText(
+                        R.string.wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation),
+                        (d, which) -> mHandler.post(
+                                () -> handleUserAllowCarrierExemptionAction(
+                                        carrierName, carrierId)))
+                .setNegativeButton(mResources.getText(
+                        R.string.wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation),
+                        (d, which) -> mHandler.post(
+                                () -> handleUserDisallowCarrierExemptionAction(
+                                        carrierName, carrierId)))
+                .setOnDismissListener(
+                        (d) -> mHandler.post(this::handleUserDismissAction))
+                .setOnCancelListener(
+                        (d) -> mHandler.post(this::handleUserDismissAction))
+                .create();
+        dialog.setCanceledOnTouchOutside(false);
+        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+        dialog.getWindow().addSystemFlags(
+                WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS);
+        dialog.show();
+        mUserApprovalUiActive = true;
+    }
+
+    /**
+     * Send notification for exemption of IMSI protection if user never made choice before.
+     */
+    public void sendImsiProtectionExemptionNotificationIfRequired(int carrierId) {
+        int subId = getMatchingSubId(carrierId);
+        if (requiresImsiEncryption(subId)) {
+            return;
+        }
+        if (mImsiPrivacyProtectionExemptionMap.containsKey(carrierId)) {
+            return;
+        }
+        if (mUserApprovalUiActive) {
+            return;
+        }
+        Log.i(TAG, "Sending IMSI protection notification for " + carrierId);
+        sendImsiPrivacyNotification(carrierId);
+    }
+
+    private PendingIntent getPrivateBroadcast(@NonNull String action,
+            @NonNull Pair<String, String> extra1, @NonNull Pair<String, Integer> extra2) {
+        Intent intent = new Intent(action)
+                .setPackage(mWifiInjector.getWifiStackPackageName())
+                .putExtra(extra1.first, extra1.second)
+                .putExtra(extra2.first, extra2.second);
+        return mFrameworkFacade.getBroadcast(mContext, 0, intent,
+                PendingIntent.FLAG_UPDATE_CURRENT);
+    }
+
+    private void saveToStore() {
+        // Set the flag to let WifiConfigStore that we have new data to write.
+        mHasNewDataToSerialize = true;
+        if (!mWifiInjector.getWifiConfigManager().saveToStore(true)) {
+            Log.w(TAG, "Failed to save to store");
+        }
+    }
+
+    /**
+     * Helper method for user factory reset network setting.
+     */
+    public void clear() {
+        mImsiPrivacyProtectionExemptionMap.clear();
+        saveToStore();
+    }
 }
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index 5d639b1..90c7f42 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -54,7 +54,6 @@
 import com.android.server.wifi.hotspot2.PasspointManager;
 import com.android.server.wifi.util.LruConnectionTracker;
 import com.android.server.wifi.util.MissingCounterTimerLockList;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 import com.android.wifi.resources.R;
@@ -71,7 +70,6 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -105,8 +103,9 @@
     public static final String PASSWORD_MASK = "*";
 
     /**
-     * Interface for other modules to listen to the network updated
-     * events.
+     * Interface for other modules to listen to the network updated events.
+     * Note: Credentials are masked to avoid accidentally sending credentials outside the stack.
+     * Use WifiConfigManager#getConfiguredNetworkWithPassword() to retrieve credentials.
      */
     public interface OnNetworkUpdateListener {
         /**
@@ -131,8 +130,12 @@
         void onNetworkTemporarilyDisabled(@NonNull WifiConfiguration config, int disableReason);
         /**
          * Invoked on network being updated.
+         *
+         * @param newConfig Updated WifiConfiguration object.
+         * @param oldConfig Prev WifiConfiguration object.
          */
-        void onNetworkUpdated(@NonNull WifiConfiguration config);
+        void onNetworkUpdated(
+                @NonNull WifiConfiguration newConfig, @NonNull WifiConfiguration oldConfig);
     }
     /**
      * Max size of scan details to cache in {@link #mScanDetailCaches}.
@@ -201,16 +204,19 @@
 
     /**
      * General sorting algorithm of all networks for scanning purposes:
-     * Place the configurations in descending order of their |numAssociation| values. If networks
-     * have the same |numAssociation|, place the configurations with
+     * Place the configurations in ascending order of their AgeIndex. AgeIndex is based on most
+     * recently connected order. The lower the more recently connected.
+     * If networks have the same AgeIndex, place the configurations with
      * |lastSeenInQualifiedNetworkSelection| set first.
      */
-    public static final WifiConfigurationUtil.WifiConfigurationComparator sScanListComparator =
+    private final WifiConfigurationUtil.WifiConfigurationComparator mScanListComparator =
             new WifiConfigurationUtil.WifiConfigurationComparator() {
                 @Override
                 public int compareNetworksWithSameStatus(WifiConfiguration a, WifiConfiguration b) {
-                    if (a.numAssociation != b.numAssociation) {
-                        return Long.compare(b.numAssociation, a.numAssociation);
+                    int indexA = mLruConnectionTracker.getAgeIndexOfNetwork(a);
+                    int indexB = mLruConnectionTracker.getAgeIndexOfNetwork(b);
+                    if (indexA != indexB) {
+                        return Integer.compare(indexA, indexB);
                     } else {
                         boolean isConfigALastSeen =
                                 a.getNetworkSelectionStatus()
@@ -236,7 +242,7 @@
     private final WifiPermissionsWrapper mWifiPermissionsWrapper;
     private final WifiInjector mWifiInjector;
     private final MacAddressUtil mMacAddressUtil;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
     private final WifiScoreCard mWifiScoreCard;
     // Keep order of network connection.
     private final LruConnectionTracker mLruConnectionTracker;
@@ -327,7 +333,7 @@
      */
     WifiConfigManager(
             Context context, Clock clock, UserManager userManager,
-            TelephonyUtil telephonyUtil, WifiKeyStore wifiKeyStore,
+            WifiCarrierInfoManager wifiCarrierInfoManager, WifiKeyStore wifiKeyStore,
             WifiConfigStore wifiConfigStore,
             WifiPermissionsUtil wifiPermissionsUtil,
             WifiPermissionsWrapper wifiPermissionsWrapper,
@@ -342,7 +348,7 @@
         mClock = clock;
         mUserManager = userManager;
         mBackupManagerProxy = new BackupManagerProxy();
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         mWifiKeyStore = wifiKeyStore;
         mWifiConfigStore = wifiConfigStore;
         mWifiPermissionsUtil = wifiPermissionsUtil;
@@ -1327,9 +1333,9 @@
             Log.e(TAG, "Cannot add/update network before store is read!");
             return new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID);
         }
+        WifiConfiguration existingConfig = getInternalConfiguredNetwork(config);
         if (!config.isEphemeral()) {
             // Removes the existing ephemeral network if it exists to add this configuration.
-            WifiConfiguration existingConfig = getConfiguredNetwork(config.getKey());
             if (existingConfig != null && existingConfig.isEphemeral()) {
                 // In this case, new connection for this config won't happen because same
                 // network is already registered as an ephemeral network.
@@ -1356,11 +1362,13 @@
         }
 
         for (OnNetworkUpdateListener listener : mListeners) {
-            WifiConfiguration configForListener = new WifiConfiguration(newConfig);
             if (result.isNewNetwork()) {
-                listener.onNetworkAdded(configForListener);
+                listener.onNetworkAdded(
+                        createExternalWifiConfiguration(newConfig, true, Process.WIFI_UID));
             } else {
-                listener.onNetworkUpdated(configForListener);
+                listener.onNetworkUpdated(
+                        createExternalWifiConfiguration(newConfig, true, Process.WIFI_UID),
+                        createExternalWifiConfiguration(existingConfig, true, Process.WIFI_UID));
             }
         }
         return result;
@@ -1449,8 +1457,8 @@
             saveToStore(true);
         }
         for (OnNetworkUpdateListener listener : mListeners) {
-            WifiConfiguration configForListener = new WifiConfiguration(config);
-            listener.onNetworkRemoved(configForListener);
+            listener.onNetworkRemoved(
+                    createExternalWifiConfiguration(config, true, Process.WIFI_UID));
         }
         return true;
     }
@@ -1610,8 +1618,8 @@
         // Clear out all the disable reason counters.
         status.clearDisableReasonCounter();
         for (OnNetworkUpdateListener listener : mListeners) {
-            WifiConfiguration configForListener = new WifiConfiguration(config);
-            listener.onNetworkEnabled(configForListener);
+            listener.onNetworkEnabled(
+                    createExternalWifiConfiguration(config, true, Process.WIFI_UID));
         }
     }
 
@@ -1627,8 +1635,8 @@
         status.setDisableTime(mClock.getElapsedSinceBootMillis());
         status.setNetworkSelectionDisableReason(disableReason);
         for (OnNetworkUpdateListener listener : mListeners) {
-            WifiConfiguration configForListener = new WifiConfiguration(config);
-            listener.onNetworkTemporarilyDisabled(configForListener, disableReason);
+            listener.onNetworkTemporarilyDisabled(
+                    createExternalWifiConfiguration(config, true, Process.WIFI_UID), disableReason);
         }
     }
 
@@ -1645,7 +1653,8 @@
         status.setNetworkSelectionDisableReason(disableReason);
         for (OnNetworkUpdateListener listener : mListeners) {
             WifiConfiguration configForListener = new WifiConfiguration(config);
-            listener.onNetworkPermanentlyDisabled(configForListener, disableReason);
+            listener.onNetworkPermanentlyDisabled(
+                    createExternalWifiConfiguration(config, true, Process.WIFI_UID), disableReason);
         }
     }
 
@@ -2605,186 +2614,6 @@
     }
 
     /**
-     * Helper method to fetch list of channels for a network from the associated ScanResult's cache
-     * and add it to the provided channel as long as the size of the set is less than
-     * |maxChannelSetSize|.
-     *
-     * @param channelSet        Channel set holding all the channels for the network.
-     * @param scanDetailCache   ScanDetailCache entry associated with the network.
-     * @param nowInMillis       current timestamp to be used for age comparison.
-     * @param ageInMillis       only consider scan details whose timestamps are earlier than this
-     *                          value.
-     * @param maxChannelSetSize Maximum number of channels to be added to the set.
-     * @return false if the list is full, true otherwise.
-     */
-    private boolean addToChannelSetForNetworkFromScanDetailCache(
-            Set<Integer> channelSet, ScanDetailCache scanDetailCache,
-            long nowInMillis, long ageInMillis, int maxChannelSetSize) {
-        if (scanDetailCache != null && scanDetailCache.size() > 0) {
-            for (ScanDetail scanDetail : scanDetailCache.values()) {
-                ScanResult result = scanDetail.getScanResult();
-                boolean valid = (nowInMillis - result.seen) < ageInMillis;
-                if (mVerboseLoggingEnabled) {
-                    Log.v(TAG, "fetchChannelSetForNetwork has " + result.BSSID + " freq "
-                            + result.frequency + " age " + (nowInMillis - result.seen)
-                            + " ?=" + valid);
-                }
-                if (valid) {
-                    channelSet.add(result.frequency);
-                }
-                if (channelSet.size() >= maxChannelSetSize) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Find the most recently connected network from a list of networks, and place it at top
-     */
-    private void putMostRecentlyConnectedNetworkAtTop(List<WifiConfiguration> networks) {
-        WifiConfiguration lastConnectedNetwork =
-                networks.stream()
-                        .max(Comparator.comparing(
-                                (WifiConfiguration config) -> config.lastConnected))
-                        .get();
-        if (lastConnectedNetwork.lastConnected != 0) {
-            int lastConnectedNetworkIdx = networks.indexOf(lastConnectedNetwork);
-            networks.remove(lastConnectedNetworkIdx);
-            networks.add(0, lastConnectedNetwork);
-        }
-    }
-
-    /**
-     * Retrieves a list of channels for partial single scans
-     *
-     * @param ageInMillis only consider scan details whose timestamps are more recent than this.
-     * @param maxCount maximum number of channels in the set
-     * @return Set containing the frequeincies which were used for connection recently.
-     */
-    public Set<Integer> fetchChannelSetForPartialScan(long ageInMillis, int maxCount) {
-        List<WifiConfiguration> networks = getConfiguredNetworks();
-
-        // Remove any permanently or temporarily disabled networks.
-        Iterator<WifiConfiguration> iter = networks.iterator();
-        while (iter.hasNext()) {
-            WifiConfiguration config = iter.next();
-            if (config.ephemeral || config.isPasspoint()
-                    || config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()
-                    || config.getNetworkSelectionStatus().isNetworkTemporaryDisabled()) {
-                iter.remove();
-            }
-        }
-
-        if (networks.isEmpty()) {
-            return null;
-        }
-
-        // Sort the networks with the most frequent ones at the front of the network list.
-        Collections.sort(networks, sScanListComparator);
-
-        // Find the most recently connected network and move it to the front of the network list.
-        putMostRecentlyConnectedNetworkAtTop(networks);
-
-        Set<Integer> channelSet = new HashSet<>();
-        long nowInMillis = mClock.getWallClockMillis();
-
-        for (WifiConfiguration config : networks) {
-            ScanDetailCache scanDetailCache = getScanDetailCacheForNetwork(config.networkId);
-            if (scanDetailCache == null) {
-                continue;
-            }
-
-            // Add channels for the network to the output, and exit when it reaches max size
-            if (!addToChannelSetForNetworkFromScanDetailCache(channelSet, scanDetailCache,
-                    nowInMillis, ageInMillis, maxCount)) {
-                break;
-            }
-        }
-
-        return channelSet;
-    }
-
-    /**
-     * Retrieve a set of channels on which AP's for the provided network was seen using the
-     * internal ScanResult's cache {@link #mScanDetailCaches}. This is used for initiating partial
-     * scans for the currently connected network.
-     *
-     * @param networkId       network ID corresponding to the network.
-     * @param ageInMillis     only consider scan details whose timestamps are earlier than this value.
-     * @param homeChannelFreq frequency of the currently connected network.
-     * @return Set containing the frequencies on which this network was found, null if the network
-     * was not found or there are no associated scan details in the cache.
-     */
-    public Set<Integer> fetchChannelSetForNetworkForPartialScan(int networkId, long ageInMillis,
-                                                                int homeChannelFreq) {
-        WifiConfiguration config = getInternalConfiguredNetwork(networkId);
-        if (config == null) {
-            return null;
-        }
-        ScanDetailCache scanDetailCache = getScanDetailCacheForNetwork(networkId);
-        if (scanDetailCache == null && config.linkedConfigurations == null) {
-            Log.i(TAG, "No scan detail and linked configs associated with networkId " + networkId);
-            return null;
-        }
-        final int maxNumActiveChannelsForPartialScans = mContext.getResources().getInteger(
-                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels);
-        if (mVerboseLoggingEnabled) {
-            StringBuilder dbg = new StringBuilder();
-            dbg.append("fetchChannelSetForNetworkForPartialScan ageInMillis ")
-                    .append(ageInMillis)
-                    .append(" for ")
-                    .append(config.getKey())
-                    .append(" max ")
-                    .append(maxNumActiveChannelsForPartialScans);
-            if (scanDetailCache != null) {
-                dbg.append(" bssids " + scanDetailCache.size());
-            }
-            if (config.linkedConfigurations != null) {
-                dbg.append(" linked " + config.linkedConfigurations.size());
-            }
-            Log.v(TAG, dbg.toString());
-        }
-        Set<Integer> channelSet = new HashSet<>();
-
-        // First add the currently connected network channel.
-        if (homeChannelFreq > 0) {
-            channelSet.add(homeChannelFreq);
-            if (channelSet.size() >= maxNumActiveChannelsForPartialScans) {
-                return channelSet;
-            }
-        }
-
-        long nowInMillis = mClock.getWallClockMillis();
-
-        // Then get channels for the network.
-        if (!addToChannelSetForNetworkFromScanDetailCache(
-                channelSet, scanDetailCache, nowInMillis, ageInMillis,
-                maxNumActiveChannelsForPartialScans)) {
-            return channelSet;
-        }
-
-        // Lastly get channels for linked networks.
-        if (config.linkedConfigurations != null) {
-            for (String configKey : config.linkedConfigurations.keySet()) {
-                WifiConfiguration linkedConfig = getInternalConfiguredNetwork(configKey);
-                if (linkedConfig == null) {
-                    continue;
-                }
-                ScanDetailCache linkedScanDetailCache =
-                        getScanDetailCacheForNetwork(linkedConfig.networkId);
-                if (!addToChannelSetForNetworkFromScanDetailCache(
-                        channelSet, linkedScanDetailCache, nowInMillis, ageInMillis,
-                        maxNumActiveChannelsForPartialScans)) {
-                    break;
-                }
-            }
-        }
-        return channelSet;
-    }
-
-    /**
      * Retrieves a list of all the saved hidden networks for scans
      *
      * Hidden network list sent to the firmware has limited size. If there are a lot of saved
@@ -2800,7 +2629,7 @@
         List<WifiConfiguration> networks = getConfiguredNetworks();
         // Remove any non hidden networks.
         networks.removeIf(config -> !config.hiddenSSID);
-        networks.sort(sScanListComparator);
+        networks.sort(mScanListComparator);
         // The most frequently connected network has the highest priority now.
         for (WifiConfiguration config : networks) {
             hiddenList.add(new WifiScanner.ScanSettings.HiddenNetwork(config.SSID));
@@ -2879,14 +2708,14 @@
             network = configuration.SSID;
         }
         mUserTemporarilyDisabledList.remove(network);
+        mWifiInjector.getBssidBlocklistMonitor().clearBssidBlocklistForSsid(configuration.SSID);
         Log.d(TAG, "Enable disabled network: " + network + " num="
                 + mUserTemporarilyDisabledList.size());
     }
 
     /**
-     * Clear all deleted ephemeral networks.
+     * Clear all user temporarily disabled networks.
      */
-    @VisibleForTesting
     public void clearUserTemporarilyDisabledList() {
         mUserTemporarilyDisabledList.clear();
     }
@@ -2903,7 +2732,7 @@
             }
             if (config.enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.PEAP) {
                 Pair<String, String> currentIdentity =
-                        mTelephonyUtil.getSimIdentity(config);
+                        mWifiCarrierInfoManager.getSimIdentity(config);
                 if (mVerboseLoggingEnabled) {
                     Log.d(TAG, "New identity for config " + config + ": " + currentIdentity);
                 }
@@ -2918,7 +2747,7 @@
             } else {
                 // reset identity as well: supplicant will ask us for it
                 config.enterpriseConfig.setIdentity("");
-                if (!TelephonyUtil.isAnonymousAtRealmIdentity(
+                if (!WifiCarrierInfoManager.isAnonymousAtRealmIdentity(
                         config.enterpriseConfig.getAnonymousIdentity())) {
                     config.enterpriseConfig.setAnonymousIdentity("");
                 }
@@ -3371,7 +3200,7 @@
         pw.println("WifiConfigManager - PNO scan recency sorting enabled = "
                 + mContext.getResources().getBoolean(R.bool.config_wifiPnoRecencySortingEnabled));
         mWifiConfigStore.dump(fd, pw, args);
-        mTelephonyUtil.dump(fd, pw, args);
+        mWifiCarrierInfoManager.dump(fd, pw, args);
     }
 
     /**
@@ -3400,7 +3229,7 @@
     }
 
     /**
-     * Set the network update event listener
+     * Add the network update event listener
      */
     public void addOnNetworkUpdateListener(OnNetworkUpdateListener listener) {
         mListeners.add(listener);
@@ -3454,4 +3283,8 @@
         }
         return scanMaxRssi;
     }
+
+    public Comparator<WifiConfiguration> getScanListComparator() {
+        return mScanListComparator;
+    }
 }
diff --git a/service/java/com/android/server/wifi/WifiConfigStore.java b/service/java/com/android/server/wifi/WifiConfigStore.java
index 9a73f52..2853bba 100644
--- a/service/java/com/android/server/wifi/WifiConfigStore.java
+++ b/service/java/com/android/server/wifi/WifiConfigStore.java
@@ -936,7 +936,7 @@
             FileOutputStream out = null;
             try {
                 out = mAtomicFile.startWrite();
-                FileUtils.setPermissions(mFileName, FILE_MODE, -1, -1);
+                FileUtils.chmod(mFileName, FILE_MODE);
                 out.write(mWriteData);
                 mAtomicFile.finishWrite(out);
             } catch (IOException e) {
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 31fcfca..3d2f3c5 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -52,7 +52,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -146,6 +145,7 @@
     private final ClientModeImpl mStateMachine;
     private final WifiInjector mWifiInjector;
     private final WifiConfigManager mConfigManager;
+    private final WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
     private final WifiInfo mWifiInfo;
     private final WifiConnectivityHelper mConnectivityHelper;
     private final WifiNetworkSelector mNetworkSelector;
@@ -160,6 +160,7 @@
     private final LinkedList<Long> mConnectionAttemptTimeStamps;
     private final BssidBlocklistMonitor mBssidBlocklistMonitor;
     private WifiScanner mScanner;
+    private WifiScoreCard mWifiScoreCard;
 
     private boolean mDbg = false;
     private boolean mWifiEnabled = false;
@@ -699,40 +700,39 @@
             WifiConfigManager.OnNetworkUpdateListener {
         @Override
         public void onNetworkAdded(WifiConfiguration config) {
-            updateScan();
+            triggerScanOnNetworkChanges();
         }
         @Override
         public void onNetworkEnabled(WifiConfiguration config) {
-            updateScan();
+            triggerScanOnNetworkChanges();
         }
         @Override
         public void onNetworkRemoved(WifiConfiguration config) {
-            updateScan();
+            triggerScanOnNetworkChanges();
         }
         @Override
-        public void onNetworkUpdated(WifiConfiguration config) {
-            updateScan();
+        public void onNetworkUpdated(WifiConfiguration newConfig, WifiConfiguration oldConfig) {
+            triggerScanOnNetworkChanges();
         }
         @Override
         public void onNetworkTemporarilyDisabled(WifiConfiguration config, int disableReason) { }
 
         @Override
         public void onNetworkPermanentlyDisabled(WifiConfiguration config, int disableReason) {
-            updateScan();
+            triggerScanOnNetworkChanges();
         }
-        private void updateScan() {
-            if (mScreenOn) {
-                // Update scanning schedule if needed
-                if (updateSingleScanningSchedule()) {
-                    localLog("Saved networks updated impacting single scan schedule");
-                    startConnectivityScan(false);
-                }
-            } else {
-                // Update the PNO scan network list when screen is off. Here we
-                // rely on startConnectivityScan() to perform all the checks and clean up.
-                localLog("Saved networks updated impacting pno scan");
-                startConnectivityScan(false);
-            }
+    }
+
+    private class OnSuggestionUpdateListener implements
+            WifiNetworkSuggestionsManager.OnSuggestionUpdateListener {
+        @Override
+        public void onSuggestionsAddedOrUpdated(List<WifiNetworkSuggestion> suggestions) {
+            triggerScanOnNetworkChanges();
+        }
+
+        @Override
+        public void onSuggestionsRemoved(List<WifiNetworkSuggestion> suggestions) {
+            triggerScanOnNetworkChanges();
         }
     }
 
@@ -741,15 +741,17 @@
      */
     WifiConnectivityManager(Context context, ScoringParams scoringParams,
             ClientModeImpl stateMachine,
-            WifiInjector injector, WifiConfigManager configManager, WifiInfo wifiInfo,
+            WifiInjector injector, WifiConfigManager configManager,
+            WifiNetworkSuggestionsManager wifiNetworkSuggestionsManager, WifiInfo wifiInfo,
             WifiNetworkSelector networkSelector, WifiConnectivityHelper connectivityHelper,
             WifiLastResortWatchdog wifiLastResortWatchdog, OpenNetworkNotifier openNetworkNotifier,
             WifiMetrics wifiMetrics, Handler handler,
-            Clock clock, LocalLog localLog) {
+            Clock clock, LocalLog localLog, WifiScoreCard scoreCard) {
         mContext = context;
         mStateMachine = stateMachine;
         mWifiInjector = injector;
         mConfigManager = configManager;
+        mWifiNetworkSuggestionsManager = wifiNetworkSuggestionsManager;
         mWifiInfo = wifiInfo;
         mNetworkSelector = networkSelector;
         mConnectivityHelper = connectivityHelper;
@@ -766,9 +768,13 @@
 
         // Listen to WifiConfigManager network update events
         mConfigManager.addOnNetworkUpdateListener(new OnNetworkUpdateListener());
+        // Listen to WifiNetworkSuggestionsManager suggestion update events
+        mWifiNetworkSuggestionsManager.addOnSuggestionUpdateListener(
+                new OnSuggestionUpdateListener());
         mBssidBlocklistMonitor = mWifiInjector.getBssidBlocklistMonitor();
         mWifiChannelUtilization = mWifiInjector.getWifiChannelUtilizationScan();
         mNetworkSelector.setWifiChannelUtilization(mWifiChannelUtilization);
+        mWifiScoreCard = scoreCard;
     }
 
     /** Initialize single scanning schedules, and validate them */
@@ -954,10 +960,9 @@
                     R.integer.config_wifiInitialPartialScanChannelCacheAgeMins);
             int maxCount = mContext.getResources().getInteger(
                     R.integer.config_wifiInitialPartialScanChannelMaxCount);
-            freqs = mConfigManager.fetchChannelSetForPartialScan(ageInMillis, maxCount);
+            freqs = fetchChannelSetForPartialScan(maxCount);
         } else {
-            freqs = mConfigManager.fetchChannelSetForNetworkForPartialScan(
-                    config.networkId, CHANNEL_LIST_AGE_MS, mWifiInfo.getFrequency());
+            freqs = fetchChannelSetForNetworkForPartialScan(config.networkId);
         }
 
         if (freqs != null && freqs.size() != 0) {
@@ -973,6 +978,72 @@
         }
     }
 
+    /**
+     * Add the channels into the channel set with a size limit.
+     * If maxCount equals to 0, will add all available channels into the set.
+     * @param channelSet Target set for adding channel to.
+     * @param config Network for query channel from WifiScoreCard
+     * @param maxCount Size limit of the set. If equals to 0, means no limit.
+     * @return True if all available channels for this network are added, otherwise false.
+     */
+    private boolean addChannelFromWifiScoreCard(@NonNull Set<Integer> channelSet,
+            @NonNull WifiConfiguration config, int maxCount) {
+        WifiScoreCard.PerNetwork network = mWifiScoreCard.lookupNetwork(config.SSID);
+        List<Integer> channelList = network.getFrequencies();
+        for (Integer channel : channelList) {
+            if (maxCount > 0 && channelSet.size() >= maxCount) {
+                return false;
+            }
+            channelSet.add(channel);
+        }
+        return true;
+    }
+
+    /**
+     * Fetch channel set for target network.
+     */
+    @VisibleForTesting
+    public Set<Integer> fetchChannelSetForNetworkForPartialScan(int networkId) {
+        WifiConfiguration config = mConfigManager.getConfiguredNetwork(networkId);
+        if (config == null) {
+            return null;
+        }
+        final int maxNumActiveChannelsForPartialScans = mContext.getResources().getInteger(
+                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels);
+        Set<Integer> channelSet = new HashSet<>();
+        // First add the currently connected network channel.
+        if (mWifiInfo.getFrequency() > 0) {
+            channelSet.add(mWifiInfo.getFrequency());
+        }
+        // Then get channels for the network.
+        addChannelFromWifiScoreCard(channelSet, config, maxNumActiveChannelsForPartialScans);
+        return channelSet;
+    }
+
+    /**
+     * Fetch channel set for all saved and suggestion non-passpoint network for partial scan.
+     */
+    @VisibleForTesting
+    public Set<Integer> fetchChannelSetForPartialScan(int maxCount) {
+        List<WifiConfiguration> networks = getAllScanOptimizationNetworks();
+        if (networks.isEmpty()) {
+            return null;
+        }
+
+        // Sort the networks with the most frequent ones at the front of the network list.
+        Collections.sort(networks, mConfigManager.getScanListComparator());
+
+        Set<Integer> channelSet = new HashSet<>();
+
+        for (WifiConfiguration config : networks) {
+            if (!addChannelFromWifiScoreCard(channelSet, config, maxCount)) {
+                return channelSet;
+            }
+        }
+
+        return channelSet;
+    }
+
     // Watchdog timer handler
     private void watchdogHandler() {
         // Schedule the next timer and start a single scan if we are in disconnected state.
@@ -986,6 +1057,21 @@
         }
     }
 
+    private void triggerScanOnNetworkChanges() {
+        if (mScreenOn) {
+            // Update scanning schedule if needed
+            if (updateSingleScanningSchedule()) {
+                localLog("Saved networks / suggestions updated impacting single scan schedule");
+                startConnectivityScan(false);
+            }
+        } else {
+            // Update the PNO scan network list when screen is off. Here we
+            // rely on startConnectivityScan() to perform all the checks and clean up.
+            localLog("Saved networks / suggestions updated impacting pno scan");
+            startConnectivityScan(false);
+        }
+    }
+
     // Start a single scan and set up the interval for next single scan.
     private void startPeriodicSingleScan() {
         // Reaching here with scanning schedule is null means this is a false timer alarm
@@ -1164,8 +1250,7 @@
         // retrieve the list of hidden network SSIDs from saved network to scan for
         settings.hiddenNetworks.addAll(mConfigManager.retrieveHiddenNetworkList());
         // retrieve the list of hidden network SSIDs from Network suggestion to scan for
-        settings.hiddenNetworks.addAll(
-                mWifiInjector.getWifiNetworkSuggestionsManager().retrieveHiddenNetworkList());
+        settings.hiddenNetworks.addAll(mWifiNetworkSuggestionsManager.retrieveHiddenNetworkList());
 
         SingleScanListener singleScanListener =
                 new SingleScanListener(isFullBandScan);
@@ -1288,29 +1373,28 @@
         mWifiMetrics.logPnoScanStart();
     }
 
+    private @NonNull List<WifiConfiguration> getAllScanOptimizationNetworks() {
+        List<WifiConfiguration> networks = mConfigManager.getSavedNetworks(-1);
+        networks.addAll(mWifiNetworkSuggestionsManager.getAllScanOptimizationSuggestionNetworks());
+        // remove all auto-join disabled or network selection disabled network.
+        networks.removeIf(config -> !config.allowAutojoin
+                || !config.getNetworkSelectionStatus().isNetworkEnabled());
+        return networks;
+    }
+
     /**
      * Retrieve the PnoNetworks from Saved and suggestion non-passpoint network.
      */
     @VisibleForTesting
     public List<PnoSettings.PnoNetwork> retrievePnoNetworkList() {
-        List<WifiConfiguration> networks = mConfigManager.getSavedNetworks(-1);
-        networks.addAll(mWifiInjector.getWifiNetworkSuggestionsManager()
-                        .getAllPnoAvailableSuggestionNetworks());
-        // remove all auto-join disabled or network selection disabled network.
-        networks.removeIf(config -> !config.allowAutojoin
-                || !config.getNetworkSelectionStatus().isNetworkEnabled());
+        List<WifiConfiguration> networks = getAllScanOptimizationNetworks();
+
         if (networks.isEmpty()) {
             return Collections.EMPTY_LIST;
         }
-        Collections.sort(networks, WifiConfigManager.sScanListComparator);
-        if (mContext.getResources().getBoolean(R.bool.config_wifiPnoRecencySortingEnabled)) {
-            // Find the most recently connected network and move it to the front of the list.
-            putMostRecentlyConnectedNetworkAtTop(networks);
-        }
-        WifiScoreCard scoreCard = null;
-        if (mContext.getResources().getBoolean(R.bool.config_wifiPnoFrequencyCullingEnabled)) {
-            scoreCard = mWifiInjector.getWifiScoreCard();
-        }
+        Collections.sort(networks, mConfigManager.getScanListComparator());
+        boolean pnoFrequencyCullingEnabled = mContext.getResources()
+                .getBoolean(R.bool.config_wifiPnoFrequencyCullingEnabled);
 
         List<PnoSettings.PnoNetwork> pnoList = new ArrayList<>();
         Set<WifiScanner.PnoSettings.PnoNetwork> pnoSet = new HashSet<>();
@@ -1322,11 +1406,11 @@
             }
             pnoList.add(pnoNetwork);
             pnoSet.add(pnoNetwork);
-            if (scoreCard == null) {
+            if (!pnoFrequencyCullingEnabled) {
                 continue;
             }
-            WifiScoreCard.PerNetwork network = scoreCard.lookupNetwork(config.SSID);
-            List<Integer> channelList = network.getFrequencies();
+            Set<Integer> channelList = new HashSet<>();
+            addChannelFromWifiScoreCard(channelList, config, 0);
             pnoNetwork.frequencies = channelList.stream().mapToInt(Integer::intValue).toArray();
             localLog("retrievePnoNetworkList " + pnoNetwork.ssid + ":"
                     + Arrays.toString(pnoNetwork.frequencies));
@@ -1334,22 +1418,6 @@
         return pnoList;
     }
 
-    /**
-     * Find the most recently connected network from a list of networks, and place it at top
-     */
-    private void putMostRecentlyConnectedNetworkAtTop(List<WifiConfiguration> networks) {
-        WifiConfiguration lastConnectedNetwork =
-                networks.stream()
-                        .max(Comparator.comparing(
-                                (WifiConfiguration config) -> config.lastConnected))
-                        .get();
-        if (lastConnectedNetwork.lastConnected != 0) {
-            int lastConnectedNetworkIdx = networks.indexOf(lastConnectedNetwork);
-            networks.remove(lastConnectedNetworkIdx);
-            networks.add(0, lastConnectedNetwork);
-        }
-    }
-
     // Stop PNO scan.
     private void stopPnoScan() {
         if (!mPnoScanStarted) return;
@@ -1530,7 +1598,7 @@
         }
 
         Set<WifiNetworkSuggestion> suggestionsNetworks =
-                mWifiInjector.getWifiNetworkSuggestionsManager().getAllNetworkSuggestions();
+                mWifiNetworkSuggestionsManager.getAllNetworkSuggestions();
         // If total size not equal to 1, then no need to proceed
         if (passpointNetworks.size() + savedNetworks.size() + suggestionsNetworks.size() != 1) {
             return false;
diff --git a/service/java/com/android/server/wifi/WifiContext.java b/service/java/com/android/server/wifi/WifiContext.java
index 2040d73..b360a8e 100644
--- a/service/java/com/android/server/wifi/WifiContext.java
+++ b/service/java/com/android/server/wifi/WifiContext.java
@@ -19,18 +19,29 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.content.ContextWrapper;
+import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
 import android.util.Log;
 
+import com.android.server.wifi.util.Environment;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Wrapper for context to override getResources method. Resources for wifi mainline jar needs to be
  * fetched from the resources APK.
  */
 public class WifiContext extends ContextWrapper {
     private static final String TAG = "WifiContext";
-    public static final String WIFI_OVERLAY_APK_PKG_NAME = "com.android.wifi.resources";
+    /** Intent action that is used to identify ServiceWifiResources.apk */
+    private static final String ACTION_RESOURCES_APK =
+            "com.android.server.wifi.intent.action.SERVICE_WIFI_RESOURCES_APK";
+
+    private String mWifiOverlayApkPkgName;
 
     // Cached resources from the resources APK.
     private AssetManager mWifiAssetsFromApk;
@@ -41,9 +52,45 @@
         super(contextBase);
     }
 
+    /** Get the package name of ServiceWifiResources.apk */
+    public String getWifiOverlayApkPkgName() {
+        if (mWifiOverlayApkPkgName != null) {
+            return mWifiOverlayApkPkgName;
+        }
+
+        List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(
+                new Intent(ACTION_RESOURCES_APK),
+                PackageManager.MATCH_SYSTEM_ONLY);
+
+        // remove apps that don't live in the Wifi apex
+        resolveInfos.removeIf(info ->
+                !Environment.isAppInWifiApex(info.activityInfo.applicationInfo));
+
+        if (resolveInfos.isEmpty()) {
+            // Resource APK not loaded yet, print a stack trace to see where this is called from
+            Log.e(TAG, "Attempted to fetch resources before Wifi Resources APK is loaded!",
+                    new IllegalStateException());
+            return null;
+        }
+
+        if (resolveInfos.size() > 1) {
+            // multiple apps found, log a warning, but continue
+            Log.w(TAG, "Found > 1 APK that can resolve Wifi Resources APK intent: "
+                    + resolveInfos.stream()
+                            .map(info -> info.activityInfo.applicationInfo.packageName)
+                            .collect(Collectors.joining(", ")));
+        }
+
+        // Assume the first ResolveInfo is the one we're looking for
+        ResolveInfo info = resolveInfos.get(0);
+        mWifiOverlayApkPkgName = info.activityInfo.applicationInfo.packageName;
+        Log.i(TAG, "Found Wifi Resources APK at: " + mWifiOverlayApkPkgName);
+        return mWifiOverlayApkPkgName;
+    }
+
     private Context getResourcesApkContext() {
         try {
-            return createPackageContext(WIFI_OVERLAY_APK_PKG_NAME, 0);
+            return createPackageContext(getWifiOverlayApkPkgName(), 0);
         } catch (PackageManager.NameNotFoundException e) {
             Log.wtf(TAG, "Failed to load resources", e);
         }
diff --git a/service/java/com/android/server/wifi/WifiDataStall.java b/service/java/com/android/server/wifi/WifiDataStall.java
index fd29934..ba1de32 100644
--- a/service/java/com/android/server/wifi/WifiDataStall.java
+++ b/service/java/com/android/server/wifi/WifiDataStall.java
@@ -48,7 +48,7 @@
     // Maximum time that a data stall start time stays valid.
     public static final long VALIDITY_PERIOD_OF_DATA_STALL_START_MS = 30 * 1000; // 0.5 minutes
     // Default Tx packet error rate when there is no Tx attempt
-    public static final int DEFAULT_TX_PACKET_ERROR_RATE = 20;
+    public static final int DEFAULT_TX_PACKET_ERROR_RATE = 5;
     // Default CCA level when CCA stats are not available
     public static final int DEFAULT_CCA_LEVEL_2G = CHANNEL_UTILIZATION_SCALE * 16 / 100;
     public static final int DEFAULT_CCA_LEVEL_ABOVE_2G = CHANNEL_UTILIZATION_SCALE * 6 / 100;
@@ -230,6 +230,7 @@
         int currFrequency = wifiInfo.getFrequency();
         mWifiChannelUtilization.refreshChannelStatsAndChannelUtilization(newStats, currFrequency);
         int ccaLevel = mWifiChannelUtilization.getUtilizationRatio(currFrequency);
+        mWifiMetrics.incrementChannelUtilizationCount(ccaLevel, currFrequency);
 
         if (oldStats == null || newStats == null) {
             // First poll after new association
@@ -242,6 +243,7 @@
             }
             mIsThroughputSufficient = true;
             mWifiMetrics.resetWifiIsUnusableLinkLayerStats();
+            mWifiMetrics.incrementThroughputKbpsCount(mTxTputKbps, mRxTputKbps, currFrequency);
             return WifiIsUnusableEvent.TYPE_UNKNOWN;
         }
 
@@ -322,6 +324,7 @@
         } else {
             mRxTputKbps = INVALID_THROUGHPUT;
         }
+        mWifiMetrics.incrementThroughputKbpsCount(mTxTputKbps, mRxTputKbps, currFrequency);
 
         mIsThroughputSufficient = isThroughputSufficientInternal(mTxTputKbps, mRxTputKbps,
                 isTxTrafficHigh, isRxTrafficHigh, timeDeltaLastTwoPollsMs);
diff --git a/service/java/com/android/server/wifi/WifiDiagnostics.java b/service/java/com/android/server/wifi/WifiDiagnostics.java
index 05c4df6..4ac9820 100644
--- a/service/java/com/android/server/wifi/WifiDiagnostics.java
+++ b/service/java/com/android/server/wifi/WifiDiagnostics.java
@@ -108,7 +108,6 @@
     public static final long MIN_DUMP_TIME_WINDOW_MILLIS = 10 * 60 * 1000; // 10 mins
 
     private long mLastBugReportTime;
-    static final long MIN_BUG_REPORT_TIME_WINDOW_MILLIS = 60 * 60 * 1000; // 60 mins
 
     @VisibleForTesting public static final String FIRMWARE_DUMP_SECTION_HEADER =
             "FW Memory dump";
@@ -302,7 +301,8 @@
             return;
         }
         long currentTime = mClock.getWallClockMillis();
-        if ((currentTime - mLastBugReportTime) < MIN_BUG_REPORT_TIME_WINDOW_MILLIS
+        if ((currentTime - mLastBugReportTime)
+                < mWifiInjector.getDeviceConfigFacade().getBugReportMinWindowMs()
                 && mLastBugReportTime > 0) {
             return;
         }
diff --git a/service/java/com/android/server/wifi/WifiHealthMonitor.java b/service/java/com/android/server/wifi/WifiHealthMonitor.java
index b85fa5f..0b0c68d 100644
--- a/service/java/com/android/server/wifi/WifiHealthMonitor.java
+++ b/service/java/com/android/server/wifi/WifiHealthMonitor.java
@@ -524,6 +524,7 @@
         mWifiSystemInfoStats.clearAll();
     }
 
+    public static final int REASON_NO_FAILURE = -1;
     public static final int REASON_ASSOC_REJECTION = 0;
     public static final int REASON_ASSOC_TIMEOUT = 1;
     public static final int REASON_AUTH_FAILURE = 2;
@@ -531,7 +532,16 @@
     public static final int REASON_DISCONNECTION_NONLOCAL = 4;
     public static final int REASON_SHORT_CONNECTION_NONLOCAL = 5;
     public static final int NUMBER_FAILURE_REASON_CODE = 6;
+    public static final String[] FAILURE_REASON_NAME = {
+            "association rejection failure",
+            "association timeout failure",
+            "authentication failure",
+            "connection failure",
+            "disconnection",
+            "short connection"
+    };
     @IntDef(prefix = { "REASON_" }, value = {
+        REASON_NO_FAILURE,
         REASON_ASSOC_REJECTION,
         REASON_ASSOC_TIMEOUT,
         REASON_AUTH_FAILURE,
@@ -955,7 +965,7 @@
         }
 
         @Override
-        public void onNetworkUpdated(WifiConfiguration config) {
+        public void onNetworkUpdated(WifiConfiguration newConfig, WifiConfiguration oldConfig) {
         }
     }
 
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index a6aa034..6831130 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -56,7 +56,6 @@
 import com.android.server.wifi.util.LruConnectionTracker;
 import com.android.server.wifi.util.NetdWrapper;
 import com.android.server.wifi.util.SettingsMigrationDataHolder;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 
@@ -83,7 +82,7 @@
 
     static WifiInjector sWifiInjector = null;
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final BatteryStatsManager mBatteryStats;
     private final FrameworkFacade mFrameworkFacade;
     private final DeviceConfigFacade mDeviceConfigFacade;
@@ -155,7 +154,7 @@
     private BssidBlocklistMonitor mBssidBlocklistMonitor;
     private final MacAddressUtil mMacAddressUtil;
     private final MboOceController mMboOceController;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
     private WifiChannelUtilization mWifiChannelUtilizationScan;
     private WifiChannelUtilization mWifiChannelUtilizationConnected;
     private final KeyStore mKeyStore;
@@ -169,7 +168,7 @@
     private final SettingsMigrationDataHolder mSettingsMigrationDataHolder;
     private final LruConnectionTracker mLruConnectionTracker;
 
-    public WifiInjector(Context context) {
+    public WifiInjector(WifiContext context) {
         if (context == null) {
             throw new IllegalStateException(
                     "WifiInjector should not be initialized with a null Context.");
@@ -260,15 +259,17 @@
                 WifiConfigStore.createSharedFiles(mFrameworkFacade.isNiapModeOn(mContext)));
         SubscriptionManager subscriptionManager =
                 mContext.getSystemService(SubscriptionManager.class);
-        mTelephonyUtil = new TelephonyUtil(makeTelephonyManager(), subscriptionManager,
-                mFrameworkFacade, mContext, wifiHandler);
+        mWifiCarrierInfoManager = new WifiCarrierInfoManager(makeTelephonyManager(),
+                subscriptionManager, this, mFrameworkFacade, mContext,
+                mWifiConfigStore, wifiHandler);
         String l2KeySeed = Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
         mWifiScoreCard = new WifiScoreCard(mClock, l2KeySeed, mDeviceConfigFacade);
+        mWifiMetrics.setWifiScoreCard(mWifiScoreCard);
         mLruConnectionTracker = new LruConnectionTracker(MAX_RECENTLY_CONNECTED_NETWORK,
                 mContext);
         // Config Manager
         mWifiConfigManager = new WifiConfigManager(mContext, mClock,
-                mUserManager, mTelephonyUtil,
+                mUserManager, mWifiCarrierInfoManager,
                 mWifiKeyStore, mWifiConfigStore, mWifiPermissionsUtil,
                 mWifiPermissionsWrapper, this,
                 new NetworkListSharedStoreData(mContext),
@@ -300,17 +301,17 @@
         mWifiMetrics.setWifiNetworkSelector(mWifiNetworkSelector);
         mWifiNetworkSuggestionsManager = new WifiNetworkSuggestionsManager(mContext, wifiHandler,
                 this, mWifiPermissionsUtil, mWifiConfigManager, mWifiConfigStore, mWifiMetrics,
-                mTelephonyUtil, mWifiKeyStore, mLruConnectionTracker);
+                mWifiCarrierInfoManager, mWifiKeyStore, mLruConnectionTracker);
         mPasspointManager = new PasspointManager(mContext, this,
                 wifiHandler, mWifiNative, mWifiKeyStore, mClock, new PasspointObjectFactory(),
-                mWifiConfigManager, mWifiConfigStore, mWifiMetrics, mTelephonyUtil);
+                mWifiConfigManager, mWifiConfigStore, mWifiMetrics, mWifiCarrierInfoManager);
         PasspointNetworkNominateHelper nominateHelper =
                 new PasspointNetworkNominateHelper(mPasspointManager, mWifiConfigManager,
                         mConnectivityLocalLog);
         mSavedNetworkNominator = new SavedNetworkNominator(
-                mWifiConfigManager, nominateHelper, mConnectivityLocalLog, mTelephonyUtil);
+                mWifiConfigManager, nominateHelper, mConnectivityLocalLog, mWifiCarrierInfoManager);
         mNetworkSuggestionNominator = new NetworkSuggestionNominator(mWifiNetworkSuggestionsManager,
-                mWifiConfigManager, nominateHelper, mConnectivityLocalLog, mTelephonyUtil);
+                mWifiConfigManager, nominateHelper, mConnectivityLocalLog, mWifiCarrierInfoManager);
         mScoredNetworkNominator = new ScoredNetworkNominator(mContext, wifiHandler,
                 mFrameworkFacade, mNetworkScoreManager, mContext.getPackageManager(),
                 mWifiConfigManager, mConnectivityLocalLog,
@@ -345,8 +346,8 @@
                 this, mBackupManagerProxy, mCountryCode, mWifiNative,
                 new WrongPasswordNotifier(mContext, mFrameworkFacade),
                 mSarManager, mWifiTrafficPoller, mLinkProbeManager, mBatteryStats,
-                supplicantStateTracker, mMboOceController, mTelephonyUtil,
-                new EapFailureNotifier(mContext, mFrameworkFacade, mTelephonyUtil),
+                supplicantStateTracker, mMboOceController, mWifiCarrierInfoManager,
+                new EapFailureNotifier(mContext, mFrameworkFacade, mWifiCarrierInfoManager),
                 new SimRequiredNotifier(mContext, mFrameworkFacade));
         mActiveModeWarden = new ActiveModeWarden(this, wifiLooper,
                 mWifiNative, new DefaultModeManager(mContext), mBatteryStats, mWifiDiagnostics,
@@ -409,7 +410,7 @@
         mWifiNetworkSuggestionsManager.enableVerboseLogging(verbose);
         LogcatLog.enableVerboseLogging(verbose);
         mDppManager.enableVerboseLogging(verbose);
-        mTelephonyUtil.enableVerboseLogging(verbose);
+        mWifiCarrierInfoManager.enableVerboseLogging(verbose);
     }
 
     public UserManager getUserManager() {
@@ -536,8 +537,8 @@
         return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
     }
 
-    public TelephonyUtil getTelephonyUtil() {
-        return mTelephonyUtil;
+    public WifiCarrierInfoManager getWifiCarrierInfoManager() {
+        return mWifiCarrierInfoManager;
     }
 
     public WifiStateTracker getWifiStateTracker() {
@@ -618,11 +619,11 @@
         mWifiChannelUtilizationScan = new WifiChannelUtilization(mClock);
         return new WifiConnectivityManager(mContext, getScoringParams(),
                 clientModeImpl, this,
-                mWifiConfigManager, clientModeImpl.getWifiInfo(),
+                mWifiConfigManager, mWifiNetworkSuggestionsManager, clientModeImpl.getWifiInfo(),
                 mWifiNetworkSelector, mWifiConnectivityHelper,
                 mWifiLastResortWatchdog, mOpenNetworkNotifier,
                 mWifiMetrics, new Handler(mWifiHandlerThread.getLooper()),
-                mClock, mConnectivityLocalLog);
+                mClock, mConnectivityLocalLog, mWifiScoreCard);
     }
 
     /**
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java
index fb61737..3f13e99 100644
--- a/service/java/com/android/server/wifi/WifiMetrics.java
+++ b/service/java/com/android/server/wifi/WifiMetrics.java
@@ -204,6 +204,7 @@
     private WifiDataStall mWifiDataStall;
     private WifiLinkLayerStats mLastLinkLayerStats;
     private WifiHealthMonitor mWifiHealthMonitor;
+    private WifiScoreCard mWifiScoreCard;
     private String mLastBssid;
     private int mLastFrequency = -1;
     private int mSeqNumInsideFramework = 0;
@@ -442,6 +443,26 @@
     // Connection duration stats collected while link layer stats reports are on
     private final ConnectionDurationStats mConnectionDurationStats = new ConnectionDurationStats();
 
+    private static final int[] CHANNEL_UTILIZATION_BUCKETS =
+            {25, 50, 75, 100, 125, 150, 175, 200, 225};
+
+    private final IntHistogram mChannelUtilizationHistogram2G =
+            new IntHistogram(CHANNEL_UTILIZATION_BUCKETS);
+
+    private final IntHistogram mChannelUtilizationHistogramAbove2G =
+            new IntHistogram(CHANNEL_UTILIZATION_BUCKETS);
+
+    private static final int[] THROUGHPUT_MBPS_BUCKETS =
+            {1, 5, 10, 15, 25, 50, 100, 150, 200, 300, 450, 600, 800, 1200, 1600};
+    private final IntHistogram mTxThroughputMbpsHistogram2G =
+            new IntHistogram(THROUGHPUT_MBPS_BUCKETS);
+    private final IntHistogram mRxThroughputMbpsHistogram2G =
+            new IntHistogram(THROUGHPUT_MBPS_BUCKETS);
+    private final IntHistogram mTxThroughputMbpsHistogramAbove2G =
+            new IntHistogram(THROUGHPUT_MBPS_BUCKETS);
+    private final IntHistogram mRxThroughputMbpsHistogramAbove2G =
+            new IntHistogram(THROUGHPUT_MBPS_BUCKETS);
+
     // Wi-Fi off metrics
     private final WifiOffMetrics mWifiOffMetrics = new WifiOffMetrics();
 
@@ -959,6 +980,8 @@
                         sb.append("CREATOR_CARRIER");
                         break;
                 }
+                sb.append(", numConsecutiveConnectionFailure="
+                        + mConnectionEvent.numConsecutiveConnectionFailure);
             }
             return sb.toString();
         }
@@ -1114,6 +1137,11 @@
         mWifiHealthMonitor = wifiHealthMonitor;
     }
 
+    /** Sets internal WifiScoreCard member */
+    public void setWifiScoreCard(WifiScoreCard wifiScoreCard) {
+        mWifiScoreCard = wifiScoreCard;
+    }
+
     /**
      * Increment cumulative counters for link layer stats.
      * @param newStats
@@ -1373,6 +1401,14 @@
                     mCurrentConnectionEvent.mConnectionEvent.networkCreator =
                             WifiMetricsProto.ConnectionEvent.CREATOR_UNKNOWN;
                 }
+
+                mCurrentConnectionEvent.mConnectionEvent.screenOn = mScreenOn;
+                if (mCurrentConnectionEvent.mConfigSsid != null) {
+                    WifiScoreCard.NetworkConnectionStats recentStats = mWifiScoreCard.lookupNetwork(
+                            mCurrentConnectionEvent.mConfigSsid).getRecentStats();
+                    mCurrentConnectionEvent.mConnectionEvent.numConsecutiveConnectionFailure =
+                            recentStats.getCount(WifiScoreCard.CNT_CONSECUTIVE_CONNECTION_FAILURE);
+                }
             }
         }
     }
@@ -2039,6 +2075,54 @@
     }
 
     /**
+     * Increment occurrence count of channel utilization
+     * @param channelUtilization Channel utilization of current network
+     * @param frequency Channel frequency of current network
+     */
+    @VisibleForTesting
+    public void incrementChannelUtilizationCount(int channelUtilization, int frequency) {
+        if (channelUtilization < InformationElementUtil.BssLoad.MIN_CHANNEL_UTILIZATION
+                || channelUtilization > InformationElementUtil.BssLoad.MAX_CHANNEL_UTILIZATION) {
+            return;
+        }
+        synchronized (mLock) {
+            if (frequency <= KnownBandsChannelHelper.BAND_24_GHZ_END_FREQ) {
+                mChannelUtilizationHistogram2G.increment(channelUtilization);
+            } else {
+                mChannelUtilizationHistogramAbove2G.increment(channelUtilization);
+            }
+        }
+    }
+
+    /**
+     * Increment occurrence count of Tx and Rx throughput
+     * @param txThroughputKbps Tx throughput of current network in Kbps
+     * @param rxThroughputKbps Rx throughput of current network in Kbps
+     * @param frequency Channel frequency of current network in MHz
+     */
+    @VisibleForTesting
+    public void incrementThroughputKbpsCount(int txThroughputKbps, int rxThroughputKbps,
+            int frequency) {
+        synchronized (mLock) {
+            if (frequency <= KnownBandsChannelHelper.BAND_24_GHZ_END_FREQ) {
+                if (txThroughputKbps >= 0) {
+                    mTxThroughputMbpsHistogram2G.increment(txThroughputKbps / 1000);
+                }
+                if (rxThroughputKbps >= 0) {
+                    mRxThroughputMbpsHistogram2G.increment(rxThroughputKbps / 1000);
+                }
+            } else {
+                if (txThroughputKbps >= 0) {
+                    mTxThroughputMbpsHistogramAbove2G.increment(txThroughputKbps / 1000);
+                }
+                if (rxThroughputKbps >= 0) {
+                    mRxThroughputMbpsHistogramAbove2G.increment(rxThroughputKbps / 1000);
+                }
+            }
+        }
+    }
+
+    /**
      * Increment count of Watchdog successes.
      */
     public void incrementNumLastResortWatchdogSuccesses() {
@@ -2106,6 +2190,8 @@
         int mboCellularDataAwareNetworks = 0;
         int oceSupportedNetworks = 0;
         int filsSupportedNetworks = 0;
+        int band6gNetworks = 0;
+        int standard11axNetworks = 0;
 
         for (ScanDetail scanDetail : scanDetails) {
             NetworkDetail networkDetail = scanDetail.getNetworkDetail();
@@ -2131,12 +2217,18 @@
                         oceSupportedNetworks++;
                     }
                 }
+                if (networkDetail.getWifiMode() == InformationElementUtil.WifiMode.MODE_11AX) {
+                    standard11axNetworks++;
+                }
             }
             if (scanResult != null && scanResult.capabilities != null) {
                 if (ScanResultUtil.isScanResultForFilsSha256Network(scanResult)
                         || ScanResultUtil.isScanResultForFilsSha384Network(scanResult)) {
                     filsSupportedNetworks++;
                 }
+                if (scanResult.is6GHz()) {
+                    band6gNetworks++;
+                }
                 if (ScanResultUtil.isScanResultForEapSuiteBNetwork(scanResult)) {
                     wpa3EnterpriseNetworks++;
                 } else if (ScanResultUtil.isScanResultForWapiPskNetwork(scanResult)) {
@@ -2174,6 +2266,8 @@
             mWifiLogProto.numMboCellularDataAwareNetworkScanResults += mboCellularDataAwareNetworks;
             mWifiLogProto.numOceSupportedNetworkScanResults += oceSupportedNetworks;
             mWifiLogProto.numFilsSupportedNetworkScanResults += filsSupportedNetworks;
+            mWifiLogProto.num11AxNetworkScanResults += standard11axNetworks;
+            mWifiLogProto.num6GNetworkScanResults += band6gNetworks;
             mWifiLogProto.numScans++;
         }
     }
@@ -3029,6 +3123,10 @@
                         + mWifiLogProto.numOceSupportedNetworkScanResults);
                 pw.println("mWifiLogProto.numFilsSupportedNetworkScanResults="
                         + mWifiLogProto.numFilsSupportedNetworkScanResults);
+                pw.println("mWifiLogProto.num11AxNetworkScanResults="
+                        + mWifiLogProto.num11AxNetworkScanResults);
+                pw.println("mWifiLogProto.num6GNetworkScanResults"
+                        + mWifiLogProto.num6GNetworkScanResults);
                 pw.println("mWifiLogProto.numBssidFilteredDueToMboAssocDisallowInd="
                         + mWifiLogProto.numBssidFilteredDueToMboAssocDisallowInd);
                 pw.println("mWifiLogProto.numConnectToNetworkSupportingMbo="
@@ -3039,6 +3137,8 @@
                         + mWifiLogProto.numForceScanDueToSteeringRequest);
                 pw.println("mWifiLogProto.numMboCellularSwitchRequest="
                         + mWifiLogProto.numMboCellularSwitchRequest);
+                pw.println("mWifiLogProto.numSteeringRequestIncludingMboAssocRetryDelay="
+                        + mWifiLogProto.numSteeringRequestIncludingMboAssocRetryDelay);
                 pw.println("mWifiLogProto.numConnectRequestWithFilsAkm="
                         + mWifiLogProto.numConnectRequestWithFilsAkm);
                 pw.println("mWifiLogProto.numL2ConnectionThroughFilsAuthentication="
@@ -3403,6 +3503,18 @@
                         + mWifiOffMetrics.toString());
                 pw.println("mWifiLogProto.softApConfigLimitationMetrics="
                         + mSoftApConfigLimitationMetrics.toString());
+                pw.println("mChannelUtilizationHistogram2G:\n"
+                        + mChannelUtilizationHistogram2G);
+                pw.println("mChannelUtilizationHistogramAbove2G:\n"
+                        + mChannelUtilizationHistogramAbove2G);
+                pw.println("mTxThroughputMbpsHistogram2G:\n"
+                        + mTxThroughputMbpsHistogram2G);
+                pw.println("mRxThroughputMbpsHistogram2G:\n"
+                        + mRxThroughputMbpsHistogram2G);
+                pw.println("mTxThroughputMbpsHistogramAbove2G:\n"
+                        + mTxThroughputMbpsHistogramAbove2G);
+                pw.println("mRxThroughputMbpsHistogramAbove2G:\n"
+                        + mRxThroughputMbpsHistogramAbove2G);
             }
         }
     }
@@ -3974,6 +4086,22 @@
             mWifiLogProto.connectionDurationStats = mConnectionDurationStats.toProto();
             mWifiLogProto.wifiOffMetrics = mWifiOffMetrics.toProto();
             mWifiLogProto.softApConfigLimitationMetrics = mSoftApConfigLimitationMetrics.toProto();
+            mWifiLogProto.channelUtilizationHistogram =
+                    new WifiMetricsProto.ChannelUtilizationHistogram();
+            mWifiLogProto.channelUtilizationHistogram.utilization2G =
+                    mChannelUtilizationHistogram2G.toProto();
+            mWifiLogProto.channelUtilizationHistogram.utilizationAbove2G =
+                    mChannelUtilizationHistogramAbove2G.toProto();
+            mWifiLogProto.throughputMbpsHistogram =
+                    new WifiMetricsProto.ThroughputMbpsHistogram();
+            mWifiLogProto.throughputMbpsHistogram.tx2G =
+                    mTxThroughputMbpsHistogram2G.toProto();
+            mWifiLogProto.throughputMbpsHistogram.txAbove2G =
+                    mTxThroughputMbpsHistogramAbove2G.toProto();
+            mWifiLogProto.throughputMbpsHistogram.rx2G =
+                    mRxThroughputMbpsHistogram2G.toProto();
+            mWifiLogProto.throughputMbpsHistogram.rxAbove2G =
+                    mRxThroughputMbpsHistogramAbove2G.toProto();
         }
     }
 
@@ -4166,6 +4294,12 @@
             mWifiLockLowLatencyActiveSessionDurationSecHistogram.clear();
             mWifiLockStats.clear();
             mWifiToggleStats.clear();
+            mChannelUtilizationHistogram2G.clear();
+            mChannelUtilizationHistogramAbove2G.clear();
+            mTxThroughputMbpsHistogram2G.clear();
+            mRxThroughputMbpsHistogram2G.clear();
+            mTxThroughputMbpsHistogramAbove2G.clear();
+            mRxThroughputMbpsHistogramAbove2G.clear();
             mPasspointProvisionFailureCounts.clear();
             mNumProvisionSuccess = 0;
             mBssidBlocklistStats = new BssidBlocklistStats();
@@ -4844,9 +4978,18 @@
      */
     public void updateWifiUsabilityStatsEntries(WifiInfo info, WifiLinkLayerStats stats) {
         synchronized (mLock) {
-            if (info == null || stats == null) {
+            if (info == null) {
                 return;
             }
+            if (stats == null) {
+                // For devices lacking vendor hal, fill in the parts that we can
+                stats = new WifiLinkLayerStats();
+                stats.timeStampInMs = mClock.getElapsedSinceBootMillis();
+                stats.txmpdu_be = info.txSuccess;
+                stats.retries_be = info.txRetries;
+                stats.lostmpdu_be = info.txBad;
+                stats.rxmpdu_be = info.rxSuccess;
+            }
             WifiUsabilityStatsEntry wifiUsabilityStatsEntry =
                     mWifiUsabilityStatsEntriesList.size()
                     < MAX_WIFI_USABILITY_STATS_ENTRIES_LIST_SIZE
@@ -5814,6 +5957,16 @@
     }
 
     /**
+     * Increment number of times STA received steering request
+     * including MBO association retry delay.
+     */
+    public void incrementSteeringRequestCountIncludingMboAssocRetryDelay() {
+        synchronized (mLock) {
+            mWifiLogProto.numSteeringRequestIncludingMboAssocRetryDelay++;
+        }
+    }
+
+    /**
      * Increment number of connect request to AP adding FILS AKM.
      */
     public void incrementConnectRequestWithFilsAkmCount() {
diff --git a/service/java/com/android/server/wifi/WifiMonitor.java b/service/java/com/android/server/wifi/WifiMonitor.java
index 4e006a2..7f62085 100644
--- a/service/java/com/android/server/wifi/WifiMonitor.java
+++ b/service/java/com/android/server/wifi/WifiMonitor.java
@@ -29,10 +29,10 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.Protocol;
 import com.android.server.wifi.MboOceController.BtmFrameData;
+import com.android.server.wifi.WifiCarrierInfoManager.SimAuthRequestData;
 import com.android.server.wifi.hotspot2.AnqpEvent;
 import com.android.server.wifi.hotspot2.IconEvent;
 import com.android.server.wifi.hotspot2.WnmData;
-import com.android.server.wifi.util.TelephonyUtil.SimAuthRequestData;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
index e0c7fbc..fa1295d 100644
--- a/service/java/com/android/server/wifi/WifiNative.java
+++ b/service/java/com/android/server/wifi/WifiNative.java
@@ -813,10 +813,10 @@
      * For devices which do not the support the HAL, this will bypass HalDeviceManager &
      * teardown any existing iface.
      */
-    private String createStaIface(@NonNull Iface iface, boolean lowPrioritySta) {
+    private String createStaIface(@NonNull Iface iface) {
         synchronized (mLock) {
             if (mWifiVendorHal.isVendorHalSupported()) {
-                return mWifiVendorHal.createStaIface(lowPrioritySta,
+                return mWifiVendorHal.createStaIface(
                         new InterfaceDestoyedListenerInternal(iface.id));
             } else {
                 Log.i(TAG, "Vendor Hal not supported, ignoring createStaIface.");
@@ -1039,7 +1039,7 @@
                 return null;
             }
             iface.externalListener = interfaceCallback;
-            iface.name = createStaIface(iface, /* lowPrioritySta */ false);
+            iface.name = createStaIface(iface);
             if (TextUtils.isEmpty(iface.name)) {
                 Log.e(TAG, "Failed to create STA iface in vendor HAL");
                 mIfaceMgr.removeIface(iface.id);
@@ -1101,7 +1101,7 @@
                 return null;
             }
             iface.externalListener = interfaceCallback;
-            iface.name = createStaIface(iface, /* lowPrioritySta */ false);
+            iface.name = createStaIface(iface);
             if (TextUtils.isEmpty(iface.name)) {
                 Log.e(TAG, "Failed to create iface in vendor HAL");
                 mIfaceMgr.removeIface(iface.id);
@@ -2846,6 +2846,15 @@
     }
 
     /**
+     * Returns whether STA/AP concurrency is supported or not.
+     */
+    public boolean isStaApConcurrencySupported() {
+        synchronized (mLock) {
+            return mWifiVendorHal.isStaApConcurrencySupported();
+        }
+    }
+
+    /**
      * Get the supported features
      *
      * @param ifaceName Name of the interface.
diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java
index 0af51f7..26e6023 100644
--- a/service/java/com/android/server/wifi/WifiNetworkFactory.java
+++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java
@@ -128,6 +128,8 @@
     public final Map<String, LinkedHashSet<AccessPoint>> mUserApprovedAccessPointMap;
     private WifiScanner mWifiScanner;
     private CompanionDeviceManager mCompanionDeviceManager;
+    // Temporary approval set by shell commands.
+    private String mApprovedApp = null;
 
     private int mGenericConnectionReqCount = 0;
     // Request that is being actively processed. All new requests start out as an "active" request
@@ -643,11 +645,11 @@
                 return;
             }
             if (Objects.equals(mActiveSpecificNetworkRequest, networkRequest)) {
-                Log.i(TAG, "App released request, cancelling "
+                Log.i(TAG, "App released active request, cancelling "
                         + mActiveSpecificNetworkRequest);
                 teardownForActiveRequest();
             } else if (Objects.equals(mConnectedSpecificNetworkRequest, networkRequest)) {
-                Log.i(TAG, "App released request, cancelling "
+                Log.i(TAG, "App released connected request, cancelling "
                         + mConnectedSpecificNetworkRequest);
                 teardownForConnectedNetwork();
             } else {
@@ -983,6 +985,10 @@
 
     // Invoked at the termination of current active request processing.
     private void teardownForActiveRequest() {
+        if (mPendingConnectionSuccess) {
+            Log.i(TAG, "Disconnecting from network on reset");
+            disconnectAndRemoveNetworkFromWifiConfigManager(mUserSelectedNetwork);
+        }
         cleanupActiveRequest();
         // ensure there is no connected request in progress.
         if (mConnectedSpecificNetworkRequest == null) {
@@ -1317,6 +1323,10 @@
         if (isAccessPointApprovedInInternalApprovalList(scanResult, requestorPackageName)) {
             return scanResult;
         }
+        // Shell approved app
+        if (TextUtils.equals(mApprovedApp, requestorPackageName)) {
+            return scanResult;
+        }
         // no bypass approvals, show UI.
         return null;
     }
@@ -1439,6 +1449,26 @@
     }
 
     /**
+     * Sets all access points approved for the specified app.
+     * Used by shell commands.
+     */
+    public void setUserApprovedApp(@NonNull String packageName, boolean approved) {
+        if (approved) {
+            mApprovedApp = packageName;
+        } else if (TextUtils.equals(packageName, mApprovedApp)) {
+            mApprovedApp = null;
+        }
+    }
+
+    /**
+     * Whether all access points are approved for the specified app.
+     * Used by shell commands.
+     */
+    public boolean hasUserApprovedApp(@NonNull String packageName) {
+        return TextUtils.equals(packageName, mApprovedApp);
+    }
+
+    /**
      * Remove all user approved access points for the specified app.
      */
     public void removeUserApprovedAccessPointsForApp(@NonNull String packageName) {
@@ -1453,6 +1483,7 @@
      */
     public void clear() {
         mUserApprovedAccessPointMap.clear();
+        mApprovedApp = null;
         Log.i(TAG, "Cleared all internal state");
         saveToStore();
     }
diff --git a/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java b/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java
index c82539b..894a8bc 100644
--- a/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java
+++ b/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java
@@ -36,6 +36,7 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Icon;
 import android.net.MacAddress;
+import android.net.NetworkScoreManager;
 import android.net.wifi.ISuggestionConnectionStatusListener;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
@@ -58,7 +59,6 @@
 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
 import com.android.server.wifi.util.ExternalCallbackTracker;
 import com.android.server.wifi.util.LruConnectionTracker;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
 
@@ -105,40 +105,25 @@
     public static final String EXTRA_UID =
             "com.android.server.wifi.extra.NetworkSuggestion.UID";
 
-    @VisibleForTesting
-    public static final String EXTRA_CARRIER_NAME =
-            "com.android.server.wifi.extra.NetworkSuggestion.CARRIER_NAME";
-    @VisibleForTesting
-    public static final String EXTRA_CARRIER_ID =
-            "com.android.server.wifi.extra.NetworkSuggestion.CARRIER_ID";
-
-    /** Intent when user tapped action button to allow the app. */
-    @VisibleForTesting
-    public static final String NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION =
-            "com.android.server.wifi.action.NetworkSuggestion.USER_ALLOWED_CARRIER";
-    /** Intent when user tapped action button to disallow the app. */
-    @VisibleForTesting
-    public static final String NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION =
-            "com.android.server.wifi.action.NetworkSuggestion.USER_DISALLOWED_CARRIER";
-
     /**
      * Limit number of hidden networks attach to scan
      */
     private static final int NUMBER_OF_HIDDEN_NETWORK_FOR_ONE_SCAN = 100;
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final Resources mResources;
     private final Handler mHandler;
     private final AppOpsManager mAppOps;
     private final ActivityManager mActivityManager;
     private final NotificationManager mNotificationManager;
+    private final NetworkScoreManager mNetworkScoreManager;
     private final PackageManager mPackageManager;
     private final WifiPermissionsUtil mWifiPermissionsUtil;
     private final WifiConfigManager mWifiConfigManager;
     private final WifiMetrics mWifiMetrics;
     private final WifiInjector mWifiInjector;
     private final FrameworkFacade mFrameworkFacade;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
     private final WifiKeyStore mWifiKeyStore;
     // Keep order of network connection.
     private final LruConnectionTracker mLruConnectionTracker;
@@ -192,6 +177,24 @@
             // else ignored.
         }
 
+        /**
+         * Returns true if this app has the necessary approvals to place network suggestions.
+         */
+        private boolean isApproved(@Nullable String activeScorerPkg) {
+            return hasUserApproved || isExemptFromUserApproval(activeScorerPkg);
+        }
+
+        /**
+         * Returns true if this app can suggest networks without user approval.
+         */
+        private boolean isExemptFromUserApproval(@Nullable String activeScorerPkg) {
+            final boolean isCarrierPrivileged = carrierId != TelephonyManager.UNKNOWN_CARRIER_ID;
+            if (isCarrierPrivileged) {
+                return true;
+            }
+            return packageName.equals(activeScorerPkg);
+        }
+
         // This is only needed for comparison in unit tests.
         @Override
         public boolean equals(Object other) {
@@ -264,6 +267,17 @@
                     && TextUtils.equals(perAppInfo.packageName, other.perAppInfo.packageName);
         }
 
+        /**
+         * Helper method to set the carrier Id.
+         */
+        public void setCarrierId(int carrierId) {
+            if (wns.passpointConfiguration == null) {
+                wns.wifiConfiguration.carrierId = carrierId;
+            } else {
+                wns.passpointConfiguration.setCarrierId(carrierId);
+            }
+        }
+
         @Override
         public String toString() {
             return new StringBuilder(wns.toString())
@@ -331,7 +345,10 @@
     private final HashMap<String, ExternalCallbackTracker<ISuggestionConnectionStatusListener>>
             mSuggestionStatusListenerPerApp = new HashMap<>();
 
-    private final Map<Integer, Boolean> mImsiPrivacyProtectionExemptionMap = new HashMap<>();
+    /**
+     * Store the suggestion update listeners.
+     */
+    private final List<OnSuggestionUpdateListener> mListeners = new ArrayList<>();
 
     /**
      * Intent filter for processing notification actions.
@@ -452,35 +469,6 @@
         }
     }
 
-    /**
-     * Module to interact with the wifi config store.
-     */
-    private class ImsiProtectionExemptionDataSource implements
-            ImsiPrivacyProtectionExemptionStoreData.DataSource {
-        @Override
-        public Map<Integer, Boolean> toSerialize() {
-            // Clear the flag after writing to disk.
-            // TODO(b/115504887): Don't reset the flag on write failure.
-            mHasNewDataToSerialize = false;
-            return mImsiPrivacyProtectionExemptionMap;
-        }
-
-        @Override
-        public void fromDeserialized(Map<Integer, Boolean> imsiProtectionExemptionMap) {
-            mImsiPrivacyProtectionExemptionMap.putAll(imsiProtectionExemptionMap);
-        }
-
-        @Override
-        public void reset() {
-            mImsiPrivacyProtectionExemptionMap.clear();
-        }
-
-        @Override
-        public boolean hasNewDataToSerialize() {
-            return mHasNewDataToSerialize;
-        }
-    }
-
     private void handleUserAllowAction(int uid, String packageName) {
         Log.i(TAG, "User clicked to allow app");
         // Set the user approved flag.
@@ -503,59 +491,23 @@
         mUserApprovalUiActive = false;
     }
 
-    private void handleUserAllowCarrierExemptionAction(String carrierName, int carrierId) {
-        Log.i(TAG, "User clicked to allow carrier:" + carrierName);
-        setHasUserApprovedImsiPrivacyExemptionForCarrier(true, carrierId);
-        mUserApprovalUiActive = false;
-    }
-
-    private void handleUserDisallowCarrierExemptionAction(String carrierName, int carrierId) {
-        Log.i(TAG, "User clicked to disallow carrier:" + carrierName);
-        setHasUserApprovedImsiPrivacyExemptionForCarrier(false, carrierId);
-        mUserApprovalUiActive = false;
-    }
-
     private final BroadcastReceiver mBroadcastReceiver =
             new BroadcastReceiver() {
                 @Override
                 public void onReceive(Context context, Intent intent) {
                     String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
-                    String carrierName = intent.getStringExtra(EXTRA_CARRIER_NAME);
                     int uid = intent.getIntExtra(EXTRA_UID, -1);
-                    int carrierId = intent.getIntExtra(EXTRA_CARRIER_ID, -1);
-
+                    if (packageName == null || uid == -1) {
+                        Log.e(TAG, "No package name or uid found in intent");
+                        return;
+                    }
                     switch (intent.getAction()) {
                         case NOTIFICATION_USER_ALLOWED_APP_INTENT_ACTION:
-                            if (packageName == null || uid == -1) {
-                                Log.e(TAG, "No package name or uid found in intent");
-                                return;
-                            }
                             handleUserAllowAction(uid, packageName);
                             break;
                         case NOTIFICATION_USER_DISALLOWED_APP_INTENT_ACTION:
-                            if (packageName == null || uid == -1) {
-                                Log.e(TAG, "No package name or uid found in intent");
-                                return;
-                            }
                             handleUserDisallowAction(uid, packageName);
                             break;
-                        case NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION:
-                            if (carrierName == null || carrierId == -1) {
-                                Log.e(TAG, "No carrier name or carrier id found in intent");
-                                return;
-                            }
-                            Log.i(TAG, "User clicked to allow carrier");
-                            sendImsiPrivacyConfirmationDialog(carrierName, carrierId);
-                            // Collapse the notification bar
-                            mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
-                            break;
-                        case NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION:
-                            if (carrierName == null || carrierId == -1) {
-                                Log.e(TAG, "No carrier name or carrier id found in intent");
-                                return;
-                            }
-                            handleUserDisallowCarrierExemptionAction(carrierName, carrierId);
-                            break;
                         case NOTIFICATION_USER_DISMISSED_INTENT_ACTION:
                             handleUserDismissAction();
                             return; // no need to cancel a dismissed notification, return.
@@ -568,10 +520,33 @@
                 }
             };
 
-    public WifiNetworkSuggestionsManager(Context context, Handler handler,
+    /**
+     * Interface for other modules to listen to the suggestion updated events.
+     */
+    public interface OnSuggestionUpdateListener {
+        /**
+         * Invoked on suggestion being added or updated.
+         */
+        void onSuggestionsAddedOrUpdated(@NonNull List<WifiNetworkSuggestion> addedSuggestions);
+        /**
+         * Invoked on suggestion being removed.
+         */
+        void onSuggestionsRemoved(@NonNull List<WifiNetworkSuggestion> removedSuggestions);
+    }
+
+    private final class UserApproveCarrierListener implements
+            WifiCarrierInfoManager.OnUserApproveCarrierListener {
+
+        @Override
+        public void onUserAllowed(int carrierId) {
+            restoreInitialAutojoinForCarrierId(carrierId);
+        }
+    }
+
+    public WifiNetworkSuggestionsManager(WifiContext context, Handler handler,
             WifiInjector wifiInjector, WifiPermissionsUtil wifiPermissionsUtil,
             WifiConfigManager wifiConfigManager, WifiConfigStore wifiConfigStore,
-            WifiMetrics wifiMetrics, TelephonyUtil telephonyUtil,
+            WifiMetrics wifiMetrics, WifiCarrierInfoManager wifiCarrierInfoManager,
             WifiKeyStore keyStore, LruConnectionTracker lruConnectionTracker) {
         mContext = context;
         mResources = context.getResources();
@@ -580,28 +555,28 @@
         mActivityManager = context.getSystemService(ActivityManager.class);
         mNotificationManager =
                 (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+        mNetworkScoreManager = context.getSystemService(NetworkScoreManager.class);
         mPackageManager = context.getPackageManager();
         mWifiInjector = wifiInjector;
         mFrameworkFacade = mWifiInjector.getFrameworkFacade();
         mWifiPermissionsUtil = wifiPermissionsUtil;
         mWifiConfigManager = wifiConfigManager;
         mWifiMetrics = wifiMetrics;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         mWifiKeyStore = keyStore;
 
         // register the data store for serializing/deserializing data.
         wifiConfigStore.registerStoreData(
                 wifiInjector.makeNetworkSuggestionStoreData(new NetworkSuggestionDataSource()));
-        wifiConfigStore.registerStoreData(wifiInjector.makeImsiProtectionExemptionStoreData(
-                new ImsiProtectionExemptionDataSource()));
+
+        mWifiCarrierInfoManager.addImsiExemptionUserApprovalListener(
+                new UserApproveCarrierListener());
 
         // Register broadcast receiver for UI interactions.
         mIntentFilter = new IntentFilter();
         mIntentFilter.addAction(NOTIFICATION_USER_ALLOWED_APP_INTENT_ACTION);
         mIntentFilter.addAction(NOTIFICATION_USER_DISALLOWED_APP_INTENT_ACTION);
         mIntentFilter.addAction(NOTIFICATION_USER_DISMISSED_INTENT_ACTION);
-        mIntentFilter.addAction(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION);
-        mIntentFilter.addAction(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION);
 
         mContext.registerReceiver(mBroadcastReceiver, mIntentFilter, null, handler);
         mLruConnectionTracker = lruConnectionTracker;
@@ -794,21 +769,44 @@
                         Collectors.toSet()));
     }
 
+    private void updateWifiConfigInWcmIfPresent(
+            WifiConfiguration newConfig, int uid, String packageName) {
+        WifiConfiguration configInWcm =
+                mWifiConfigManager.getConfiguredNetwork(newConfig.getKey());
+        if (configInWcm == null) return;
+        // !suggestion
+        if (!configInWcm.fromWifiNetworkSuggestion) return;
+        // is suggestion from same app.
+        if (configInWcm.creatorUid != uid
+                || !TextUtils.equals(configInWcm.creatorName, packageName)) {
+            return;
+        }
+        NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(
+                newConfig, uid, packageName);
+        if (!result.isSuccess()) {
+            Log.e(TAG, "Failed to update config in WifiConfigManager");
+        } else {
+            if (mVerboseLoggingEnabled) {
+                Log.v(TAG, "Updated config in WifiConfigManager");
+            }
+        }
+    }
+
     /**
      * Add the provided list of network suggestions from the corresponding app's active list.
      */
     public @WifiManager.NetworkSuggestionsStatusCode int add(
             List<WifiNetworkSuggestion> networkSuggestions, int uid, String packageName,
             @Nullable String featureId) {
-        if (mVerboseLoggingEnabled) {
-            Log.v(TAG, "Adding " + networkSuggestions.size() + " networks from " + packageName);
-        }
-        if (networkSuggestions.isEmpty()) {
+        if (networkSuggestions == null || networkSuggestions.isEmpty()) {
             Log.w(TAG, "Empty list of network suggestions for " + packageName + ". Ignoring");
             return WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS;
         }
+        if (mVerboseLoggingEnabled) {
+            Log.v(TAG, "Adding " + networkSuggestions.size() + " networks from " + packageName);
+        }
         if (!validateNetworkSuggestions(networkSuggestions)) {
-            Log.e(TAG, "Invalid suggestion from app: " + packageName);
+            Log.e(TAG, "Invalid suggestion add from app: " + packageName);
             return WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID;
         }
         if (!validateCarrierNetworkSuggestions(networkSuggestions, uid, packageName)) {
@@ -816,7 +814,9 @@
             return WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED;
         }
 
-        int carrierId = mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(packageName);
+        int carrierId = mWifiCarrierInfoManager
+                .getCarrierIdForPackageWithCarrierPrivileges(packageName);
+        final String activeScorerPackage = mNetworkScoreManager.getActiveScorerPackage();
         PerAppInfo perAppInfo = mActiveNetworkSuggestionsPerApp.get(packageName);
         if (perAppInfo == null) {
             perAppInfo = new PerAppInfo(uid, packageName, featureId);
@@ -827,6 +827,10 @@
             } else if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
                 Log.i(TAG, "Setting the carrier privileged app approved");
                 perAppInfo.carrierId = carrierId;
+            } else if (perAppInfo.packageName.equals(activeScorerPackage)) {
+                Log.i(TAG, "Exempting the active scorer app");
+                // nothing more to do, user approval related checks are done at network selection
+                // time (which also takes care of any dynamic changes in active scorer).
             } else {
                 if (isSuggestionFromForegroundApp(packageName)) {
                     sendUserApprovalDialog(packageName, uid);
@@ -862,10 +866,21 @@
         }
 
         for (ExtendedWifiNetworkSuggestion ewns: extNetworkSuggestions) {
-            if (ewns.wns.passpointConfiguration == null) {
-                if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
-                    ewns.wns.wifiConfiguration.carrierId = carrierId;
+            if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
+                ewns.setCarrierId(carrierId);
+            }
+            // If network has no IMSI protection and user didn't approve exemption, make it initial
+            // auto join disabled
+            if (isSimBasedSuggestion(ewns)) {
+                int subId = mWifiCarrierInfoManager
+                        .getMatchingSubId(getCarrierIdFromSuggestion(ewns));
+                if (!(mWifiCarrierInfoManager.requiresImsiEncryption(subId)
+                        || mWifiCarrierInfoManager.hasUserApprovedImsiPrivacyExemptionForCarrier(
+                        getCarrierIdFromSuggestion(ewns)))) {
+                    ewns.isAutojoinEnabled = false;
                 }
+            }
+            if (ewns.wns.passpointConfiguration == null) {
                 if (ewns.wns.wifiConfiguration.isEnterprise()) {
                     if (!mWifiKeyStore.updateNetworkKeys(ewns.wns.wifiConfiguration, null)) {
                         Log.e(TAG, "Enterprise network install failure for SSID: "
@@ -873,11 +888,13 @@
                         continue;
                     }
                 }
+                // If we have a config in WifiConfigManager for this suggestion, update
+                // WifiConfigManager with the latest WifiConfig.
+                // Note: Similar logic is present in PasspointManager for passpoint networks.
+                updateWifiConfigInWcmIfPresent(
+                        ewns.createInternalWifiConfiguration(), uid, packageName);
                 addToScanResultMatchInfoMap(ewns);
             } else {
-                if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
-                    ewns.wns.passpointConfiguration.setCarrierId(carrierId);
-                }
                 ewns.wns.passpointConfiguration.setAutojoinEnabled(ewns.isAutojoinEnabled);
                 // Install Passpoint config, if failure, ignore that suggestion
                 if (!mWifiInjector.getPasspointManager().addOrUpdateProvider(
@@ -889,19 +906,12 @@
                 }
                 addToPasspointInfoMap(ewns);
             }
-            // If network has no IMSI protection and user didn't approve exemption, make it initial
-            // auto join disabled
-            if (isSimBasedSuggestion(ewns)) {
-                int subId = mTelephonyUtil.getMatchingSubId(getCarrierIdFromSuggestion(ewns));
-                if (!(mTelephonyUtil.requiresImsiEncryption(subId)
-                        || hasUserApprovedImsiPrivacyExemptionForCarrier(
-                                getCarrierIdFromSuggestion(ewns)))) {
-                    ewns.isAutojoinEnabled = false;
-                }
-            }
             perAppInfo.extNetworkSuggestions.remove(ewns);
             perAppInfo.extNetworkSuggestions.add(ewns);
         }
+        for (OnSuggestionUpdateListener listener : mListeners) {
+            listener.onSuggestionsAddedOrUpdated(networkSuggestions);
+        }
         // Update the max size for this app.
         perAppInfo.maxSize = Math.max(perAppInfo.extNetworkSuggestions.size(), perAppInfo.maxSize);
         saveToStore();
@@ -928,6 +938,9 @@
 
     private boolean validateNetworkSuggestions(List<WifiNetworkSuggestion> networkSuggestions) {
         for (WifiNetworkSuggestion wns : networkSuggestions) {
+            if (wns == null || wns.wifiConfiguration == null) {
+                return false;
+            }
             if (wns.passpointConfiguration == null) {
                 if (!WifiConfigurationUtil.validate(wns.wifiConfiguration,
                         WifiConfigurationUtil.VALIDATE_FOR_ADD)) {
@@ -945,7 +958,7 @@
     private boolean validateCarrierNetworkSuggestions(
             List<WifiNetworkSuggestion> networkSuggestions, int uid, String packageName) {
         if (mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(uid)
-                || mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(packageName)
+                || mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(packageName)
                 != TelephonyManager.UNKNOWN_CARRIER_ID) {
             return true;
         }
@@ -994,11 +1007,11 @@
             @NonNull String packageName,
             @NonNull PerAppInfo perAppInfo) {
         // Get internal suggestions
-        Set<ExtendedWifiNetworkSuggestion> removingSuggestions =
+        Set<ExtendedWifiNetworkSuggestion> removingExtSuggestions =
                 new HashSet<>(perAppInfo.extNetworkSuggestions);
         if (!extNetworkSuggestions.isEmpty()) {
             // Keep the internal suggestions need to remove.
-            removingSuggestions.retainAll(extNetworkSuggestions);
+            removingExtSuggestions.retainAll(extNetworkSuggestions);
             perAppInfo.extNetworkSuggestions.removeAll(extNetworkSuggestions);
         } else {
             // empty list is used to clear everything for the app. Store a copy for use below.
@@ -1013,7 +1026,8 @@
             stopTrackingAppOpsChange(packageName);
         }
         // Clear the cache.
-        for (ExtendedWifiNetworkSuggestion ewns : removingSuggestions) {
+        List<WifiNetworkSuggestion> removingSuggestions = new ArrayList<>();
+        for (ExtendedWifiNetworkSuggestion ewns : removingExtSuggestions) {
             if (ewns.wns.passpointConfiguration != null) {
                 // Clear the Passpoint config.
                 mWifiInjector.getPasspointManager().removeProvider(
@@ -1027,9 +1041,13 @@
                 }
                 removeFromScanResultMatchInfoMapAndRemoveRelatedScoreCard(ewns);
             }
+            removingSuggestions.add(ewns.wns);
+        }
+        for (OnSuggestionUpdateListener listener : mListeners) {
+            listener.onSuggestionsRemoved(removingSuggestions);
         }
         // Disconnect suggested network if connected
-        removeFromConfigManagerIfServingNetworkSuggestionRemoved(removingSuggestions);
+        removeFromConfigManagerIfServingNetworkSuggestionRemoved(removingExtSuggestions);
     }
 
     /**
@@ -1037,9 +1055,18 @@
      */
     public @WifiManager.NetworkSuggestionsStatusCode int remove(
             List<WifiNetworkSuggestion> networkSuggestions, int uid, String packageName) {
+        if (networkSuggestions == null) {
+            Log.w(TAG, "Null list of network suggestions for " + packageName + ". Ignoring");
+            return WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS;
+        }
         if (mVerboseLoggingEnabled) {
             Log.v(TAG, "Removing " + networkSuggestions.size() + " networks from " + packageName);
         }
+
+        if (!validateNetworkSuggestions(networkSuggestions)) {
+            Log.e(TAG, "Invalid suggestion remove from app: " + packageName);
+            return WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID;
+        }
         PerAppInfo perAppInfo = mActiveNetworkSuggestionsPerApp.get(packageName);
         if (perAppInfo == null) {
             Log.e(TAG, "Failed to remove network suggestions for " + packageName
@@ -1105,7 +1132,6 @@
             iter.remove();
         }
         mSuggestionStatusListenerPerApp.clear();
-        mImsiPrivacyProtectionExemptionMap.clear();
         saveToStore();
         Log.i(TAG, "Cleared all internal state");
     }
@@ -1136,37 +1162,6 @@
     }
 
     /**
-     * Clear the Imsi Privacy Exemption user approval info the target carrier.
-     */
-    public void clearImsiPrivacyExemptionForCarrier(int carrierId) {
-        mImsiPrivacyProtectionExemptionMap.remove(carrierId);
-        saveToStore();
-    }
-
-    /**
-     * Check if carrier have user approved exemption for IMSI protection
-     */
-    public boolean hasUserApprovedImsiPrivacyExemptionForCarrier(int carrierId) {
-        return  mImsiPrivacyProtectionExemptionMap.getOrDefault(carrierId, false);
-    }
-
-    /**
-     * Enable or disable exemption on IMSI protection.
-     */
-    public void setHasUserApprovedImsiPrivacyExemptionForCarrier(boolean approved, int carrierId) {
-        if (mVerboseLoggingEnabled) {
-            Log.v(TAG, "Setting Imsi privacy exemption for carrier " + carrierId
-                    + (approved ? " approved" : " not approved"));
-        }
-        mImsiPrivacyProtectionExemptionMap.put(carrierId, approved);
-        // If user approved the exemption restore to initial auto join configure.
-        if (approved) {
-            restoreInitialAutojoinForCarrierId(carrierId);
-        }
-        saveToStore();
-    }
-
-    /**
      * When user approve the IMSI protection exemption for carrier, restore the initial auto join
      * configure. If user already change it to enabled, keep that choice.
      */
@@ -1196,10 +1191,11 @@
     /**
      * Get all user approved, non-passpoint networks from suggestion.
      */
-    public List<WifiConfiguration> getAllPnoAvailableSuggestionNetworks() {
+    public List<WifiConfiguration> getAllScanOptimizationSuggestionNetworks() {
         List<WifiConfiguration> networks = new ArrayList<>();
+        final String activeScorerPackage = mNetworkScoreManager.getActiveScorerPackage();
         for (PerAppInfo info : mActiveNetworkSuggestionsPerApp.values()) {
-            if (!info.hasUserApproved && info.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) {
+            if (!info.isApproved(activeScorerPackage)) {
                 continue;
             }
             for (ExtendedWifiNetworkSuggestion ewns : info.extNetworkSuggestions) {
@@ -1305,7 +1301,7 @@
         CharSequence appName = getAppName(packageName, uid);
         Notification notification = mFrameworkFacade.makeNotificationBuilder(
                 mContext, WifiService.NOTIFICATION_NETWORK_STATUS)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
                 .setTicker(mResources.getString(R.string.wifi_suggestion_title))
                 .setContentTitle(mResources.getString(R.string.wifi_suggestion_title))
@@ -1327,83 +1323,6 @@
         mUserApprovalUiActive = true;
     }
 
-    private void sendImsiPrivacyNotification(@NonNull String carrierName, int carrierId) {
-        Notification.Action userAllowAppNotificationAction =
-                new Notification.Action.Builder(null,
-                        mResources.getText(R.string
-                                .wifi_suggestion_action_allow_imsi_privacy_exemption_carrier),
-                        getPrivateBroadcast(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
-                                Pair.create(EXTRA_CARRIER_NAME, carrierName),
-                                Pair.create(EXTRA_CARRIER_ID, carrierId)))
-                        .build();
-        Notification.Action userDisallowAppNotificationAction =
-                new Notification.Action.Builder(null,
-                        mResources.getText(R.string
-                                .wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier),
-                        getPrivateBroadcast(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION,
-                                Pair.create(EXTRA_CARRIER_NAME, carrierName),
-                                Pair.create(EXTRA_CARRIER_ID, carrierId)))
-                        .build();
-
-        Notification notification = mFrameworkFacade.makeNotificationBuilder(
-                mContext, WifiService.NOTIFICATION_NETWORK_STATUS)
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
-                        com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
-                .setTicker(mResources.getString(
-                        R.string.wifi_suggestion_imsi_privacy_title, carrierName))
-                .setContentTitle(mResources.getString(
-                        R.string.wifi_suggestion_imsi_privacy_title, carrierName))
-                .setStyle(new Notification.BigTextStyle()
-                        .bigText(mResources.getString(
-                                R.string.wifi_suggestion_imsi_privacy_content)))
-                .setDeleteIntent(getPrivateBroadcast(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
-                        Pair.create(EXTRA_CARRIER_NAME, carrierName),
-                        Pair.create(EXTRA_CARRIER_ID, carrierId)))
-                .setShowWhen(false)
-                .setLocalOnly(true)
-                .setColor(mResources.getColor(android.R.color.system_notification_accent_color,
-                        mContext.getTheme()))
-                .addAction(userDisallowAppNotificationAction)
-                .addAction(userAllowAppNotificationAction)
-                .build();
-
-        // Post the notification.
-        mNotificationManager.notify(
-                SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE, notification);
-        mUserApprovalUiActive = true;
-    }
-
-    private void sendImsiPrivacyConfirmationDialog(@NonNull String carrierName, int carrierId) {
-        AlertDialog dialog = mFrameworkFacade.makeAlertDialogBuilder(mContext)
-                .setTitle(mResources.getString(
-                        R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_title))
-                .setMessage(mResources.getString(
-                        R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_content,
-                        carrierName))
-                .setPositiveButton(mResources.getText(
-                        R.string.wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation),
-                        (d, which) -> mHandler.post(
-                                () -> handleUserAllowCarrierExemptionAction(
-                                        carrierName, carrierId)))
-                .setNegativeButton(mResources.getText(
-                        R.string.wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation),
-                        (d, which) -> mHandler.post(
-                                () -> handleUserDisallowCarrierExemptionAction(
-                                        carrierName, carrierId)))
-                .setOnDismissListener(
-                        (d) -> mHandler.post(this::handleUserDismissAction))
-                .setOnCancelListener(
-                        (d) -> mHandler.post(this::handleUserDismissAction))
-                .create();
-        dialog.setCanceledOnTouchOutside(false);
-        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
-        dialog.getWindow().addSystemFlags(
-                WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS);
-        dialog.show();
-        mUserApprovalUiActive = true;
-    }
-
-
     /**
      * Send user approval notification if the app is not approved
      * @param packageName app package name
@@ -1428,24 +1347,6 @@
         return true;
     }
 
-    /**
-     * Send notification for exemption of IMSI protection if user never made choice before.
-     */
-    private void sendImsiProtectionExemptionNotificationIfRequired(int carrierId) {
-        int subId = mTelephonyUtil.getMatchingSubId(carrierId);
-        if (mTelephonyUtil.requiresImsiEncryption(subId)) {
-            return;
-        }
-        if (mImsiPrivacyProtectionExemptionMap.containsKey(carrierId)) {
-            return;
-        }
-        if (mUserApprovalUiActive) {
-            return;
-        }
-        Log.i(TAG, "Sending IMSI protection notification for " + carrierId);
-        sendImsiPrivacyNotification(mTelephonyUtil.getCarrierNameforSubId(subId), carrierId);
-    }
-
     private @Nullable Set<ExtendedWifiNetworkSuggestion>
             getNetworkSuggestionsForScanResultMatchInfo(
             @NonNull ScanResultMatchInfo scanResultMatchInfo, @Nullable MacAddress bssid) {
@@ -1486,17 +1387,17 @@
         if (extNetworkSuggestions == null) {
             return null;
         }
+        final String activeScorerPackage = mNetworkScoreManager.getActiveScorerPackage();
         Set<ExtendedWifiNetworkSuggestion> approvedExtNetworkSuggestions = new HashSet<>();
         for (ExtendedWifiNetworkSuggestion ewns : extNetworkSuggestions) {
-            if (!ewns.perAppInfo.hasUserApproved
-                    && ewns.perAppInfo.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) {
+            if (!ewns.perAppInfo.isApproved(activeScorerPackage)) {
                 sendUserApprovalNotificationIfNotApproved(ewns.perAppInfo.packageName,
                         ewns.perAppInfo.uid);
                 continue;
             }
             if (isSimBasedSuggestion(ewns)) {
-                int carrierId = getCarrierIdFromSuggestion(ewns);
-                sendImsiProtectionExemptionNotificationIfRequired(carrierId);
+                mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(
+                        getCarrierIdFromSuggestion(ewns));
             }
             approvedExtNetworkSuggestions.add(ewns);
         }
@@ -1533,17 +1434,17 @@
         if (extNetworkSuggestions == null) {
             return null;
         }
+        final String activeScorerPackage = mNetworkScoreManager.getActiveScorerPackage();
         Set<ExtendedWifiNetworkSuggestion> approvedExtNetworkSuggestions = new HashSet<>();
         for (ExtendedWifiNetworkSuggestion ewns : extNetworkSuggestions) {
-            if (!ewns.perAppInfo.hasUserApproved
-                    && ewns.perAppInfo.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) {
+            if (!ewns.perAppInfo.isApproved(activeScorerPackage)) {
                 sendUserApprovalNotificationIfNotApproved(ewns.perAppInfo.packageName,
                         ewns.perAppInfo.uid);
                 continue;
             }
             if (isSimBasedSuggestion(ewns)) {
-                int carrierId = getCarrierIdFromSuggestion(ewns);
-                sendImsiProtectionExemptionNotificationIfRequired(carrierId);
+                mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(
+                        getCarrierIdFromSuggestion(ewns));
             }
             approvedExtNetworkSuggestions.add(ewns);
         }
@@ -1580,11 +1481,11 @@
         if (extNetworkSuggestions == null || extNetworkSuggestions.isEmpty()) {
             return null;
         }
+        final String activeScorerPackage = mNetworkScoreManager.getActiveScorerPackage();
         Set<ExtendedWifiNetworkSuggestion> approvedExtNetworkSuggestions =
                 extNetworkSuggestions
                         .stream()
-                        .filter(n -> n.perAppInfo.hasUserApproved
-                                || n.perAppInfo.carrierId != TelephonyManager.UNKNOWN_CARRIER_ID)
+                        .filter(n -> n.perAppInfo.isApproved(activeScorerPackage))
                         .collect(Collectors.toSet());
         if (approvedExtNetworkSuggestions.isEmpty()) {
             return null;
@@ -1603,6 +1504,8 @@
      */
     public @NonNull List<WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(
             List<ScanResult> scanResults) {
+        // Create a HashSet to avoid return multiple result for duplicate ScanResult.
+        Set<String> networkKeys = new HashSet<>();
         List<WifiConfiguration> sharedWifiConfigs = new ArrayList<>();
         for (ScanResult scanResult : scanResults) {
             ScanResultMatchInfo scanResultMatchInfo =
@@ -1636,7 +1539,9 @@
             if (existingConfig == null || !existingConfig.fromWifiNetworkSuggestion) {
                 continue;
             }
-            sharedWifiConfigs.add(existingConfig);
+            if (networkKeys.add(existingConfig.getKey())) {
+                sharedWifiConfigs.add(existingConfig);
+            }
         }
         return sharedWifiConfigs;
     }
@@ -1646,7 +1551,7 @@
      */
     public boolean isPasspointSuggestionSharedWithUser(WifiConfiguration config) {
         if (WifiConfiguration.isMetered(config, null)
-                && mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config)) {
+                && mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config)) {
             return false;
         }
         Set<ExtendedWifiNetworkSuggestion> extendedWifiNetworkSuggestions =
@@ -1973,17 +1878,18 @@
     public void resetCarrierPrivilegedApps() {
         Log.w(TAG, "SIM state is changed!");
         for (PerAppInfo appInfo : mActiveNetworkSuggestionsPerApp.values()) {
-            int carrierId = mTelephonyUtil
+            int carrierId = mWifiCarrierInfoManager
                     .getCarrierIdForPackageWithCarrierPrivileges(appInfo.packageName);
             if (carrierId == appInfo.carrierId) {
                 continue;
             }
             if (carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) {
-                Log.v(TAG, "Carrier privilege revoked for " + appInfo.packageName);
+                Log.i(TAG, "Carrier privilege revoked for " + appInfo.packageName);
                 removeInternal(Collections.EMPTY_LIST, appInfo.packageName, appInfo);
                 mActiveNetworkSuggestionsPerApp.remove(appInfo.packageName);
                 continue;
             }
+            Log.i(TAG, "Carrier privilege granted for " + appInfo.packageName);
             appInfo.carrierId = carrierId;
             for (ExtendedWifiNetworkSuggestion ewns : appInfo.extNetworkSuggestions) {
                 ewns.wns.wifiConfiguration.carrierId = carrierId;
@@ -2031,7 +1937,14 @@
             @NonNull List<WifiNetworkSuggestion> wifiNetworkSuggestions,
             @NonNull List<ScanResult> scanResults) {
         Map<WifiNetworkSuggestion, List<ScanResult>> filteredScanResults = new HashMap<>();
+        if (wifiNetworkSuggestions == null || wifiNetworkSuggestions.isEmpty()
+                || scanResults == null || scanResults.isEmpty()) {
+            return filteredScanResults;
+        }
         for (WifiNetworkSuggestion suggestion : wifiNetworkSuggestions) {
+            if (suggestion == null || suggestion.wifiConfiguration == null) {
+                continue;
+            }
             if (suggestion.passpointConfiguration != null) {
                 filteredScanResults.put(suggestion,
                         mWifiInjector.getPasspointManager().getMatchingScanResults(
@@ -2071,11 +1984,19 @@
     }
 
     /**
+     * Add the suggestion update event listener
+     */
+    public void addOnSuggestionUpdateListener(OnSuggestionUpdateListener listener) {
+        mListeners.add(listener);
+    }
+
+    /**
      * Dump of {@link WifiNetworkSuggestionsManager}.
      */
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("Dump of WifiNetworkSuggestionsManager");
         pw.println("WifiNetworkSuggestionsManager - Networks Begin ----");
+        final String activeScorerPackage = mNetworkScoreManager.getActiveScorerPackage();
         for (Map.Entry<String, PerAppInfo> networkSuggestionsEntry
                 : mActiveNetworkSuggestionsPerApp.entrySet()) {
             pw.println("Package Name: " + networkSuggestionsEntry.getKey());
@@ -2083,6 +2004,7 @@
             pw.println("Has user approved: " + appInfo.hasUserApproved);
             pw.println("Has carrier privileges: "
                     + (appInfo.carrierId != TelephonyManager.UNKNOWN_CARRIER_ID));
+            pw.println("Is active scorer: " + appInfo.packageName.equals(activeScorerPackage));
             for (ExtendedWifiNetworkSuggestion extNetworkSuggestion
                     : appInfo.extNetworkSuggestions) {
                 pw.println("Network: " + extNetworkSuggestion);
diff --git a/service/java/com/android/server/wifi/WifiScoreCard.java b/service/java/com/android/server/wifi/WifiScoreCard.java
index 79c9ccb..4f12470 100644
--- a/service/java/com/android/server/wifi/WifiScoreCard.java
+++ b/service/java/com/android/server/wifi/WifiScoreCard.java
@@ -27,6 +27,7 @@
 import static com.android.server.wifi.WifiHealthMonitor.REASON_AUTH_FAILURE;
 import static com.android.server.wifi.WifiHealthMonitor.REASON_CONNECTION_FAILURE;
 import static com.android.server.wifi.WifiHealthMonitor.REASON_DISCONNECTION_NONLOCAL;
+import static com.android.server.wifi.WifiHealthMonitor.REASON_NO_FAILURE;
 import static com.android.server.wifi.WifiHealthMonitor.REASON_SHORT_CONNECTION_NONLOCAL;
 
 import android.annotation.IntDef;
@@ -104,10 +105,6 @@
     // disconnection stats collection.
     private static final int LAST_RSSI_POLL_MAX_INTERVAL_MS = 3_100;
 
-    // Minimum number of connection attempts to qualify abnormal auth detection
-    static final int MIN_NUM_CONNECTION_ATTEMPT_ABNORMAL_AUTH_FAILURE = 5;
-    static final int FAILURE_PERCENT_THRESHOLD_ABNORMAL_AUTH_FAILURE = 80;
-
     static final int INSUFFICIENT_RECENT_STATS = 0;
     static final int SUFFICIENT_RECENT_STATS_ONLY = 1;
     static final int SUFFICIENT_RECENT_PREV_STATS = 2;
@@ -258,7 +255,7 @@
      * Handle network disconnection or shutdown event
      */
     public void resetConnectionState() {
-        String ssidDisconnected = (mAttemptingSwitch) ? mSsidPrev : mSsidCurr;
+        String ssidDisconnected = mAttemptingSwitch ? mSsidPrev : mSsidCurr;
         updatePerNetwork(Event.DISCONNECTION, ssidDisconnected, INVALID_RSSI, LINK_SPEED_UNKNOWN,
                 UNKNOWN_REASON);
         if (mVerboseLoggingEnabled && mTsConnectionAttemptStart > TS_NONE && !mAttemptingSwitch) {
@@ -565,20 +562,90 @@
     }
 
     /**
-     * Detect abnormal authentication failure at high RSSI with enough connection attempts
-     * and high failure rate
-     * @return true if abnormal auth failure is detected, false otherwise
+     * Detect abnormal disconnection at high RSSI with a high rate
      */
-    public boolean detectAbnormalAuthFailure(String ssid) {
+    public int detectAbnormalDisconnection() {
+        String ssid = mAttemptingSwitch ? mSsidPrev : mSsidCurr;
         PerNetwork perNetwork = lookupNetwork(ssid);
         NetworkConnectionStats recentStats = perNetwork.getRecentStats();
-        logd("detectAbnormalAuthFailure: " + recentStats.toString());
-        int numAuthFailure = recentStats.getCount(CNT_AUTHENTICATION_FAILURE);
-        int numAttempt = recentStats.getCount(CNT_CONNECTION_ATTEMPT);
-        boolean hasEnoughAttempt = numAttempt >=  MIN_NUM_CONNECTION_ATTEMPT_ABNORMAL_AUTH_FAILURE;
-        boolean isAuthFailureRateHigh = (numAuthFailure * 100)
-                >= (numAttempt * FAILURE_PERCENT_THRESHOLD_ABNORMAL_AUTH_FAILURE);
-        return hasEnoughAttempt && isAuthFailureRateHigh;
+        if (recentStats.getRecentCountCode() == CNT_SHORT_CONNECTION_NONLOCAL) {
+            return detectAbnormalFailureReason(recentStats, CNT_SHORT_CONNECTION_NONLOCAL,
+                    REASON_SHORT_CONNECTION_NONLOCAL,
+                    mDeviceConfigFacade.getShortConnectionNonlocalHighThrPercent(),
+                    mDeviceConfigFacade.getShortConnectionNonlocalCountMin(),
+                    CNT_DISCONNECTION);
+        } else if (recentStats.getRecentCountCode() == CNT_DISCONNECTION_NONLOCAL) {
+            return detectAbnormalFailureReason(recentStats, CNT_DISCONNECTION_NONLOCAL,
+                    REASON_DISCONNECTION_NONLOCAL,
+                    mDeviceConfigFacade.getDisconnectionNonlocalHighThrPercent(),
+                    mDeviceConfigFacade.getDisconnectionNonlocalCountMin(),
+                    CNT_DISCONNECTION);
+        } else {
+            return REASON_NO_FAILURE;
+        }
+    }
+
+    /**
+     * Detect abnormal connection failure at high RSSI with a high rate
+     */
+    public int detectAbnormalConnectionFailure(String ssid) {
+        PerNetwork perNetwork = lookupNetwork(ssid);
+        NetworkConnectionStats recentStats = perNetwork.getRecentStats();
+        int recentCountCode = recentStats.getRecentCountCode();
+        if (recentCountCode == CNT_AUTHENTICATION_FAILURE) {
+            return detectAbnormalFailureReason(recentStats, CNT_AUTHENTICATION_FAILURE,
+                    REASON_AUTH_FAILURE,
+                    mDeviceConfigFacade.getAuthFailureHighThrPercent(),
+                    mDeviceConfigFacade.getAuthFailureCountMin(),
+                    CNT_CONNECTION_ATTEMPT);
+        } else if (recentCountCode == CNT_ASSOCIATION_REJECTION) {
+            return detectAbnormalFailureReason(recentStats, CNT_ASSOCIATION_REJECTION,
+                    REASON_ASSOC_REJECTION,
+                    mDeviceConfigFacade.getAssocRejectionHighThrPercent(),
+                    mDeviceConfigFacade.getAssocRejectionCountMin(),
+                    CNT_CONNECTION_ATTEMPT);
+        } else if (recentCountCode == CNT_ASSOCIATION_TIMEOUT) {
+            return detectAbnormalFailureReason(recentStats, CNT_ASSOCIATION_TIMEOUT,
+                    REASON_ASSOC_TIMEOUT,
+                    mDeviceConfigFacade.getAssocTimeoutHighThrPercent(),
+                    mDeviceConfigFacade.getAssocTimeoutCountMin(),
+                    CNT_CONNECTION_ATTEMPT);
+        } else if (recentCountCode == CNT_CONNECTION_FAILURE) {
+            return detectAbnormalFailureReason(recentStats, CNT_CONNECTION_FAILURE,
+                    REASON_CONNECTION_FAILURE,
+                    mDeviceConfigFacade.getConnectionFailureHighThrPercent(),
+                    mDeviceConfigFacade.getConnectionFailureCountMin(),
+                    CNT_CONNECTION_ATTEMPT);
+        } else {
+            return REASON_NO_FAILURE;
+        }
+    }
+
+    private int detectAbnormalFailureReason(NetworkConnectionStats stats, int countCode,
+            int reasonCode, int highThresholdPercent, int minCount, int refCountCode) {
+        // To detect abnormal failure which may trigger bugReport,
+        // increase the detection threshold by thresholdRatio
+        int thresholdRatio =
+                mDeviceConfigFacade.getBugReportThresholdExtraRatio();
+        if (isHighPercentageAndEnoughCount(stats, countCode, reasonCode,
+                highThresholdPercent * thresholdRatio,
+                minCount * thresholdRatio,
+                refCountCode)) {
+            return reasonCode;
+        } else {
+            return REASON_NO_FAILURE;
+        }
+    }
+
+    private boolean isHighPercentageAndEnoughCount(NetworkConnectionStats stats, int countCode,
+            int reasonCode, int highThresholdPercent, int minCount, int refCountCode) {
+        highThresholdPercent = Math.min(highThresholdPercent, 100);
+        // Use Laplace's rule of succession, useful especially for a small
+        // connection attempt count
+        // R = (f+1)/(n+2) with a pseudo count of 2 (one for f and one for s)
+        return ((stats.getCount(countCode) >= minCount)
+                && ((stats.getCount(countCode) + 1) * 100)
+                >= (highThresholdPercent * (stats.getCount(refCountCode) + 2)));
     }
 
     final class PerBssid extends MemoryStoreAccessBase {
@@ -771,6 +838,7 @@
                     if (rssi >= mDeviceConfigFacade.getHealthMonitorMinRssiThrDbm()) {
                         if (failureReason != BssidBlocklistMonitor.REASON_WRONG_PASSWORD) {
                             mRecentStats.incrementCount(CNT_CONNECTION_FAILURE);
+                            mRecentStats.incrementCount(CNT_CONSECUTIVE_CONNECTION_FAILURE);
                         }
                         switch (failureReason) {
                             case BssidBlocklistMonitor.REASON_AP_UNABLE_TO_HANDLE_NEW_STA:
@@ -837,6 +905,9 @@
                     }
                 }
             }
+            // Reset CNT_CONSECUTIVE_CONNECTION_FAILURE here so that it can report the correct
+            // failure count after a connection success
+            mRecentStats.clearCount(CNT_CONSECUTIVE_CONNECTION_FAILURE);
             mConnectionSessionStartTimeMs = TS_NONE;
             mLastRssiPollTimeMs = TS_NONE;
         }
@@ -999,12 +1070,8 @@
 
         private boolean recentStatsHighDetection(FailureStats statsHigh, int countCode,
                 int reasonCode, int highThresholdPercent, int minCount, int refCountCode) {
-            // Use Laplace's rule of succession, useful especially for a small
-            // connection attempt count
-            // R = (f+1)/(n+2) with a pseudo count of 2 (one for f and one for s)
-            if ((((mRecentStats.getCount(countCode) + 1) * 100)
-                    >= (highThresholdPercent * (mRecentStats.getCount(refCountCode) + 2)))
-                    && (mRecentStats.getCount(countCode) >= minCount)) {
+            if (isHighPercentageAndEnoughCount(mRecentStats, countCode, reasonCode,
+                    highThresholdPercent, minCount, refCountCode)) {
                 statsHigh.incrementCount(reasonCode);
                 return true;
             }
@@ -1152,6 +1219,7 @@
     }
 
     // Codes for various connection related counts
+    public static final int CNT_INVALID = -1;
     public static final int CNT_CONNECTION_ATTEMPT = 0;
     public static final int CNT_CONNECTION_FAILURE = 1;
     public static final int CNT_CONNECTION_DURATION_SEC = 2;
@@ -1161,8 +1229,9 @@
     public static final int CNT_SHORT_CONNECTION_NONLOCAL = 6;
     public static final int CNT_DISCONNECTION_NONLOCAL = 7;
     public static final int CNT_DISCONNECTION = 8;
+    public static final int CNT_CONSECUTIVE_CONNECTION_FAILURE = 9;
     // Constant being used to keep track of how many counter there are.
-    public static final int NUMBER_CONNECTION_CNT_CODE = 9;
+    public static final int NUMBER_CONNECTION_CNT_CODE = 10;
     private static final String[] CONNECTION_CNT_NAME = {
         " ConnectAttempt: ",
         " ConnectFailure: ",
@@ -1172,7 +1241,8 @@
         " AuthFailure: ",
         " ShortDiscNonlocal: ",
         " DisconnectNonlocal: ",
-        " Disconnect: "
+        " Disconnect: ",
+        " ConsecutiveConnectFailure: "
     };
 
     @IntDef(prefix = { "CNT_" }, value = {
@@ -1184,7 +1254,8 @@
         CNT_AUTHENTICATION_FAILURE,
         CNT_SHORT_CONNECTION_NONLOCAL,
         CNT_DISCONNECTION_NONLOCAL,
-        CNT_DISCONNECTION
+        CNT_DISCONNECTION,
+        CNT_CONSECUTIVE_CONNECTION_FAILURE
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ConnectionCountCode {}
@@ -1194,7 +1265,7 @@
      */
     public static class NetworkConnectionStats {
         private final int[] mCount = new int[NUMBER_CONNECTION_CNT_CODE];
-
+        private int mRecentCountCode = CNT_INVALID;
         /**
          * Copy all values
          * @param src is the source of copy
@@ -1203,6 +1274,7 @@
             for (int i = 0; i < NUMBER_CONNECTION_CNT_CODE; i++) {
                 mCount[i] = src.getCount(i);
             }
+            mRecentCountCode = src.mRecentCountCode;
         }
 
         /**
@@ -1212,6 +1284,7 @@
             for (int i = 0; i < NUMBER_CONNECTION_CNT_CODE; i++) {
                 mCount[i] = 0;
             }
+            mRecentCountCode = CNT_INVALID;
         }
 
         /**
@@ -1224,12 +1297,11 @@
         }
 
         /**
-         * Set counterer value
-         * @param countCode is the selected counter
-         * @param cnt is the value set to the selected counter
+         * Clear counter value
+         * @param countCode is the selected counter to be cleared
          */
-        public void setCount(@ConnectionCountCode int countCode, int cnt) {
-            mCount[countCode] = cnt;
+        public void clearCount(@ConnectionCountCode int countCode) {
+            mCount[countCode] = 0;
         }
 
         /**
@@ -1238,6 +1310,14 @@
          */
         public void incrementCount(@ConnectionCountCode int countCode) {
             mCount[countCode]++;
+            mRecentCountCode = countCode;
+        }
+
+        /**
+         * Got the recent incremented count code
+         */
+        public int getRecentCountCode() {
+            return mRecentCountCode;
         }
 
         /**
diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java
index ad3c1ca..5561a91 100644
--- a/service/java/com/android/server/wifi/WifiScoreReport.java
+++ b/service/java/com/android/server/wifi/WifiScoreReport.java
@@ -56,11 +56,10 @@
 
     // Cache of the last score
     private int mScore = ConnectedScore.WIFI_MAX_SCORE;
-    private int mSessionId = INVALID_SESSION_ID;
 
     private final ScoringParams mScoringParams;
     private final Clock mClock;
-    private int mSessionNumber = 0;
+    private int mSessionNumber = 0; // not to be confused with sessionid, this just counts resets
     private String mInterfaceName;
     private final BssidBlocklistMonitor mBssidBlocklistMonitor;
     private long mLastScoreBreachLowTimeMillis = -1;
@@ -75,16 +74,19 @@
     WifiThreadRunner mWifiThreadRunner;
 
     /**
-     * Callback proxy. See {@link WifiManager#ScoreUpdateObserver}.
+     * Callback proxy. See {@link android.net.wifi.WifiManager.ScoreUpdateObserver}.
      */
     private class ScoreUpdateObserverProxy extends IScoreUpdateObserver.Stub {
         @Override
         public void notifyScoreUpdate(int sessionId, int score) {
             mWifiThreadRunner.post(() -> {
-                if (mWifiConnectedNetworkScorerHolder == null) {
-                    return;
-                }
-                if (!validateSessionId(sessionId)) {
+                if (mWifiConnectedNetworkScorerHolder == null
+                        || sessionId == INVALID_SESSION_ID
+                        || sessionId != getCurrentSessionId()) {
+                    Log.w(TAG, "Ignoring stale/invalid external score"
+                             + " sessionId=" + sessionId
+                             + " currentSessionId=" + getCurrentSessionId()
+                             + " score=" + score);
                     return;
                 }
                 if (mNetworkAgent != null) {
@@ -108,21 +110,20 @@
         @Override
         public void triggerUpdateOfWifiUsabilityStats(int sessionId) {
             mWifiThreadRunner.post(() -> {
-                if (mWifiConnectedNetworkScorerHolder == null) {
+                if (mWifiConnectedNetworkScorerHolder == null
+                        || sessionId == INVALID_SESSION_ID
+                        || sessionId != getCurrentSessionId()
+                        || mInterfaceName == null) {
+                    Log.w(TAG, "Ignoring triggerUpdateOfWifiUsabilityStats"
+                             + " sessionId=" + sessionId
+                             + " currentSessionId=" + getCurrentSessionId()
+                             + " interfaceName=" + mInterfaceName);
                     return;
                 }
-                if (!validateSessionId(sessionId)) {
-                    return;
-                }
-                if (mInterfaceName == null) {
-                    Log.e(TAG, "getWifiLinkLayerStats called without an interface");
-                    return;
-                }
-
                 WifiLinkLayerStats stats = mWifiNative.getWifiLinkLayerStats(mInterfaceName);
 
                 // update mWifiInfo
-                // TODO: b/149583741 Better coordinate this class and ClientModeImpl to remove
+                // TODO(b/153075963): Better coordinate this class and ClientModeImpl to remove
                 // redundant codes below and in ClientModeImpl#fetchRssiLinkSpeedAndFrequencyNative.
                 WifiNl80211Manager.SignalPollResult pollResult =
                         mWifiNative.signalPoll(mInterfaceName);
@@ -159,34 +160,19 @@
                     }
                 }
 
+                // TODO(b/153075963): This should not be plumbed through WifiMetrics
                 mWifiMetrics.updateWifiUsabilityStatsEntries(mWifiInfo, stats);
             });
         }
-
-        private boolean validateSessionId(int sessionId) {
-            if (sessionId == INVALID_SESSION_ID) {
-                Log.e(TAG, "Called with invalid ID");
-                return false;
-            }
-            if (mSessionId == INVALID_SESSION_ID) {
-                if (mVerboseLoggingEnabled) Log.d(TAG, "Called with score after session reset");
-                return false;
-            }
-            if (sessionId != mSessionId) {
-                // This indicates a more serious timing issue
-                Log.w(TAG, "Called with old session ID");
-                return false;
-            }
-            return true;
-        }
     }
 
     /**
-     * Container for storing info about external scorer and tracks its death.
+     * Container for storing info about external scorer and tracking its death.
      */
     private final class WifiConnectedNetworkScorerHolder implements IBinder.DeathRecipient {
         private final IBinder mBinder;
         private final IWifiConnectedNetworkScorer mScorer;
+        private int mSessionId = INVALID_SESSION_ID;
 
         WifiConnectedNetworkScorerHolder(IBinder binder, IWifiConnectedNetworkScorer scorer) {
             mBinder = binder;
@@ -209,10 +195,9 @@
         /**
          * App hosting the binder has died.
          */
+        @Override
         public void binderDied() {
-            mWifiThreadRunner.post(() -> {
-                revertAospConnectedScorer();
-            });
+            mWifiThreadRunner.post(() -> revertToDefaultConnectedScorer());
         }
 
         /**
@@ -223,10 +208,39 @@
         }
 
         /**
-         * Get Wi-Fi connected network scorer
+         * Starts a new scoring session.
          */
-        public IWifiConnectedNetworkScorer getScorer() {
-            return mScorer;
+        public void startSession(int sessionId) {
+            if (sessionId == INVALID_SESSION_ID) {
+                throw new IllegalArgumentException();
+            }
+            if (mSessionId != INVALID_SESSION_ID) {
+                // This is not expected to happen, log if it does
+                Log.e(TAG, "Stopping session " + mSessionId + " before starting " + sessionId);
+                stopSession();
+            }
+            // Bail now if the scorer has gone away
+            if (this != mWifiConnectedNetworkScorerHolder) {
+                return;
+            }
+            mSessionId = sessionId;
+            try {
+                mScorer.onStart(sessionId);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Unable to start Wifi connected network scorer " + this, e);
+                revertToDefaultConnectedScorer();
+            }
+        }
+        public void stopSession() {
+            final int sessionId = mSessionId;
+            if (sessionId == INVALID_SESSION_ID) return;
+            mSessionId = INVALID_SESSION_ID;
+            try {
+                mScorer.onStop(sessionId);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Unable to stop Wifi connected network scorer " + this, e);
+                revertToDefaultConnectedScorer();
+            }
         }
     }
 
@@ -353,7 +367,7 @@
         mScore = score;
     }
 
-    private void updateWifiMetrics(long now, int s2, int score) {
+    private int getCurrentNetId() {
         int netId = 0;
         if (mNetworkAgent != null) {
             final Network network = mNetworkAgent.getNetwork();
@@ -361,6 +375,28 @@
                 netId = network.getNetId();
             }
         }
+        return netId;
+    }
+
+    private int getCurrentSessionId() {
+        return sessionIdFromNetId(getCurrentNetId());
+    }
+
+    /**
+     * Encodes a network id into a scoring session id.
+     *
+     * We use a different numeric value for session id and the network id
+     * to make it clear that these are not the same thing. However, for
+     * easier debugging, the network id can be recovered by dropping the
+     * last decimal digit (at least until they get very, very, large).
+     */
+    public static int sessionIdFromNetId(final int netId) {
+        if (netId <= 0) return INVALID_SESSION_ID;
+        return (int) (((long) netId * 10 + (8 - (netId % 9))) % Integer.MAX_VALUE + 1);
+    }
+
+    private void updateWifiMetrics(long now, int s2, int score) {
+        int netId = getCurrentNetId();
 
         mAggressiveConnectedScore.updateUsingWifiInfo(mWifiInfo, now);
         int s1 = mAggressiveConnectedScore.generateScore();
@@ -516,6 +552,7 @@
      */
     public boolean setWifiConnectedNetworkScorer(IBinder binder,
             IWifiConnectedNetworkScorer scorer) {
+        if (binder == null || scorer == null) return false;
         // Enforce that only a single scorer can be set successfully.
         if (mWifiConnectedNetworkScorerHolder != null) {
             Log.e(TAG, "Failed to set current scorer because one scorer is already set");
@@ -532,15 +569,17 @@
             scorer.onSetScoreUpdateObserver(mScoreUpdateObserver);
         } catch (RemoteException e) {
             Log.e(TAG, "Unable to set score update observer " + scorer, e);
-            revertAospConnectedScorer();
+            revertToDefaultConnectedScorer();
             return false;
         }
-        if (mSessionId != INVALID_SESSION_ID) {
-            startConnectedNetworkScorer(mSessionId);
-        }
         // Disable AOSP scorer
         mVelocityBasedConnectedScore = null;
         mWifiMetrics.setIsExternalWifiScorerOn(true);
+        // If there is already a connection, start a new session
+        final int netId = getCurrentNetId();
+        if (netId > 0) {
+            startConnectedNetworkScorer(netId);
+        }
         return true;
     }
 
@@ -552,26 +591,25 @@
             return;
         }
         mWifiConnectedNetworkScorerHolder.reset();
-        revertAospConnectedScorer();
+        revertToDefaultConnectedScorer();
     }
 
     /**
      * Start the registered Wi-Fi connected network scorer.
-     * @param sessionId
+     * @param netId identifies the current android.net.Network
      */
-    public void startConnectedNetworkScorer(int sessionId) {
-        mSessionId = sessionId;
-        if (mWifiConnectedNetworkScorerHolder == null) {
+    public void startConnectedNetworkScorer(int netId) {
+        final int sessionId = getCurrentSessionId();
+        if (mWifiConnectedNetworkScorerHolder == null
+                || netId != getCurrentNetId()
+                || sessionId == INVALID_SESSION_ID) {
+            Log.w(TAG, "Cannot start external scoring"
+                    + " netId=" + netId
+                    + " currentNetId=" + getCurrentNetId()
+                    + " sessionId=" + sessionId);
             return;
         }
-        try {
-            IWifiConnectedNetworkScorer scorer = mWifiConnectedNetworkScorerHolder.getScorer();
-            scorer.onStart(sessionId);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Unable to start Wifi connected network scorer "
-                    + mWifiConnectedNetworkScorerHolder, e);
-            revertAospConnectedScorer();
-        }
+        mWifiConnectedNetworkScorerHolder.startSession(sessionId);
         mLastScoreBreachLowTimeMillis = INVALID_WALL_CLOCK_MILLIS;
     }
 
@@ -582,15 +620,8 @@
         if (mWifiConnectedNetworkScorerHolder == null) {
             return;
         }
-        try {
-            IWifiConnectedNetworkScorer scorer = mWifiConnectedNetworkScorerHolder.getScorer();
-            scorer.onStop(mSessionId);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Unable to stop Wifi connected network scorer "
-                    + mWifiConnectedNetworkScorerHolder, e);
-        }
+        mWifiConnectedNetworkScorerHolder.stopSession();
 
-        mSessionId = INVALID_SESSION_ID;
         long millis = mClock.getWallClockMillis();
         // Blocklist the current BSS
         if ((mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS)
@@ -605,7 +636,6 @@
 
     /**
      * Set NetworkAgent
-     * @param agent
      */
     public void setNetworkAgent(NetworkAgent agent) {
         mNetworkAgent = agent;
@@ -626,8 +656,8 @@
         mInterfaceName = ifaceName;
     }
 
-    private void revertAospConnectedScorer() {
-        // Create AOSP scorer and null external Wifi connected network scorer
+    private void revertToDefaultConnectedScorer() {
+        Log.d(TAG, "Using VelocityBasedConnectedScore");
         mVelocityBasedConnectedScore = new VelocityBasedConnectedScore(mScoringParams, mClock);
         mWifiConnectedNetworkScorerHolder = null;
         mWifiMetrics.setIsExternalWifiScorerOn(false);
diff --git a/service/java/com/android/server/wifi/WifiService.java b/service/java/com/android/server/wifi/WifiService.java
index 552afd4..0197246 100644
--- a/service/java/com/android/server/wifi/WifiService.java
+++ b/service/java/com/android/server/wifi/WifiService.java
@@ -39,12 +39,15 @@
     public static final String NOTIFICATION_NETWORK_ALERTS = "NETWORK_ALERTS";
     public static final String NOTIFICATION_NETWORK_AVAILABLE = "NETWORK_AVAILABLE";
 
-    final WifiServiceImpl mImpl;
+    private final WifiServiceImpl mImpl;
+    private final WifiContext mWifiContext;
 
     public WifiService(Context contextBase) {
-        super(new WifiContext(contextBase));
-        mImpl = new WifiServiceImpl(getContext(), new WifiInjector(getContext()),
-                new WifiAsyncChannel(TAG));
+        super(contextBase);
+        mWifiContext = new WifiContext(contextBase);
+        WifiInjector injector = new WifiInjector(mWifiContext);
+        WifiAsyncChannel channel =  new WifiAsyncChannel(TAG);
+        mImpl = new WifiServiceImpl(mWifiContext, injector, channel);
     }
 
     @Override
@@ -56,7 +59,7 @@
     @Override
     public void onBootPhase(int phase) {
         if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
-            createNotificationChannels(getContext());
+            createNotificationChannels(mWifiContext);
             mImpl.checkAndStartWifi();
         } else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
             mImpl.handleBootCompleted();
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 2e93728..a373c3f 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -115,6 +115,7 @@
 import com.android.server.wifi.util.ApConfigUtil;
 import com.android.server.wifi.util.ExternalCallbackTracker;
 import com.android.server.wifi.util.RssiUtil;
+import com.android.server.wifi.util.ScanResultUtil;
 import com.android.server.wifi.util.WifiHandler;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
@@ -1035,8 +1036,10 @@
 
         public boolean setEnablingIfAllowed() {
             synchronized (mLock) {
-                if (mTetheredSoftApState == WIFI_AP_STATE_ENABLING) return false;
-                if (mTetheredSoftApState == WIFI_AP_STATE_ENABLED) return false;
+                if (mTetheredSoftApState != WIFI_AP_STATE_DISABLED
+                        && mTetheredSoftApState != WIFI_AP_STATE_FAILED) {
+                    return false;
+                }
                 mTetheredSoftApState = WIFI_AP_STATE_ENABLING;
                 return true;
             }
@@ -2192,6 +2195,10 @@
         if (mVerboseLoggingEnabled) {
             mLog.info("getMatchingPasspointConfigurations uid=%").c(Binder.getCallingUid()).flush();
         }
+        if (!ScanResultUtil.validateScanResultList(scanResults)) {
+            Log.e(TAG, "Attempt to retrieve passpoint with invalid scanResult List");
+            return Collections.emptyMap();
+        }
         return mWifiThreadRunner.call(
             () -> mPasspointManager.getAllMatchingPasspointProfilesForScanResults(scanResults),
                 Collections.emptyMap());
@@ -2212,6 +2219,11 @@
         if (mVerboseLoggingEnabled) {
             mLog.info("getMatchingOsuProviders uid=%").c(Binder.getCallingUid()).flush();
         }
+
+        if (!ScanResultUtil.validateScanResultList(scanResults)) {
+            Log.e(TAG, "Attempt to retrieve OsuProviders with invalid scanResult List");
+            return Collections.emptyMap();
+        }
         return mWifiThreadRunner.call(
             () -> mPasspointManager.getMatchingOsuProviders(scanResults), Collections.emptyMap());
     }
@@ -2288,8 +2300,8 @@
             mLog.info("getWifiConfigsForMatchedNetworkSuggestions uid=%").c(
                     Binder.getCallingUid()).flush();
         }
-        if (scanResults == null) {
-            Log.e(TAG, "Attempt to retrieve WifiConfiguration with null scanResult List");
+        if (!ScanResultUtil.validateScanResultList(scanResults)) {
+            Log.e(TAG, "Attempt to retrieve WifiConfiguration with invalid scanResult List");
             return new ArrayList<>();
         }
         return mWifiThreadRunner.call(
@@ -2701,7 +2713,7 @@
 
             return mWifiThreadRunner.call(
                     () -> {
-                        if (scanResults == null || scanResults.isEmpty()) {
+                        if (!ScanResultUtil.validateScanResultList(scanResults)) {
                             return mWifiNetworkSuggestionsManager.getMatchingScanResults(
                                     networkSuggestions, mScanRequestProxy.getScanResults());
                         } else {
@@ -3494,6 +3506,8 @@
                         }
                         // Enable all networks restored.
                         mWifiConfigManager.enableNetwork(networkId, false, callingUid, null);
+                        // Restore auto-join param.
+                        mWifiConfigManager.allowAutojoin(networkId, configuration.allowAutojoin);
                     }
                 });
     }
@@ -3691,7 +3705,7 @@
             supportedFeatureSet |= WifiManager.WIFI_FEATURE_AP_RAND_MAC;
         }
         if (mWifiThreadRunner.call(
-                () -> mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager(),
+                () -> mActiveModeWarden.isStaApConcurrencySupported(),
                 false)) {
             supportedFeatureSet |= WifiManager.WIFI_FEATURE_AP_STA;
         }
diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java
index 6d7eeed..f3bd4ba 100644
--- a/service/java/com/android/server/wifi/WifiShellCommand.java
+++ b/service/java/com/android/server/wifi/WifiShellCommand.java
@@ -16,31 +16,48 @@
 
 package com.android.server.wifi;
 
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_METERED;
 import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED;
 
 import android.content.Context;
 import android.content.pm.ParceledListSlice;
+import android.net.ConnectivityManager;
+import android.net.MacAddress;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
 import android.net.wifi.IActionListener;
 import android.net.wifi.ScanResult;
 import android.net.wifi.SoftApConfiguration;
 import android.net.wifi.SupplicantState;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiNetworkSpecifier;
+import android.net.wifi.WifiNetworkSuggestion;
 import android.net.wifi.WifiScanner;
 import android.net.wifi.nl80211.WifiNl80211Manager;
 import android.os.BasicShellCommandHandler;
 import android.os.Binder;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.text.TextUtils;
+import android.util.Pair;
 
 import com.android.server.wifi.util.ApConfigUtil;
+import com.android.server.wifi.util.ArrayUtils;
 import com.android.server.wifi.util.ScanResultUtil;
 
 import java.io.PrintWriter;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -52,14 +69,37 @@
  *   if command executed successfully.
  * - onHelp: add a description string.
  *
- * If additional state objects are necessary add them to the
- * constructor.
- *
- * Permissions: currently root permission is required for most
- * commands, which is checked using {@link #checkRootPermission()}.
+ * Permissions: currently root permission is required for some commands. Others will
+ * enforce the corresponding API permissions.
+ * TODO (b/152875610): Add unit tests.
  */
 public class WifiShellCommand extends BasicShellCommandHandler {
     private static String SHELL_PACKAGE_NAME = "com.android.shell";
+    // These don't require root access.
+    // However, these do perform permission checks in the corresponding WifiService methods.
+    private static final String[] NON_PRIVILEGED_COMMANDS = {
+            "add-suggestion",
+            "add-network",
+            "connect-network",
+            "forget-network",
+            "get-country-code",
+            "help",
+            "-h",
+            "list-scan-results",
+            "list-networks",
+            "list-suggestions",
+            "remove-suggestion",
+            "remove-all-suggestions",
+            "set-scan-always-available",
+            "set-verbose-logging",
+            "set-wifi-enabled",
+            "start-scan",
+            "status",
+    };
+
+    private static final Map<String, Pair<NetworkRequest, ConnectivityManager.NetworkCallback>>
+            sActiveRequests = new ConcurrentHashMap<>();
+
     private final ClientModeImpl mClientModeImpl;
     private final WifiLockManager mWifiLockManager;
     private final WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
@@ -70,6 +110,8 @@
     private final WifiLastResortWatchdog mWifiLastResortWatchdog;
     private final WifiServiceImpl mWifiService;
     private final Context mContext;
+    private final ConnectivityManager mConnectivityManager;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     WifiShellCommand(WifiInjector wifiInjector, WifiServiceImpl wifiService, Context context) {
         mClientModeImpl = wifiInjector.getClientModeImpl();
@@ -82,33 +124,30 @@
         mWifiLastResortWatchdog = wifiInjector.getWifiLastResortWatchdog();
         mWifiService = wifiService;
         mContext = context;
+        mConnectivityManager = context.getSystemService(ConnectivityManager.class);
+        mWifiCarrierInfoManager = wifiInjector.getWifiCarrierInfoManager();
     }
 
     @Override
     public int onCommand(String cmd) {
+        // Treat no command as help command.
+        if (cmd == null || cmd.equals("")) {
+            cmd = "help";
+        }
         // Explicit exclusion from root permission
-        // Do not require root permission to maintain backwards compatibility with
-        // `svc wifi [enable|disable]`.
-        if (!"set-wifi-enabled".equals(cmd)) {
-            checkRootPermission();
+        if (ArrayUtils.indexOf(NON_PRIVILEGED_COMMANDS, cmd) == -1) {
+            final int uid = Binder.getCallingUid();
+            if (uid != Process.ROOT_UID) {
+                throw new SecurityException(
+                        "Uid " + uid + " does not have access to " + cmd + " wifi command");
+            }
         }
 
         final PrintWriter pw = getOutPrintWriter();
         try {
-            switch (cmd != null ? cmd : "") {
+            switch (cmd) {
                 case "set-ipreach-disconnect": {
-                    boolean enabled;
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg)) {
-                        enabled = true;
-                    } else if ("disabled".equals(nextArg)) {
-                        enabled = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'set-ipreach-disconnect' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
-                    }
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
                     mClientModeImpl.setIpReachabilityDisconnectEnabled(enabled);
                     return 0;
                 }
@@ -141,36 +180,14 @@
                             + mClientModeImpl.getPollRssiIntervalMsecs());
                     return 0;
                 case "force-hi-perf-mode": {
-                    boolean enabled;
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg)) {
-                        enabled = true;
-                    } else if ("disabled".equals(nextArg)) {
-                        enabled = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'force-hi-perf-mode' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
-                    }
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
                     if (!mWifiLockManager.forceHiPerfMode(enabled)) {
                         pw.println("Command execution failed");
                     }
                     return 0;
                 }
                 case "force-low-latency-mode": {
-                    boolean enabled;
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg)) {
-                        enabled = true;
-                    } else if ("disabled".equals(nextArg)) {
-                        enabled = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'force-low-latency-mode' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
-                    }
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
                     if (!mWifiLockManager.forceLowLatencyMode(enabled)) {
                         pw.println("Command execution failed");
                     }
@@ -178,18 +195,7 @@
                 }
                 case "network-suggestions-set-user-approved": {
                     String packageName = getNextArgRequired();
-                    boolean approved;
-                    String nextArg = getNextArgRequired();
-                    if ("yes".equals(nextArg)) {
-                        approved = true;
-                    } else if ("no".equals(nextArg)) {
-                        approved = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'network-suggestions-set-user-approved' "
-                                        + "- must be 'yes' or 'no'");
-                        return -1;
-                    }
+                    boolean approved = getNextArgRequiredTrueOrFalse("yes", "no");
                     mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(approved, packageName);
                     return 0;
                 }
@@ -202,9 +208,7 @@
                 }
                 case "imsi-protection-exemption-set-user-approved-for-carrier": {
                     String arg1 = getNextArgRequired();
-                    String arg2 = getNextArgRequired();
                     int carrierId = -1;
-                    boolean approved;
                     try {
                         carrierId = Integer.parseInt(arg1);
                     } catch (NumberFormatException e) {
@@ -213,17 +217,8 @@
                                 + "- carrierId must be an Integer");
                         return -1;
                     }
-                    if ("yes".equals(arg2)) {
-                        approved = true;
-                    } else if ("no".equals(arg2)) {
-                        approved = false;
-                    } else {
-                        pw.println("Invalid argument to "
-                                + "'imsi-protection-exemption-set-user-approved-for-carrier' "
-                                + "- must be 'yes' or 'no'");
-                        return -1;
-                    }
-                    mWifiNetworkSuggestionsManager
+                    boolean approved = getNextArgRequiredTrueOrFalse("yes", "no");
+                    mWifiCarrierInfoManager
                             .setHasUserApprovedImsiPrivacyExemptionForCarrier(approved, carrierId);
                     return 0;
                 }
@@ -238,7 +233,7 @@
                                 + "- 'carrierId' must be an Integer");
                         return -1;
                     }
-                    boolean hasUserApproved = mWifiNetworkSuggestionsManager
+                    boolean hasUserApproved = mWifiCarrierInfoManager
                             .hasUserApprovedImsiPrivacyExemptionForCarrier(carrierId);
                     pw.println(hasUserApproved ? "yes" : "no");
                     return 0;
@@ -254,7 +249,7 @@
                                 + "- 'carrierId' must be an Integer");
                         return -1;
                     }
-                    mWifiNetworkSuggestionsManager.clearImsiPrivacyExemptionForCarrier(carrierId);
+                    mWifiCarrierInfoManager.clearImsiPrivacyExemptionForCarrier(carrierId);
                     return 0;
                 }
                 case "network-requests-remove-user-approved-access-points": {
@@ -270,8 +265,8 @@
                     return sendLinkProbe(pw);
                 }
                 case "force-softap-channel": {
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg))  {
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
+                    if (enabled) {
                         int apChannelMHz;
                         try {
                             apChannelMHz = Integer.parseInt(getNextArgRequired());
@@ -299,19 +294,14 @@
 
                         mHostapdHal.enableForceSoftApChannel(apChannel, band);
                         return 0;
-                    } else if ("disabled".equals(nextArg)) {
+                    } else {
                         mHostapdHal.disableForceSoftApChannel();
                         return 0;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'force-softap-channel' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
                     }
                 }
                 case "force-country-code": {
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg))  {
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
+                    if (enabled) {
                         String countryCode = getNextArgRequired();
                         if (!(countryCode.length() == 2
                                 && countryCode.chars().allMatch(Character::isLetter))) {
@@ -321,14 +311,9 @@
                         }
                         mWifiCountryCode.enableForceCountryCode(countryCode);
                         return 0;
-                    } else if ("disabled".equals(nextArg)) {
+                    } else {
                         mWifiCountryCode.disableForceCountryCode();
                         return 0;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'force-country-code' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
                     }
                 }
                 case "get-country-code": {
@@ -337,18 +322,7 @@
                     return 0;
                 }
                 case "set-wifi-watchdog": {
-                    boolean enabled;
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg)) {
-                        enabled = true;
-                    } else if ("disabled".equals(nextArg)) {
-                        enabled = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'set-wifi-watchdog' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
-                    }
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
                     mWifiLastResortWatchdog.setWifiWatchdogFeature(enabled);
                     return 0;
                 }
@@ -358,27 +332,15 @@
                     return 0;
                 }
                 case "set-wifi-enabled": {
-                    // This command is explicitly exempted from checkRootPermission() (see beginning
-                    // of this method).
-                    // Do not require root permission to maintain backwards compatibility with
-                    // `svc wifi [enable|disable]`.
-                    // However, setWifiEnabled() does perform its own check for the
-                    // android.Manifest.permission.CHANGE_WIFI_STATE permission.
-                    boolean enabled;
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg)) {
-                        enabled = true;
-                    } else if ("disabled".equals(nextArg)) {
-                        enabled = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'set-wifi-enabled' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
-                    }
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
                     mWifiService.setWifiEnabled(SHELL_PACKAGE_NAME, enabled);
                     return 0;
                 }
+                case "set-scan-always-available": {
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
+                    mWifiService.setScanAlwaysAvailable(enabled);
+                    return 0;
+                }
                 case "get-softap-supported-features":
                     // This command is used for vts to check softap supported features.
                     if (ApConfigUtil.isAcsSupported(mContext)) {
@@ -431,23 +393,6 @@
                     }
                     break;
                 case "connect-network": {
-                    String ssid = getNextArgRequired();
-                    String type = getNextArgRequired();
-                    String optionalPassphrase = getNextArg();
-                    WifiConfiguration configuration = new WifiConfiguration();
-                    configuration.SSID = "\"" + ssid + "\"";
-                    if (TextUtils.equals(type, "wpa3")) {
-                        configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
-                    } else if (TextUtils.equals(type, "wpa2")) {
-                        configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
-                    } else if (TextUtils.equals(type, "owe")) {
-                        configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
-                    } else if (TextUtils.equals(type, "open")) {
-                        configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);
-                    }
-                    if (optionalPassphrase != null) {
-                        configuration.preSharedKey = "\"" + optionalPassphrase + "\"";
-                    }
                     CountDownLatch countDownLatch = new CountDownLatch(1);
                     IActionListener.Stub actionListener = new IActionListener.Stub() {
                         @Override
@@ -463,7 +408,29 @@
                         }
                     };
                     mWifiService.connect(
-                            configuration, -1, new Binder(), actionListener,
+                            buildWifiConfiguration(pw), -1, new Binder(), actionListener,
+                            actionListener.hashCode());
+                    // wait for status.
+                    countDownLatch.await(500, TimeUnit.MILLISECONDS);
+                    break;
+                }
+                case "add-network": {
+                    CountDownLatch countDownLatch = new CountDownLatch(1);
+                    IActionListener.Stub actionListener = new IActionListener.Stub() {
+                        @Override
+                        public void onSuccess() throws RemoteException {
+                            pw.println("Save successful");
+                            countDownLatch.countDown();
+                        }
+
+                        @Override
+                        public void onFailure(int i) throws RemoteException {
+                            pw.println("Save failed");
+                            countDownLatch.countDown();
+                        }
+                    };
+                    mWifiService.save(
+                            buildWifiConfiguration(pw), new Binder(), actionListener,
                             actionListener.hashCode());
                     // wait for status.
                     countDownLatch.await(500, TimeUnit.MILLISECONDS);
@@ -495,35 +462,154 @@
                 case "status":
                     boolean wifiEnabled = mWifiService.getWifiEnabledState() == WIFI_STATE_ENABLED;
                     pw.println("Wifi is " + (wifiEnabled ? "enabled" : "disabled"));
+                    pw.println("Wifi scanning is "
+                            + (mWifiService.isScanAlwaysAvailable()
+                            ? "always available" : "only available when wifi is enabled"));
                     WifiInfo info =
                             mWifiService.getConnectionInfo(SHELL_PACKAGE_NAME, null);
                     if (wifiEnabled) {
                         if (info.getSupplicantState() == SupplicantState.COMPLETED) {
                             pw.println("Wifi is connected to " + info.getSSID());
-                            pw.println("Connection Details: " + info);
+                            pw.println("WifiInfo: " + info);
+                            Network network = mWifiService.getCurrentNetwork();
+                            try {
+                                NetworkCapabilities capabilities =
+                                        mConnectivityManager.getNetworkCapabilities(network);
+                                pw.println("NetworkCapabilities: " + capabilities);
+                            } catch (SecurityException e) {
+                                // ignore on unrooted shell.
+                            }
                         } else {
                             pw.println("Wifi is not connected");
                         }
                     }
                     break;
-                case "set-verbose-logging":
-                    boolean enabled;
-                    String nextArg = getNextArgRequired();
-                    if ("enabled".equals(nextArg)) {
-                        enabled = true;
-                    } else if ("disabled".equals(nextArg)) {
-                        enabled = false;
-                    } else {
-                        pw.println(
-                                "Invalid argument to 'set-verbose-logging' - must be 'enabled'"
-                                        + " or 'disabled'");
-                        return -1;
-                    }
+                case "set-verbose-logging": {
+                    boolean enabled = getNextArgRequiredTrueOrFalse("enabled", "disabled");
                     mWifiService.enableVerboseLogging(enabled ? 1 : 0);
                     break;
+                }
+                case "add-suggestion":
+                    mWifiService.addNetworkSuggestions(
+                            Arrays.asList(buildSuggestion(pw)), SHELL_PACKAGE_NAME, null);
+                    break;
+                case "remove-suggestion": {
+                    String ssid = getNextArgRequired();
+                    List<WifiNetworkSuggestion> suggestions =
+                            mWifiService.getNetworkSuggestions(SHELL_PACKAGE_NAME);
+                    WifiNetworkSuggestion suggestion = suggestions.stream()
+                            .filter(s -> s.getSsid().equals(ssid))
+                            .findAny()
+                            .orElse(null);
+                    if (suggestion == null) {
+                        pw.println("No matching suggestion to remove");
+                        return -1;
+                    }
+                    mWifiService.removeNetworkSuggestions(
+                            Arrays.asList(suggestion), SHELL_PACKAGE_NAME);
+                    break;
+                }
+                case "remove-all-suggestions":
+                    mWifiService.removeNetworkSuggestions(
+                            Collections.emptyList(), SHELL_PACKAGE_NAME);
+                    break;
+                case "list-suggestions": {
+                    List<WifiNetworkSuggestion> suggestions =
+                            mWifiService.getNetworkSuggestions(SHELL_PACKAGE_NAME);
+                    if (suggestions == null || suggestions.isEmpty()) {
+                        pw.println("No suggestions");
+                    } else {
+                        pw.println("SSID                         Security type");
+                        for (WifiNetworkSuggestion suggestion : suggestions) {
+                            String securityType = null;
+                            if (WifiConfigurationUtil.isConfigForSaeNetwork(
+                                    suggestion.getWifiConfiguration())) {
+                                securityType = "wpa3";
+                            } else if (WifiConfigurationUtil.isConfigForPskNetwork(
+                                    suggestion.getWifiConfiguration())) {
+                                securityType = "wpa2";
+                            } else if (WifiConfigurationUtil.isConfigForEapNetwork(
+                                    suggestion.getWifiConfiguration())) {
+                                securityType = "eap";
+                            } else if (WifiConfigurationUtil.isConfigForOweNetwork(
+                                    suggestion.getWifiConfiguration())) {
+                                securityType = "owe";
+                            } else if (WifiConfigurationUtil.isConfigForOpenNetwork(
+                                    suggestion.getWifiConfiguration())) {
+                                securityType = "open";
+                            }
+                            pw.println(String.format("%-32s %-4s",
+                                    WifiInfo.sanitizeSsid(suggestion.getWifiConfiguration().SSID),
+                                    securityType));
+                        }
+                    }
+                    break;
+                }
+                case "add-request": {
+                    NetworkRequest networkRequest = buildNetworkRequest(pw);
+                    ConnectivityManager.NetworkCallback networkCallback =
+                            new ConnectivityManager.NetworkCallback();
+                    pw.println("Adding request: " + networkRequest);
+                    mConnectivityManager.requestNetwork(networkRequest, networkCallback);
+                    String ssid = getAllArgs()[1];
+                    sActiveRequests.put(ssid, Pair.create(networkRequest, networkCallback));
+                    break;
+                }
+                case "remove-request": {
+                    String ssid = getNextArgRequired();
+                    Pair<NetworkRequest, ConnectivityManager.NetworkCallback> nrAndNc =
+                            sActiveRequests.remove(ssid);
+                    if (nrAndNc == null) {
+                        pw.println("No matching request to remove");
+                        return -1;
+                    }
+                    pw.println("Removing request: " + nrAndNc.first);
+                    mConnectivityManager.unregisterNetworkCallback(nrAndNc.second);
+                    break;
+                }
+                case "remove-all-requests":
+                    if (sActiveRequests.isEmpty()) {
+                        pw.println("No active requests");
+                        return -1;
+                    }
+                    for (Pair<NetworkRequest, ConnectivityManager.NetworkCallback> nrAndNc
+                            : sActiveRequests.values()) {
+                        pw.println("Removing request: " + nrAndNc.first);
+                        mConnectivityManager.unregisterNetworkCallback(nrAndNc.second);
+                    }
+                    sActiveRequests.clear();
+                    break;
+                case "list-requests":
+                    if (sActiveRequests.isEmpty()) {
+                        pw.println("No active requests");
+                    } else {
+                        pw.println("SSID                         NetworkRequest");
+                        for (Map.Entry<String,
+                                Pair<NetworkRequest, ConnectivityManager.NetworkCallback>> entry :
+                                sActiveRequests.entrySet()) {
+                            pw.println(String.format("%-32s %-4s",
+                                    entry.getKey(), entry.getValue().first));
+                        }
+                    }
+                    break;
+                case "network-requests-set-user-approved": {
+                    String packageName = getNextArgRequired();
+                    boolean approved = getNextArgRequiredTrueOrFalse("yes", "no");
+                    mClientModeImpl.setNetworkRequestUserApprovedApp(packageName, approved);
+                    return 0;
+                }
+                case "network-requests-has-user-approved": {
+                    String packageName = getNextArgRequired();
+                    boolean hasUserApproved =
+                            mClientModeImpl.hasNetworkRequestUserApprovedApp(packageName);
+                    pw.println(hasUserApproved ? "yes" : "no");
+                    return 0;
+                }
                 default:
                     return handleDefaultCommands(cmd);
             }
+        } catch (IllegalArgumentException e) {
+            pw.println("Invalid args for " + cmd + ": " + e);
         } catch (Exception e) {
             pw.println("Exception while executing WifiShellCommand: ");
             e.printStackTrace(pw);
@@ -531,6 +617,119 @@
         return -1;
     }
 
+    private boolean getNextArgRequiredTrueOrFalse(String trueString, String falseString)
+            throws IllegalArgumentException {
+        String nextArg = getNextArgRequired();
+        if (trueString.equals(nextArg)) {
+            return true;
+        } else if (falseString.equals(nextArg)) {
+            return false;
+        } else {
+            throw new IllegalArgumentException("Expected '" + trueString + "' or '" + falseString
+                    + "' as next arg but got '" + nextArg + "'");
+        }
+    }
+
+    private WifiConfiguration buildWifiConfiguration(PrintWriter pw) {
+        String ssid = getNextArgRequired();
+        String type = getNextArgRequired();
+        WifiConfiguration configuration = new WifiConfiguration();
+        configuration.SSID = "\"" + ssid + "\"";
+        if (TextUtils.equals(type, "wpa3")) {
+            configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
+            configuration.preSharedKey = "\"" + getNextArgRequired() + "\"";
+        } else if (TextUtils.equals(type, "wpa2")) {
+            configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
+            configuration.preSharedKey = "\"" + getNextArgRequired() + "\"";
+        } else if (TextUtils.equals(type, "owe")) {
+            configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
+        } else if (TextUtils.equals(type, "open")) {
+            configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);
+        } else {
+            throw new IllegalArgumentException("Unknown network type " + type);
+        }
+        String option = getNextOption();
+        while (option != null) {
+            if (option.equals("-m")) {
+                configuration.meteredOverride = METERED_OVERRIDE_METERED;
+            } else {
+                pw.println("Ignoring unknown option " + option);
+            }
+            option = getNextOption();
+        }
+        return configuration;
+    }
+
+    private WifiNetworkSuggestion buildSuggestion(PrintWriter pw) {
+        String ssid = getNextArgRequired();
+        String type = getNextArgRequired();
+        WifiNetworkSuggestion.Builder suggestionBuilder =
+                new WifiNetworkSuggestion.Builder();
+        suggestionBuilder.setSsid(ssid);
+        if (TextUtils.equals(type, "wpa3")) {
+            suggestionBuilder.setWpa3Passphrase(getNextArgRequired());
+        } else if (TextUtils.equals(type, "wpa2")) {
+            suggestionBuilder.setWpa2Passphrase(getNextArgRequired());
+        } else if (TextUtils.equals(type, "owe")) {
+            suggestionBuilder.setIsEnhancedOpen(true);
+        } else if (TextUtils.equals(type, "open")) {
+            // nothing to do.
+        } else {
+            throw new IllegalArgumentException("Unknown network type " + type);
+        }
+        String option = getNextOption();
+        while (option != null) {
+            if (option.equals("-u")) {
+                suggestionBuilder.setUntrusted(true);
+            } else if (option.equals("-m")) {
+                suggestionBuilder.setIsMetered(true);
+            } else if (option.equals("-s")) {
+                suggestionBuilder.setCredentialSharedWithUser(true);
+            } else {
+                pw.println("Ignoring unknown option " + option);
+            }
+            option = getNextOption();
+        }
+        return suggestionBuilder.build();
+    }
+
+    private NetworkRequest buildNetworkRequest(PrintWriter pw) {
+        String ssid = getNextArgRequired();
+        String type = getNextArgRequired();
+        WifiNetworkSpecifier.Builder specifierBuilder =
+                new WifiNetworkSpecifier.Builder();
+        specifierBuilder.setSsid(ssid);
+        if (TextUtils.equals(type, "wpa3")) {
+            specifierBuilder.setWpa3Passphrase(getNextArgRequired());
+        } else if (TextUtils.equals(type, "wpa2")) {
+            specifierBuilder.setWpa2Passphrase(getNextArgRequired());
+        } else if (TextUtils.equals(type, "owe")) {
+            specifierBuilder.setIsEnhancedOpen(true);
+        } else if (TextUtils.equals(type, "open")) {
+            // nothing to do.
+        } else {
+            throw new IllegalArgumentException("Unknown network type " + type);
+        }
+        // Permission approval bypass is only available to requests with both ssid & bssid set.
+        // So, find scan result with the best rssi level to set in the request.
+        ScanResult matchingScanResult =
+                mWifiService.getScanResults(SHELL_PACKAGE_NAME, null)
+                .stream()
+                .filter(s -> s.SSID.equals(ssid))
+                .max(Comparator.comparingInt(s -> s.level))
+                .orElse(null);
+        if (matchingScanResult != null) {
+            specifierBuilder.setBssid(MacAddress.fromString(matchingScanResult.BSSID));
+        } else {
+            pw.println("No matching bssid found, request will need UI approval");
+        }
+        return new NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_WIFI)
+                .removeCapability(NET_CAPABILITY_INTERNET)
+                .setNetworkSpecifier(specifierBuilder.build())
+                .build();
+    }
+
     private int sendLinkProbe(PrintWriter pw) throws InterruptedException {
         // Note: should match WifiNl80211Manager#SEND_MGMT_FRAME_TIMEOUT_MS
         final int sendMgmtFrameTimeoutMs = 1000;
@@ -583,22 +782,72 @@
                 || Arrays.binarySearch(allowed6gFreq, apChannelMHz) >= 0;
     }
 
-    private void checkRootPermission() {
-        final int uid = Binder.getCallingUid();
-        if (uid == 0) {
-            // Root can do anything.
-            return;
-        }
-        throw new SecurityException("Uid " + uid + " does not have access to wifi commands");
+    private void onHelpNonPrivileged(PrintWriter pw) {
+        pw.println("  get-country-code");
+        pw.println("    Gets country code as a two-letter string");
+        pw.println("  set-wifi-enabled enabled|disabled");
+        pw.println("    Enables/disables Wifi on this device.");
+        pw.println("  set-scan-always-available enabled|disabled");
+        pw.println("    Sets whether scanning should be available even when wifi is off.");
+        pw.println("  list-scan-results");
+        pw.println("    Lists the latest scan results");
+        pw.println("  start-scan");
+        pw.println("    Start a new scan");
+        pw.println("  list-networks");
+        pw.println("    Lists the saved networks");
+        pw.println("  connect-network <ssid> open|owe|wpa2|wpa3 [<passphrase>] [-m]");
+        pw.println("    Connect to a network with provided params and add to saved networks list");
+        pw.println("    <ssid> - SSID of the network");
+        pw.println("    open|owe|wpa2|wpa3 - Security type of the network.");
+        pw.println("        - Use 'open' or 'owe' for networks with no passphrase");
+        pw.println("           - 'open' - Open networks (Most prevalent)");
+        pw.println("           - 'owe' - Enhanced open networks");
+        pw.println("        - Use 'wpa2' or 'wpa3' for networks with passphrase");
+        pw.println("           - 'wpa2' - WPA-2 PSK networks (Most prevalent)");
+        pw.println("           - 'wpa3' - WPA-3 PSK networks");
+        pw.println("    -m - Mark the network metered.");
+        pw.println("  add-network <ssid> open|owe|wpa2|wpa3 [<passphrase>] [-m]");
+        pw.println("    Add/update saved network with provided params");
+        pw.println("    <ssid> - SSID of the network");
+        pw.println("    open|owe|wpa2|wpa3 - Security type of the network.");
+        pw.println("        - Use 'open' or 'owe' for networks with no passphrase");
+        pw.println("           - 'open' - Open networks (Most prevalent)");
+        pw.println("           - 'owe' - Enhanced open networks");
+        pw.println("        - Use 'wpa2' or 'wpa3' for networks with passphrase");
+        pw.println("           - 'wpa2' - WPA-2 PSK networks (Most prevalent)");
+        pw.println("           - 'wpa3' - WPA-3 PSK networks");
+        pw.println("    -m - Mark the network metered.");
+        pw.println("  forget-network <networkId>");
+        pw.println("    Remove the network mentioned by <networkId>");
+        pw.println("        - Use list-networks to retrieve <networkId> for the network");
+        pw.println("  status");
+        pw.println("    Current wifi status");
+        pw.println("  set-verbose-logging enabled|disabled ");
+        pw.println("    Set the verbose logging enabled or disabled");
+        pw.println("  add-suggestion <ssid> open|owe|wpa2|wpa3 [<passphrase>] [-u] [-m] [-s]");
+        pw.println("    Add a network suggestion with provided params");
+        pw.println("    Use 'network-suggestions-set-user-approved " + SHELL_PACKAGE_NAME + " yes'"
+                +  " to approve suggestions added via shell (Needs root access)");
+        pw.println("    <ssid> - SSID of the network");
+        pw.println("    open|owe|wpa2|wpa3 - Security type of the network.");
+        pw.println("        - Use 'open' or 'owe' for networks with no passphrase");
+        pw.println("           - 'open' - Open networks (Most prevalent)");
+        pw.println("           - 'owe' - Enhanced open networks");
+        pw.println("        - Use 'wpa2' or 'wpa3' for networks with passphrase");
+        pw.println("           - 'wpa2' - WPA-2 PSK networks (Most prevalent)");
+        pw.println("           - 'wpa3' - WPA-3 PSK networks");
+        pw.println("    -u - Mark the suggestion untrusted.");
+        pw.println("    -m - Mark the suggestion metered.");
+        pw.println("    -s - Share the suggestion with user.");
+        pw.println("  remove-suggestion <ssid>");
+        pw.println("    Remove a network suggestion with provided SSID of the network");
+        pw.println("  remove-all-suggestions");
+        pw.println("    Removes all suggestions added via shell");
+        pw.println("  list-suggestions");
+        pw.println("    Lists the suggested networks added via shell");
     }
 
-    @Override
-    public void onHelp() {
-        final PrintWriter pw = getOutPrintWriter();
-
-        pw.println("Wi-Fi (wifi) commands:");
-        pw.println("  help");
-        pw.println("    Print this help text.");
+    private void onHelpPrivileged(PrintWriter pw) {
         pw.println("  set-ipreach-disconnect enabled|disabled");
         pw.println("    Sets whether CMD_IP_REACHABILITY_LOST events should trigger disconnects.");
         pw.println("  get-ipreach-disconnect");
@@ -632,27 +881,19 @@
         pw.println("    or left for normal   operation.");
         pw.println("  force-country-code enabled <two-letter code> | disabled ");
         pw.println("    Sets country code to <two-letter code> or left for normal value");
-        pw.println("  get-country-code");
-        pw.println("    Gets country code as a two-letter string");
         pw.println("  set-wifi-watchdog enabled|disabled");
         pw.println("    Sets whether wifi watchdog should trigger recovery");
         pw.println("  get-wifi-watchdog");
         pw.println("    Gets setting of wifi watchdog trigger recovery.");
-        pw.println("  set-wifi-enabled enabled|disabled");
-        pw.println("    Enables/disables Wifi on this device.");
         pw.println("  get-softap-supported-features");
         pw.println("    Gets softap supported features. Will print 'wifi_softap_acs_supported'");
         pw.println("    and/or 'wifi_softap_wpa3_sae_supported', each on a separate line.");
         pw.println("  settings-reset");
         pw.println("    Initiates wifi settings reset");
-        pw.println("  list-scan-results");
-        pw.println("    Lists the latest scan results");
-        pw.println("  start-scan");
-        pw.println("    Start a new scan");
-        pw.println("  list-networks");
-        pw.println("    Lists the saved networks");
-        pw.println("  connect-network <ssid> open|owe|wpa2|wpa3 [<passphrase>]");
-        pw.println("    Connect to a network with provided params and save");
+        pw.println("  add-request <ssid> open|owe|wpa2|wpa3 [<passphrase>]");
+        pw.println("    Add a network request with provided params");
+        pw.println("    Use 'network-requests-set-user-approved android yes'"
+                +  " to pre-approve requests added via rooted shell (Not persisted)");
         pw.println("    <ssid> - SSID of the network");
         pw.println("    open|owe|wpa2|wpa3 - Security type of the network.");
         pw.println("        - Use 'open' or 'owe' for networks with no passphrase");
@@ -661,13 +902,31 @@
         pw.println("        - Use 'wpa2' or 'wpa3' for networks with passphrase");
         pw.println("           - 'wpa2' - WPA-2 PSK networks (Most prevalent)");
         pw.println("           - 'wpa3' - WPA-3 PSK networks");
-        pw.println("  forget-network <networkId>");
-        pw.println("    Remove the network mentioned by <networkId>");
-        pw.println("        - Use list-networks to retrieve <networkId> for the network");
-        pw.println("  status");
-        pw.println("    Current wifi status");
-        pw.println("  set-verbose-logging enabled|disabled ");
-        pw.println("    Set the verbose logging enabled or disabled");
+        pw.println("  remove-request <ssid>");
+        pw.println("    Remove a network request with provided SSID of the network");
+        pw.println("  remove-all-requests");
+        pw.println("    Removes all active requests added via shell");
+        pw.println("  list-requests");
+        pw.println("    Lists the requested networks added via shell");
+        pw.println("  network-requests-set-user-approved <package name> yes|no");
+        pw.println("    Sets whether network requests from the app is approved or not.");
+        pw.println("    Note: Only 1 such app can be approved from the shell at a time");
+        pw.println("  network-requests-has-user-approved <package name>");
+        pw.println("    Queries whether network requests from the app is approved or not.");
+        pw.println("    Note: This only returns whether the app was set via the " +
+                "'network-requests-set-user-approved' shell command");
+    }
+
+    @Override
+    public void onHelp() {
+        final PrintWriter pw = getOutPrintWriter();
+        pw.println("Wi-Fi (wifi) commands:");
+        pw.println("  help or -h");
+        pw.println("    Print this help text.");
+        onHelpNonPrivileged(pw);
+        if (Binder.getCallingUid() == Process.ROOT_UID) {
+            onHelpPrivileged(pw);
+        }
         pw.println();
     }
 }
diff --git a/service/java/com/android/server/wifi/WifiTrafficPoller.java b/service/java/com/android/server/wifi/WifiTrafficPoller.java
index 4491449..8349f7b 100644
--- a/service/java/com/android/server/wifi/WifiTrafficPoller.java
+++ b/service/java/com/android/server/wifi/WifiTrafficPoller.java
@@ -33,67 +33,83 @@
  * Polls for traffic stats and notifies the clients
  */
 public class WifiTrafficPoller {
-
     private static final String TAG = "WifiTrafficPoller";
 
-    private long mTxPkts;
-    private long mRxPkts;
-    /* Tracks last reported data activity */
-    private int mDataActivity;
+    private long mTxPkts = 0;
+    private long mRxPkts = 0;
 
-    private final ExternalCallbackTracker<ITrafficStateCallback> mRegisteredCallbacks;
+    private int mLastActivity = -1;
 
-    WifiTrafficPoller(@NonNull Handler handler) {
+    private static class CallbackWrapper {
+        public final ITrafficStateCallback callback;
+        /**
+         * On the first invocation, the callback is invoked no matter if the data activity changed
+         * or not.
+         */
+        public boolean isFirstInvocation = true;
+
+        CallbackWrapper(ITrafficStateCallback callback) {
+            this.callback = callback;
+        }
+    }
+
+    private final ExternalCallbackTracker<CallbackWrapper> mRegisteredCallbacks;
+
+    public WifiTrafficPoller(@NonNull Handler handler) {
         mRegisteredCallbacks = new ExternalCallbackTracker<>(handler);
     }
 
     /**
      * Add a new callback to the traffic poller.
      */
-    public void addCallback(IBinder binder, ITrafficStateCallback callback,
-                            int callbackIdentifier) {
-        if (!mRegisteredCallbacks.add(binder, callback, callbackIdentifier)) {
+    public void addCallback(IBinder binder, ITrafficStateCallback callback, int callbackId) {
+        if (!mRegisteredCallbacks.add(binder, new CallbackWrapper(callback), callbackId)) {
             Log.e(TAG, "Failed to add callback");
-            return;
         }
     }
 
     /**
      * Remove an existing callback from the traffic poller.
      */
-    public void removeCallback(int callbackIdentifier) {
-        mRegisteredCallbacks.remove(callbackIdentifier);
+    public void removeCallback(int callbackId) {
+        mRegisteredCallbacks.remove(callbackId);
     }
 
-    void notifyOnDataActivity(long txPkts, long rxPkts) {
-        long sent, received;
-        long preTxPkts = mTxPkts, preRxPkts = mRxPkts;
+    /**
+     * Notifies clients of data activity if the activity changed since the last update.
+     */
+    public void notifyOnDataActivity(long newTxPkts, long newRxPkts) {
+        if (newTxPkts <= 0 && newRxPkts <= 0) {
+            return;
+        }
+
+        long sent = newTxPkts - mTxPkts;
+        long received = newRxPkts - mRxPkts;
         int dataActivity = WifiManager.TrafficStateCallback.DATA_ACTIVITY_NONE;
-        mTxPkts = txPkts;
-        mRxPkts = rxPkts;
+        if (sent > 0) {
+            dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT;
+        }
+        if (received > 0) {
+            dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_IN;
+        }
 
-        if (preTxPkts > 0 || preRxPkts > 0) {
-            sent = mTxPkts - preTxPkts;
-            received = mRxPkts - preRxPkts;
-            if (sent > 0) {
-                dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT;
-            }
-            if (received > 0) {
-                dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_IN;
-            }
-
-            if (dataActivity != mDataActivity) {
-                mDataActivity = dataActivity;
-                for (ITrafficStateCallback callback : mRegisteredCallbacks.getCallbacks()) {
-                    try {
-                        callback.onStateChanged(mDataActivity);
-                    } catch (RemoteException e) {
-                        // Failed to reach, skip
-                        // Client removal is handled in WifiService
-                    }
+        for (CallbackWrapper wrapper : mRegisteredCallbacks.getCallbacks()) {
+            // if this callback hasn't been triggered before, or the data activity changed,
+            // notify the callback
+            if (wrapper.isFirstInvocation || dataActivity != mLastActivity) {
+                wrapper.isFirstInvocation = false;
+                try {
+                    wrapper.callback.onStateChanged(dataActivity);
+                } catch (RemoteException e) {
+                    // Failed to reach, skip
+                    // Client removal is handled in WifiService
                 }
             }
         }
+
+        mTxPkts = newTxPkts;
+        mRxPkts = newRxPkts;
+        mLastActivity = dataActivity;
     }
 
     /**
@@ -102,8 +118,7 @@
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("mTxPkts " + mTxPkts);
         pw.println("mRxPkts " + mRxPkts);
-        pw.println("mDataActivity " + mDataActivity);
+        pw.println("mLastActivity " + mLastActivity);
         pw.println("mRegisteredCallbacks " + mRegisteredCallbacks.getNumCallbacks());
     }
-
 }
diff --git a/service/java/com/android/server/wifi/WifiVendorHal.java b/service/java/com/android/server/wifi/WifiVendorHal.java
index 07e55cd..f01f9a9 100644
--- a/service/java/com/android/server/wifi/WifiVendorHal.java
+++ b/service/java/com/android/server/wifi/WifiVendorHal.java
@@ -59,6 +59,7 @@
 import android.util.Log;
 import android.util.MutableBoolean;
 import android.util.MutableLong;
+import android.util.SparseArray;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.HexDump;
@@ -343,7 +344,7 @@
             if (!startVendorHal()) {
                 return false;
             }
-            if (TextUtils.isEmpty(createStaIface(false, null))) {
+            if (TextUtils.isEmpty(createStaIface(null))) {
                 stopVendorHal();
                 return false;
             }
@@ -433,15 +434,12 @@
     /**
      * Create a STA iface using {@link HalDeviceManager}.
      *
-     * @param lowPrioritySta The requested STA has a low request priority (lower probability of
-     *                       getting created, higher probability of getting destroyed).
      * @param destroyedListener Listener to be invoked when the interface is destroyed.
      * @return iface name on success, null otherwise.
      */
-    public String createStaIface(boolean lowPrioritySta,
-            InterfaceDestroyedListener destroyedListener) {
+    public String createStaIface(InterfaceDestroyedListener destroyedListener) {
         synchronized (sLock) {
-            IWifiStaIface iface = mHalDeviceManager.createStaIface(lowPrioritySta,
+            IWifiStaIface iface = mHalDeviceManager.createStaIface(
                     new StaInterfaceDestroyedListenerInternal(destroyedListener), null);
             if (iface == null) {
                 mLog.err("Failed to create STA iface").flush();
@@ -2638,6 +2636,18 @@
         }
     }
 
+    /**
+     * Returns whether STA/AP concurrency is supported or not.
+     */
+    public boolean isStaApConcurrencySupported() {
+        synchronized (sLock) {
+            return mHalDeviceManager.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                    put(IfaceType.STA, 1);
+                    put(IfaceType.AP, 1);
+                }});
+        }
+    }
+
     // This creates a blob of IE elements from the array received.
     // TODO: This ugly conversion can be removed if we put IE elements in ScanResult.
     private static byte[] hidlIeArrayToFrameworkIeBlob(ArrayList<WifiInformationElement> ies) {
diff --git a/service/java/com/android/server/wifi/WrongPasswordNotifier.java b/service/java/com/android/server/wifi/WrongPasswordNotifier.java
index d086ad5..9975f97 100644
--- a/service/java/com/android/server/wifi/WrongPasswordNotifier.java
+++ b/service/java/com/android/server/wifi/WrongPasswordNotifier.java
@@ -42,11 +42,11 @@
     // Flag indicating if a wrong password error is detected for the current connection.
     private boolean mWrongPasswordDetected;
 
-    private final Context mContext;
+    private final WifiContext mContext;
     private final NotificationManager mNotificationManager;
     private final FrameworkFacade mFrameworkFacade;
 
-    public WrongPasswordNotifier(Context context, FrameworkFacade frameworkFacade) {
+    public WrongPasswordNotifier(WifiContext context, FrameworkFacade frameworkFacade) {
         mContext = context;
         mFrameworkFacade = frameworkFacade;
         mNotificationManager =
@@ -86,7 +86,7 @@
                 .setAutoCancel(true)
                 .setTimeoutAfter(CANCEL_TIMEOUT_MILLISECONDS)
                 // TODO(zqiu): consider creating a new icon.
-                .setSmallIcon(Icon.createWithResource(WifiContext.WIFI_OVERLAY_APK_PKG_NAME,
+                .setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
                         com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
                 .setContentTitle(mContext.getString(
                         com.android.wifi.resources.R.string.wifi_available_title_failed_to_connect))
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java
index 682af56..18ff047 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java
@@ -1554,7 +1554,7 @@
          * Tell the network agent the network is now connected.
          */
         public void setConnected(WifiAwareNetworkAgent networkAgent) {
-            networkAgent.setConnected();
+            networkAgent.markConnected();
         }
     }
 
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointConfigUserStoreData.java b/service/java/com/android/server/wifi/hotspot2/PasspointConfigUserStoreData.java
index e7de22f..8400bb5 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointConfigUserStoreData.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointConfigUserStoreData.java
@@ -21,9 +21,9 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiConfigStore;
 import com.android.server.wifi.WifiKeyStore;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiConfigStoreEncryptionUtil;
 import com.android.server.wifi.util.XmlUtil;
 
@@ -77,7 +77,7 @@
     private static final String XML_TAG_IS_TRUSTED = "IsTrusted";
 
     private final WifiKeyStore mKeyStore;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
     private final DataSource mDataSource;
 
     /**
@@ -99,10 +99,10 @@
         void setProviders(List<PasspointProvider> providers);
     }
 
-    PasspointConfigUserStoreData(WifiKeyStore keyStore, TelephonyUtil telephonyUtil,
-            DataSource dataSource) {
+    PasspointConfigUserStoreData(WifiKeyStore keyStore,
+            WifiCarrierInfoManager wifiCarrierInfoManager, DataSource dataSource) {
         mKeyStore = keyStore;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         mDataSource = dataSource;
     }
 
@@ -348,7 +348,8 @@
         if (config == null) {
             throw new XmlPullParserException("Missing Passpoint configuration");
         }
-        PasspointProvider provider =  new PasspointProvider(config, mKeyStore, mTelephonyUtil,
+        PasspointProvider provider =  new PasspointProvider(config, mKeyStore,
+                mWifiCarrierInfoManager,
                 providerId, creatorUid, packageName, isFromSuggestion, caCertificateAliases,
                 clientPrivateKeyAndCertificateAlias, remediationCaCertificateAlias,
                 hasEverConnected, shared);
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java
index d3e405b..a702c7e 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java
@@ -51,6 +51,8 @@
 import android.util.Pair;
 
 import com.android.server.wifi.Clock;
+import com.android.server.wifi.NetworkUpdateResult;
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiConfigManager;
 import com.android.server.wifi.WifiConfigStore;
 import com.android.server.wifi.WifiInjector;
@@ -62,7 +64,6 @@
 import com.android.server.wifi.hotspot2.anqp.HSOsuProvidersElement;
 import com.android.server.wifi.hotspot2.anqp.OsuProviderInfo;
 import com.android.server.wifi.util.InformationElementUtil;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -117,7 +118,7 @@
     private final WifiMetrics mWifiMetrics;
     private final PasspointProvisioner mPasspointProvisioner;
     private final AppOpsManager mAppOps;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     /**
      * Map of package name of an app to the app ops changed listener for the app.
@@ -330,7 +331,7 @@
             PasspointObjectFactory objectFactory, WifiConfigManager wifiConfigManager,
             WifiConfigStore wifiConfigStore,
             WifiMetrics wifiMetrics,
-            TelephonyUtil telephonyUtil) {
+            WifiCarrierInfoManager wifiCarrierInfoManager) {
         mPasspointEventHandler = objectFactory.makePasspointEventHandler(wifiNative,
                 new CallbackHandler(context));
         mWifiInjector = wifiInjector;
@@ -343,9 +344,9 @@
         mWifiConfigManager = wifiConfigManager;
         mWifiMetrics = wifiMetrics;
         mProviderIndex = 0;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         wifiConfigStore.registerStoreData(objectFactory.makePasspointConfigUserStoreData(
-                mKeyStore, mTelephonyUtil, new UserDataSourceHandler()));
+                mKeyStore, mWifiCarrierInfoManager, new UserDataSourceHandler()));
         wifiConfigStore.registerStoreData(objectFactory.makePasspointConfigSharedStoreData(
                 new SharedDataSourceHandler()));
         mPasspointProvisioner = objectFactory.makePasspointProvisioner(context, wifiNative,
@@ -375,6 +376,30 @@
         }
     }
 
+    private void updateWifiConfigInWcmIfPresent(
+            WifiConfiguration newConfig, int uid, String packageName, boolean isFromSuggestion) {
+        WifiConfiguration configInWcm =
+                mWifiConfigManager.getConfiguredNetwork(newConfig.getKey());
+        if (configInWcm == null) return;
+        // suggestion != saved
+        if (isFromSuggestion != configInWcm.fromWifiNetworkSuggestion) return;
+        // is suggestion from same app.
+        if (isFromSuggestion
+                && (configInWcm.creatorUid != uid
+                || !TextUtils.equals(configInWcm.creatorName, packageName))) {
+            return;
+        }
+        NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(
+                newConfig, uid, packageName);
+        if (!result.isSuccess()) {
+            Log.e(TAG, "Failed to update config in WifiConfigManager");
+        } else {
+            if (mVerboseLoggingEnabled) {
+                Log.v(TAG, "Updated config in WifiConfigManager");
+            }
+        }
+    }
+
     /**
      * Add or update a Passpoint provider with the given configuration.
      *
@@ -408,10 +433,10 @@
             return false;
         }
 
-        mTelephonyUtil.tryUpdateCarrierIdForPasspoint(config);
+        mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(config);
         // Create a provider and install the necessary certificates and keys.
         PasspointProvider newProvider = mObjectFactory.makePasspointProvider(config, mKeyStore,
-                mTelephonyUtil, mProviderIndex++, uid, packageName, isFromSuggestion);
+                mWifiCarrierInfoManager, mProviderIndex++, uid, packageName, isFromSuggestion);
         newProvider.setTrusted(isTrusted);
 
         if (!newProvider.installCertsAndKeys()) {
@@ -423,7 +448,7 @@
         if (mProviders.containsKey(config.getUniqueId())) {
             PasspointProvider old = mProviders.get(config.getUniqueId());
             // If new profile is from suggestion and from a different App, ignore new profile,
-            // return true.
+            // return false.
             // If from same app, update it.
             if (isFromSuggestion && !old.getPackageName().equals(packageName)) {
                 newProvider.uninstallCertsAndKeys();
@@ -437,6 +462,10 @@
             if (!old.equals(newProvider)) {
                 mWifiConfigManager.removePasspointConfiguredNetwork(
                         newProvider.getWifiConfig().getKey());
+            } else {
+                // If there is a config cached in WifiConfigManager, update it with new info.
+                updateWifiConfigInWcmIfPresent(
+                        newProvider.getWifiConfig(), uid, packageName, isFromSuggestion);
             }
         }
         newProvider.enableVerboseLogging(mVerboseLoggingEnabled ? 1 : 0);
@@ -1142,7 +1171,7 @@
         // Note that for legacy configuration, the alias for client private key is the same as the
         // alias for the client certificate.
         PasspointProvider provider = new PasspointProvider(passpointConfig, mKeyStore,
-                mTelephonyUtil,
+                mWifiCarrierInfoManager,
                 mProviderIndex++, wifiConfig.creatorUid, null, false,
                 Arrays.asList(enterpriseConfig.getCaCertificateAlias()),
                 enterpriseConfig.getClientCertificateAlias(), null, false, false);
@@ -1197,7 +1226,7 @@
             @NonNull PasspointConfiguration passpointConfiguration,
             @NonNull List<ScanResult> scanResults) {
         PasspointProvider provider = mObjectFactory.makePasspointProvider(passpointConfiguration,
-                null, mTelephonyUtil, 0, 0, null, false);
+                null, mWifiCarrierInfoManager, 0, 0, null, false);
         List<ScanResult> filteredScanResults = new ArrayList<>();
         for (ScanResult scanResult : scanResults) {
             PasspointMatch matchInfo = provider.match(getANQPElements(scanResult),
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java b/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java
index 27c8331..22ce2f0 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java
@@ -202,6 +202,8 @@
         }
 
         // Add or update with the newly created WifiConfiguration to WifiConfigManager.
+        // NOTE: if existingNetwork != null, this update is a no-op in most cases if the SSID is the
+        // same (since we update the cached config in PasspointManager#addOrUpdateProvider().
         NetworkUpdateResult result;
         if (config.fromWifiNetworkSuggestion) {
             result = mWifiConfigManager.addOrUpdateNetwork(
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointObjectFactory.java b/service/java/com/android/server/wifi/hotspot2/PasspointObjectFactory.java
index 70095f0..2ce1b1a 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointObjectFactory.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointObjectFactory.java
@@ -20,10 +20,10 @@
 import android.net.wifi.hotspot2.PasspointConfiguration;
 
 import com.android.server.wifi.Clock;
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiKeyStore;
 import com.android.server.wifi.WifiMetrics;
 import com.android.server.wifi.WifiNative;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import java.security.KeyStore;
 import java.security.KeyStoreException;
@@ -59,23 +59,24 @@
      * @return {@link PasspointProvider}
      */
     public PasspointProvider makePasspointProvider(PasspointConfiguration config,
-            WifiKeyStore keyStore, TelephonyUtil telephonyUtil, long providerId, int creatorUid,
-            String packageName, boolean isFromSuggestion) {
-        return new PasspointProvider(config, keyStore, telephonyUtil, providerId, creatorUid,
-                packageName, isFromSuggestion);
+            WifiKeyStore keyStore, WifiCarrierInfoManager wifiCarrierInfoManager, long providerId,
+            int creatorUid, String packageName, boolean isFromSuggestion) {
+        return new PasspointProvider(config, keyStore, wifiCarrierInfoManager, providerId,
+                creatorUid, packageName, isFromSuggestion);
     }
 
     /**
      * Create a {@link PasspointConfigUserStoreData} instance.
      *
      * @param keyStore Instance of {@link WifiKeyStore}
-     * @param telephonyUtil Instance of {@link TelephonyUtil}
+     * @param wifiCarrierInfoManager Instance of {@link WifiCarrierInfoManager}
      * @param dataSource Passpoint configuration data source
      * @return {@link PasspointConfigUserStoreData}
      */
     public PasspointConfigUserStoreData makePasspointConfigUserStoreData(WifiKeyStore keyStore,
-            TelephonyUtil telephonyUtil, PasspointConfigUserStoreData.DataSource dataSource) {
-        return new PasspointConfigUserStoreData(keyStore, telephonyUtil, dataSource);
+            WifiCarrierInfoManager wifiCarrierInfoManager,
+            PasspointConfigUserStoreData.DataSource dataSource) {
+        return new PasspointConfigUserStoreData(keyStore, wifiCarrierInfoManager, dataSource);
     }
 
     /**
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java b/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java
index 43d6f06..006b8ea 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java
@@ -34,6 +34,7 @@
 import android.util.Pair;
 
 import com.android.server.wifi.IMSIParameter;
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiKeyStore;
 import com.android.server.wifi.hotspot2.anqp.ANQPElement;
 import com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType;
@@ -45,7 +46,6 @@
 import com.android.server.wifi.hotspot2.anqp.eap.NonEAPInnerAuth;
 import com.android.server.wifi.util.ArrayUtils;
 import com.android.server.wifi.util.InformationElementUtil.RoamingConsortium;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
@@ -98,7 +98,7 @@
 
     private final int mEAPMethodID;
     private final AuthParam mAuthParam;
-    private final TelephonyUtil mTelephonyUtil;
+    private final WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     private int mBestGuessCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
     private boolean mHasEverConnected;
@@ -108,17 +108,16 @@
     private boolean mVerboseLoggingEnabled;
 
     public PasspointProvider(PasspointConfiguration config, WifiKeyStore keyStore,
-            TelephonyUtil telephonyUtil, long providerId, int creatorUid, String packageName,
-            boolean isFromSuggestion) {
-        this(config, keyStore, telephonyUtil, providerId, creatorUid, packageName, isFromSuggestion,
-                null, null, null, false, false);
+            WifiCarrierInfoManager wifiCarrierInfoManager, long providerId, int creatorUid,
+            String packageName, boolean isFromSuggestion) {
+        this(config, keyStore, wifiCarrierInfoManager, providerId, creatorUid, packageName,
+                isFromSuggestion, null, null, null, false, false);
     }
 
     public PasspointProvider(PasspointConfiguration config, WifiKeyStore keyStore,
-            TelephonyUtil telephonyUtil, long providerId, int creatorUid, String packageName,
-            boolean isFromSuggestion, List<String> caCertificateAliases,
-            String clientPrivateKeyAndCertificateAlias,
-            String remediationCaCertificateAlias,
+            WifiCarrierInfoManager wifiCarrierInfoManager, long providerId, int creatorUid,
+            String packageName, boolean isFromSuggestion, List<String> caCertificateAliases,
+            String clientPrivateKeyAndCertificateAlias, String remediationCaCertificateAlias,
             boolean hasEverConnected, boolean isShared) {
         // Maintain a copy of the configuration to avoid it being updated by others.
         mConfig = new PasspointConfiguration(config);
@@ -132,7 +131,7 @@
         mHasEverConnected = hasEverConnected;
         mIsShared = isShared;
         mIsFromSuggestion = isFromSuggestion;
-        mTelephonyUtil = telephonyUtil;
+        mWifiCarrierInfoManager = wifiCarrierInfoManager;
         mIsTrusted = true;
 
         // Setup EAP method and authentication parameter based on the credential.
@@ -351,19 +350,19 @@
      * @return true if the carrier ID is updated, otherwise false.
      */
     public boolean tryUpdateCarrierId() {
-        return mTelephonyUtil.tryUpdateCarrierIdForPasspoint(mConfig);
+        return mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(mConfig);
     }
 
     private @Nullable String getMatchingSimImsi() {
         String matchingSIMImsi = null;
         if (mConfig.getCarrierId() != TelephonyManager.UNKNOWN_CARRIER_ID) {
-            matchingSIMImsi = mTelephonyUtil
+            matchingSIMImsi = mWifiCarrierInfoManager
                     .getMatchingImsi(mConfig.getCarrierId());
         } else {
             // Get the IMSI and carrier ID of SIM card which match with the IMSI prefix from
             // passpoint profile
-            Pair<String, Integer> imsiCarrierIdPair = mTelephonyUtil.getMatchingImsiCarrierId(
-                    mConfig.getCredential().getSimCredential().getImsi());
+            Pair<String, Integer> imsiCarrierIdPair = mWifiCarrierInfoManager
+                    .getMatchingImsiCarrierId(mConfig.getCredential().getSimCredential().getImsi());
             if (imsiCarrierIdPair != null) {
                 matchingSIMImsi = imsiCarrierIdPair.first;
                 mBestGuessCarrierId = imsiCarrierIdPair.second;
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointProvisioner.java b/service/java/com/android/server/wifi/hotspot2/PasspointProvisioner.java
index 1884536..ad8480a 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointProvisioner.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointProvisioner.java
@@ -20,6 +20,8 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.net.Network;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiManager;
@@ -53,7 +55,7 @@
 import com.android.server.wifi.hotspot2.soap.command.BrowserUri;
 import com.android.server.wifi.hotspot2.soap.command.PpsMoData;
 import com.android.server.wifi.hotspot2.soap.command.SppCommand;
-import com.android.wifi.resources.R;
+import com.android.server.wifi.util.Environment;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -781,24 +783,43 @@
             }
 
             Intent intent = new Intent(WifiManager.ACTION_PASSPOINT_LAUNCH_OSU_VIEW);
-            intent.setPackage(mContext.getResources()
-                    .getString(R.string.config_wifiOsuLoginPackage));
             intent.putExtra(WifiManager.EXTRA_OSU_NETWORK, mNetwork);
             intent.putExtra(WifiManager.EXTRA_URL, mWebUrl);
+            intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
 
-            intent.setFlags(
-                    Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
-
-            // Verify that the intent will resolve to an activity
-            if (intent.resolveActivity(mContext.getPackageManager()) != null) {
-                mContext.startActivityAsUser(intent, UserHandle.CURRENT);
-                invokeProvisioningCallback(PROVISIONING_STATUS,
-                        ProvisioningCallback.OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE);
-                changeState(STATE_WAITING_FOR_REDIRECT_RESPONSE);
-            } else {
+            List<ResolveInfo> resolveInfos = mContext.getPackageManager()
+                    .queryIntentActivities(
+                            intent,
+                            PackageManager.MATCH_DEFAULT_ONLY | PackageManager.MATCH_SYSTEM_ONLY);
+            if (resolveInfos == null || resolveInfos.isEmpty()) {
                 Log.e(TAG, "can't resolve the activity for the intent");
                 resetStateMachineForFailure(ProvisioningCallback.OSU_FAILURE_NO_OSU_ACTIVITY_FOUND);
+                return;
             }
+
+            if (resolveInfos.size() > 1) {
+                if (mVerboseLoggingEnabled) {
+                    Log.i(TAG, "Multiple OsuLogin apps found: "
+                            + resolveInfos.stream()
+                                    .map(info -> info.activityInfo.applicationInfo.packageName)
+                                    .collect(Collectors.joining(", ")));
+                }
+
+                // if multiple apps are found, filter out the default implementation supplied
+                // in the Wifi apex and let other implementations override.
+                resolveInfos.removeIf(info ->
+                        Environment.isAppInWifiApex(info.activityInfo.applicationInfo));
+            }
+            // forcefully resolve to the first one
+            String packageName = resolveInfos.get(0).activityInfo.applicationInfo.packageName;
+            intent.setPackage(packageName);
+            if (mVerboseLoggingEnabled) {
+                Log.i(TAG, "Opening OsuLogin app: " + packageName);
+            }
+            mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+            invokeProvisioningCallback(PROVISIONING_STATUS,
+                    ProvisioningCallback.OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE);
+            changeState(STATE_WAITING_FOR_REDIRECT_RESPONSE);
         }
 
         /**
diff --git a/service/java/com/android/server/wifi/util/Environment.java b/service/java/com/android/server/wifi/util/Environment.java
index b4df26d..a423d55 100644
--- a/service/java/com/android/server/wifi/util/Environment.java
+++ b/service/java/com/android/server/wifi/util/Environment.java
@@ -17,6 +17,7 @@
 package com.android.server.wifi.util;
 
 import android.content.ApexEnvironment;
+import android.content.pm.ApplicationInfo;
 import android.os.UserHandle;
 
 import java.io.File;
@@ -33,6 +34,13 @@
     private static final String WIFI_APEX_NAME = "com.android.wifi";
 
     /**
+     * The path where the Wifi apex is mounted.
+     * Current value = "/apex/com.android.wifi"
+     */
+    private static final String WIFI_APEX_PATH =
+            new File("/apex", WIFI_APEX_NAME).getAbsolutePath();
+
+    /**
      * Wifi shared folder.
      */
     public static File getWifiSharedDirectory() {
@@ -46,4 +54,12 @@
         return ApexEnvironment.getApexEnvironment(WIFI_APEX_NAME)
                 .getCredentialProtectedDataDirForUser(UserHandle.of(userId));
     }
+
+    /**
+     * Returns true if the app is in the Wifi apex, false otherwise.
+     * Checks if the app's path starts with "/apex/com.android.wifi".
+     */
+    public static boolean isAppInWifiApex(ApplicationInfo appInfo) {
+        return appInfo.sourceDir.startsWith(WIFI_APEX_PATH);
+    }
 }
diff --git a/service/java/com/android/server/wifi/util/FileUtils.java b/service/java/com/android/server/wifi/util/FileUtils.java
index 07b1155..fb82142 100644
--- a/service/java/com/android/server/wifi/util/FileUtils.java
+++ b/service/java/com/android/server/wifi/util/FileUtils.java
@@ -33,31 +33,20 @@
     private static final String TAG = "FileUtils";
 
     /**
-     * Set owner and mode of of given path.
+     * Change the mode of a file.
      *
+     * @param path path of the file
      * @param mode to apply through {@code chmod}
-     * @param uid to apply through {@code chown}, or -1 to leave unchanged
-     * @param gid to apply through {@code chown}, or -1 to leave unchanged
      * @return 0 on success, otherwise errno.
      */
-    public static int setPermissions(String path, int mode, int uid, int gid) {
+    public static int chmod(String path, int mode) {
         try {
             Os.chmod(path, mode);
+            return 0;
         } catch (ErrnoException e) {
-            Log.w(TAG, "Failed to chmod(" + path + "): " + e);
+            Log.w(TAG, "Failed to chmod(" + path + ", " + mode + "): ", e);
             return e.errno;
         }
-
-        if (uid >= 0 || gid >= 0) {
-            try {
-                Os.chown(path, uid, gid);
-            } catch (ErrnoException e) {
-                Log.w(TAG, "Failed to chown(" + path + "): " + e);
-                return e.errno;
-            }
-        }
-
-        return 0;
     }
 
     /**
@@ -80,5 +69,4 @@
     public static void stringToFile(String filename, String string) throws IOException {
         bytesToFile(filename, string.getBytes(StandardCharsets.UTF_8));
     }
-
 }
diff --git a/service/java/com/android/server/wifi/util/ScanResultUtil.java b/service/java/com/android/server/wifi/util/ScanResultUtil.java
index 320490c..dc2281a 100644
--- a/service/java/com/android/server/wifi/util/ScanResultUtil.java
+++ b/service/java/com/android/server/wifi/util/ScanResultUtil.java
@@ -243,4 +243,24 @@
             }
         }
     }
+
+    /**
+     * Check if ScarResult list is valid.
+     */
+    public static boolean validateScanResultList(List<ScanResult> scanResults) {
+        if (scanResults == null || scanResults.isEmpty()) {
+            return false;
+        }
+        for (ScanResult scanResult : scanResults) {
+            if (!validate(scanResult)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static boolean validate(ScanResult scanResult) {
+        return scanResult != null && scanResult.SSID != null
+                && scanResult.capabilities != null && scanResult.BSSID != null;
+    }
 }
diff --git a/service/java/com/android/server/wifi/util/XmlUtil.java b/service/java/com/android/server/wifi/util/XmlUtil.java
index d20ee7e..1984e41 100644
--- a/service/java/com/android/server/wifi/util/XmlUtil.java
+++ b/service/java/com/android/server/wifi/util/XmlUtil.java
@@ -456,8 +456,6 @@
                     configuration.allowedSuiteBCiphers.toByteArray());
             XmlUtil.writeNextValue(out, XML_TAG_SHARED, configuration.shared);
             XmlUtil.writeNextValue(out, XML_TAG_IS_AUTO_JOIN, configuration.allowAutojoin);
-            XmlUtil.writeNextValue(out, XML_TAG_IS_TRUSTED, configuration.trusted);
-
         }
 
         /**
@@ -487,6 +485,7 @@
                 @Nullable WifiConfigStoreEncryptionUtil encryptionUtil)
                 throws XmlPullParserException, IOException {
             writeCommonElementsToXml(out, configuration, encryptionUtil);
+            XmlUtil.writeNextValue(out, XML_TAG_IS_TRUSTED, configuration.trusted);
             XmlUtil.writeNextValue(out, XML_TAG_BSSID, configuration.BSSID);
             XmlUtil.writeNextValue(out, XML_TAG_STATUS, configuration.status);
             XmlUtil.writeNextValue(out, XML_TAG_FQDN, configuration.FQDN);
diff --git a/service/proto/src/metrics.proto b/service/proto/src/metrics.proto
index f2ed398..e0061f4 100644
--- a/service/proto/src/metrics.proto
+++ b/service/proto/src/metrics.proto
@@ -640,6 +640,21 @@
 
   // Metrics related to limitation in soft ap config
   optional SoftApConfigLimitationMetrics soft_ap_config_limitation_metrics = 178;
+
+  // WiFi channel utilization histogram of various RF bands
+  optional ChannelUtilizationHistogram channel_utilization_histogram = 179;
+
+  // WiFi Tx and Rx throughput histogram at various RF bands
+  optional ThroughputMbpsHistogram throughput_mbps_histogram = 180;
+
+  // Total number of steering requests which include MBO assoc retry delay
+  optional int32 num_steering_request_including_mbo_assoc_retry_delay = 181;
+
+  // Total number of scan results from 11ax network
+  optional int32 num_11ax_network_scan_results = 182;
+
+  // Total number of scan results from 6GHz band
+  optional int32 num_6g_network_scan_results = 183;
 }
 
 // Information that gets logged for every WiFi connection.
@@ -1007,6 +1022,15 @@
 
   // UID of the app that created this network.
   optional NetworkCreator network_creator = 17;
+
+  // Whether the screen is on when the connection event starts
+  optional bool screen_on = 18;
+
+  // Number of consecutive connection failures with the same SSID at high RSSI
+  // before current connection event. Any connection failure at low RSSI in the
+  // middle won't break the streak count. The count is cleared after
+  // a network disconnection event.
+  optional int32 num_consecutive_connection_failure = 19 [default = -1];
 }
 
 // Number of occurrences of a specific RSSI poll rssi value
@@ -2602,6 +2626,15 @@
   // Easy Connect (DPP) operation time bucket
   repeated HistogramBucketInt32 dpp_operation_time = 7;
 
+  // Number of Enrollee-Responder peer devices supporting DPP protocol version 1
+  optional int32 num_dpp_r1_capable_enrollee_responder_devices = 8;
+
+  // Number of Enrollee-Responder peer devices supporting DPP protocol version 2
+  optional int32 num_dpp_r2_capable_enrollee_responder_devices = 9;
+
+  // Number of Enrollee-Responder incompatible configurations found in DPP R2 compatibility check.
+  optional int32 num_dpp_r2_enrollee_responder_incompatible_configuration = 10;
+
   // Histogram bucket for Wi-Fi DPP configurator success
   message DppConfiguratorSuccessStatusHistogramBucket {
     // status type defining the bucket
@@ -2626,6 +2659,9 @@
 
     // Easy Connect Configurator success event: Configuration sent to enrollee
     EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 1;
+
+    // Easy Connect Configurator success event: Configuration applied by enrollee
+    EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED = 2;
   }
 
   enum DppFailureCode {
@@ -2661,6 +2697,15 @@
     // Easy Connect Failure event: Invalid network provided to Easy Connect configurator.
     // Network must either be WPA3-Personal (SAE) or WPA2-Personal (PSK).
     EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = 9;
+
+    // Easy Connect R2 Failure event: Enrollee cannot find the network.
+    EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK = 10;
+
+    // Easy Connect R2 Failure event: Enrollee failed to authenticate with the network.
+    EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION = 11;
+
+    // Easy Connect R2 Failure event: Enrollee rejected the configuration.
+    EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION = 12;
   }
 }
 
@@ -3055,3 +3100,25 @@
   // setting limitation
   repeated Int32Count max_client_setting_when_reach_histogram = 4;
 }
+
+// Channel utilization histogram
+// The valid utilization range is between 0 and 255 corresponding to
+// utilization ratio between 0 and 1
+message ChannelUtilizationHistogram {
+  // Histogram at 2G
+  repeated HistogramBucketInt32 utilization_2g = 1;
+  // Histogram above 2G
+  repeated HistogramBucketInt32 utilization_above_2g = 2;
+}
+
+// Throughput histogram
+message ThroughputMbpsHistogram {
+  // Tx histogram at 2G
+  repeated HistogramBucketInt32 tx_2g = 1;
+  // Tx histogram above 2G
+  repeated HistogramBucketInt32 tx_above_2g = 2;
+  // Rx histogram at 2G
+  repeated HistogramBucketInt32 rx_2g = 3;
+  // Rx histogram above 2G
+  repeated HistogramBucketInt32 rx_above_2g = 4;
+}
diff --git a/service/res/values-af/strings.xml b/service/res/values-af/strings.xml
index 740028b..d4e52ba 100644
--- a/service/res/values-af/strings.xml
+++ b/service/res/values-af/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Netwerke wat deur <xliff:g id="NAME">%s</xliff:g> voorgestel is. Toestel sal dalk outomaties koppel."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Laat toe"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nee, dankie"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> wil outomaties koppel"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Hierdie netwerke ontvang \'n unieke ID wat gebruik kan word om toestelligging na te spoor"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Koppel in elk geval"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Moenie koppel nie"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Bevestig verbinding?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"As jy koppel, kan <xliff:g id="CARRIERNAME">%s</xliff:g> se Wi‑Fi-netwerke toegang kry tot \'n unieke ID wat met jou SIM geassosieer word, of dit deel. Dit kan dit vir hulle moontlik maak om jou toestel se ligging na te spoor."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Koppel"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Moenie koppel nie"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi sal outomaties aanskakel"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Wanneer jy naby \'n gestoorde hoëgehaltenetwerk is"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Moenie weer aanskakel nie"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-stawingsfout 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-stawingsfout 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-stawingsfout 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Warmkol is afgeskakel"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Geen toestelle is gekoppel nie. Tik om te wysig."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi is ontkoppel"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Sit \'n <xliff:g id="CARRIER_NAME">%2$s</xliff:g>-SIM in om aan <xliff:g id="SSID">%1$s</xliff:g> te koppel"</string>
 </resources>
diff --git a/service/res/values-am/strings.xml b/service/res/values-am/strings.xml
index 604de0d..5d8bac3 100644
--- a/service/res/values-am/strings.xml
+++ b/service/res/values-am/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"በ<xliff:g id="NAME">%s</xliff:g> የተጠቆሙ አውታረ መረቦች። መሣሪያ በራስ-ሰር ሊገናኝ ይችላል።"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ፍቀድ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"አይ፣ አመሰግናለሁ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> በራስ-ሰር መገናኘት ይፈልጋል"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"እነዚህ አውታረ መረቦች የመሣሪያ አካባቢን ለመከታተል ሥራ ላይ ሊውል የሚችል ልዩ መታወቂያ ተቀብለዋል።"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ለማንኛውም ተገናኝ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"አታገናኝ"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ግንኙነት ይረጋገጥ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ከተገናኙ የ<xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi አውትረ መረቦች ከእርስዎ ሲም ጋር የተጎዳኘ ልዩ መታወቂያ ሊደርሱ ወይም ሊያጋሩ ይችላሉ። ይህ የመሣሪያዎ አካባቢ ክትትል እንዲደረግበት ሊያስችል ይችላል።"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"አገናኝ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"አታገናኝ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi በራስ-ሰር ይበራል"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"ከፍተኛ ጥራት ያለው የተቀመጠ አውታረ መረብ አቅራቢያ ሲሆኑ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"መልሰህ አታብራ"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>፦ የEAP ማረጋገጥ ስህተት 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>፦ የEAP ማረጋገጥ ስህተት 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>፦ የEAP ማረጋገጥ ስህተት 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"መገናኛ ነጥብ ጠፍቷል"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ምንም መሣሪያ አልተገናኘም። ለመቀየር መታ ያድርጉ።"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"የWifi ግንኙነት ተቋርጧል"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"ክ<xliff:g id="SSID">%1$s</xliff:g> ጋር ለመገናኘት የ<xliff:g id="CARRIER_NAME">%2$s</xliff:g> ሲም ያስገቡ"</string>
 </resources>
diff --git a/service/res/values-ar/strings.xml b/service/res/values-ar/strings.xml
index 39de1e0..fd9df74 100644
--- a/service/res/values-ar/strings.xml
+++ b/service/res/values-ar/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"شبكات <xliff:g id="NAME">%s</xliff:g> المقترحة - قد يتم توصيل الجهاز تلقائيًا."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"سماح"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"لا، شكرًا"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"يريد مشغِّل شبكة الجوّال <xliff:g id="CARRIERNAME">%s</xliff:g> الاتصال التلقائي بالشبكة."</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"تتلقّى هذه الشبكات معرّفًا فريدًا يمكن استخدامه لتتبُّع الموقع الجغرافي للجهاز."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"الاتصال على أي حال"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"عدم الاتصال"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"هل تريد تأكيد الاتصال بالشبكة؟"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"‏في حال اتصال بالشبكة، يمكن لشبكات Wi‑Fi من <xliff:g id="CARRIERNAME">%s</xliff:g> الوصول إلى المعرّف الفريد المرتبط بشريحة SIM أو مشاركته. قد يسمح هذا بتتبُّع الموقع الجغرافي لجهازك."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"اتصال"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"عدم الاتصال"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"‏سيتم تفعيل شبكة Wi-Fi تلقائيًا."</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"عندما تكون بالقرب من شبكة محفوظة عالية الجودة"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"عدم إعادة التشغيل"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"‏<xliff:g id="SSID">%1$s</xliff:g> : خطأ في مصادقة EAP رقم 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"‏<xliff:g id="SSID">%1$s</xliff:g> : خطأ في مصادقة EAP رقم 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"‏<xliff:g id="SSID">%1$s</xliff:g> : خطأ في مصادقة EAP رقم 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"تم إيقاف نقطة الاتصال."</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ما مِن أجهزة متصلة. انقر للتعديل."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"‏تم قطع اتصال Wi-Fi."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"‏للاتصال بشبكة <xliff:g id="SSID">%1$s</xliff:g>، عليك إدخال شريحة SIM من <xliff:g id="CARRIER_NAME">%2$s</xliff:g>."</string>
 </resources>
diff --git a/service/res/values-as/strings.xml b/service/res/values-as/strings.xml
index dcb8c79..0ece64d 100644
--- a/service/res/values-as/strings.xml
+++ b/service/res/values-as/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g>এ পৰামর্শ হিচাপে দিয়া নেটৱর্কবোৰ। ডিভাইচটো স্বয়ংক্ৰিয়ভাৱে সংযোগ হ\'ব পাৰে।"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"অনুমতি দিয়ক"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"নালাগে, ধন্যবাদ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>এ স্বয়ংক্ৰিয়ভাৱে সংযোগ কৰিবলৈ বিচাৰিছে"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"এই নেটৱৰ্কসমূহে এটা সুকীয়া আইডি পায়, যিটো ডিভাইচৰ অৱস্থান ট্ৰেক কৰিবলৈ ব্যৱহাৰ কৰিব পৰা যায়"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"যিহ’লেও সংযোগ কৰক"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"সংযোগ নকৰিব"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"সংযোগ নিশ্চিত কৰিবনে?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"আপুনি যদি সংযোগ কৰে, <xliff:g id="CARRIERNAME">%s</xliff:g>ৰ ৱাই-ফাই নেটৱৰ্কসমূহে আপোনাৰ ছিমৰ সৈতে জড়িত এটা সুকীয়া আইডি এক্সেছ কৰিব অথবা সেইটো শ্বেয়াৰ কৰিব পাৰে। এইটোৱে আপোনাৰ ডিভাইচটোৰ অৱস্থান ট্ৰেক কৰাৰ অনুমতি দিব পাৰে।"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"সংযোগ কৰক"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"সংযোগ নকৰিব"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন হ\'ব"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"যেতিয়া আপুনি ছেভ কৰি থোৱা উচ্চ মানৰ নেটৱৰ্কৰ কাষত থাকে"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"পুনৰাই অন নকৰিব"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : ইএপি বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ সম্পর্কীয় আসোঁৱাহ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : ইএপি বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ সম্পর্কীয় আসোঁৱাহ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : ইএপি বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ সম্পর্কীয় আসোঁৱাহ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"হটস্পট অফ কৰা হ’ল"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"কোনো ডিভাইচ সংযোগ কৰা হোৱা নাই। সংশোধন কৰিবলৈ টিপক।"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ৱাই-ফাই সংযোগ বিচ্ছিন্ন হৈছে"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰিবলৈ এখন <xliff:g id="CARRIER_NAME">%2$s</xliff:g> ছিম ভৰাওক"</string>
 </resources>
diff --git a/service/res/values-az/strings.xml b/service/res/values-az/strings.xml
index 5e1374f..db40150 100644
--- a/service/res/values-az/strings.xml
+++ b/service/res/values-az/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> təklif edilən şəbəkə. Cihaz avtomatik qoşula bilər."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"İcazə verin"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Xeyr, təşəkkürlər"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> avtomatik qoşulmaq istəyir"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Bu şəbəkələr cihaz məkanını izləmək üçün istifadə edilə biləcək unikal ID qəbul edir"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"İstənilən halda qoşulun"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Qoşulmayın"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Bağlantı təsdiq edilsin?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Qoşulsanız, <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi şəbəkələri SIM kartınızla əlaqəli unikal ID\'ə daxil ola və ya onu paylaşa bilər. Bu, cihazınızın məkanının izlənilməsinə icazə verə bilər."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Qoşulun"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Qoşulmayın"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi avtomatik olaraq aktiv ediləcək"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Yadda saxlanmış yüksək keyfiyyətli şəbəkələr yaxınlıqda olduqda"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Yenidən aktiv etməyin"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP doğrulama xətası 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP doğrulama xətası 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP doğrulama xətası 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot deaktiv edilib"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Heç bir cihaz qoşulmayıb. Dəyişiklik etmək üçün toxunun."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi‑Fi bağlantısı kəsildi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> şəbəkəsinə qoşulmaq üçün <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM kartı daxil edin"</string>
 </resources>
diff --git a/service/res/values-b+sr+Latn/strings.xml b/service/res/values-b+sr+Latn/strings.xml
index d0ba452..08970f9 100644
--- a/service/res/values-b+sr+Latn/strings.xml
+++ b/service/res/values-b+sr+Latn/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Mreže koje predlaže <xliff:g id="NAME">%s</xliff:g>. Uređaj će se možda povezati automatski."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Dozvoli"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ne, hvala"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> želi da se automatski poveže"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ove mreže zahtevaju jedinstveni ID koji može da se koristi za praćenje lokacije uređaja"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Ipak poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ne povezuj"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Želite li da potvrdite povezivanje?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ako se povežete, Wi‑Fi mreže operatera <xliff:g id="CARRIERNAME">%s</xliff:g> mogu da pristupaju jedinstvenom ID-u povezanom sa SIM karticom ili da ga dele. To može da omogući praćenje lokacije uređaja."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ne povezuj"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi će se automatski uključiti"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kada ste u blizini sačuvane mreže visokog kvaliteta"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ne uključuj ponovo"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP greška pri potvrdi identiteta 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP greška pri potvrdi identiteta 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP greška pri potvrdi identiteta 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot je isključen"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nijedan uređaj nije povezan. Dodirnite da biste izmenili."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi veza je prekinuta"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Da biste se povezali na mrežu <xliff:g id="SSID">%1$s</xliff:g>, umetnite <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM karticu"</string>
 </resources>
diff --git a/service/res/values-be/strings.xml b/service/res/values-be/strings.xml
index 4d2b69b..b66cb9a 100644
--- a/service/res/values-be/strings.xml
+++ b/service/res/values-be/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Праграма \"<xliff:g id="NAME">%s</xliff:g>\" прапанавала сеткі. Прылада можа падключыцца да ніх аўтаматычна."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Дазволіць"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Не, дзякуй"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> запытвае дазвол на аўтаматычнае падключэнне"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Гэтыя сеткі атрымліваюць унікальны ідэнтыфікатар, які можа выкарыстоўвацца для адсочвання месцазнаходжання прылады"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Усё роўна падключыцца"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Не падключацца"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Пацвердзіць падключэнне?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Калі вы падключыцеся, сеткі Wi‑Fi аператара \"<xliff:g id="CARRIERNAME">%s</xliff:g>\" змогуць атрымаць доступ да ўнікальнага ідэнтыфікатара, звязанага з вашай SIM-картай, ці абагуліць яго. Можа ўзнікнуць магчымасць адсочваць месцазнаходжанне вашай прылады."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Падключыцца"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Не падключацца"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi уключыцца аўтаматычна"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Побач з захаванай сеткай з высакаякасным сігналам"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Не ўключаць зноў"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : памылка аўтэнтыфікацыі EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : памылка аўтэнтыфікацыі EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : памылка аўтэнтыфікацыі EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Хот-спот выключаны"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Няма падключаных прылад. Націсніце, каб змяніць налады."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi выключаны"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Каб падключыцца да сеткі \"<xliff:g id="SSID">%1$s</xliff:g>\", устаўце SIM-карту аператара \"<xliff:g id="CARRIER_NAME">%2$s</xliff:g>\""</string>
 </resources>
diff --git a/service/res/values-bg/strings.xml b/service/res/values-bg/strings.xml
index 4ca0b39..915b7fa 100644
--- a/service/res/values-bg/strings.xml
+++ b/service/res/values-bg/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Предложени от <xliff:g id="NAME">%s</xliff:g> мрежи. Устройството може да се свърже автоматично."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Разрешаване"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Не, благодаря"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> иска да се свързва автоматично"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Тези мрежи получават уникален идентификатор, който може да се използва за проследяване на местоположението на устройството"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Свързване въпреки това"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Без свързване"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Потвърждавате ли връзката?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ако се свържете, Wi-Fi мрежите на <xliff:g id="CARRIERNAME">%s</xliff:g> може да имат достъп или да споделят уникален идентификатор, свързан със SIM картата ви. Това може да позволи проследяването на местоположението на устройството ви."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Свързване"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Без свързване"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi ще се включи автоматично"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Когато сте в района на запазена мрежа с високо качество"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Без повторно включване"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> – Грешка при удостоверяването на EAP: 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> – Грешка при удостоверяването на EAP: 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> – Грешка при удостоверяването на EAP: 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Точката за достъп е изключена"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Няма свързани устройства. Докоснете за промяна."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Няма връзка с Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"За да се свържете с(ъс) <xliff:g id="SSID">%1$s</xliff:g>, поставете SIM карта от <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-bn/strings.xml b/service/res/values-bn/strings.xml
index af0cd79..6973575 100644
--- a/service/res/values-bn/strings.xml
+++ b/service/res/values-bn/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g>-এর সাজেস্ট করা নেটওয়ার্ক। ডিভাইস নিজে থেকে কানেক্ট হতে পারে।"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"অনুমতি দিন"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"না থাক"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> অটোমেটিক কানেক্ট করতে চায়"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"এই নেটওয়ার্ক যে অনন্য আইডি পায় সেটি ব্যবহার করে ডিভাইসের লোকেশন ট্র্যাক করা যায়"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"তা সত্ত্বেও কানেক্ট করুন"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"কানেক্ট করবেন না"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"কানেকশন কনফার্ম করতে চান?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"আপনি কানেক্ট করলে, <xliff:g id="CARRIERNAME">%s</xliff:g> ওয়াই-ফাই নেটওয়ার্ক আপনার সিমের সাথে সম্পর্কযুক্ত একটি অনন্য আইডি অ্যাক্সেস বা শেয়ার করতে পারে। এর ফলে আপনার ডিভাইসের লোকেশন ট্র্যাক করা যেতে পারে।"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"কানেক্ট করুন"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"কানেক্ট করবেন না"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"ওয়াই-ফাই অটোমেটিক চালু হবে"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"যখন আপনি একটি উচ্চ মানের সংরক্ষিত নেটওয়ার্ক কাছাকাছি থাকেন"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"আবার চালু করবেন না"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP যাচাইকরণের সমস্যা 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP যাচাইকরণের সমস্যা 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP যাচাইকরণের সমস্যা 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"হটস্পট বন্ধ করা আছে"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"কোনও ডিভাইস কানেক্ট করা নেই। পরিবর্তন করতে ট্যাপ করুন।"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ওয়াই-ফাই ডিসকানেক্ট হয়েছে"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>-এ কানেক্ট করার জন্য <xliff:g id="CARRIER_NAME">%2$s</xliff:g>-এর সিম কার্ড যোগ করুন"</string>
 </resources>
diff --git a/service/res/values-bs/strings.xml b/service/res/values-bs/strings.xml
index 68bb060..2a9b52a 100644
--- a/service/res/values-bs/strings.xml
+++ b/service/res/values-bs/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Mreže koje predlaže <xliff:g id="NAME">%s</xliff:g>. Uređaj će se možda povezati automatski."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Dozvoli"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ne, hvala"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> se želi automatski povezati"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ove mreže primaju jedinstveni ID koji se može koristiti za praćenje lokacije uređaja"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Ipak se poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nemoj se povezati"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Potvrditi povezivanje?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ako se povežete, Wi-Fi mreže mobilnog operatera <xliff:g id="CARRIERNAME">%s</xliff:g> mogu pristupiti jedinstvenom ID-u koji je povezan s vašom SIM karticom ili ga podijeliti. Na taj način možete dozvoliti da se prati lokacija vašeg uređaja."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Poveži se"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nemoj se povezati"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"WiFi će se uključiti automatski"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kada ste u blizini sačuvane mreže visokog kvaliteta"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Nemoj ponovo uključiti"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP greška autentifikacije 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP greška autentifikacije 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP greška autentifikacije 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Pristupna tačka je isključena"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nema povezanih uređaja. Dodirnite da izmijenite."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"WiFi nije povezan"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Da se povežete s mrežom <xliff:g id="SSID">%1$s</xliff:g>, umetnite SIM karticu mobilnog operatera <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-ca/strings.xml b/service/res/values-ca/strings.xml
index 8116640..d9de95f 100644
--- a/service/res/values-ca/strings.xml
+++ b/service/res/values-ca/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Xarxes suggerides de l\'aplicació <xliff:g id="NAME">%s</xliff:g>. El dispositiu pot connectar-se automàticament."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permet"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"No, gràcies"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"L\'operador <xliff:g id="CARRIERNAME">%s</xliff:g> vol connectar-se automàticament"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Aquestes xarxes reben un identificador únic que es pot utilitzar per fer un seguiment de la ubicació del dispositiu"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Connecta\'t de totes maneres"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"No et connectis"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Vols confirmar la connexió?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Si et connectes, les xarxes Wi‑Fi de l\'operador <xliff:g id="CARRIERNAME">%s</xliff:g> poden compartir un identificador únic associat a la teva SIM o bé accedir-hi. Això pot permetre que es faci un seguiment de la ubicació del teu dispositiu."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Connecta"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"No connectis"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"La Wi-Fi s\'activarà automàticament"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Quan siguis a prop d\'una xarxa de qualitat desada"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"No tornis a activar"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: error d\'autenticació EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: error d\'autenticació EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: error d\'autenticació EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"S\'ha desactivat el punt d\'accés Wi‑Fi"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"No hi ha cap dispositiu connectat. Toca per modificar."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"La Wi‑Fi està desconnectada"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Per connectar-te a <xliff:g id="SSID">%1$s</xliff:g>, insereix una SIM de l\'operador<xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-cs/strings.xml b/service/res/values-cs/strings.xml
index 67c44a8..68b2cab 100644
--- a/service/res/values-cs/strings.xml
+++ b/service/res/values-cs/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Sítě navrhované aplikací <xliff:g id="NAME">%s</xliff:g>. Zařízení se může připojovat automaticky."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Povolit"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ne, díky"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"Operátor <xliff:g id="CARRIERNAME">%s</xliff:g> se chce automaticky připojit"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Tyto sítě dostávají jedinečné ID, pomocí něhož lze sledovat polohu zařízení"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Přesto připojit"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nepřipojovat"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Potvrdit připojení?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Pokud se připojíte, sítě Wi-Fi operátora <xliff:g id="CARRIERNAME">%s</xliff:g> mohou získat přístup k jedinečnému ID přidruženému k vaší SIM kartě. Může to umožnit sledování polohy zařízení."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Připojit"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nepřipojovat"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi se zapne automaticky"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Když budete v dosahu kvalitní uložené sítě"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Znovu nezapínat"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: Chyba ověření EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: Chyba ověření EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: Chyba ověření EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot je vypnutý"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Žádná připojená zařízení Upravíte klepnutím."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Síť Wi-Fi je odpojena"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Chcete-li se připojit k síti <xliff:g id="SSID">%1$s</xliff:g>, vložte SIM kartu operátora <xliff:g id="CARRIER_NAME">%2$s</xliff:g>."</string>
 </resources>
diff --git a/service/res/values-da/strings.xml b/service/res/values-da/strings.xml
index 23d6185..fbd9c92 100644
--- a/service/res/values-da/strings.xml
+++ b/service/res/values-da/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Netværk foreslået af <xliff:g id="NAME">%s</xliff:g>. Enheden opretter muligvis forbindelse automatisk."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Tillad"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nej tak"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> vil gerne oprette forbindelse automatisk"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Disse netværk modtager et unikt id, der kan bruges til at spore enhedens placering"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Opret forbindelse alligevel"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Opret ikke forbindelse"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Vil du bekræfte forbindelsen?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Hvis du opretter forbindelse, kan Wi-Fi-netværk fra <xliff:g id="CARRIERNAME">%s</xliff:g> få adgang til eller dele et unikt id, der er knyttet til dit SIM-kort. Derved kan din enheds placering muligvis spores."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Opret forbindelse"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Opret ikke forbindelse"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi aktiveres automatisk"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Når du er i nærheden af et gemt netværk af høj kvalitet"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Aktivér ikke igen"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-godkendelsesfejl 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-godkendelsesfejl 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-godkendelsesfejl 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot er slået fra"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Der er ikke tilsluttet nogen enheder. Tryk for at ændre."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi-forbindelsen er afbrudt"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Indsæt et SIM-kort fra <xliff:g id="CARRIER_NAME">%2$s</xliff:g> for at oprette forbindelse til <xliff:g id="SSID">%1$s</xliff:g>."</string>
 </resources>
diff --git a/service/res/values-de/strings.xml b/service/res/values-de/strings.xml
index 251da4a..21aa008 100644
--- a/service/res/values-de/strings.xml
+++ b/service/res/values-de/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Von <xliff:g id="NAME">%s</xliff:g> vorgeschlagene Netzwerke. Gerät verbindet sich möglicherweise automatisch."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Zulassen"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nein danke"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> möchte sich automatisch verbinden"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Diese Mobilfunknetze empfangen eine eindeutige ID, mit der der Gerätestandort ermittelt werden kann"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Trotzdem verbinden"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nicht verbinden"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Verbindung bestätigen?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Wenn du eine Verbindung herstellst, können die WLANs von <xliff:g id="CARRIERNAME">%s</xliff:g> möglicherweise eine eindeutige ID abrufen oder teilen, die deiner SIM zugewiesen ist. Damit lässt sich unter Umständen der Standort deines Geräts ermitteln."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Verbinden"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nicht verbinden"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"WLAN wird automatisch aktiviert"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Wenn du in der Nähe eines sicheren gespeicherten Netzwerks bist"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Nicht wieder aktivieren"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-Authentifizierungsfehler 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-Authentifizierungsfehler 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-Authentifizierungsfehler 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot ist deaktiviert"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Keine Geräte verbunden. Tippen, um Einstellungen zu ändern."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"WLAN nicht verbunden"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Lege eine SIM-Karte von <xliff:g id="CARRIER_NAME">%2$s</xliff:g> ein, um eine Verbindung mit <xliff:g id="SSID">%1$s</xliff:g> herzustellen"</string>
 </resources>
diff --git a/service/res/values-el/strings.xml b/service/res/values-el/strings.xml
index 9ffc6cc..9fa523b 100644
--- a/service/res/values-el/strings.xml
+++ b/service/res/values-el/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Προτεινόμενα δίκτυα <xliff:g id="NAME">%s</xliff:g>. Η συσκευή μπορεί να συνδεθεί αυτόματα."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Αποδοχή"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Όχι, ευχαριστώ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"Η εταιρεία κινητής τηλεφωνίας <xliff:g id="CARRIERNAME">%s</xliff:g> θέλει αυτόματη σύνδεση"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Αυτά τα δίκτυα λαμβάνουν ένα μοναδικό αναγνωριστικό που μπορεί να χρησιμοποιηθεί για την παρακολούθηση της τοποθεσίας της συσκευής."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Σύνδεση ούτως ή άλλως"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Να μην γίνει σύνδεση."</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Επιβεβαίωση της σύνδεσης;"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Εάν συνδεθείτε, τα δίκτυα Wi-Fi <xliff:g id="CARRIERNAME">%s</xliff:g> ενδέχεται να έχουν πρόσβαση ή να μοιράζονται ένα μοναδικό αναγνωριστικό που σχετίζεται με την κάρτα σας SIM. Αυτό μπορεί να επιτρέψει την παρακολούθηση της τοποθεσίας της συσκευής σας."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Σύνδεση"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Να μην γίνει σύνδεση."</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Το Wi‑Fi θα ενεργοποιηθεί αυτόματα"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Όταν βρίσκεστε κοντά σε αποθηκευμένο δίκτυο υψηλής ποιότητας"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Να μην ενεργοποιηθεί ξανά"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Σφάλμα ελέγχου ταυτότητας EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Σφάλμα ελέγχου ταυτότητας EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Σφάλμα ελέγχου ταυτότητας EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Το σημείο πρόσβασης Wi-Fi απενεργοποιήθηκε."</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Δεν υπάρχουν συνδεδεμένες συσκευές. Πατήστε για τροποποίηση."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Το Wi-Fi αποσυνδέθηκε."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Για να συνδεθείτε στο <xliff:g id="SSID">%1$s</xliff:g>, τοποθετήστε μια κάρτα SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>."</string>
 </resources>
diff --git a/service/res/values-es-rUS/strings.xml b/service/res/values-es-rUS/strings.xml
index eaacb10..615d844 100644
--- a/service/res/values-es-rUS/strings.xml
+++ b/service/res/values-es-rUS/strings.xml
@@ -17,7 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="wifiResourcesAppLabel" product="default" msgid="4965162975090543792">"Recursos Wi‑Fi del sistema"</string>
-    <string name="wifi_available_title" msgid="2844963247498642107">"Conectarse a una red Wi-Fi abierta"</string>
+    <string name="wifi_available_title" msgid="2844963247498642107">"Conéctate a una red Wi-Fi abierta"</string>
     <string name="wifi_available_title_connecting" msgid="4308431577637294026">"Estableciendo conexión con la red Wi-Fi"</string>
     <string name="wifi_available_title_connected" msgid="922603556292157664">"Se conectó a la red Wi-Fi"</string>
     <string name="wifi_available_title_failed_to_connect" msgid="2304443371893419545">"No fue posible conectarse a la red Wi‑Fi"</string>
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> sugirió redes. Es posible que el dispositivo se conecte automáticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permitir"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"No, gracias"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> quiere conectarse automáticamente"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Estas redes reciben un ID único que puede usarse para realizar el seguimiento de la ubicación del dispositivo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Conectar de todos modos"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"No conectar"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"¿Confirmar conexión?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Si te conectas, las redes de Wi-Fi de <xliff:g id="CARRIERNAME">%s</xliff:g> podrán acceder o compartir un ID único asociado con tu SIM. Esto podría permitir que se realice el seguimiento de la ubicación del dispositivo."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Conectar"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"No conectar"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Se activará la conexión Wi-Fi automáticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Cuando estés cerca de una red guardada de alta calidad"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"No volver a activar"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: Error de autenticación de EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: Error de autenticación de EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: Error de autenticación de EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Se desactivó el hotspot"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"No hay dispositivos conectados. Presiona para modificar la configuración."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Sin conexión Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para conectarte a <xliff:g id="SSID">%1$s</xliff:g>, inserta una SIM de <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-es/strings.xml b/service/res/values-es/strings.xml
index f028588..29a33b2 100644
--- a/service/res/values-es/strings.xml
+++ b/service/res/values-es/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> te ha sugerido alguna red. El dispositivo puede que se conecte automáticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permitir"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"No, gracias"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> quiere conectarse automáticamente"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Estas redes reciben un ID único con el que se puede rastrear la ubicación del dispositivo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Conectar de todos modos"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"No conectar"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"¿Confirmar conexión?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Si te conectas, es posible que la red Wi‑Fi de <xliff:g id="CARRIERNAME">%s</xliff:g> obtenga o comparta un ID único asociado a tu SIM, lo que puede permitir que se rastree la ubicación de tu dispositivo."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Conectar"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"No conectar"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"La conexión Wi‑Fi se activará automáticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Cuando estés cerca de una red de alta calidad guardada"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"No volver a activar"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: error de autenticación de EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: error de autenticación de EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: error de autenticación de EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Punto de acceso desactivado"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"No hay dispositivos conectados. Toca para modificar este ajuste."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi‑Fi desconectado"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para conectarte a <xliff:g id="SSID">%1$s</xliff:g>, inserta una tarjeta SIM de <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-et/strings.xml b/service/res/values-et/strings.xml
index 0f97601..f0785b5 100644
--- a/service/res/values-et/strings.xml
+++ b/service/res/values-et/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Rakenduse <xliff:g id="NAME">%s</xliff:g> soovitatud võrgud. Seade võib automaatselt ühenduse luua."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Luba"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Tänan, ei"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> soovib automaatselt ühenduse luua"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Need võrgud saavad kordumatu ID, mida saab kasutada seadme asukoha jälgimiseks."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Ühenda siiski"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ära ühenda"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Kas soovite ühenduse kinnitada?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Kui loote ühenduse, võivad operaatori <xliff:g id="CARRIERNAME">%s</xliff:g> WiFi-võrgud teie SIM-kaardiga seotud kordumatule ID-le juurde pääseda või seda jagada. See võib võimaldada seadme asukohta jälgida."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Ühenda"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ära ühenda"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"WiFi lülitub sisse automaatselt"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kui olete kvaliteetse salvestatud võrgu läheduses"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ära lülita tagasi sisse"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP autentimise viga 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP autentimise viga 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP autentimise viga 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Kuumkoht lülitati välja"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ükski seade pole ühendatud. Puudutage muutmiseks."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"WiFi-ühendus on katkestatud"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Võrguga <xliff:g id="SSID">%1$s</xliff:g> ühendamiseks sisestage operaatori <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM-kaart"</string>
 </resources>
diff --git a/service/res/values-eu/strings.xml b/service/res/values-eu/strings.xml
index 1984c25..b0d6fd3 100644
--- a/service/res/values-eu/strings.xml
+++ b/service/res/values-eu/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> aplikazioak sare batzuk iradoki ditu. Baliteke gailua automatikoki konektatzea."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Baimendu"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ez, eskerrik asko"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> operadoreak automatikoki konektatu nahi du"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Sare hauek ID esklusibo bat jasotzen dute, gailuaren kokapenaren jarraipena egin ahal izateko"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Konektatu halere"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ez konektatu"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Konexioa berretsi nahi duzu?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Konektatzen bazara, baliteke <xliff:g id="CARRIERNAME">%s</xliff:g> operadorearen wifi-sareek zure SIM txartelarekin lotutako ID esklusiboa atzitzea edo partekatzea. Horrela, baliteke zure gailuaren kokapenaren jarraipena egiteko aukera izatea."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Konektatu"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ez konektatu"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi konexioa automatikoki aktibatuko da"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Gordeta daukazun kalitate handiko sare batetik gertu zaudenean"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ez aktibatu berriro"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP metodoaren autentifikazio-errorea 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP metodoaren autentifikazio-errorea 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP metodoaren autentifikazio-errorea 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Sare publikoa desaktibatu egin da"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ez dago gailurik konektatuta. Sakatu aldatzeko."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Deskonektatu egin da wifia"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> sarera konektatzeko, sartu <xliff:g id="CARRIER_NAME">%2$s</xliff:g> operadorearen SIM txartel bat"</string>
 </resources>
diff --git a/service/res/values-fa/strings.xml b/service/res/values-fa/strings.xml
index 9d237c8..b6d0139 100644
--- a/service/res/values-fa/strings.xml
+++ b/service/res/values-fa/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"شبکه‌های پیشنهادی <xliff:g id="NAME">%s</xliff:g>. ممکن است دستگاه به‌طور خودکار متصل شود."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"مجاز"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"نه متشکرم"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> می‌خواهد به‌طور خودکار متصل شود"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"این شبکه‌ها شناسه یکتایی دریافت می‌کنند که می‌توانید از آن برای ردیابی مکان دستگاه استفاده کرد"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"درهر صورت متصل شود"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"متصل نشود"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"اتصال را تأیید می‌کنید؟"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"‏اگر متصل شوید، شبکه‌های Wi‑Fi <xliff:g id="CARRIERNAME">%s</xliff:g> می‌توانند به شناسه یکتای مربوط به سیم‌کارتتان دسترسی پیدا کنند و از آن به‌صورت مشترک استفاده کنند. این کار ممکن است ردیابی مکان دستگاه را مجاز کند."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"اتصال"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"متصل نشود"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"‏Wi‑Fi به‌طور خودکار روشن خواهد شد"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"وقتی نزدیک شبکه ذخیره‌شده با کیفیت بالا هستید"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"دوباره روشن نشود"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"‏<xliff:g id="SSID">%1$s</xliff:g> : خطای ۳۲۷۶۴ احراز هویت EAP"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"‏<xliff:g id="SSID">%1$s</xliff:g> : خطای ۳۲۷۶۵ احراز هویت EAP"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"‏<xliff:g id="SSID">%1$s</xliff:g> : خطای ۳۲۷۶۶ احراز هویت EAP"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"نقطه اتصال خاموش شد"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"هیچ دستگاهی متصل نیست. برای اصلاح ضربه بزنید."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"‏Wi-Fi قطع شد."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"برای متصل شدن به <xliff:g id="SSID">%1$s</xliff:g>، یک سیم‌کارت <xliff:g id="CARRIER_NAME">%2$s</xliff:g> در دستگاه قرار دهید"</string>
 </resources>
diff --git a/service/res/values-fi/strings.xml b/service/res/values-fi/strings.xml
index 8e6df91..583ec42 100644
--- a/service/res/values-fi/strings.xml
+++ b/service/res/values-fi/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ehdotti verkkoja. Laite voi muodostaa yhteyden automaattisesti."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Salli"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ei kiitos"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> haluaa muodostaa yhteyden automaattisesti"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Nämä verkot saavat yksilöllisen tunnuksen, jolla laitteen sijaintia voi seurata."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Yhdistä silti"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Älä yhdistä"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Vahvistetaanko yhteys?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Jos muodostat yhteyden, Wi-Fi-verkot (<xliff:g id="CARRIERNAME">%s</xliff:g>) voivat nähdä tai jakaa yksilöllisen tunnuksen, joka liittyy SIM-korttiisi. Tämän kautta laitteesi sijaintia voidaan seurata."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Yhdistä"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Älä yhdistä"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi käynnistyy automaattisesti"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kun olet lähellä laadukasta tallennettua verkkoa"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Älä käynnistä uudelleen"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-todennusvirhe 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-todennusvirhe 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-todennusvirhe 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot pois päältä"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ei liitettyjä laitteita. Muokkaa napauttamalla."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Ei Wi-Fi-yhteyttä"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Aseta SIM-kortti (<xliff:g id="CARRIER_NAME">%2$s</xliff:g>), jotta <xliff:g id="SSID">%1$s</xliff:g> voidaan yhdistää"</string>
 </resources>
diff --git a/service/res/values-fr-rCA/strings.xml b/service/res/values-fr-rCA/strings.xml
index 94ca199..3a34f3c 100644
--- a/service/res/values-fr-rCA/strings.xml
+++ b/service/res/values-fr-rCA/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Réseaux suggérés par <xliff:g id="NAME">%s</xliff:g>. L\'appareil peut s\'y connecter automatiquement."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Autoriser"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Non merci"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> souhaite se connecter automatiquement"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ces réseaux reçoivent un identifiant unique qui peut être utilisé pour faire le suivi de la position de l\'appareil"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Se connecter sans même"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ne pas se connecter"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Confirmer la connexion?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Si vous vous connectez, les réseaux Wi-Fi de <xliff:g id="CARRIERNAME">%s</xliff:g> pourront accéder à un identifiant unique associé à votre module SIM ou partager cet identifiant. Cela pourrait permettre à d\'autres appareils de faire le suivi de la position de votre appareil."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Se connecter"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ne pas se connecter"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Le Wi-Fi s\'activera automatiquement"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Lorsque vous êtes près d\'un réseau enregistré de haute qualité"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ne pas réactiver"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : erreur d\'authentification EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : erreur d\'authentification EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : erreur d\'authentification EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Point d\'accès sans fil désactivé"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Aucun appareil n\'est connecté. Touchez pour effectuer une modification."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi déconnecté"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Pour vous connecter à <xliff:g id="SSID">%1$s</xliff:g>, insérez une carte SIM de <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-fr/strings.xml b/service/res/values-fr/strings.xml
index 6ee133f..1aba6a1 100644
--- a/service/res/values-fr/strings.xml
+++ b/service/res/values-fr/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Réseaux suggérés par <xliff:g id="NAME">%s</xliff:g>. L\'appareil pourra se connecter automatiquement."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Autoriser"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Non, merci"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> souhaite se connecter automatiquement"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ces réseaux reçoivent un identifiant unique qui peut être utilisé pour suivre la position de l\'appareil"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Connecter quand même"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ne pas connecter"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Confirmer la connexion ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Si vous établissez la connexion, les réseaux Wi-Fi <xliff:g id="CARRIERNAME">%s</xliff:g> peuvent accéder à un identifiant unique associé à votre carte SIM ou le partager. Suite à cette connexion, la position de votre appareil peut également d\'être suivie."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Connecter"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ne pas connecter"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Le Wi-Fi sera activé automatiquement"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Lorsque vous êtes à proximité d\'un réseau enregistré de haute qualité"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ne pas réactiver"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : erreur d\'authentification EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : erreur d\'authentification EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : erreur d\'authentification EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Point d\'accès désactivé"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Aucun appareil connecté. Appuyez pour modifier."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi déconnecté"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Pour vous connecter au réseau <xliff:g id="SSID">%1$s</xliff:g>, insérez une carte SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-gl/strings.xml b/service/res/values-gl/strings.xml
index 9d9ee7d..71fd10f 100644
--- a/service/res/values-gl/strings.xml
+++ b/service/res/values-gl/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Redes suxeridas de <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode conectarse automaticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permitir"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Non, grazas"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> quere conectarse automaticamente"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Estas redes reciben un código exclusivo que se pode usar para facer un seguimento da localización dun dispositivo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Conectar igualmente"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Non conectar"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Queres confirmar a conexión?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Se te conectas, as redes wifi de <xliff:g id="CARRIERNAME">%s</xliff:g> poden acceder a un código exclusivo asociado coa túa SIM ou ben compartilo. Deste xeito, pódese facer un seguimento da localización do teu dispositivo."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Conectar"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Non conectar"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"A wifi activarase automaticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Cando esteas preto dunha rede gardada de alta calidade"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Non volver activar"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: produciuse un erro (32764) de autenticación de EAP"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: produciuse un erro (32765) de autenticación de EAP"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: produciuse un erro (32766) de autenticación de EAP"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"A zona wifi esta desactivada"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Non hai ningún dispositivo conectado. Toca para modificalo."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Desconectouse a wifi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para conectarte a <xliff:g id="SSID">%1$s</xliff:g>, introduce unha tarxeta SIM de <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-gu/strings.xml b/service/res/values-gu/strings.xml
index f4c052b..634199e 100644
--- a/service/res/values-gu/strings.xml
+++ b/service/res/values-gu/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> સૂચવેલા નેટવર્ક. ડિવાઇસ ઑટોમૅટિક રીતે કનેક્ટ થાય તેમ બની શકે છે."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"મંજૂરી આપો"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ના, આભાર"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ઑટોમૅટિક રીતે કનેક્ટ કરવા માગે છે"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"આ નેટવર્કને અજોડ ID મળે છે કે જેનો ઉપયોગ ડિવાઇસના સ્થાનને ટ્રૅક કરવા માટે થઈ શકે છે"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"કોઈપણ રીતે કનેક્ટ કરો"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"કનેક્ટ કરશો નહીં"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"કનેક્શનને કન્ફર્મ કરીએ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"જો તમે કનેક્ટ કરો છો, તો <xliff:g id="CARRIERNAME">%s</xliff:g> વાઇ-ફાઇ નેટવર્ક, તમારા SIM સાથે સંકળાયેલા અજોડ IDને ઍક્સેસ અથવા શેર કરી શકે છે. આમ કરવાથી તમારા ડિવાઇસનું સ્થાન ટ્રૅક કરવાની મંજૂરી આપવામાં આવી શકે છે."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"કનેક્ટ કરો"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"કનેક્ટ કરશો નહીં"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"વાઇ-ફાઇ આપમેળે ચાલુ થઈ જશે"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"જ્યારે તમે એક ઉચ્ચ ક્વૉલિટીવાળા સાચવેલ નેટવર્કની નજીક હોવ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"પાછું ચાલુ કરશો નહીં"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP પ્રમાણીકરણમાં ભૂલ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP પ્રમાણીકરણમાં ભૂલ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP પ્રમાણીકરણમાં ભૂલ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"હૉટસ્પૉટ બંધ કર્યું"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"કોઈ ડિવાઇસ કનેક્ટ કરેલું નથી. ફેરફાર કરવા માટે ટૅપ કરો."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"વાઇ-ફાઇ ડિસ્કનેક્ટ થયું"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> સાથે કનેક્ટ કરવા માટે, <xliff:g id="CARRIER_NAME">%2$s</xliff:g>નું સિમ કાર્ડ દાખલ કરો"</string>
 </resources>
diff --git a/service/res/values-hi/strings.xml b/service/res/values-hi/strings.xml
index dd29644..05c9b68 100644
--- a/service/res/values-hi/strings.xml
+++ b/service/res/values-hi/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> के सुझाए गए नेटवर्क. डिवाइस अपने आप कनेक्ट हो सकता है."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"अनुमति दें"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"रहने दें"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> अपने-आप कनेक्ट करना चाहता है"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"इन नेटवर्क को एक विशेष आईडी दिया जाता है जिसका इस्तेमाल डिवाइस की जगह की जानकारी का पता लगाने के लिए किया जा सकता है"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"फिर भी कनेक्ट करें"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"कनेक्ट न करें"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"कनेक्शन की पुष्टि करना चाहते हैं?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"अगर आप कनेक्ट करते हैं, तो <xliff:g id="CARRIERNAME">%s</xliff:g> वाई-फ़ाई नेटवर्क आपकी सिम से जुड़े हुए विशेष आईडी को ऐक्सेस या शेयर कर सकता है. इससे आपके डिवाइस की जगह की जानकारी का पता लगा सकते हैं."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"कनेक्ट करें"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"कनेक्ट न करें"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"वाई-फ़ाई अपने आप चालू हो जाएगा"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"जब आप किसी अच्छी क्वालिटी वाले सेव किए गए नेटवर्क के पास हों"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"वापस चालू न करें"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP authentication error 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP authentication error 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP authentication error 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"हॉटस्पॉट बंद किया गया"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"कोई भी डिवाइस जुड़ा नहीं है. बदलाव करने के लिए टैप करें."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"वाई-फ़ाई डिसकनेक्ट हो गया"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> से कनेक्ट करने के लिए, <xliff:g id="CARRIER_NAME">%2$s</xliff:g> का सिम डालें"</string>
 </resources>
diff --git a/service/res/values-hr/strings.xml b/service/res/values-hr/strings.xml
index 12edff1..8ebbcad 100644
--- a/service/res/values-hr/strings.xml
+++ b/service/res/values-hr/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Mreže koje predlaže aplikacija <xliff:g id="NAME">%s</xliff:g>. Uređaji se mogu povezati automatski."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Dopusti"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ne, hvala"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> se želi automatski povezati"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Te mreže primaju jedinstveni ID koji se može upotrijebiti za praćenje lokacije uređaja"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Svejedno poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nemoj povezati"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Želite li potvrditi povezivanje?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ako se povežete, Wifi mreže operatera <xliff:g id="CARRIERNAME">%s</xliff:g> mogu pristupiti jedinstvenom ID-ju povezanom s vašim SIM-om ili ga podijeliti. To može omogućiti praćenje lokacije vašeg uređaja."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nemoj povezati"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi će se uključiti automatski"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kada ste u blizini spremljene mreže visoke kvalitete"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Više ne uključuj"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP pogreška autentifikacije 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP pogreška autentifikacije 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP pogreška autentifikacije 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Žarišna točka je isključena"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nije povezan nijedan uređaj. Dodirnite za prilagodbu."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi je isključen"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Da biste se povezali s mrežom <xliff:g id="SSID">%1$s</xliff:g> umetnite SIM mobilnog operatera <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-hu/strings.xml b/service/res/values-hu/strings.xml
index 7516212..92260fc 100644
--- a/service/res/values-hu/strings.xml
+++ b/service/res/values-hu/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"A(z) <xliff:g id="NAME">%s</xliff:g> hálózatokat javasolt. Az eszköz automatikusan csatlakozhat hozzájuk."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Engedélyezés"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nem, köszönöm"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"A(z) <xliff:g id="CARRIERNAME">%s</xliff:g> automatikusan csatlakozni szeretne"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ezek a hálózatok egyedi azonosítót kapnak, amelyek az eszköz helyadatainak követésére használhatók"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Csatlakozás mindenképp"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ne csatlakozzon"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Biztosan csatlakozik?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ha csatlakozik, a(z) <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi-hálózatai hozzáférhetnek a SIM-hez társított egyedi azonosítóhoz, amelyet meg is oszthatnak. Ez lehetővé teheti eszköze helyadatainak követését."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Csatlakozás"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ne csatlakozzon"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"A Wi-Fi automatikusan bekapcsol"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Amikor jó minőségű mentett hálózat közelében tartózkodik"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ne kapcsolódjon vissza"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP hitelesítési hiba 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP hitelesítési hiba 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP hitelesítési hiba 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot kikapcsolva"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nincsenek csatlakoztatott eszközök. Koppintson a módosításhoz."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Nincs Wi-Fi-kapcsolat"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"A(z) <xliff:g id="SSID">%1$s</xliff:g> csatlakoztatásához helyezzen be <xliff:g id="CARRIER_NAME">%2$s</xliff:g> szolgáltatóhoz tartozó SIM-kártyát"</string>
 </resources>
diff --git a/service/res/values-hy/strings.xml b/service/res/values-hy/strings.xml
index 41254b2..9dea80e 100644
--- a/service/res/values-hy/strings.xml
+++ b/service/res/values-hy/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> հավելվածի առաջարկվող ցանցեր: Սարքը կարող է ավտոմատ միանալ:"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Թույլատրել"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ոչ, շնորհակալություն"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>-ը հայցում է ավտոմատ միանալու թույլտվություն"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Այս ցանցերը ստանում են եզակի ID, որը կարող է օգտագործվել սարքի տեղադրությունը հետագծելու համար։"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Միանալ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Չմիանալ"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Հաստատե՞լ միացումը"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Միանալու դեպքում <xliff:g id="CARRIERNAME">%s</xliff:g>-ի Wi‑Fi ցանցերը կարող են ստանալ ձեր SIM քարտի հետ կապված եզակի ID-ն կամ կիսվել դրանով։ Դա հնարավորություն կտա հետագծել ձեր սարքի տեղադրությունը։"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Միանալ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Չմիանալ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi-ն ավտոմատ կմիանա"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Լավ ազդանշանով պահված ցանցի տարածքում գտնվելիս"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Նորից չմիացնել"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP նույնականացման սխալ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP նույնականացման սխալ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP նույնականացման սխալ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Թեժ կետն անջատված է"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Կապված սարքեր չկան։ Հպեք՝ փոփոխելու համար։"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi-ն անջատված է"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> ցանցին միանալու համար տեղադրեք <xliff:g id="CARRIER_NAME">%2$s</xliff:g> օպերատորի SIM քարտը"</string>
 </resources>
diff --git a/service/res/values-in/strings.xml b/service/res/values-in/strings.xml
index 6899613..cfe9254 100644
--- a/service/res/values-in/strings.xml
+++ b/service/res/values-in/strings.xml
@@ -31,29 +31,21 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Jaringan yang disarankan <xliff:g id="NAME">%s</xliff:g>. Perangkat dapat terhubung secara otomatis."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Izinkan"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Lain kali"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ingin terhubung otomatis"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Jaringan berikut menerima ID unik yang dapat digunakan untuk melacak lokasi perangkat"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Tetap hubungkan"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Jangan hubungkan"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Konfirmasi koneksi?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Jika Anda menghubungkan, jaringan Wi-Fi <xliff:g id="CARRIERNAME">%s</xliff:g> mungkin mengakses atau membagikan ID unik terkait dengan SIM Anda. Ini memungkinkan lokasi perangkat Anda untuk dilacak."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Ikuti"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Jangan hubungkan"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi akan aktif otomatis"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Saat berada di dekat jaringan berkualitas tinggi yang tersimpan"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Jangan aktifkan kembali"</string>
     <string name="wifi_wakeup_enabled_title" msgid="7758584632765597662">"Wi‑Fi diaktifkan otomatis"</string>
     <string name="wifi_wakeup_enabled_content" msgid="4713038331224656338">"Anda berada di dekat jaringan yang tersimpan: <xliff:g id="NETWORK_SSID">%1$s</xliff:g>"</string>
     <string name="wifi_watchdog_network_disabled" msgid="688248897654073438">"Tidak dapat tersambung ke Wi-Fi"</string>
-    <string name="wifi_watchdog_network_disabled_detailed" msgid="2946200607682633112">" memiliki sambungan internet yang buruk."</string>
+    <string name="wifi_watchdog_network_disabled_detailed" msgid="2946200607682633112">" memiliki koneksi internet yang buruk."</string>
     <string name="wifi_connect_alert_title" msgid="6144470472092017636">"Izinkan hubungan?"</string>
     <string name="wifi_connect_alert_message" msgid="3123801378559831220">"Aplikasi %1$s ingin tersambung ke Jaringan Wifi %2$s"</string>
     <string name="wifi_connect_default_application" msgid="6164721692891325243">"Aplikasi"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Error autentikasi EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Error autentikasi EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Error autentikasi EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot dinonaktifkan"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Tidak ada perangkat yang terhubung. Ketuk untuk mengubah."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi tidak tersambung"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Untuk terhubung ke <xliff:g id="SSID">%1$s</xliff:g>, masukkan SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-is/strings.xml b/service/res/values-is/strings.xml
index 5ea169d..28819cc 100644
--- a/service/res/values-is/strings.xml
+++ b/service/res/values-is/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> kom með tillögur að netkerfum. Tækið gæti tengst sjálfkrafa."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Leyfa"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nei, takk"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> vill tengjast sjálfkrafa"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Þessi net fá einkvæmt auðkenni sem hægt er að nota til að rekja staðsetningu tækisins"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Tengjast samt"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ekki tengjast"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Staðfesta tengingu?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ef þú tengist geta Wi-Fi net <xliff:g id="CARRIERNAME">%s</xliff:g> fengið aðgang að eða deilt einkvæmu auðkenni sem er tengt SIM-kortinu þínu. Með þessu er hugsanlega hægt að rekja staðsetningu tækisins þíns."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Tengjast"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ekki tengjast"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Kveikt verður sjálfkrafa á Wi‑Fi"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Þegar þú ert nálægt vistuðu hágæðaneti"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ekki kveikja aftur"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-auðkenningarvilla 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-auðkenningarvilla 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-auðkenningarvilla 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Slökkt á heitum reit"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Engin tæki eru tengd. Ýttu til að breyta."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi ótengt"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Til að tengjast <xliff:g id="SSID">%1$s</xliff:g> skaltu setja inn SIM-kort frá <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-it/strings.xml b/service/res/values-it/strings.xml
index 2b639ea..84240d7 100644
--- a/service/res/values-it/strings.xml
+++ b/service/res/values-it/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ha suggerito delle reti. Il dispositivo potrebbe collegarsi automaticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Consenti"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"No, grazie"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> vuole connettersi automaticamente"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Queste reti ricevono un ID univoco che può essere usato per monitorare la posizione del dispositivo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Connetti comunque"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Non connettere"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Confermi la connessione?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Se esegui la connessione, le reti Wi-Fi di <xliff:g id="CARRIERNAME">%s</xliff:g> potranno accedere o condividere un ID univoco associato alla tua SIM. Questa azione potrebbe consentire il monitoraggio della posizione del tuo dispositivo."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Connetti"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Non connettere"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Il Wi‑Fi verrà attivato automaticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Quando ti trovi nell\'area di una rete salvata di alta qualità"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Non riattivare"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: errore di autenticazione EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: errore di autenticazione EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: errore di autenticazione EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot disattivato"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nessun dispositivo connesso. Tocca per modificare."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Rete Wi-Fi scollegata"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Per connetterti alla rete <xliff:g id="SSID">%1$s</xliff:g>, inserisci una SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-iw/strings.xml b/service/res/values-iw/strings.xml
index 02a0c76..51e0432 100644
--- a/service/res/values-iw/strings.xml
+++ b/service/res/values-iw/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"הצעות לרשתות <xliff:g id="NAME">%s</xliff:g>. ייתכן שחיבור המכשיר ייעשה באופן אוטומטי."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"אישור"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"לא תודה"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> רוצה להתחבר אוטומטית"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"רשתות אלה מקבלות מזהה ייחודי שבו ניתן להשתמש למעקב אחר מיקום של מכשיר"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"יש להתחבר בכל זאת"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"אין להתחבר"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"לאשר את ההתחברות?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"‏אם תתבצע התחברות, ייתכן שרשתות Wi‑Fi של <xliff:g id="CARRIERNAME">%s</xliff:g> יקבלו גישה או ישתפו מזהה ייחודי שמשויך לכרטיס ה-SUM שלך. בעקבות זאת, ייתכן שניתן יהיה לעקוב אחר מיקום המכשיר שלך."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"התחברות"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"אין להתחבר"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"‏ה-Wi-Fi יופעל אוטומטית"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"כשתימצאו בקרבת רשת באיכות גבוהה ששמרתם"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"אל תפעיל שוב"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"‏<xliff:g id="SSID">%1$s</xliff:g> : שגיאה 32764 באימות EAP"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"‏<xliff:g id="SSID">%1$s</xliff:g> : שגיאה 32765 באימות EAP"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"‏<xliff:g id="SSID">%1$s</xliff:g> : שגיאה 32766 באימות EAP"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"נקודה לשיתוף אינטרנט נכבתה"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"אין מכשירים מחוברים. יש להקיש כדי לשנות."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"‏Wi-Fi מנותק"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"‏יש להכניס SIM של <xliff:g id="CARRIER_NAME">%2$s</xliff:g> כדי להתחבר אל <xliff:g id="SSID">%1$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-ja/strings.xml b/service/res/values-ja/strings.xml
index 5b6b93b..95be7fa 100644
--- a/service/res/values-ja/strings.xml
+++ b/service/res/values-ja/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> からのネットワーク候補に、デバイスが自動的に接続される可能性があります。"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"許可"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"許可しない"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> が自動接続をリクエストしています"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"これらのネットワークは一意の ID を受信します。この ID を使ってデバイスの位置情報が追跡される可能性があります"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"接続する"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"接続しない"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"接続を確認しますか?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"接続すると、<xliff:g id="CARRIERNAME">%s</xliff:g> の Wi‑Fi ネットワークが、SIM に関連付けられている一意の ID にアクセスしたりその ID を共有したりする可能性があります。これにより、デバイスの位置情報が追跡される可能性もあります。"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"接続"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"接続しない"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi は自動的にオンになります"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"高品質の保存済みネットワークの検出時"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"再度オンにしない"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP 認証エラー 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP 認証エラー 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP 認証エラー 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"アクセス ポイントが OFF になりました"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"デバイスは接続されていません。タップすると変更できます。"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi が切断されました"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> に接続するには、<xliff:g id="CARRIER_NAME">%2$s</xliff:g> の SIM を挿入します"</string>
 </resources>
diff --git a/service/res/values-ka/strings.xml b/service/res/values-ka/strings.xml
index 1828e7b..83d9b78 100644
--- a/service/res/values-ka/strings.xml
+++ b/service/res/values-ka/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> შემოთავაზებული ქსელები. მოწყობილობა შეიძლება ავტომატურად დაუკავშირდეს."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"დაშვება"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"არა, გმადლობთ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>-ს ავტომატურად დაკავშირება სურს"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ეს ქსელები იღებს უნიკალურ ID-ს, რომლის მეშვეობითაც შესაძლებელია მოწყობილობის მდებარეობის აღნუსხვა"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"მაინც დაკავშირება"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"არ დაუკავშირდეს"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"გსურთ, დაადასტუროთ დაკავშირება?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"დაკავშირების შემთხვევაში, <xliff:g id="CARRIERNAME">%s</xliff:g>-ის Wi‑Fi ქსელებმა შეიძლება წვდომა იქონიოს ან გააზიაროს უნიკალური ID, რომელიც თქვენს SIM-ბარათთან არის ასოცირებული. ამ ცვლილებამ შესაძლოა თქვენი მოწყობილობის მდებარეობა აღნუსხვადი გახადოს."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"დაკავშირება"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"არ დაუკავშირდეს"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi ავტომატურად ჩაირთვება"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"როცა შენახულ მაღალხარისხიან ქსელებთან ახლოს იმყოფებით"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ხელახლა ნუ ჩართავ"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ავთენტიკაციის შეცდომა 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ავთენტიკაციის შეცდომა 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ავთენტიკაციის შეცდომა 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"უსადენო ქსელი გამორთულია"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"დაკავშირებული მოწყობილობები არ არის. შეეხეთ შესაცვლელად."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi ქსელთან კავშირი გაწყდა."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>-თან დასაკავშირებლად მოათავსეთ <xliff:g id="CARRIER_NAME">%2$s</xliff:g>-ის SIM-ბარათი"</string>
 </resources>
diff --git a/service/res/values-kk/strings.xml b/service/res/values-kk/strings.xml
index 73b59c5..5df34c1 100644
--- a/service/res/values-kk/strings.xml
+++ b/service/res/values-kk/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ұсынған желілер. Құрылғы автоматты түрде қосылуы мүмкін."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Рұқсат беру"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Жоқ, рақмет"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> автоматты түрде қосылғысы келеді"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Бұл желілер бірегей идентификатор алады, оны құрылғының орналасқан жерін бақылау үшін қолдануға болады."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Бәрібір қосылу"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Қосылмау"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Қосылымды растайсыз ба?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Егер қосылсаңыз, <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi желілері SIM картаңызға байланыстырылған бірегей идентификаторды пайдалана немесе бөлісе алады. Оның көмегімен құрылғыңыздың орнын қадағалауға болады."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Қосу"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Қосылмау"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi автоматты түрде қосылады"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Сақталған жоғары сапалы желіге жақын болғанда"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Қайта қоспау"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP аутентификация қатесі 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP аутентификация қатесі 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP аутентификация қатесі 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Хотспот өшірілді"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ешқандай құрылғы қосылмаған. Өзгерту үшін түртіңіз."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi ажыратылған."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> желісіне қосылу үшін <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM картасын салыңыз."</string>
 </resources>
diff --git a/service/res/values-km/strings.xml b/service/res/values-km/strings.xml
index 626b50f..143d9fd 100644
--- a/service/res/values-km/strings.xml
+++ b/service/res/values-km/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"បណ្ដាញ​ដែលបាន​ណែនាំ​របស់ <xliff:g id="NAME">%s</xliff:g> ។ ឧបករណ៍​អាច​ភ្ជាប់​ដោយស្វ័យប្រវត្តិ។"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"អនុញ្ញាត"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ទេ អរគុណ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ចង់​ភ្ជាប់​ដោយស្វ័យប្រវត្តិ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"បណ្ដាញ​ទាំងនេះ​ទទួលបាន​លេខសម្គាល់​ពិសេស ដែល​អាចប្រើ​ដើម្បី​តាមដាន​ទីតាំង​ឧបករណ៍"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"មិនអីទេ ភ្ជាប់ចុះ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"កុំ​ភ្ជាប់"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"បញ្ជាក់​ការតភ្ជាប់​ដែរទេ​?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ប្រសិនបើ​អ្នក​ភ្ជាប់ នោះបណ្ដាញ Wi-Fi របស់ <xliff:g id="CARRIERNAME">%s</xliff:g> អាច​ចូលប្រើ ឬ​ចែករំលែក​លេខសម្គាល់​ពិសេស​ដែលភ្ជាប់​ជាមួយ​ស៊ីម​របស់អ្នក​។ សកម្មភាពនេះ​អាច​អនុញ្ញាតឱ្យមាន​ការតាមដាន​ទីតាំង​ឧបករណ៍​របស់អ្នក​។"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"ភ្ជាប់"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"កុំ​ភ្ជាប់"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi នឹង​បើក​ដោយ​ស្វ័យប្រវត្តិ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"នៅពេល​ដែល​អ្នក​នៅ​ជិត​បណ្តាញ​គុណភាព​ខ្ពស់​ដែល​បាន​រក្សាទុក"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"កុំ​បើក​ឡើង​វិញ"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : បញ្ហាក្នុង​ការផ្ទៀងផ្ទាត់ EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : បញ្ហាក្នុង​ការផ្ទៀងផ្ទាត់ EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : បញ្ហាក្នុង​ការផ្ទៀងផ្ទាត់ EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"បានបិទ​ហតស្ប៉ត"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"មិនមាន​ឧបករណ៍​ដែល​បានភ្ជាប់ទេ។ សូមចុច ដើម្បី​កែ។"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"បានផ្តាច់ Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"ដើម្បី​ភ្ជាប់ <xliff:g id="SSID">%1$s</xliff:g> សូមបញ្ចូល​ស៊ីម <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-kn/strings.xml b/service/res/values-kn/strings.xml
index ac1bccd..0e72fee 100644
--- a/service/res/values-kn/strings.xml
+++ b/service/res/values-kn/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ಸೂಚಿಸಿರುವ ನೆಟ್‌ವರ್ಕ್‌ಗಳು. ಸಾಧನಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಗೊಳ್ಳಬಹುದು."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ಅನುಮತಿಸಿ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ಬೇಡ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>, ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಮಾಡಲು ಬಯಸುತ್ತದೆ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ಸಾಧನದ ಸ್ಥಳವನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಬಳಸಬಹುದಾದ ಅನನ್ಯ ಐಡಿಯನ್ನು ಈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಸ್ವೀಕರಿಸುತ್ತವೆ"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ಹೇಗಿದ್ದರೂ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"ಕನೆಕ್ಟ್ ಮಾಡಬೇಡಿ"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ಕನೆಕ್ಷನ್ ಅನ್ನು ಖಚಿತಪಡಿಸಬೇಕೇ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ನೀವು ಕನೆಕ್ಟ್ ಮಾಡಿದರೆ, <xliff:g id="CARRIERNAME">%s</xliff:g> ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ನಿಮ್ಮ SIM ಗೆ ಸಂಬಂಧಿಸಿದ ಅನನ್ಯ ಐಡಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಬಹುದು ಅಥವಾ ಅದನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಇದು ಅವಕಾಶ ನೀಡಬಹುದು."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"ಕನೆಕ್ಟ್ ಮಾಡಬೇಡಿ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"ವೈ‑ಫೈ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಆಗುತ್ತದೆ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"ನೀವು ಉಳಿಸಿದ ಅಧಿಕ ಗುಣಮಟ್ಟದ ನೆಟ್‌ವರ್ಕ್‌ ಸಮೀಪದಲ್ಲಿದ್ದಾಗ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ಮತ್ತೆ ಆನ್ ಮಾಡಲು ಹಿಂತಿರುಗಬೇಡಿ"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ಪ್ರಮಾಣೀಕರಣ ದೋಷ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ಪ್ರಮಾಣೀಕರಣ ದೋಷ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ಪ್ರಮಾಣೀಕರಣ ದೋಷ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ಹಾಟ್‌ಸ್ಪಾಟ್ ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ಯಾವುದೇ ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಿಲ್ಲ. ಮಾರ್ಪಡಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ವೈ-ಫೈ ಕನೆಕ್ಷನ್ ಕಡಿತಗೊಂಡಿದೆ."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು, <xliff:g id="CARRIER_NAME">%2$s</xliff:g> ಸಿಮ್‌ ಅನ್ನು ಸೇರಿಸಿ"</string>
 </resources>
diff --git a/service/res/values-ko/strings.xml b/service/res/values-ko/strings.xml
index 5075b5b..28f7350 100644
--- a/service/res/values-ko/strings.xml
+++ b/service/res/values-ko/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g>에서 네트워크를 제안했습니다. 기기가 자동으로 연결될 수 있습니다."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"허용"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"허용 안함"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>에서 자동 연결을 사용하려고 합니다"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"이 네트워크는 기기 위치를 추적하는 데 사용할 수 있는 고유 ID를 수신합니다."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"무시하고 연결하기"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"연결 안 함"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"연결하시겠습니까?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"연결하면 <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi 네트워크에서 SIM과 연결된 고유 ID에 액세스하거나 고유 ID를 공유할 수 있습니다. 이 경우 내 기기의 위치를 추적할 수도 있습니다."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"연결"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"연결 안 함"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi가 자동으로 사용 설정됨"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"저장된 고품질 네트워크가 가까이 있는 경우"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"다시 사용 설정하지 않음"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP 인증 오류 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP 인증 오류 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP 인증 오류 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"핫스팟이 사용 중지됨"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"연결된 기기가 없습니다. 수정하려면 탭하세요."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi 연결이 끊어졌습니다."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>에 연결하려면 <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM을 삽입하세요."</string>
 </resources>
diff --git a/service/res/values-ky/strings.xml b/service/res/values-ky/strings.xml
index acb9478..e685013 100644
--- a/service/res/values-ky/strings.xml
+++ b/service/res/values-ky/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> сунуштаган тармактар. Түзмөк автоматтык түрдө туташышы мүмкүн."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Уруксат берүү"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Жок, рахмат"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> байланыш оператору автоматтык түрдө туташкысы келип жатат"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Бул тармактарга өзгөчө идентификатор берилип, анын жардамы менен түзмөктүн жайгашкан жерин аныктоого болот"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Баары бир туташуу"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Туташпасын"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Туташууну ырастайсызбы?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Туташсаңыз, <xliff:g id="CARRIERNAME">%s</xliff:g> операторунун Wi‑Fi тармактары SIM картаңызга байланышкан өзгөчө идентификаторго мүмкүнчүлүк алып, аны башкалар менен бөлүшө алат. Ушуну менен, түзмөгүңүздүн жайгашкан жерин аныктай аласыз."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Туташуу"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Туташпасын"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi автоматтык түрдө күйөт"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Байланыш сигналы күчтүү тармактарга жакындаганда"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Өзү кайра күйбөйт"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP аутентификация катасы 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP аутентификация катасы 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP аутентификация катасы 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Хотспот өчүрүлдү"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Туташып турган түзмөктөр жок. Өзгөртүү үчүн таптап коюңуз."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi‑Fi туташуусу жок"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> тармагына туташуу үчүн <xliff:g id="CARRIER_NAME">%2$s</xliff:g> байланыш операторунун SIM-картасын салыңыз"</string>
 </resources>
diff --git a/service/res/values-lo/strings.xml b/service/res/values-lo/strings.xml
index d41b2b9..8b6adf7 100644
--- a/service/res/values-lo/strings.xml
+++ b/service/res/values-lo/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"ເຄືອຂ່າຍ <xliff:g id="NAME">%s</xliff:g> ທີ່ແນະນຳ. ອຸປະກອນອາດເຊື່ອມຕໍ່ເອງໂດຍອັດຕະໂນມັດ."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ອະນຸຍາດ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ບໍ່, ຂອບໃຈ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ຕ້ອງການເຊື່ອມຕໍ່ອັດຕະໂນມັດ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ເຄືອຂ່າຍເຫຼົ່ານີ້ຈະໄດ້ຮັບ unique ID ທີ່ສາມາດໃຊ້ເພື່ອຕິດຕາມສະຖານທີ່ຂອງອຸປະກອນໄດ້"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ຢືນຢັນການເຊື່ອມຕໍ່"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"ຢ່າເຊື່ອມຕໍ່"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ຢືນຢັນການເຊື່ອມຕໍ່ບໍ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ຫາກທ່ານເຊື່ອມຕໍ່, ເຄືອຂ່າຍ Wi-Fi ຂອງ <xliff:g id="CARRIERNAME">%s</xliff:g> ຈະສາມາດເຂົ້າເຖິງ ແລະ ແບ່ງປັນ unique ID ທີ່ເຊື່ອມໂຍງກັບຊິມຂອງທ່ານໄດ້. ນີ້ອາດເຮັດໃຫ້ສາມາດຕິດຕາມສະຖານທີ່ຂອງອຸປະກອນທ່ານໄດ້."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"ເຊື່ອມຕໍ່"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"ຢ່າເຊື່ອມຕໍ່"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"ຈະມີການເປີດໃຊ້ Wi‑Fi ອັດຕະໂນມັດ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"ເມື່ອທ່ານຢູ່ໃກ້ເຄືອຂ່າຍຄຸນນະພາບສູງທີ່ບັນທຶກໄວ້"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ບໍ່ຕ້ອງເປີດໃຊ້ຄືນໃໝ່"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : ການພິສູດຢືນຢັນ EAP ຜິດພາດ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : ການພິສູດຢືນຢັນ EAP ຜິດພາດ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : ການພິສູດຢືນຢັນ EAP ຜິດພາດ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ປິດຮັອດສະປອດແລ້ວ"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ບໍ່ມີອຸປະກອນເຊື່ອມຕໍ່. ແຕະເພື່ອແກ້ໄຂ."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ຕັດການເຊື່ອມຕໍ່ Wi-Fi ແລ້ວ"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"ເພື່ອເຊື່ອມຕໍ່ຫາ <xliff:g id="SSID">%1$s</xliff:g>, ກະລຸນາໃສ່ຊິມ <xliff:g id="CARRIER_NAME">%2$s</xliff:g> ກ່ອນ"</string>
 </resources>
diff --git a/service/res/values-lt/strings.xml b/service/res/values-lt/strings.xml
index e3e3463..f9617a4 100644
--- a/service/res/values-lt/strings.xml
+++ b/service/res/values-lt/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"„<xliff:g id="NAME">%s</xliff:g>“ siūlomi tinklai. Įrenginys gali prisijungti automatiškai."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Leisti"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ne, ačiū"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"„<xliff:g id="CARRIERNAME">%s</xliff:g>“ nori prijungti automatiškai"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Šie tinklai gauna unikalų ID, kurį galima naudoti įrenginio vietovei stebėti"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Vis tiek prisijungti"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nesprisijungti"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Patvirtinti prijungimą?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Prisijungus „<xliff:g id="CARRIERNAME">%s</xliff:g>“ teikiami „Wi‑Fi“ tinklai gali pasiekti ar bendrinti su jūsų SIM susietą unikalų ID. Gali būti, kad jūsų įrenginio vieta bus stebima."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Prisijungti"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nesprisijungti"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"„Wi‑Fi“ bus įjungtas automatiškai"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kai būsite netoli išsaugoto aukštos kokybės tinklo"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Neįjunkite vėl"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> – EAP autentifikavimo klaida: 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> – EAP autentifikavimo klaida: 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> – EAP autentifikavimo klaida: 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Viešosios interneto prieigos taškas išjungtas"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nėra jokių prijungtų įrenginių. Palieskite, kad pakeistumėte."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"„Wi-Fi“ atjungtas"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Jei norite prisijungti prie „<xliff:g id="SSID">%1$s</xliff:g>“, įdėkite „<xliff:g id="CARRIER_NAME">%2$s</xliff:g>“ SIM kortelę"</string>
 </resources>
diff --git a/service/res/values-lv/strings.xml b/service/res/values-lv/strings.xml
index 8c1bc87..6c00359 100644
--- a/service/res/values-lv/strings.xml
+++ b/service/res/values-lv/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Lietotnes <xliff:g id="NAME">%s</xliff:g> ieteiktie tīkli. Ierīcē var tikt automātiski izveidots savienojums."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Atļaut"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nē, paldies"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> vēlas automātiski izveidot savienojumu"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Šie tīkli saņem unikālo ID, ko var izmantot, lai izsekotu ierīces atrašanās vietu"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Tik un tā izveidot savienojumu"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Neizveidot savienojumu"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Vai apstiprināt savienojumu?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ja izveidosiet savienojumu, <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi tīkli varēs piekļūt unikālajam ID, kas saistīts ar jūsu SIM, vai kopīgot to. Tādējādi varēs tikt izsekota jūsu ierīces atrašanās vieta."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Izveidot savienojumu"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Neizveidot savienojumu"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi tiks automātiski ieslēgts"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kad atrodaties saglabāta augstas kvalitātes tīkla tuvumā"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Neieslēgt atkārtoti"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP autentificēšanas kļūda 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP autentificēšanas kļūda 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP autentificēšanas kļūda 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Tīklājs ir izslēgts"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nav pievienota neviena ierīce. Pieskarieties, lai mainītu iestatījumus."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi savienojums ir pārtraukts."</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Lai izveidotu savienojumu ar tīklu <xliff:g id="SSID">%1$s</xliff:g>, ievietojiet operatora <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM karti."</string>
 </resources>
diff --git a/service/res/values-mcc310-mnc004-ta/strings.xml b/service/res/values-mcc310-mnc004-ta/strings.xml
new file mode 100644
index 0000000..516a527
--- /dev/null
+++ b/service/res/values-mcc310-mnc004-ta/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="wifi_eap_error_message_code_32760" msgid="2026634652595949365">"<xliff:g id="SSID">%1$s</xliff:g> : Verizon கவரேஜ் பகுதியைத் தாண்டி Verizon Wi-Fi Accessஸுடன் இணைக்க முடியாது."</string>
+    <string name="wifi_eap_error_message_code_32761" msgid="360877194229909012">"<xliff:g id="SSID">%1$s</xliff:g> : நீங்கள் Verizon Wi-Fi Accessஸிற்கு சந்தா செய்யவில்லை. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32762" msgid="7728639390217187188">"<xliff:g id="SSID">%1$s</xliff:g> : உங்கள் Verizon Wi-Fi Access கணக்கில் சிக்கல் உள்ளது. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32763" msgid="4245525855163845749">"<xliff:g id="SSID">%1$s</xliff:g> : Verizon Wi-Fi Accessஸுடன் ஏற்கெனவே இணைப்பில் உள்ளீர்கள்."</string>
+    <string name="wifi_eap_error_message_code_32764" msgid="7837099889588693332">"<xliff:g id="SSID">%1$s</xliff:g> : Verizon Wi-Fi Accessஸுடன் இணைப்பதில் சிக்கல் உள்ளது. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32765" msgid="1430902733213412544">"<xliff:g id="SSID">%1$s</xliff:g> : உங்கள் Verizon Wi-Fi Access கணக்கில் சிக்கல் உள்ளது. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32766" msgid="3201380662092880364">"<xliff:g id="SSID">%1$s</xliff:g> : உங்கள் பகுதிக்கு Verizon Wi-Fi Access சேவை கிடைக்கவில்லை. மீண்டும் முயலவும் அல்லது வேறு இருப்பிடத்தில் இருந்து முயலவும்."</string>
+</resources>
diff --git a/service/res/values-mcc311-mnc480-ta/strings.xml b/service/res/values-mcc311-mnc480-ta/strings.xml
new file mode 100644
index 0000000..379eeac
--- /dev/null
+++ b/service/res/values-mcc311-mnc480-ta/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="wifi_eap_error_message_code_32760" msgid="4555573944292156870">"<xliff:g id="SSID">%1$s</xliff:g> : Verizon கவரேஜ் பகுதியைத் தாண்டி Verizon Wi-Fi Accessஸுடன் இணைக்க முடியாது."</string>
+    <string name="wifi_eap_error_message_code_32761" msgid="6990683739673245807">"<xliff:g id="SSID">%1$s</xliff:g> : நீங்கள் Verizon Wi-Fi Accessஸிற்கு சந்தா செய்யவில்லை. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32762" msgid="6557033506833966794">"<xliff:g id="SSID">%1$s</xliff:g> : உங்கள் Verizon Wi-Fi Access கணக்கில் சிக்கல் உள்ளது. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32763" msgid="3400795159444109915">"<xliff:g id="SSID">%1$s</xliff:g> : Verizon Wi-Fi Accessஸுடன் ஏற்கெனவே இணைப்பில் உள்ளீர்கள்."</string>
+    <string name="wifi_eap_error_message_code_32764" msgid="1312072776680938826">"<xliff:g id="SSID">%1$s</xliff:g> : Verizon Wi-Fi Accessஸுடன் இணைப்பதில் சிக்கல் உள்ளது. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32765" msgid="8150337243297471644">"<xliff:g id="SSID">%1$s</xliff:g> : உங்கள் Verizon Wi-Fi Access கணக்கில் சிக்கல் உள்ளது. 800-922-0204 என்ற எண்ணில் எங்களைத் தொடர்புகொள்ளவும்."</string>
+    <string name="wifi_eap_error_message_code_32766" msgid="962325801073733226">"<xliff:g id="SSID">%1$s</xliff:g> : உங்கள் பகுதிக்கு Verizon Wi-Fi Access சேவை கிடைக்கவில்லை. மீண்டும் முயலவும் அல்லது வேறு இருப்பிடத்தில் இருந்து முயலவும்."</string>
+</resources>
diff --git a/service/res/values-mk/strings.xml b/service/res/values-mk/strings.xml
index 20b87d7..1852f52 100644
--- a/service/res/values-mk/strings.xml
+++ b/service/res/values-mk/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Предложени мрежи од <xliff:g id="NAME">%s</xliff:g>. Уредот може да се поврзе автоматски."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Дозволи"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Не, фала"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> сака автоматски да се поврзе"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Мреживе примаат уникатен ID што може да се користи за следење на локацијата на уредот"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Сепак поврзи се"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Не поврзувај"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Да се потврди врската?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ако се поврзете, Wi‑Fi мрежите на <xliff:g id="CARRIERNAME">%s</xliff:g> може да имаат пристап до уникатен ID поврзан со вашата SIM-картичка или да го споделуваат. Ова може да овозможи следење на локацијата на вашиот уред."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Поврзи"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Не поврзувај"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi ќе се вклучи автоматски"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Кога сте во близина на зачувана мрежа со висок квалитет"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Не вклучувај повторно"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: грешка 32764 при проверката со EAP"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: грешка 32765 при проверката со EAP"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: грешка 32766 при проверката со EAP"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Точката на пристап е исклучена"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Нема поврзани уреди. Допрете за да измените."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi е исклучено"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"За да се поврзете на <xliff:g id="SSID">%1$s</xliff:g>, вметнете SIM-картичка на <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-ml/strings.xml b/service/res/values-ml/strings.xml
index 5e4286a..8cad815 100644
--- a/service/res/values-ml/strings.xml
+++ b/service/res/values-ml/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> നിർദ്ദേശിച്ച നെറ്റ്‌വർക്കുകൾ. ഉപകരണം സ്വയമേവ കണക്‌റ്റ് ചെയ്‌തേക്കാം."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"അനുവദിക്കുക"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"വേണ്ട"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> സ്വയമേവ കണക്റ്റ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ഉപകരണ ലൊക്കേഷൻ ട്രാക്ക് ചെയ്യാൻ ഉപയോഗിക്കാവുന്ന തനത് ഐഡി ഈ നെറ്റ്‌വർക്കുകൾക്ക് ലഭിക്കും"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"എന്തായാലും കണക്‌റ്റ് ചെയ്യുക"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"കണക്റ്റ് ചെയ്യരുത്"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"കണക്ഷൻ സ്ഥിരീകരിക്കണോ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"നിങ്ങൾ കണക്റ്റ് ചെയ്യുകയാണെങ്കിൽ, സിമ്മുമായി ബന്ധപ്പെട്ട തനത് ഐഡി <xliff:g id="CARRIERNAME">%s</xliff:g> വൈഫൈ നെറ്റ്‌വർക്കുകൾ ആക്സസ് ചെയ്യുകയോ പങ്കിടുകയോ ചെയ്തേക്കാം. നിങ്ങളുടെ ഉപകരണ ലൊക്കേഷൻ ട്രാക്ക് ചെയ്യാൻ ഇത് അനുവദിച്ചേക്കാം."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"കണക്റ്റ് ചെയ്യുക"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"കണക്റ്റ് ചെയ്യരുത്"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"വൈഫൈ സ്വമേധയാ ഓണാകും"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"നിങ്ങൾ ഉയർന്ന നിലവാരമുള്ള സംരക്ഷിക്കപ്പെട്ട നെറ്റ്‌വർക്കിനരികിലെത്തുമ്പോൾ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"തിരികെ ഓണാക്കരുത്"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP പരിശോധിച്ചുറപ്പിക്കുന്നതിലെ പ്രശ്നം 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP പരിശോധിച്ചുറപ്പിക്കുന്നതിലെ പ്രശ്നം 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP പരിശോധിച്ചുറപ്പിക്കുന്നതിലെ പ്രശ്നം 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ഹോട്ട്‌സ്‌പോട്ട് ഓഫാക്കി"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ഉപകരണങ്ങളൊന്നും കണക്‌റ്റ് ചെയ്തിട്ടില്ല. പരിഷ്‌കരിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"വൈഫൈ വിച്ഛേദിച്ചു"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> എന്നതിലേക്ക് കണക്‌റ്റ് ചെയ്യാൻ <xliff:g id="CARRIER_NAME">%2$s</xliff:g> സിം ഇടുക"</string>
 </resources>
diff --git a/service/res/values-mn/strings.xml b/service/res/values-mn/strings.xml
index b4cd534..c7a6742 100644
--- a/service/res/values-mn/strings.xml
+++ b/service/res/values-mn/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> сүлжээ санал болголоо. Төхөөрөмж автоматаар холбогдож магадгүй."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Зөвшөөрөх"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Үгүй, баярлалаа"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> нь автоматаар холбогдох хүсэлтэй байна"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Эдгээр сүлжээ нь төхөөрөмжийн байршлыг тандахад ашиглах боломжтой цор ганц дугаарыг хүлээн авдаг"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Ямар ч тохиолдолд холбогдох"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Битгий холбогд"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Холболтыг баталгаажуулах уу?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Хэрэв та холбогдвол <xliff:g id="CARRIERNAME">%s</xliff:g>-н Wi‑Fi сүлжээ нь таны СИМ-тэй холбоотой цор ганц дугаарт хандаж эсвэл түүнийг хуваалцаж болзошгүй. Энэ нь таны төхөөрөмжийн байршлыг тандахыг зөвшөөрч болзошгүй."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Холбогдох"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Битгий холбогд"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi автоматаар асна"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Таныг хадгалсан, өндөр чанартай сүлжээний ойролцоо байх үед"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Буцааж асаахгүй"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP нотолгооны алдаа 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP нотолгооны алдаа 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP нотолгооны алдаа 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Сүлжээний цэгийг унтраасан"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ямар ч төхөөрөмж холбогдоогүй байна. Өөрчлөхийн тулд товшино уу."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wifi-г салгалаа"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>-д холбогдохын тулд <xliff:g id="CARRIER_NAME">%2$s</xliff:g> СИМ-г хийнэ үү"</string>
 </resources>
diff --git a/service/res/values-mr/strings.xml b/service/res/values-mr/strings.xml
index 39436bd..8e742fd 100644
--- a/service/res/values-mr/strings.xml
+++ b/service/res/values-mr/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> सुचवलेली नेटवर्क. डिव्हाइस आपोआप कनेक्ट होऊ शकते."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"अनुमती द्या"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"नाही, नको"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ला ऑटो‑कनेक्ट करायचे आहे"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"या नेटवर्कना एक युनिक आयडी मिळतो जो डिव्हाइस स्थानाचा मागोवा घेण्यासाठी वापरला जाऊ शकतो"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"तरीही कनेक्ट करा"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"कनेक्ट करू नका"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"कनेक्शन निश्चित करायचे आहे का?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"तुम्ही कनेक्ट केल्यास, <xliff:g id="CARRIERNAME">%s</xliff:g> वाय-फाय नेटवर्क तुमच्या सिम शी संबंधित एक युनिक आयडी अ‍ॅक्सेस किंवा शेअर करू शकतात. यामुळे तुमच्या डिव्हाइस स्थानाचा मागोवा घेतला जाऊ शकतो."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"कनेक्ट करा"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"कनेक्ट करू नका"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"वाय-फाय आपोआप चालू होईल"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"तुम्ही जेव्हा सेव्ह केलेल्या उच्च दर्जाच्या नेटवर्कजवळ असाल तेव्हा"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"पुन्हा चालू करू नका"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ऑथेंटिकेशन एरर ३२७६४"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ऑथेंटिकेशन एरर ३२७६५"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ऑथेंटिकेशन एरर ३२७६६"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"हॉटस्पॉट बंद आहे"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"कोणतीही डिव्हाइस कनेक्ट केलेली नाहीत. सुधारित करण्यासाठी टॅप करा."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"वाय-फाय डिस्कनेक्ट झाले"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> शी कनेक्ट करण्यासाठी, एक <xliff:g id="CARRIER_NAME">%2$s</xliff:g> सिम घाला"</string>
 </resources>
diff --git a/service/res/values-ms/strings.xml b/service/res/values-ms/strings.xml
index 33def3c..76f7b4f 100644
--- a/service/res/values-ms/strings.xml
+++ b/service/res/values-ms/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Rangkaian yang dicadangkan oleh <xliff:g id="NAME">%s</xliff:g>. Peranti mungkin disambungkan secara automatik."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Benarkan"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Tidak perlu"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> mahu membuat autosambungan"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Rangkaian ini memerlukan ID unit yang boleh digunakan untuk menjejaki lokasi peranti."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Sambungkan juga"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Jangan sambung"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Sahkan sambungan?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Jika anda bersambung, rangkaian Wi-Fi <xliff:g id="CARRIERNAME">%s</xliff:g> mungkin mengakses atau berkongsi ID unik yang dikaitkan dengan SIM anda. Hal ini mungkin membenarkan lokasi peranti anda dijejaki."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Sambung"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Jangan sambung"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi akan dihidupkan secara automatik"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Apabila anda berada berdekatan dengan rangkaian disimpan yang berkualiti tinggi"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Jangan hidupkan kembali"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Ralat pengesahan EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Ralat pengesahan EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Ralat pengesahan EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Tempat liputan dimatikan."</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Tiada peranti disambungkan. Ketik untuk mengubah suai."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi diputuskan sambungannya"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Untuk menyambung kepada <xliff:g id="SSID">%1$s</xliff:g>, masukkan SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-my/strings.xml b/service/res/values-my/strings.xml
index 7e7f26b..f46860c 100644
--- a/service/res/values-my/strings.xml
+++ b/service/res/values-my/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> သည် ကွန်ရက်များကို အကြံပြုထားသည်။ စက်သည် အလိုအလျောက် ချိတ်ဆက်နိုင်သည်။"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ခွင့်ပြုရန်"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"မလိုပါ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> က အလိုအလျောက် ချိတ်ဆက်လိုသည်"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ဤကွန်ရက်များက စက်တည်နေရာကို ခြေရာခံရန် အသုံးပြုနိုင်သည့် သီးသန့် ID ကို ရရှိပါသည်"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"မည်သို့ပင်ဖြစ်စေ ချိတ်ဆက်ရန်"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"မချိတ်ဆက်ပါနှင့်"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ချိတ်ဆက်မှု အတည်ပြုမလား။"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"သင်ချိတ်ဆက်ပါက <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi ကွန်ရက်များက သင့်ဆင်းမ်ကတ်နှင့် ဆက်စပ်နေသည့် သီးသန့် ID ကို သုံးခြင်း သို့မဟုတ် မျှဝေခြင်းတို့ ပြုလုပ်နိုင်သည်။ ၎င်းက သင့်စက်၏တည်နေရာကို ခြေရာခံခွင့် ပြုနိုင်သည်။"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"ချိတ်ဆက်ပါ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"မချိတ်ဆက်ပါနှင့်"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi ကို အလိုအလျောက်​ ပြန်ဖွင့်ပေးလိမ့်ပါမည်"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"သိမ်းဆည်းထားသည့် အရည်အသွေးမြင့်ကွန်ရက်များအနီးသို့ ရောက်ရှိသည့်အခါ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ပြန်မဖွင့်ပါနှင့်"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> - EAP အထောက်အထားစိစစ်ခြင်း အမှား 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> - EAP အထောက်အထားစိစစ်ခြင်း အမှား 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> - EAP အထောက်အထားစိစစ်ခြင်း အမှား 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ဟော့စပေါ့ ပိတ်ထားသည်"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ချိတ်ဆက်ထားသောစက် မရှိပါ။ ပြင်ဆင်ရန် တို့ပါ။"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi ချိတ်ဆက်မှု မရှိပါ"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> နှင့် ချိတ်ဆက်ရန် <xliff:g id="CARRIER_NAME">%2$s</xliff:g> ဆင်းမ်ကတ် ထည့်ပါ။"</string>
 </resources>
diff --git a/service/res/values-nb/strings.xml b/service/res/values-nb/strings.xml
index e3d6cf3..ea826c1 100644
--- a/service/res/values-nb/strings.xml
+++ b/service/res/values-nb/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g>-foreslåtte nettverk. Enheten kan koble til automatisk."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Tillat"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nei takk"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> vil koble til automatisk"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Disse nettverkene mottar en unik ID som kan brukes til å spore enhetsposisjonen"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Koble til likevel"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ikke koble til"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Vil du bekrefte tilkoblingen?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Hvis du kobler til, kan <xliff:g id="CARRIERNAME">%s</xliff:g>-Wi‑Fi-nettverk få tilgang til eller dele en unik ID som er knyttet til SIM-kortet ditt. Dette gjør at enhetens posisjon kan spores."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Koble til"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ikke koble til"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi slås på automatisk"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Når du er i nærheten av et lagret nettverk av høy kvalitet"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ikke slå på igjen"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-autentiseringsfeil 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-autentiseringsfeil 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP-autentiseringsfeil 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Wi-Fi-sonen er slått av"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ingen enheter er koblet til. Trykk for å endre."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi er frakoblet"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"For å koble til <xliff:g id="SSID">%1$s</xliff:g>, sett inn et <xliff:g id="CARRIER_NAME">%2$s</xliff:g>-SIM-kort"</string>
 </resources>
diff --git a/service/res/values-ne/strings.xml b/service/res/values-ne/strings.xml
index 85bd5ce..bd6a4f7 100644
--- a/service/res/values-ne/strings.xml
+++ b/service/res/values-ne/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ले सिफारिस गरेका नेटवर्कहरू। यन्त्र स्वतः जडान हुन सक्छ।"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"अनुमति दिनुहोस्"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"पर्दैन, धन्यवाद"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> स्वतः जोडिन चाहन्छ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"यी नेटवर्कहरूले यन्त्रको स्थान पहिल्याउन प्रयोग गर्न सकिने एउटा अद्वित्तीय ID प्राप्त गर्छन्"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"जुनसुकै तरिकाले भए पनि जोड्नुहोस्"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"नजोड्नुहोस्"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"जोडिने हो?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"तपाईं जोडिनुभयो भने <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi नेटवर्कहरूले तपाईंको SIM सँग सम्बद्ध अद्वित्तीय ID प्रयोग गर्न वा उक्त ID आदान प्रदान गर्न सक्छ। उक्त ID प्रयोग गरी तपाईंको यन्त्रको स्थान पहिल्याउन सकिन्छ।"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"जोड्नुहोस्"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"नजोड्नुहोस्"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi स्वतः सक्रिय हुनेछ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"तपाईं कुनै सुरक्षित गरिएको उच्च गुणस्तरीय नेटवर्कको नजिक हुनुभएको अवस्थामा"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"फेरि सक्रिय नगर्नुहोला"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP प्रमाणीकरणसम्बन्धी त्रुटि ३२७६४"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP प्रमाणीकरणसम्बन्धी त्रुटि ३२७६५"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP प्रमाणीकरणसम्बन्धी त्रुटि ३२७६६"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"हटस्पट निष्क्रिय पारिएको छ"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"कुनै यन्त्र जोडिएको छैन। परिमार्जन गर्न ट्याप गर्नुहोस्।"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi विच्छेद गरियो।"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> मा जोडिन <xliff:g id="CARRIER_NAME">%2$s</xliff:g> को SIM सम्मिलित गर्नुहोस्"</string>
 </resources>
diff --git a/service/res/values-nl/strings.xml b/service/res/values-nl/strings.xml
index 775dc14..8c79433 100644
--- a/service/res/values-nl/strings.xml
+++ b/service/res/values-nl/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> heeft netwerken voorgesteld. Apparaat kan automatisch verbinding maken."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Toestaan"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nee, bedankt"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> wil automatisch verbinding maken"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Deze netwerken ontvangen een unieke ID die kan worden gebruikt om de apparaatlocatie bij te houden"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Toch verbinding maken"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Geen verbinding maken"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Verbinding bevestigen?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Als je verbinding maakt, hebben de wifi-netwerken van <xliff:g id="CARRIERNAME">%s</xliff:g> mogelijk toegang tot de unieke ID die aan je simkaart is gekoppeld of kunnen ze deze delen. Op deze manier kan de locatie van je apparaat worden bijgehouden."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Verbinding maken"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Geen verbinding maken"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wifi wordt automatisch ingeschakeld"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Wanneer je in de buurt van een opgeslagen netwerk van hoge kwaliteit bent"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Niet weer inschakelen"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-verificatiefout 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-verificatiefout 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-verificatiefout 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot uitgeschakeld"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Geen apparaten gekoppeld. Tik om te wijzigen."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wifi-verbinding verbroken"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Plaats een simkaart van <xliff:g id="CARRIER_NAME">%2$s</xliff:g> om verbinding te maken met <xliff:g id="SSID">%1$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-or/strings.xml b/service/res/values-or/strings.xml
index f3ec243..29c4ce2 100644
--- a/service/res/values-or/strings.xml
+++ b/service/res/values-or/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ପ୍ରସ୍ତାବିତ ନେଟ୍‌ୱାର୍କଗୁଡ଼ିକ। ଡିଭାଇସ୍ ହୁଏତ ସ୍ୱଚାଳିତ ଭାବେ ସଂଯୋଗ ହୋଇପାରେ।"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ନାହିଁ, ଥାଉ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ସ୍ୱତଃ-ସଂଯୋଗ କରିବାକୁ ଚାହେଁ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ଏହି ନେଟୱାର୍କଗୁଡ଼ିକ ଏକ ସ୍ଵତନ୍ତ୍ର ID ପାଇଥାଏ ଯାହାକୁ ଡିଭାଇସର ଲୋକେସନ୍ ଟ୍ରାକ୍ କରିବାକୁ ବ୍ୟବହାର କରାଯାଇପାରେ"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ଯେ କୌଣସି ମତେ ସଂଯୋଗ କରନ୍ତୁ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"ସଂଯୋଗ କରନ୍ତୁ ନାହିଁ"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ସଂଯୋଗ ସୁନିଶ୍ଚିତ କରିବେ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ଯଦି ଆପଣ ସଂଯୋଗ କରିବେ, ତେବେ <xliff:g id="CARRIERNAME">%s</xliff:g> ୱାଇ-ଫାଇ ନେଟୱାର୍କଗୁଡ଼ିକ ଆପଣଙ୍କ SIM ସମ୍ବନ୍ଧିତ ଏକ ସ୍ଵତନ୍ତ୍ର ID ଆକ୍ସେସ୍ କିମ୍ବା ସେୟାର୍ କରିପାରେ। ଏହା ଆପଣଙ୍କ ଡିଭାଇସର ଲୋକେସନ୍ ଟ୍ରାକ୍ କରିବାକୁ ଅନୁମତି ଦେଇପାରେ।"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"ସଂଯୋଗ କରନ୍ତୁ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"ସଂଯୋଗ କରନ୍ତୁ ନାହିଁ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେବ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"ଆପଣ ଏକ ଉଚ୍ଚ-କ୍ୱାଲିଟୀ ବିଶିଷ୍ଟ ସେଭ୍‌ କରାଯାଇଥିବା ନେଟ୍‌ୱର୍କ ପାଖରେ ଥିବା ସମୟରେ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ପୁଣି ଅନ୍‍ କରନ୍ତୁ ନାହିଁ"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ପ୍ରମାଣିକତାରେ ତ୍ରୁଟି 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ପ୍ରମାଣିକତାରେ ତ୍ରୁଟି 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ପ୍ରମାଣିକତାରେ ତ୍ରୁଟି 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ହଟସ୍ପଟ୍ ବନ୍ଦ କରାଯାଇଛି"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"କୌଣସି ଡିଭାଇସ୍ ସଂଯୁକ୍ତ ନାହିଁ। ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ୱାଇ-ଫାଇ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହୋଇଛି"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>କୁ ସଂଯୋଗ କରିବା ପାଇଁ ଏକ <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
 </resources>
diff --git a/service/res/values-pa/strings.xml b/service/res/values-pa/strings.xml
index ef6bbb1..ee68453 100644
--- a/service/res/values-pa/strings.xml
+++ b/service/res/values-pa/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> ਦੇ ਸੁਝਾਏ ਨੈੱਟਵਰਕ। ਸ਼ਾਇਦ ਡੀਵਾਈਸ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਹੋਵੇ।"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ਵਰਤਣ ਦਿਓ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ਸਵੈ-ਕਨੈਕਟ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ਇਹ ਨੈੱਟਵਰਕ ਇੱਕ ਵਿਲੱਖਣ ਆਈਡੀ ਪ੍ਰਾਪਤ ਕਰਦੇ ਹਨ ਜੋ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਨੂੰ ਟਰੈਕ ਕਰਨ ਲਈ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ਫਿਰ ਵੀ ਕਨੈਕਟ ਕਰੋ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"ਕਨੈਕਟ ਨਾ ਕਰੋ"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ਕੀ ਕਨੈਕਸ਼ਨ ਦੀ ਤਸਦੀਕ ਕਰਨੀ ਹੈ?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ਜੇ ਤੁਸੀਂ ਕਨੈਕਟ ਕਰਦੇ ਹੋ, ਤਾਂ <xliff:g id="CARRIERNAME">%s</xliff:g> ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੁਹਾਡੇ ਸਿਮ ਨਾਲ ਸੰਬੰਧਿਤ ਵਿਲੱਖਣ ਆਈਡੀ ਤੱਕ ਪਹੁੰਚ ਜਾਂ ਉਸ ਨੂੰ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹਨ। ਇਸ ਨਾਲ ਸ਼ਾਇਦ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਟਿਕਾਣਾ ਟਰੈਕ ਕੀਤਾ ਜਾ ਸਕੇ।"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"ਕਨੈਕਟ ਕਰੋ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"ਕਨੈਕਟ ਨਾ ਕਰੋ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"ਵਾਈ‑ਫਾਈ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚੱਲ ਪਵੇਗਾ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਰੱਖਿਅਤ ਕੀਤੇ ਉੱਚ-ਗੁਣਵੱਤਾ ਵਾਲੇ ਨੈੱਟਵਰਕ ਦੇ ਨੇੜੇ ਹੋਵੋ"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ਵਾਪਸ ਚਾਲੂ ਨਾ ਕਰੋ"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ਪ੍ਰਮਾਣੀਕਰਨ ਗੜਬੜ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ਪ੍ਰਮਾਣੀਕਰਨ ਗੜਬੜ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ਪ੍ਰਮਾਣੀਕਰਨ ਗੜਬੜ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ਹੌਟਸਪੌਟ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ਕੋਈ ਕਨੈਕਟ ਕੀਤੇ ਹੋਏ ਡੀਵਾਈਸ ਨਹੀਂ। ਸੋਧਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ਵਾਈ-ਫਾਈ ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ, <xliff:g id="CARRIER_NAME">%2$s</xliff:g> ਦਾ ਸਿਮ ਪਾਓ"</string>
 </resources>
diff --git a/service/res/values-pl/strings.xml b/service/res/values-pl/strings.xml
index ce309a9..89628ee 100644
--- a/service/res/values-pl/strings.xml
+++ b/service/res/values-pl/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Sugerowane sieci: <xliff:g id="NAME">%s</xliff:g>. Urządzenie może łączyć się automatycznie."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Zezwól"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nie, dziękuję"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> chce łączyć się automatycznie"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Te sieci otrzymują unikalny identyfikator, który można wykorzystać do śledzenia lokalizacji urządzenia"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Połącz mimo to"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nie łącz"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Potwierdzić połączenie?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Jeśli się połączysz, sieci Wi-Fi operatora <xliff:g id="CARRIERNAME">%s</xliff:g> będą mogły korzystać z unikalnego identyfikatora powiązanego z Twoją kartą SIM oraz go udostępniać. To może pozwolić na monitorowanie lokalizacji Twojego urządzenia."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Połącz"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nie łącz"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi włączy się automatycznie"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Gdy znajdziesz się w pobliżu zapisanej sieci o mocnym sygnale"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Nie włączaj ponownie"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: błąd uwierzytelniania EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : błąd uwierzytelniania EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: błąd uwierzytelniania EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot jest wyłączony"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Brak połączonych urządzeń. Kliknij, by zmodyfikować."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi rozłączone"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Aby połączyć się z siecią <xliff:g id="SSID">%1$s</xliff:g>, włóż kartę SIM operatora <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-pt-rBR/strings.xml b/service/res/values-pt-rBR/strings.xml
index 7a8cb9f..15b5e39 100644
--- a/service/res/values-pt-rBR/strings.xml
+++ b/service/res/values-pt-rBR/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Redes sugeridas pelo app <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode se conectar automaticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permitir"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Não"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> quer fazer a conexão automática"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Essas redes recebem um código exclusivo que pode ser usado para monitorar o local do dispositivo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Conectar assim mesmo"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Não conectar"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Confirmar a conexão?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Se você fizer a conexão, as redes Wi-Fi da <xliff:g id="CARRIERNAME">%s</xliff:g> poderão acessar ou compartilhar o código exclusivo associado ao seu chip. Isso talvez permita que o local do dispositivo seja monitorado."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Conectar"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Não conectar"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"O Wi‑Fi será ativado automaticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Quando você estiver perto de uma rede salva de alta qualidade"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Não ativar novamente"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP nº 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP nº 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP nº 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Ponto de acesso desativado"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Não há dispositivos conectados. Toque para modificar."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi desconectado"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para se conectar a <xliff:g id="SSID">%1$s</xliff:g>, insira um chip da <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-pt-rPT/strings.xml b/service/res/values-pt-rPT/strings.xml
index 55f4c34..6d28b8b 100644
--- a/service/res/values-pt-rPT/strings.xml
+++ b/service/res/values-pt-rPT/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Redes sugeridas por <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode estabelecer ligação automaticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permitir"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Não, obrigado"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"O operador <xliff:g id="CARRIERNAME">%s</xliff:g> pretende efetuar uma ligação automática"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Estas redes recebem um ID exclusivo que pode ser utilizado para monitorizar a localização dos dispositivos."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Ligar mesmo assim"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Não ligar"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Pretende confirmar a ligação?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Caso proceda à ligação, as redes Wi-Fi do operador <xliff:g id="CARRIERNAME">%s</xliff:g> podem partilhar ou aceder a um ID exclusivo associado ao seu SIM. Esta ação pode permitir que a localização do seu dispositivo seja monitorizada."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Ligar"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Não ligar"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"O Wi‑Fi será ativado automaticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Quando estiver próximo de uma rede de alta qualidade guardada."</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Não reativar"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Zona Wi-Fi desativada"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nenhum dispositivo ligado. Toque para modificar."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi desligado"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para estabelecer ligação a <xliff:g id="SSID">%1$s</xliff:g>, insira um SIM do operador <xliff:g id="CARRIER_NAME">%2$s</xliff:g>."</string>
 </resources>
diff --git a/service/res/values-pt/strings.xml b/service/res/values-pt/strings.xml
index 7a8cb9f..15b5e39 100644
--- a/service/res/values-pt/strings.xml
+++ b/service/res/values-pt/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Redes sugeridas pelo app <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode se conectar automaticamente."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permitir"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Não"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> quer fazer a conexão automática"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Essas redes recebem um código exclusivo que pode ser usado para monitorar o local do dispositivo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Conectar assim mesmo"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Não conectar"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Confirmar a conexão?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Se você fizer a conexão, as redes Wi-Fi da <xliff:g id="CARRIERNAME">%s</xliff:g> poderão acessar ou compartilhar o código exclusivo associado ao seu chip. Isso talvez permita que o local do dispositivo seja monitorado."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Conectar"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Não conectar"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"O Wi‑Fi será ativado automaticamente"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Quando você estiver perto de uma rede salva de alta qualidade"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Não ativar novamente"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP nº 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP nº 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: erro de autenticação EAP nº 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Ponto de acesso desativado"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Não há dispositivos conectados. Toque para modificar."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi desconectado"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para se conectar a <xliff:g id="SSID">%1$s</xliff:g>, insira um chip da <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-ro/strings.xml b/service/res/values-ro/strings.xml
index 990e31f..52b4252 100644
--- a/service/res/values-ro/strings.xml
+++ b/service/res/values-ro/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> a sugerat rețele. Dispozitivul se poate conecta automat."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Permiteți"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nu, mulțumesc"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> încearcă să se conecteze automat"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Aceste rețele primesc un ID unic care se poate folosi pentru a urmări locația dispozitivului"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Conectați oricum"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nu conectați"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Confirmați conexiunea?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Dacă vă conectați, rețelele Wi-Fi <xliff:g id="CARRIERNAME">%s</xliff:g> pot să acceseze sau să trimită un ID unic asociat profilului dvs. SIM. Astfel, locația dispozitivului poate fi urmărită."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Conectați"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nu conectați"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi se va activa automat"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Când vă aflați lângă o rețea salvată, de înaltă calitate"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Nu reactivați"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : eroare de autentificare EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : eroare de autentificare EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : eroare de autentificare EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspotul a fost dezactivat"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Niciun dispozitiv conectat. Atingeți pentru a modifica."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Rețea Wi-Fi deconectată"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Pentru a vă conecta la <xliff:g id="SSID">%1$s</xliff:g>, introduceți un SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-ru/strings.xml b/service/res/values-ru/strings.xml
index ce8909c..c88332f 100644
--- a/service/res/values-ru/strings.xml
+++ b/service/res/values-ru/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Приложение \"<xliff:g id="NAME">%s</xliff:g>\" рекомендует сети, к которым устройство может подключаться автоматически."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Разрешить"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Нет, спасибо"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> запрашивает разрешение на автоподключение"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Эти сети получат доступ к уникальному идентификатору, с помощью которого можно отслеживать местоположение устройства."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Все равно подключиться"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Не подключаться"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Подтвердите подключение"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Если вы установите подключение, Wi‑Fi-сети оператора \"<xliff:g id="CARRIERNAME">%s</xliff:g>\" смогут получать доступ к уникальному идентификатору, связанному с вашей SIM-картой, или делиться им. Это позволит отслеживать местоположение устройства."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Подключиться"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Не подключаться"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi включится автоматически"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Когда вы будете в зоне действия сохраненной сети с хорошим сигналом."</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Не включать снова"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Ошибка аутентификации EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Ошибка аутентификации EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Ошибка аутентификации EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Хот-спот отключен"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Нет подключенных устройств. Нажмите, чтобы внести изменения."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Нет подключения к Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Чтобы подключиться к сети \"<xliff:g id="SSID">%1$s</xliff:g>\", вставьте SIM-карту оператора \"<xliff:g id="CARRIER_NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/service/res/values-si/strings.xml b/service/res/values-si/strings.xml
index 6fc8934..8e6b17f 100644
--- a/service/res/values-si/strings.xml
+++ b/service/res/values-si/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> යෝජිත ජාල. උපාංගය ස්වයංක්‍රියව සම්බන්ධ වනු ඇත."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"ඉඩ දෙන්න"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"එපා, ස්තූතියි"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> හට ස්වයං නිවැරදි කිරීමට අවශ්‍යයි"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"උපාංග ස්ථානය නිරීක්ෂණය කිරීමට භාවිත කළ හැකි අනන්‍ය ID එකක් මෙම ජාලවලට ලැබේ"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"කෙසේ වෙතත් සම්බන්ධ කරන්න"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"සම්බන්ධ නොකරන්න"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"නිවැරදි කිරීම තහවුරු කරන්නද?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"ඔබ සම්බන්ධ වුවහොත්, <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi ජාල ඔබේ SIM එක හා සම්බන්ධිත අනන්‍ය ID එකකට ප්‍රවේශ වීමට හෝ එය බෙදා ගැනීමට හැකිය. මෙය ඔබේ උපාංගයෙහි ස්ථානය නිරීක්ෂණය කිරීමට ඉඩ දිය හැකිය."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"සම්බන්ධ කරන්න"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"සම්බන්ධ නොකරන්න"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi ස්වයංක්‍රියව ක්‍රියාත්මක වනු ඇත"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"ඔබ උසස් තත්ත්වයේ සුරැකි ජාලයක් අවට සිටින විට"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"නැවත ක්‍රියාත්මක නොකරන්න"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP සත්‍යාපනය කිරීමේ දෝෂය 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP සත්‍යාපනය කිරීමේ දෝෂය 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP සත්‍යාපනය කිරීමේ දෝෂය 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"හොට්ස්පොට් ක්‍රියා විරහිතයි"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"උපාංග කිසිවක් සම්බන්ධ කර නැත. වෙනස් කිරීමට තට්ටු කරන්න."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi‑Fi විසන්ධි විය"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> වෙත සම්බන්ධ වීමට, <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM එකක් ඇතුල් කරන්න"</string>
 </resources>
diff --git a/service/res/values-sk/strings.xml b/service/res/values-sk/strings.xml
index 75edf2d..fe58277 100644
--- a/service/res/values-sk/strings.xml
+++ b/service/res/values-sk/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Siete navrhuje aplikácia <xliff:g id="NAME">%s</xliff:g>. Zariadenie sa môže pripájať automaticky."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Povoliť"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nie, ďakujem"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"Operátor <xliff:g id="CARRIERNAME">%s</xliff:g> chce používať automatické pripojenie"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Tieto siete prijímajú jedinečný identifikátor, ktorý môže byť použitý na sledovanie polohy zariadenia"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Pripojiť aj tak"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Nepripojiť"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Chcete potvrdiť pripojenie?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Po pripojení môžu siete Wi‑Fi operátora <xliff:g id="CARRIERNAME">%s</xliff:g> pristupovať k jedinečnému identifikátoru spojenému s vašou SIM kartou alebo ho zdieľať. To umožňuje sledovať polohu vášho zariadenia."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Pripojiť"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Nepripojiť"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi sa zapne automaticky"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Keď budete v blízkosti kvalitnej uloženej siete"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Znova nezapínať"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : chyba overenia EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : chyba overenia EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : chyba overenia EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot je vypnutý"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nie sú pripojené žiadne zariadenia. Klepnutím to môžete upraviť."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Sieť Wi‑Fi je odpojená"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Ak sa chcete pripojiť k sieti <xliff:g id="SSID">%1$s</xliff:g>, vložte SIM kartu operátora <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-sl/strings.xml b/service/res/values-sl/strings.xml
index 4278a0e..c27f985 100644
--- a/service/res/values-sl/strings.xml
+++ b/service/res/values-sl/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> – predlagana omrežja. Naprava se lahko poveže samodejno."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Dovoli"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ne, hvala"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"Operater <xliff:g id="CARRIERNAME">%s</xliff:g> se želi samodejno povezati"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ta omrežja prejmejo enolični ID, s katerim je mogoče spremljati lokacijo naprave."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Vseeno poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ne poveži"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Želite potrditi povezavo?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Če vzpostavite povezavo, lahko omrežja Wi-Fi operaterja <xliff:g id="CARRIERNAME">%s</xliff:g> dostopajo do enoličnega ID-ja, povezanega s kartico SIM, in ga delijo. To lahko omogoči spremljanje lokacije naprave."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Poveži"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ne poveži"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Povezava Wi‑Fi se bo samodejno vklopila"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Ko ste v bližini zanesljivega shranjenega omrežja"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ne vklopi znova"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: Napaka 32764 pri preverjanju pristnosti EAP"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: Napaka 32765 pri preverjanju pristnosti EAP"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: Napaka 32766 pri preverjanju pristnosti EAP"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Dostopna točka je izklopljena"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nobena naprava ni povezana. Dotaknite se, da spremenite."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Povezava Wi-Fi je prekinjena"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Za povezavo z omrežjem <xliff:g id="SSID">%1$s</xliff:g> vstavite kartico SIM operaterja <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-sq/strings.xml b/service/res/values-sq/strings.xml
index 0bcfb45..708503d 100644
--- a/service/res/values-sq/strings.xml
+++ b/service/res/values-sq/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Rrjet e sugjeruara të <xliff:g id="NAME">%s</xliff:g>. Pajisja mund të lidhet automatikisht."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Lejo"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Jo, faleminderit"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> dëshiron të lidhet automatikisht"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Këto rrjete marrin një ID unike që mund të përdoret për të monitoruar vendndodhjen"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Lidhu gjithsesi"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Mos u lidh"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Të konfirmohet lidhja?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Nëse lidhesh, rrjetet Wi-Fi të <xliff:g id="CARRIERNAME">%s</xliff:g> mund të kenë qasje ose mund të ndajnë një ID unike që lidhet me kartën tënde SIM. Kjo mund të lejojë monitorimin e vendndodhjes sate."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Lidhu"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Mos u lidh"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi do të aktivizohet automatikisht"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kur ndodhesh pranë një rrjeti të ruajtur me cilësi të lartë"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Mos e aktivizo përsëri"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Gabimi i vërtetimit të EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Gabimi i vërtetimit të EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Gabimi i vërtetimit të EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Zona e qasjes për internet është çaktivizuar"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Nuk ka pajisje të lidhura. Trokit për ta modifikuar."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi është i shkëputur"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Për t\'u lidhur me <xliff:g id="SSID">%1$s</xliff:g> fut një kartë SIM nga <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-sr/strings.xml b/service/res/values-sr/strings.xml
index daaa793..c488c21 100644
--- a/service/res/values-sr/strings.xml
+++ b/service/res/values-sr/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Мреже које предлаже <xliff:g id="NAME">%s</xliff:g>. Уређај ће се можда повезати аутоматски."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Дозволи"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Не, хвала"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> жели да се аутоматски повеже"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ове мреже захтевају јединствени ИД који може да се користи за праћење локације уређаја"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Ипак повежи"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Не повезуј"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Желите ли да потврдите повезивање?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ако се повежете, Wi‑Fi мреже оператера <xliff:g id="CARRIERNAME">%s</xliff:g> могу да приступају јединственом ИД-у повезаном са SIM картицом или да га деле. То може да омогући праћење локације уређаја."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Повежи"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Не повезуј"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi ће се аутоматски укључити"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Када сте у близини сачуване мреже високог квалитета"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Не укључуј поново"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP грешка при потврди идентитета 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP грешка при потврди идентитета 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP грешка при потврди идентитета 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Хотспот је искључен"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Ниједан уређај није повезан. Додирните да бисте изменили."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi веза је прекинута"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Да бисте се повезали на мрежу <xliff:g id="SSID">%1$s</xliff:g>, уметните <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM картицу"</string>
 </resources>
diff --git a/service/res/values-sv/strings.xml b/service/res/values-sv/strings.xml
index 84d5978..6b97f4a 100644
--- a/service/res/values-sv/strings.xml
+++ b/service/res/values-sv/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Nätverk som föreslagits av <xliff:g id="NAME">%s</xliff:g>. Enheten kan anslutas automatiskt."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Tillåt"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Nej tack"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> vill ansluta automatiskt"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Dessa nätverk får ett unikt id som kan användas till att spåra enhetens plats"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Anslut ändå"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Anslut inte"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Vill du bekräfta anslutningen?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Om du ansluter kan Wi-Fi-nätverk från <xliff:g id="CARRIERNAME">%s</xliff:g> få åtkomst till eller dela ett unikt id som är kopplat till ditt SIM-kort. Detta kan göra det möjligt att spåra enhetens plats."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Anslut"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Anslut inte"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi aktiveras automatiskt"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"När du är i närheten av ett sparat nätverk av hög kvalitet"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Återaktivera inte"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-autentiseringsfel 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-autentiseringsfel 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: EAP-autentiseringsfel 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Surfzonen har inaktiverats"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Inga enheter har anslutits. Tryck för att ändra."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Ingen Wi-Fi-anslutning"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Sätt i ett SIM-kort från <xliff:g id="CARRIER_NAME">%2$s</xliff:g> om du vill ansluta till <xliff:g id="SSID">%1$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-sw/strings.xml b/service/res/values-sw/strings.xml
index 1be6193..12bc190 100644
--- a/service/res/values-sw/strings.xml
+++ b/service/res/values-sw/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Mitandao inayopendekezwa kwa ajili ya <xliff:g id="NAME">%s</xliff:g>. Huenda kifaa kikaunganisha kiotomatiki."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Ruhusu"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Hapana"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> inataka kuunganisha kiotomatiki"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Mitandao hii hupokea kitambulisho cha kipekee kinachoweza kutumika ili kufuatilia mahali kifaa kilipo"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Unganisha hata hivyo"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Usiunganishe"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Ungependa kuthibitisha muunganisho?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Ukiunganisha, huenda mitandao ya Wi-Fi ya <xliff:g id="CARRIERNAME">%s</xliff:g> ikafikia au kushiriki kitambulisho cha kipekee kinachohusishwa na SIM yako. Huenda hii ikaruhusu ufuatiliaji wa mahali kifaa chako kilipo."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Unganisha"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Usiunganishe"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi itawashwa kiotomatiki"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Unapokuwa karibu na mtandao uliohifadhiwa wenye ubora wa juu"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Usiwashe tena"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Hitilafu ya 32764 ya uthibitishaji wa EAP"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Hitilafu ya 32765 ya uthibitishaji wa EAP"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Hitilafu ya 32766 ya uthibitishaji wa EAP"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Mtandaopepe umezimwa"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Hakuna vifaa vilivyounganishwa. Gusa ili ubadilishe."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi imeondolewa"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Ili uunganishe kwenye <xliff:g id="SSID">%1$s</xliff:g>, weka SIM ya <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-ta/strings.xml b/service/res/values-ta/strings.xml
index fb99d31..f684e6d 100644
--- a/service/res/values-ta/strings.xml
+++ b/service/res/values-ta/strings.xml
@@ -31,10 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> பரிந்துரைக்கும் நெட்வொர்க்குகள். சாதனம் தானாக இணைக்கப்படக்கூடும்."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"அனுமதி"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"வேண்டாம்"</string>
-    <string name="wifi_suggestion_imsi_privacy_title" msgid="5072368033308094465">"IMSI பாதுகாப்புக்கான தனியுரிமை எச்சரிக்கை"</string>
-    <string name="wifi_suggestion_imsi_privacy_content" msgid="5050532382656368119">"தனியுரிமை பாதுகாப்பின்றி உங்கள் SIM கார்டு தகவலைப் பயன்படுத்தி நெட்வொர்க்குகளை <xliff:g id="CARRIERNAME">%s</xliff:g> பரிந்துரைந்துள்ளது. நெட்வொர்க்கில் தானாகவே இணைக்க அனுமதிக்கவா?"</string>
-    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="5500037364868978935">"அனுமதி"</string>
-    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="7020127735591720299">"அனுமதிக்காதே"</string>
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> தானாக இணைக்க விரும்புகிறது"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"சாதன இருப்பிடத்தை டிராக் செய்யப் பயன்படுத்தப்படும் தனித்துவமான ஐடியை இந்த நெட்வொர்க்குகள் பெறும்"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"பரவாயில்லை, இணை"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"இணைக்காதே"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"நிச்சயமாக இணைக்கவா?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"இணைத்தால், உங்கள் SIMமுடன் இணைக்கப்பட்டிருக்கும் தனிப்பட்ட ஐடியை <xliff:g id="CARRIERNAME">%s</xliff:g> வைஃபை நெட்வொர்க்குகள் அணுகக்கூடும் அல்லது பகிரக்கூடும். இதனால் உங்கள் சாதனத்தின் இருப்பிடத்தை டிராக் செய்ய அனுமதிக்கப்படும்."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"இணை"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"இணைக்காதே"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"வைஃபை தானாக ஆன் ஆகும்"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"சேமித்த, உயர்தர நெட்வொர்க்கிற்கு அருகில் இருக்கும்போது"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"மீண்டும் ஆன் செய்யாதே"</string>
@@ -61,11 +65,9 @@
     <string name="wifi_cannot_connect_with_randomized_mac_title" msgid="3161171832972320854">"<xliff:g id="SSID">%1$s</xliff:g> உடன் இணைக்க முடியவில்லை"</string>
     <string name="wifi_cannot_connect_with_randomized_mac_message" msgid="3084495849409387375">"தனியுரிமை அமைப்புகளை மாற்ற தட்டி மீண்டும் முயலவும்"</string>
     <string name="wifi_disable_mac_randomization_dialog_title" msgid="7200723795776228456">"தனியுரிமை அமைப்பை மாற்றவா?"</string>
-    <!-- no translation found for wifi_disable_mac_randomization_dialog_message (6780528750693169829) -->
-    <skip />
+    <string name="wifi_disable_mac_randomization_dialog_message" msgid="6780528750693169829">"இணைப்பதற்கு, தனித்துவமான அடையாளங்காட்டியான உங்கள் சாதன MAC முகவரியை <xliff:g id="SSID">%1$s</xliff:g> பயன்படுத்த வேண்டும். தற்போது, இந்த நெட்வொர்க்கிற்கான உங்கள் தனியுரிமை அமைப்பானது ரேண்டம் ஆக்கப்பட்ட அடையாளங்காட்டியைப் பயன்படுத்துகிறது. \n\nஇதனால் உங்கள் சாதனத்தின் இருப்பிடத்தை டிராக் செய்ய அருகில் இருக்கும் சாதனங்கள் அனுமதிக்கப்படக்கூடும்."</string>
     <string name="wifi_disable_mac_randomization_dialog_confirm_text" msgid="6592972299988727403">"அமைப்பை மாற்று"</string>
-    <!-- no translation found for wifi_disable_mac_randomization_dialog_success (7288972191769783828) -->
-    <skip />
+    <string name="wifi_disable_mac_randomization_dialog_success" msgid="7288972191769783828">"அமைப்பு புதுப்பிக்கப்பட்டது. மீண்டும் இணைக்க முயலவும்."</string>
     <string name="wifi_disable_mac_randomization_dialog_failure" msgid="1823128152758990275">"தனியுரிமை அமைப்பை மாற்ற இயலவில்லை"</string>
     <string name="wifi_disable_mac_randomization_dialog_network_not_found" msgid="2352188098110676023">"நெட்வொர்க்கைக் கண்டறிய முடியவில்லை"</string>
     <string name="wifi_eap_error_message_code_32760" msgid="2272296327034079386">"<xliff:g id="SSID">%1$s</xliff:g> : EAP அங்கீகரிப்புப் பிழை 32760"</string>
@@ -75,9 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP அங்கீகரிப்புப் பிழை 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP அங்கீகரிப்புப் பிழை 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP அங்கீகரிப்புப் பிழை 32766"</string>
-    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="6772994319428197481">"மொபைல் ஹாட்ஸ்பாட் முடக்கப்பட்டது"</string>
-    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="2784340491027490290">"மொபைல் ஹாட்ஸ்பாட் முடக்கப்பட்டுள்ளது"</string>
-    <string name="wifi_softap_auto_shutdown_timeout_expired_detail" msgid="7203939001058203709">"எந்தச் செயல்பாடும் இல்லாததால் மொபைல் ஹாட்ஸ்பாட் நேரமுடிவிற்குப் பிறகு முடக்கப்பட்டது."</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ஹாட்ஸ்பாட் முடக்கப்பட்டது"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"சாதனங்கள் எதுவும் இணைக்கப்படவில்லை. மாற்ற, தட்டவும்."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"வைஃபை துண்டிக்கப்பட்டது"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> இல் இணைக்க <xliff:g id="CARRIER_NAME">%2$s</xliff:g> சிம்மைச் செருகவும்"</string>
 </resources>
diff --git a/service/res/values-te/strings.xml b/service/res/values-te/strings.xml
index a5db3e9..465f587 100644
--- a/service/res/values-te/strings.xml
+++ b/service/res/values-te/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> సూచించిన నెట్‌వర్క్‌లు. పరికరం ఆటోమేటిక్‌గా కనెక్ట్ అవచ్చు."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"అనుమతించు"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"వద్దు"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ఆటోమేటిక్‌గా కనెక్షన్ అనుమతిని కోరుతోంది"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"ఈ నెట్‌వర్క్‌లకు, పరికర లొకేషన్‌ను ట్రాక్ చేయడానికి ఉపయోగించగల ప్రత్యేక ID అందుతాయి"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ఏదేమైనా కనెక్ట్ చేయి"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"కనెక్ట్ చేయవద్దు"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ఖచ్చితంగా కనెక్ట్ చేయాలా?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"<xliff:g id="CARRIERNAME">%s</xliff:g> నెట్‌వర్క్‌కు మీరు కనెక్ట్ చేస్తే, ఆ క్యారియర్ Wi‑Fi నెట్‌వర్క్‌లు మీ SIMకు అనుబంధితమైన ప్రత్యేక IDని యాక్సెస్ లేదా షేర్ చేయగలగవచ్చు. దీని వలన మీ పరికరం లొకేషన్ ట్రాక్ చేయబడవచ్చు."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"కనెక్ట్ చేయి"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"కనెక్ట్ చేయవద్దు"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi స్వయంచాలకంగా ఆన్ అవుతుంది"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"మీరు అధిక నాణ్యత గల సేవ్ చేసిన నెట్‌వర్క్‌కు సమీపంగా ఉన్నప్పుడు"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"తిరిగి ఆన్ చేయవద్దు"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ప్రామాణీకరణ ఎర్రర్ 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ప్రామాణీకరణ ఎర్రర్ 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP ప్రామాణీకరణ ఎర్రర్ 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"హాట్‌స్పాట్ ఆఫ్ చేయబడింది"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"పరికరాలు ఏవీ కనెక్ట్ కాలేదు. మార్చడానికి నొక్కండి."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wifi డిస్‌కనెక్ట్ చేయబడింది"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g>కి కనెక్ట్ చేయడానికి, <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIMను చొప్పించండి"</string>
 </resources>
diff --git a/service/res/values-th/strings.xml b/service/res/values-th/strings.xml
index 7a97af0..5cd4e6e 100644
--- a/service/res/values-th/strings.xml
+++ b/service/res/values-th/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"เครือข่ายที่แนะนำโดย <xliff:g id="NAME">%s</xliff:g> และอุปกรณ์อาจเชื่อมต่อโดยอัตโนมัติ"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"อนุญาต"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"ไม่เป็นไร"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> ต้องการเชื่อมต่อโดยอัตโนมัติ"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"เครือข่ายเหล่านี้จะได้รับรหัสที่ไม่ซ้ำกันซึ่งใช้ในการติดตามตำแหน่งของอุปกรณ์ได้"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"ยังต้องการเชื่อมต่อ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"ไม่เชื่อมต่อ"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"ยืนยันการเชื่อมต่อใช่ไหม"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"หากเชื่อมต่อ เครือข่าย Wi-Fi ของ <xliff:g id="CARRIERNAME">%s</xliff:g> อาจเข้าถึงหรือแชร์รหัสที่ไม่ซ้ำกันซึ่งเชื่อมโยงกับซิมของคุณ และอาจอนุญาตให้มีการติดตามตำแหน่งอุปกรณ์ของคุณ"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"เชื่อมต่อ"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"ไม่เชื่อมต่อ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi จะเปิดโดยอัตโนมัติ"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"เมื่อคุณอยู่ใกล้เครือข่ายคุณภาพสูงที่บันทึกไว้"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"ไม่ต้องเปิดอีกครั้ง"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : ข้อผิดพลาดในการตรวจสอบสิทธิ์ EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : ข้อผิดพลาดในการตรวจสอบสิทธิ์ EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : ข้อผิดพลาดในการตรวจสอบสิทธิ์ EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ปิดฮอตสปอตแล้ว"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"ไม่มีอุปกรณ์ที่เชื่อมต่อ แตะเพื่อแก้ไข"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"ไม่ได้เชื่อมต่อ Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"หากต้องการเชื่อมต่อกับ <xliff:g id="SSID">%1$s</xliff:g> ให้ใส่ซิมของ <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-tl/strings.xml b/service/res/values-tl/strings.xml
index dd30f1a..bc38fd4 100644
--- a/service/res/values-tl/strings.xml
+++ b/service/res/values-tl/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Mga iminumungkahing network ng <xliff:g id="NAME">%s</xliff:g>. Posibleng awtomatikong kumonekta ang device."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Payagan"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Hindi, salamat na lang"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"Gustong awtomatikong kumonekta ng <xliff:g id="CARRIERNAME">%s</xliff:g>"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Makakatanggap ang mga network na ito ng isang natatanging ID na puwedeng gamitin sa pagsusubaybay ng lokasyon ng device"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Kumonekta pa rin"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Huwag kumonekta"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Kumpirmahin ang koneksyon?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Kung kokonekta ka, posibleng ma-access o maging kapareho ng mga Wi-Fi network ng <xliff:g id="CARRIERNAME">%s</xliff:g> ang natatanging ID na nauugnay sa iyong SIM. Baka mapahintulutan nito ang pagsubaybay sa lokasyon ng iyong device."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Ikonekta"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Huwag kumonekta"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Awtomatikong mag-o-on ang Wi‑Fi"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Kapag malapit ka sa naka-save na network na mataas ang kalidad"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Huwag i-on muli"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Error sa pag-authenticate ng EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Error sa pag-authenticate ng EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Error sa pag-authenticate ng EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Naka-off ang hotspot"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Walang mga nakakonektang device. I-tap para baguhin."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Nadiskonekta ang Wi‑Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Para makakonekta sa <xliff:g id="SSID">%1$s</xliff:g>, maglagay ng <xliff:g id="CARRIER_NAME">%2$s</xliff:g> na SIM"</string>
 </resources>
diff --git a/service/res/values-tr/strings.xml b/service/res/values-tr/strings.xml
index b66cc40..d955319 100644
--- a/service/res/values-tr/strings.xml
+++ b/service/res/values-tr/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> tarafından önerilen ağlar. Cihaz otomatik olarak bağlanabilir."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"İzin ver"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Hayır, teşekkürler"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>, otomatik olarak bağlanmak istiyor"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Bu ağlar, cihazın konumunu izlemek için kullanılabilecek benzersiz bir kimlik alır"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Yine de bağlan"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Bağlanma"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Bağlantı onaylansın mı?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Bağlanırsanız <xliff:g id="CARRIERNAME">%s</xliff:g> kablosuz ağları SIM\'inizle ilişkilendirilmiş benzersiz kimliğe erişebilir veya bunları paylaşabilir. Bu, cihazınızın konumunun izlenmesine olanak sağlayabilir."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Bağlan"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Bağlanma"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Kablosuz özelliği otomatik olarak açılacak"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Daha önce kaydedilmiş yüksek kaliteli bir ağın yakınında olduğunuzda"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Tekrar açılmasın"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP kimlik doğrulama hatası 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP kimlik doğrulama hatası 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP kimlik doğrulama hatası 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot kapatıldı"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Bağlı cihaz yok. Değiştirmek için dokunun."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Kablosuz bağlantı kesildi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> ağına bağlanmak için <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM\'ini takın"</string>
 </resources>
diff --git a/service/res/values-uk/strings.xml b/service/res/values-uk/strings.xml
index aaaf247..6624d01 100644
--- a/service/res/values-uk/strings.xml
+++ b/service/res/values-uk/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Мережі, пропоновані додатком <xliff:g id="NAME">%s</xliff:g>. Пристрій може підключитися автоматично."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Дозволити"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Ні, дякую"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"Оператор \"<xliff:g id="CARRIERNAME">%s</xliff:g>\" хоче підключатися автоматично"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Ці мережі отримують унікальний ідентифікатор, за допомогою якого можна відстежити місцезнаходження пристрою"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Усе одно підключитися"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Не підключатися"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Підтвердити підключення?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Якщо ви під\'єднаєтеся, мережі Wi‑Fi оператора \"<xliff:g id="CARRIERNAME">%s</xliff:g>\" зможуть розкрити унікальний ідентифікатор вашої SIM-карти й відстежити місцезнаходження вашого пристрою."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Підключитися"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Не підключатися"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi вмикатиметься автоматично"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Коли ви поблизу збереженої мережі високої якості"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Не вмикати знову"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>: помилка автентифікації за протоколом EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>: помилка автентифікації за протоколом EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>: помилка автентифікації за протоколом EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Точку доступу вимкнено"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Немає підключених пристроїв. Натисніть, щоб змінити."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Від\'єднано від мережі Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Щоб підключитися до мережі \"<xliff:g id="SSID">%1$s</xliff:g>\", вставте SIM-карту \"<xliff:g id="CARRIER_NAME">%2$s</xliff:g>\""</string>
 </resources>
diff --git a/service/res/values-ur/strings.xml b/service/res/values-ur/strings.xml
index fd44254..668abaa 100644
--- a/service/res/values-ur/strings.xml
+++ b/service/res/values-ur/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> تجویز کردہ نیٹ ورکس۔ آلہ خودکار طور پر منسلک ہو سکتا ہے۔"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"اجازت ہیں"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"نہیں شکریہ"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> خود کار طور پر منسلک ہونا چاہتا ہے"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"‏یہ نیٹ ورکس ایک منفرد ID موصول کرتے ہیں جسے آلہ کا مقام ٹریک کرنے کے لیے استعمال کیا جا سکتا ہے"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"بہرحال منسلک کریں"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"منسلک نہ کریں"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"کنکشن کی تصدیق کریں؟"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"‏اگر آب منسلک ہیں، Wi-Fi <xliff:g id="CARRIERNAME">%s</xliff:g> نیٹ ورکس آپ کے SIM سے وابستہ ایک منفرد ID تک رسائی حاصل یا اشتراک کر سکتے ہیں۔ یہ آپ کے آلہ کے مقام کو ٹریک کیے جانے کی اجازت دے سکتا ہے۔"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"منسلک کریں"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"منسلک نہ کریں"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"‏Wi‑Fi از خود آن ہو جائے گا"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"جب آپ اعلی معیار کے محفوظ کردہ نیٹ ورک کے قریب ہوں"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"دوبارہ آن نہ کریں"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"‏<xliff:g id="SSID">%1$s</xliff:g> : EAP توثیق کی خرابی 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"‏<xliff:g id="SSID">%1$s</xliff:g> : EAP توثیق کی خرابی 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"‏<xliff:g id="SSID">%1$s</xliff:g> : EAP توثیق کی خرابی 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"ہاٹ اسپاٹ کو آف کر دیا گیا"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"کوئی آلات منسلک نہیں ہیں۔ ترمیم کرنے کے لیے تھپتھپائیں۔"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"‏Wifi غیر منسلک ہو گیا"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"‏<xliff:g id="SSID">%1$s</xliff:g> سے منسلک ہونے کے ليے <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM داخل کریں"</string>
 </resources>
diff --git a/service/res/values-uz/strings.xml b/service/res/values-uz/strings.xml
index 3534075..9ba9778 100644
--- a/service/res/values-uz/strings.xml
+++ b/service/res/values-uz/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> tavsiya qilgan tarmoqlar. Qurilma avtomatik ulanishi mumkin."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Ruxsat"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Kerak emas"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> avtomatik ulanmoqchi"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Bu tarmoqlar unikal identifikator oladi, bu orqali qurilma joylashuvini kuzatish mumkin"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Baribir ulansin"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ulanmasin"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Ulanish tasdiqlansinmi?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Agar ulansangiz, <xliff:g id="CARRIERNAME">%s</xliff:g> Wi‑Fi tarmoqlari SIM kartangizga aloqador unikal identifikatordan foydalanishi yoki ulashishi mumkin. Bu qurilmangiz joylashuvi kuzatilishiga ruxsat berishi mumkin."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Ulash"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ulanmasin"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi avtomatik ravishda yoqiladi"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Saqlangan tarmoqlar ichidan signali yaxshisi hududida ekaningizda"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Qayta yoqilmasin"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP haqiqiylikni tekshirishda xato: 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP haqiqiylikni tekshirishda xato: 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP haqiqiylikni tekshirishda xato: 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Hotspot oʻchirildi"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Hech qanday qurilma ulanmagan. Oʻzgartirish uchun tegining."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi uzildi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"<xliff:g id="SSID">%1$s</xliff:g> nomli tarmoqqa ulanish uchun <xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM kartasini joylang"</string>
 </resources>
diff --git a/service/res/values-vi/strings.xml b/service/res/values-vi/strings.xml
index 3eac9be..fafdd68 100644
--- a/service/res/values-vi/strings.xml
+++ b/service/res/values-vi/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"Các mạng do <xliff:g id="NAME">%s</xliff:g> đề xuất. Thiết bị có thể kết nối tự động."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Cho phép"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Không, cảm ơn"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g> muốn kết nối tự động"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Các mạng này nhận được một mã nhận dạng duy nhất dùng để theo dõi vị trí của thiết bị"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Vẫn kết nối"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Không kết nối"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Xác nhận kết nối?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Nếu bạn kết nối, các mạng Wi-Fi của <xliff:g id="CARRIERNAME">%s</xliff:g> có thể truy cập hoặc chia sẻ mã nhận dạng duy nhất liên kết với SIM của bạn. Từ đó, các mạng này có thể theo dõi vị trí thiết bị của bạn."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Kết nối"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Không kết nối"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi sẽ tự động bật"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Khi bạn ở gần mạng đã lưu chất lượng cao"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Không bật lại"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Lỗi xác thực EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Lỗi xác thực EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Lỗi xác thực EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"Đã tắt điểm phát sóng"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Chưa kết nối thiết bị nào. Hãy nhấn để chỉnh sửa."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Đã ngắt kết nối Wi-Fi"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Để kết nối với <xliff:g id="SSID">%1$s</xliff:g>, hãy lắp một thẻ SIM <xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values-zh-rCN/strings.xml b/service/res/values-zh-rCN/strings.xml
index 5bbcaaf..1c9aa1e 100644
--- a/service/res/values-zh-rCN/strings.xml
+++ b/service/res/values-zh-rCN/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g>建议的网络。设备可能会自动连接到这些网络。"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"允许"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"不用了"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"<xliff:g id="CARRIERNAME">%s</xliff:g>想要自动连接"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"这些网络会收到可用于跟踪设备位置的唯一 ID"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"仍然连接"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"不连接"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"确认连接?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"如果您确认连接,<xliff:g id="CARRIERNAME">%s</xliff:g> WLAN 网络可获取或共享与您的 SIM 卡关联的唯一 ID。他人或许可以借此跟踪您的设备位置。"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"连接"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"不连接"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"WLAN 将自动开启"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"当您位于已保存的高品质网络信号范围内时"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"不要重新开启"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>:EAP 身份验证错误 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>:EAP 身份验证错误 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>:EAP 身份验证错误 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"热点已关闭"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"未连接到任何设备。点按即可修改。"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"WLAN 连接已断开"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"要连接到“<xliff:g id="SSID">%1$s</xliff:g>”,请插入<xliff:g id="CARRIER_NAME">%2$s</xliff:g> SIM 卡"</string>
 </resources>
diff --git a/service/res/values-zh-rHK/strings.xml b/service/res/values-zh-rHK/strings.xml
index e13aa48..c66b2b5 100644
--- a/service/res/values-zh-rHK/strings.xml
+++ b/service/res/values-zh-rHK/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"「<xliff:g id="NAME">%s</xliff:g>」已建議網絡連線,裝置可能會自動連接網絡。"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"允許"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"不用了,謝謝"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"「<xliff:g id="CARRIERNAME">%s</xliff:g>」要求自動連線"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"這些網絡會收到可追蹤裝置位置的獨有 ID"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"仍要連線"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"不要連線"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"確定要連線嗎?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"連線後,「<xliff:g id="CARRIERNAME">%s</xliff:g>」的 Wi‑Fi 網絡就能存取或分享與 SIM 卡相關的獨有 ID,有心人或許可藉此追蹤您裝置的位置。"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"連線"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"不要連線"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi-Fi 將會自動開啟"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"當您位於已儲存的高品質網絡信號範圍內時"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"不要重新開啟"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : EAP 驗證錯誤 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : EAP 驗證錯誤 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : EAP 驗證錯誤 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"熱點已關閉"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"未連接到任何裝置,輕按即可修改。"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi 連線已中斷"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"插入「<xliff:g id="CARRIER_NAME">%2$s</xliff:g>」SIM 卡以連線至「<xliff:g id="SSID">%1$s</xliff:g>」"</string>
 </resources>
diff --git a/service/res/values-zh-rTW/strings.xml b/service/res/values-zh-rTW/strings.xml
index 6ca5d15..ede75b4 100644
--- a/service/res/values-zh-rTW/strings.xml
+++ b/service/res/values-zh-rTW/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"「<xliff:g id="NAME">%s</xliff:g>」建議的網路。裝置可能會自動連線到這些網路。"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"允許"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"不用了,謝謝"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"「<xliff:g id="CARRIERNAME">%s</xliff:g>」要求自動連線"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"這些網路會收到可用於追蹤裝置位置資訊的唯一 ID"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"繼續連線"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"不要連線"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"確定要連線嗎?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"連線後,「<xliff:g id="CARRIERNAME">%s</xliff:g>」的 Wi‑Fi 網路可能會存取或分享與 SIM 卡相關的唯一 ID,有心人士或許可藉此追蹤你的裝置所在位置。"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"連線"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"不要連線"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"Wi‑Fi 將自動開啟"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"當你位於已儲存的高品質網路範圍內時"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"不要重新開啟"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g>:EAP 驗證錯誤 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g>:EAP 驗證錯誤 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g>:EAP 驗證錯誤 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"無線基地台已關閉"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"未連線到任何裝置,輕觸即可修改。"</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"Wi-Fi 連線中斷"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"如要連線到「<xliff:g id="SSID">%1$s</xliff:g>」,請插入「<xliff:g id="CARRIER_NAME">%2$s</xliff:g>」的 SIM 卡"</string>
 </resources>
diff --git a/service/res/values-zu/strings.xml b/service/res/values-zu/strings.xml
index 9a82744..ce14f92 100644
--- a/service/res/values-zu/strings.xml
+++ b/service/res/values-zu/strings.xml
@@ -31,22 +31,14 @@
     <string name="wifi_suggestion_content" msgid="7796523101671166285">"<xliff:g id="NAME">%s</xliff:g> amanethiwekhi aphakanyisiwe. Idivayisi ingaxhumeka ngokuzenzakalela."</string>
     <string name="wifi_suggestion_action_allow_app" msgid="1269853856167682235">"Vumela"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="4844316521687534924">"Cha ngiyabonga"</string>
-    <!-- no translation found for wifi_suggestion_imsi_privacy_title (2915915091404141470) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_content (2964867545127220548) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_carrier (4510014692570591616) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier (1466870675651864648) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_title (3252889810011175876) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_imsi_privacy_exemption_confirmation_content (1665277613133133730) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation (3102046304611708608) -->
-    <skip />
-    <!-- no translation found for wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation (8467281276632253246) -->
-    <skip />
+    <string name="wifi_suggestion_imsi_privacy_title" msgid="2915915091404141470">"I-<xliff:g id="CARRIERNAME">%s</xliff:g> ifuna ukuxhuma ngokuzenzekelayo"</string>
+    <string name="wifi_suggestion_imsi_privacy_content" msgid="2964867545127220548">"Lama nethiwekhi athola i-ID ehlukile engasetshenziselwa ukulandelela indawo yedivayisi"</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_carrier" msgid="4510014692570591616">"Xhuma noma kunjalo"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier" msgid="1466870675651864648">"Ungaxhumi"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_title" msgid="3252889810011175876">"Qinisekisa ukuxhuma?"</string>
+    <string name="wifi_suggestion_imsi_privacy_exemption_confirmation_content" msgid="1665277613133133730">"Uma uxhuma, amanethiwekhi we-Wi-Fi ye-<xliff:g id="CARRIERNAME">%s</xliff:g> angase akwazi ukufinyelela ku-ID yakho ehlukile ehlobene ne-SIM yakho. Lokhu kungase kuvumele ukuthi indawo yedivayisi yakho ilandelelwe."</string>
+    <string name="wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation" msgid="3102046304611708608">"Xhuma"</string>
+    <string name="wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation" msgid="8467281276632253246">"Ungaxhumi"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="8825510461478671504">"I-Wi-Fi izovuleka ngokuzenzakalela"</string>
     <string name="wifi_wakeup_onboarding_subtext" msgid="2525097093651287599">"Uma useduze kwenethiwekhi yekhwalithi ephezulu elondoloziwe"</string>
     <string name="wifi_wakeup_onboarding_action_disable" msgid="672002169958868470">"Ungaphindi uvule"</string>
@@ -85,10 +77,8 @@
     <string name="wifi_eap_error_message_code_32764" msgid="6883041845648321423">"<xliff:g id="SSID">%1$s</xliff:g> : Iphutha lokugunyaza le-EAP 32764"</string>
     <string name="wifi_eap_error_message_code_32765" msgid="3134805513440435314">"<xliff:g id="SSID">%1$s</xliff:g> : Iphutha lokugunyaza le-EAP 32765"</string>
     <string name="wifi_eap_error_message_code_32766" msgid="6907401733158262194">"<xliff:g id="SSID">%1$s</xliff:g> : Iphutha lokugunyaza le-EAP 32766"</string>
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_title (3145323037688670043) -->
-    <skip />
-    <!-- no translation found for wifi_softap_auto_shutdown_timeout_expired_summary (5136282560556465701) -->
-    <skip />
+    <string name="wifi_softap_auto_shutdown_timeout_expired_title" msgid="3145323037688670043">"I-Hotspot ivaliwe"</string>
+    <string name="wifi_softap_auto_shutdown_timeout_expired_summary" msgid="5136282560556465701">"Awekho amadivayisi axhunyiwe. Thepha ukuze ushintshe."</string>
     <string name="wifi_sim_required_title" msgid="8362843050699015640">"I-Wi-Fi inqanyuliwe"</string>
     <string name="wifi_sim_required_message" msgid="6085636103482409595">"Ukuze uxhumeke ku-<xliff:g id="SSID">%1$s</xliff:g> faka i-SIM ye-<xliff:g id="CARRIER_NAME">%2$s</xliff:g>"</string>
 </resources>
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index e51e640..4d351b1 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -159,7 +159,7 @@
     <!-- Boolean indicating performing a partial initial scan is enabled -->
     <bool translatable="false" name="config_wifiEnablePartialInitialScan">false</bool>
 
-    <!-- Integer for maximum number of channels to use in initial partial scan -->
+    <!-- Integer for maximum number of channels to use in initial partial scan. If equals to 0, means add all available channels for networks -->
     <integer translatable="false" name="config_wifiInitialPartialScanChannelMaxCount">10</integer>
 
     <!-- Integer for maximum age for scan results used to identify channels for partial initial
@@ -399,7 +399,4 @@
 
     <!-- Enable WPA2 to WPA3 auto-upgrade offload to capable Driver/Firmware -->
     <bool translatable="false" name="config_wifiSaeUpgradeOffloadEnabled">false</bool>
-
-    <!-- Package name for the OSU Login APK -->
-    <string translatable="false" name="config_wifiOsuLoginPackage">com.android.hotspot2.osulogin</string>
 </resources>
diff --git a/service/res/values/overlayable.xml b/service/res/values/overlayable.xml
index a6a37a3..7244911 100644
--- a/service/res/values/overlayable.xml
+++ b/service/res/values/overlayable.xml
@@ -126,7 +126,6 @@
           <item type="integer" name="config_wifiPollRssiIntervalMilliseconds" />
           <item type="bool" name="config_wifiSaeUpgradeEnabled" />
           <item type="bool" name="config_wifiSaeUpgradeOffloadEnabled" />
-          <item type="string" name="config_wifiOsuLoginPackage" />
           <!-- Params from config.xml that can be overlayed -->
 
           <!-- Params from strings.xml that can be overlayed -->
@@ -190,7 +189,6 @@
           <item type="string" name="wifi_eap_error_message_code_32766" />
           <item type="string" name="wifi_softap_auto_shutdown_timeout_expired_title" />
           <item type="string" name="wifi_softap_auto_shutdown_timeout_expired_summary" />
-          <item type="string" name="wifi_softap_auto_shutdown_timeout_expired_detail" />
           <item type="string" name="wifi_sim_required_title" />
           <item type="string" name="wifi_sim_required_message" />
           <!-- Params from strings.xml that can be overlayed -->
diff --git a/service/resources-certs/com.android.wifi.resources.pk8 b/service/resources-certs/com.android.wifi.resources.pk8
new file mode 100644
index 0000000..50cca90
--- /dev/null
+++ b/service/resources-certs/com.android.wifi.resources.pk8
Binary files differ
diff --git a/service/resources-certs/com.android.wifi.resources.x509.pem b/service/resources-certs/com.android.wifi.resources.x509.pem
new file mode 100644
index 0000000..c321be1
--- /dev/null
+++ b/service/resources-certs/com.android.wifi.resources.x509.pem
@@ -0,0 +1,35 @@
+-----BEGIN CERTIFICATE-----
+MIIGJzCCBA+gAwIBAgIUYJCfWCLIVw8RN9EmWeX78BvlReMwDQYJKoZIhvcNAQEL
+BQAwgaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
+DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy
+b2lkMR0wGwYDVQQDDBRTZXJ2aWNlV2lmaVJlc291cmNlczEiMCAGCSqGSIb3DQEJ
+ARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAgFw0yMDAzMjUwMzA0MDFaGA80NzU4MDIx
+OTAzMDQwMVowgaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYw
+FAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQL
+DAdBbmRyb2lkMR0wGwYDVQQDDBRTZXJ2aWNlV2lmaVJlc291cmNlczEiMCAGCSqG
+SIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAOqOCNZuwS5nIEg5wUPop40+WSAZEQ5SL/uSNU1dnGMSxkD5
+QqZQ3eWKlLSvP1FXtbQPTojXn2fa8w2P39dUAe33NXgpSHZVk18DMgeepNCAbynJ
+fciqYCMjnT3G1scIZP8HCxAXsuoynqLSms7IyombgM4iePVKKKwRpe3F3BmWgjgz
+RatW6C2CJLHc4KgCD53b4w9XHrQ8l3L1c3bgIwjaDSd0VxKIa41KtHHWp3LuvxX5
+4wz6tbBNW5ZMNDEfvF7CGmTCkdbMAYkWcJxZxA57E2tpxXd+2TnEDo6HL7Yq28jG
+r8jN6U63zRsKHLMi+Dtyei0w1nBxtTf5KsWI7B5Cxavl+V+tCsnNfq5Gu+vjJnlL
+0kpFcBixG/TPv7H+NgyO5D7joAyGSctfMkTPWdSRD/FNTs30yil+hxUIu4mFYtXO
++c6yIm11OBmGz1IoqetgbBhQiUwy+p8oqge2NtFDaIJ3dkd5cmNUF/EXI89aUhu0
+o/Vo2coUpR/cYZTgexfk2RKcH3RkuG69HXofrC9SGY0RI7GgmaG0e1inBjVrOydP
+1XXJmF3DV8yy8NmkJklbljsGD52XuBC6VQ0eIh7cLKWjgMCJFFNkNgU0syZ3+bma
+28FWvzJzd3ii5seWqePGgcrfdgjxblNzQEKWw0Me9Wn/S0OKOz/5OAM9Z7RDAgMB
+AAGjUzBRMB0GA1UdDgQWBBQjYEU0cbWxEO42h68+ttN5+wDSITAfBgNVHSMEGDAW
+gBQjYEU0cbWxEO42h68+ttN5+wDSITAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4ICAQCatnV7MZsIQTPo3AbbvmSPfyFM4/ncRDao+hxxvDKwMMWw6O2r
+uKPIbdj3xcH4vwvM2v3Kg+YCNrRgTTG23QHXNzHgXM75o1q7djGEiuOaZ6lwGh0G
+KD0B1xnYVRKqpacoP7SJ2MLWpum1i6c12P3s4JLBIiU4OtHKOozai37YMFM1Iwla
+QsGwgXyScRPs091aGe0G4eC0/10skHW0ASS4VUjbvqQE6opfMLdoMhuqAxTY8Nlz
+51B2smf/w7AAU4dpOE5sgdctbWpMNovAZe8yxt3Wk48pFIYPwTRXM6wSXoqYzX23
+s/rJmuGzX3PKV5hVZazYetj5clK/HB4Y/Clf3bVaoOKKSUgtOT3KB732yHIfFJDl
+vhqe5niRNf2Decy6aYJFw/IqMYM/3Fh4B1JcDFHzOq4Ta6yuvhqbXVdbM5dPzcgQ
+CO640v20uQVMjpknnxdBu7QxLMYuAfeuJkoWnvRtjSwQHPisnCWfxu6ryBIN3Xg7
+HtiEv+CVrvyq2UGbKhCtk/Z50eOdyRTAldoP3AcGbakZHtKAuz/m9TlTYDCnh/tH
+79soVqj2HMaM5XzslueGaERt149pr8uOhhK4NO+e1bc65Fw9ysHVrVn4pcaq8OGm
+yPSAsaHXcskBG5CywWfPcBaSij/0+QLbddie1cyeCFxz0aDypNMH+SCgsA==
+-----END CERTIFICATE-----
diff --git a/service/resources-certs/key.pem b/service/resources-certs/key.pem
new file mode 100644
index 0000000..31acc3c
--- /dev/null
+++ b/service/resources-certs/key.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDqjgjWbsEuZyBI
+OcFD6KeNPlkgGREOUi/7kjVNXZxjEsZA+UKmUN3lipS0rz9RV7W0D06I159n2vMN
+j9/XVAHt9zV4KUh2VZNfAzIHnqTQgG8pyX3IqmAjI509xtbHCGT/BwsQF7LqMp6i
+0prOyMqJm4DOInj1SiisEaXtxdwZloI4M0WrVugtgiSx3OCoAg+d2+MPVx60PJdy
+9XN24CMI2g0ndFcSiGuNSrRx1qdy7r8V+eMM+rWwTVuWTDQxH7xewhpkwpHWzAGJ
+FnCcWcQOexNracV3ftk5xA6Ohy+2KtvIxq/IzelOt80bChyzIvg7cnotMNZwcbU3
++SrFiOweQsWr5flfrQrJzX6uRrvr4yZ5S9JKRXAYsRv0z7+x/jYMjuQ+46AMhknL
+XzJEz1nUkQ/xTU7N9MopfocVCLuJhWLVzvnOsiJtdTgZhs9SKKnrYGwYUIlMMvqf
+KKoHtjbRQ2iCd3ZHeXJjVBfxFyPPWlIbtKP1aNnKFKUf3GGU4HsX5NkSnB90ZLhu
+vR16H6wvUhmNESOxoJmhtHtYpwY1azsnT9V1yZhdw1fMsvDZpCZJW5Y7Bg+dl7gQ
+ulUNHiIe3Cylo4DAiRRTZDYFNLMmd/m5mtvBVr8yc3d4oubHlqnjxoHK33YI8W5T
+c0BClsNDHvVp/0tDijs/+TgDPWe0QwIDAQABAoICAQCXq2SXlGKiqNi9G2uXh/fg
+Y3KqSMs4oXiZij+hWWjov5knJocsmJoD9gqWk8Ozy62ZU1SLNDLFq1UDbgdma9Ib
+mIEgxEExE8EJ7T0KpFEa6hH3yWzmtxUXY84nxk3Xwdvc9Sb4LvroafcefmTQVhJx
+zPYLVUs2AdAvA/JxwEHE4gguYykn1DiqRL+Jq7Qxr7N9dlRq9QDLt2qPUZxqQCEn
+diiPXLF5MHGrmaT4/76jmTJC+aUSHYQjDsKse3Y8VbMu6wC6Kv63EI/ln3cOAxW9
+72PtTyX7UTESI27uRwhZGXmpaKD+jffRiRS96VoJlBFED5BlbHEdoMl3+kzoEtPq
+uIA+8gdl0pXtQpzR340d6vqSU+THnqhR4OCyhZXRSJAqyBIlG7pWmNMnMJoARUIq
+q3vJmiakgNGcFqFaddYL8dUdZiwBg37WIG40GUhEaSaPc9BYpX4mTxheWRqPUHuj
+BUQpZA8qUZx4zlkJ8OpqCznU5wCPs6CRxB9+MXh7+Rk4l0aEir2yvQpkQuoH+qx8
+HzinDpj6B+PPDuHhQkVu7EZxq/hnl3RktHghT+qOH36Z4f6yx6+UqR724NcHC4zn
+igS4JP1wq7egedPbr1v+GZWWa+/HIkUicy1gT2FxvlLAXiYBCQh9lQW80tPLREE5
+OC++g3Znn4BhAxC9Nf9MIQKCAQEA+A/Mq6etUdjEER0F22MMm2H5wca/x+VAPw03
+0PkpuWD6hEXIWEq5olowMAmsy99XDQmLhP4qnARNbVcqJ3/Ad8TDiPc9u4ofHvEI
+r0BiB+90Y+MSydjtE2JCGqZ+7f1o9gv02Ym28ZNmF786oJKoCLTF7oarzuFSyiBL
+V6dcE6zzkaMNpHj9U2boeI/vgdhUlLPZ3ES+o2FUCWvuuhfkj6NheCuyqhKiLTnW
+1M3sLjSbxQKLkY0ebPK0I3l8pasBKRE34MUWRRc5sHQquvdv5YHRLHsL1Ti4zzTM
+jPejMWsBHFdygA2EIz144PV0rLQAXURtu1fp864oRhMmQeIvqwKCAQEA8g+VDmyR
+QJrhea199judCRvURxsFR9Cy6ZQpGdYpK9OQcHA1AGig4hCW2S1+ZIdJCOWvjdBQ
+X2SbtM0tzjOkwqfsMjYubXcPMLB2tM8eOSPD/kOfDL4+G8wjGhDeua8loTOg3Jzl
+MeSCDrPhO5gIzXDr+ysnMQblLrL36YJb+PTwMHgk1NdgCQ9PBa2BHbKpPiK3mMM0
+qQXz+zRublvB0uXYaNlUpgdL35fXo5ChKgrMvk9rOiozh/jE/SFTM1iRGU4WJUlN
+KB1CxXR5Cn+lYeO8yF+aZO0a7lWq9R8i2bXsMReQIr+sOBE2cAZP+VP18chujSkP
+DnAwoLVxmHXVyQKCAQAA9h6285lqXcq0vkYNiZ68425SX/DSV4MeO3Dh8HVG8KdH
+5/VU0kVR6cOSDBeNWro9pLHTvCByJloeeF4DdS1LyYlweHTWyzw/pHOCKl+25Cix
+Umn6OksA7jqPW+HWDktf2MAEL9JzsTyODwGtKaRZFEpIGGGGFb16ZxGjr1ReByeS
+gu1Em+tvbVCtVvF4sVvyj5fikKmkfHYU60QrmHgcTmfMTW8N1bCnODgq7vlhXHbW
+FqJv1/osNeyYzpm7EqSYgiaTSnBBqEti8bBQtTDL1Or4nyl2lBezReMdEMCjKmUA
+tR4OfP7sHArh5FGlcbUmp2M9fKO9fAlP7DcTvkqtAoIBAQDp0hd/6Wud5n5rFSWZ
+1xfoFpPFY9qD9pr8enwBUxhOF31sv1bTYD4YYUH147Y10WDBUW11JYadvweRbKkU
+iFpdFexYzHGol9t6gtsH6RIey+elExjuLE6+d0BpC2a6Iu/MeZynvn6+5SakoSmu
+cTv/h1bMNnETML/tjj9ftua045WonEWnu6wu1DTXHTSdxVkqhkqnK9kQdImrXIhX
+3haqbA/RqC3WezHVeE162Fh1zhzcsMa5Vs6UR7+xbKF79c+jjARkXBxF5Y38Qngx
+pf/RQTW4sHDpkQf0tZgAU+VMPCk9eq9mgZQQTMAzEkXqaCopNh1kCgdbQRAYDWz/
+gsPRAoIBAQCVVhnmVFI3+u0vFcnJsKScw/D/hUcv2czUje0Li7fz84lrT2sXiSfH
+iFsvG9SwFsrSvTVcAy/agumE3nzsvymTQvdu7irVJczKw4lUdx22ZqdupqQRsUMR
+2kx2fzPLUlG5eHnFUpyUDIVwPSfmjSv6MwF2ScWFLWyR0coPDgYz/EdUENDSXkzW
+CCxbF7lH7jc60vOVqMH0HyFT+k5SOQDVWckzQzGLoMhKobv9FHijCnc/jdsAYkOx
++MMdUcFf1X4WjHb9U5be/YrhiOO4Ar41hEm2ezsrcreszr69Zv4Tw3BLpr/nkS37
+adx3U1hB9OzUKVm21xtowKxcrEsOpvR1
+-----END PRIVATE KEY-----
diff --git a/tests/wifitests/Android.bp b/tests/wifitests/Android.bp
index 4d808b7..02b4f7a 100644
--- a/tests/wifitests/Android.bp
+++ b/tests/wifitests/Android.bp
@@ -86,7 +86,7 @@
         "jsr305",
         "services",
         // load the resources from the resources APK.
-        "wifi-service-resources",
+        "ServiceWifiResources",
         "unsupportedappusage",
     ],
 
@@ -900,6 +900,9 @@
             "com.android.server.wifi.util.KeyValueListParser",
             "com.android.server.wifi.util.KeyValueListParser$*",
             "com.android.server.wifi.util.KeyValueListParser.**",
+            "com.android.server.wifi.util.LruConnectionTracker",
+            "com.android.server.wifi.util.LruConnectionTracker$*",
+            "com.android.server.wifi.util.LruConnectionTracker.**",
             "com.android.server.wifi.util.LruList",
             "com.android.server.wifi.util.LruList$*",
             "com.android.server.wifi.util.LruList.**",
@@ -927,12 +930,15 @@
             "com.android.server.wifi.util.ScanResultUtil",
             "com.android.server.wifi.util.ScanResultUtil$*",
             "com.android.server.wifi.util.ScanResultUtil.**",
+            "com.android.server.wifi.util.SettingsMigrationDataHolder",
+            "com.android.server.wifi.util.SettingsMigrationDataHolder$*",
+            "com.android.server.wifi.util.SettingsMigrationDataHolder.**",
             "com.android.server.wifi.util.StringUtil",
             "com.android.server.wifi.util.StringUtil$*",
             "com.android.server.wifi.util.StringUtil.**",
-            "com.android.server.wifi.util.TelephonyUtil",
-            "com.android.server.wifi.util.TelephonyUtil$*",
-            "com.android.server.wifi.util.TelephonyUtil.**",
+            "com.android.server.wifi.WifiCarrierInfoManager",
+            "com.android.server.wifi.WifiCarrierInfoManager$*",
+            "com.android.server.wifi.WifiCarrierInfoManager.**",
             "com.android.server.wifi.util.TimedQuotaManager",
             "com.android.server.wifi.util.TimedQuotaManager$*",
             "com.android.server.wifi.util.TimedQuotaManager.**",
diff --git a/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java b/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java
index c68cd9a..701ffb3 100644
--- a/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java
@@ -2151,41 +2151,11 @@
     }
 
     @Test
-    public void canSupportAtleastOneConcurrentClientAndSoftApManager() throws Exception {
-        assertNotNull(mClientIfaceAvailableListener.getValue());
-        assertNotNull(mSoftApIfaceAvailableListener.getValue());
+    public void isStaApConcurrencySupported() throws Exception {
+        when(mWifiNative.isStaApConcurrencySupported()).thenReturn(false);
+        assertFalse(mActiveModeWarden.isStaApConcurrencySupported());
 
-        // No mode manager
-        assertFalse(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager());
-
-        // client mode manager active, but cannot create one more softap manager
-        enterClientModeActiveState();
-        assertFalse(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager());
-
-        // client mode manager active, can create one more softap manager
-        mSoftApIfaceAvailableListener.getValue().onAvailabilityChanged(true);
-        mLooper.dispatchAll();
-        assertTrue(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager());
-
-        // Tear down client mode manager
-        enterStaDisabledMode(false);
-
-        // active softap manager, but cannot create one more client mode manager
-        reset(mSoftApManager, mBatteryStats);
-        enterSoftApActiveMode();
-        assertFalse(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager());
-
-        // active softap manager, can create one more client mode manager
-        mClientIfaceAvailableListener.getValue().onAvailabilityChanged(true);
-        mLooper.dispatchAll();
-        assertTrue(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager());
-
-        // softap manager + client mode manager active, cannot create any more mode managers
-        reset(mClientModeManager, mBatteryStats, mScanRequestProxy);
-        enterClientModeActiveState();
-        mSoftApIfaceAvailableListener.getValue().onAvailabilityChanged(false);
-        mClientIfaceAvailableListener.getValue().onAvailabilityChanged(false);
-        mLooper.dispatchAll();
-        assertTrue(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager());
+        when(mWifiNative.isStaApConcurrencySupported()).thenReturn(true);
+        assertTrue(mActiveModeWarden.isStaApConcurrencySupported());
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java b/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java
index 00afa91..2567faa 100644
--- a/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java
@@ -628,14 +628,15 @@
         when(mClock.getWallClockMillis()).thenReturn(0L);
         long testDuration = 5500L;
         mBssidBlocklistMonitor.blockBssidForDurationMs(TEST_BSSID_1, TEST_SSID_1, testDuration);
+        assertEquals(1, mBssidBlocklistMonitor.updateAndGetBssidBlocklist().size());
 
-        // Verify that the BSSID is not removed from blocklist dispite of regular "clear" calls.
-        when(mClock.getWallClockMillis()).thenReturn(testDuration);
-        mBssidBlocklistMonitor.clearBssidBlocklist();
+        // Verify that the BSSID is removed from blocklist by clearBssidBlocklistForSsid
         mBssidBlocklistMonitor.clearBssidBlocklistForSsid(TEST_SSID_1);
-        Set<String> bssidList = mBssidBlocklistMonitor.updateAndGetBssidBlocklist();
-        assertEquals(1, bssidList.size());
-        assertTrue(bssidList.contains(TEST_BSSID_1));
+        assertEquals(0, mBssidBlocklistMonitor.updateAndGetBssidBlocklist().size());
+
+        // Add the BSSID to blocklist again.
+        mBssidBlocklistMonitor.blockBssidForDurationMs(TEST_BSSID_1, TEST_SSID_1, testDuration);
+        assertEquals(1, mBssidBlocklistMonitor.updateAndGetBssidBlocklist().size());
 
         // Verify that the BSSID is removed from blocklist once the specified duration is over.
         when(mClock.getWallClockMillis()).thenReturn(testDuration + 1);
diff --git a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
index 6028497..17fc1a7 100644
--- a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
@@ -16,6 +16,9 @@
 
 package com.android.server.wifi;
 
+import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_METERED;
+import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_NONE;
+import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
 import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.DISABLED_NONE;
 import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.DISABLED_NO_INTERNET_TEMPORARY;
 
@@ -47,6 +50,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.withSettings;
 
@@ -61,6 +65,7 @@
 import android.net.ConnectivityManager;
 import android.net.DhcpResultsParcelable;
 import android.net.InetAddresses;
+import android.net.Layer2InformationParcelable;
 import android.net.Layer2PacketParcelable;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
@@ -128,7 +133,6 @@
 import com.android.server.wifi.proto.nano.WifiMetricsProto.WifiUsabilityStats;
 import com.android.server.wifi.util.RssiUtilTest;
 import com.android.server.wifi.util.ScanResultUtil;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 import com.android.wifi.resources.R;
@@ -155,7 +159,6 @@
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.function.Consumer;
 
@@ -363,7 +366,7 @@
     IpClientCallbacks mIpClientCallback;
     OsuProvider mOsuProvider;
     WifiConfiguration mConnectedNetwork;
-    TelephonyUtil mTelephonyUtil;
+    WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     @Mock WifiScanner mWifiScanner;
     @Mock SupplicantStateTracker mSupplicantStateTracker;
@@ -538,9 +541,10 @@
         when(mSubscriptionManager.getActiveSubscriptionIdList())
                 .thenReturn(new int[]{DATA_SUBID});
 
-        TelephonyUtil tu = new TelephonyUtil(mTelephonyManager, mSubscriptionManager,
-                mock(FrameworkFacade.class), mock(Context.class), mock(Handler.class));
-        mTelephonyUtil = spy(tu);
+        WifiCarrierInfoManager tu = new WifiCarrierInfoManager(mTelephonyManager,
+                mSubscriptionManager, mWifiInjector, mock(FrameworkFacade.class),
+                mock(WifiContext.class), mock(WifiConfigStore.class), mock(Handler.class));
+        mWifiCarrierInfoManager = spy(tu);
         // static mocking
         mSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT)
                 .spyStatic(MacAddress.class)
@@ -551,7 +555,12 @@
         mConnectedNetwork = spy(WifiConfigurationTestUtil.createOpenNetwork());
         when(mNullAsyncChannel.sendMessageSynchronously(any())).thenReturn(null);
         when(mWifiScoreCard.getL2KeyAndGroupHint(any())).thenReturn(new Pair<>(null, null));
-        when(mDeviceConfigFacade.isAbnormalEapAuthFailureBugreportEnabled()).thenReturn(true);
+        when(mDeviceConfigFacade.isAbnormalDisconnectionBugreportEnabled()).thenReturn(true);
+        when(mDeviceConfigFacade.isAbnormalConnectionFailureBugreportEnabled()).thenReturn(true);
+        when(mWifiScoreCard.detectAbnormalConnectionFailure(anyString()))
+                .thenReturn(WifiHealthMonitor.REASON_NO_FAILURE);
+        when(mWifiScoreCard.detectAbnormalDisconnection())
+                .thenReturn(WifiHealthMonitor.REASON_NO_FAILURE);
         when(mThroughputPredictor.predictMaxTxThroughput(any())).thenReturn(90);
         when(mThroughputPredictor.predictMaxRxThroughput(any())).thenReturn(80);
     }
@@ -596,9 +605,9 @@
     private void initializeCmi() throws Exception {
         mCmi = new ClientModeImpl(mContext, mFrameworkFacade, mLooper.getLooper(),
                 mUserManager, mWifiInjector, mBackupManagerProxy, mCountryCode, mWifiNative,
-                mWrongPasswordNotifier, mSarManager, mWifiTrafficPoller,
-                mLinkProbeManager, mBatteryStatsManager, mSupplicantStateTracker,
-                mMboOceController, mTelephonyUtil, mEapFailureNotifier, mSimRequiredNotifier);
+                mWrongPasswordNotifier, mSarManager, mWifiTrafficPoller, mLinkProbeManager,
+                mBatteryStatsManager, mSupplicantStateTracker, mMboOceController,
+                mWifiCarrierInfoManager, mEapFailureNotifier, mSimRequiredNotifier);
         mCmi.start();
         mWifiCoreThread = getCmiHandlerThread(mCmi);
 
@@ -1042,7 +1051,7 @@
         mConnectedNetwork = spy(WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE));
         mConnectedNetwork.carrierId = CARRIER_ID_1;
-        doReturn(DATA_SUBID).when(mTelephonyUtil)
+        doReturn(DATA_SUBID).when(mWifiCarrierInfoManager)
                 .getBestMatchSubscriptionId(any(WifiConfiguration.class));
         when(mDataTelephonyManager.getSimOperator()).thenReturn("123456");
         when(mDataTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_READY);
@@ -1069,7 +1078,7 @@
     @Test
     public void testResetSimWhenNonConnectedSimRemoved() throws Exception {
         setupEapSimConnection();
-        doReturn(true).when(mTelephonyUtil).isSimPresent(eq(DATA_SUBID));
+        doReturn(true).when(mWifiCarrierInfoManager).isSimPresent(eq(DATA_SUBID));
         mCmi.sendMessage(ClientModeImpl.CMD_RESET_SIM_NETWORKS,
                 ClientModeImpl.RESET_SIM_REASON_SIM_REMOVED);
         mLooper.dispatchAll();
@@ -1086,7 +1095,7 @@
     @Test
     public void testResetSimWhenConnectedSimRemoved() throws Exception {
         setupEapSimConnection();
-        doReturn(false).when(mTelephonyUtil).isSimPresent(eq(DATA_SUBID));
+        doReturn(false).when(mWifiCarrierInfoManager).isSimPresent(eq(DATA_SUBID));
         mCmi.sendMessage(ClientModeImpl.CMD_RESET_SIM_NETWORKS,
                 ClientModeImpl.RESET_SIM_REASON_SIM_REMOVED);
         mLooper.dispatchAll();
@@ -1126,7 +1135,7 @@
                 .mockStatic(SubscriptionManager.class)
                 .startMocking();
         when(SubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(DATA_SUBID);
-        doReturn(true).when(mTelephonyUtil).isImsiEncryptionInfoAvailable(anyInt());
+        doReturn(true).when(mWifiCarrierInfoManager).isImsiEncryptionInfoAvailable(anyInt());
 
         // Initial value should be "not set"
         assertEquals("", mConnectedNetwork.enterpriseConfig.getAnonymousIdentity());
@@ -1182,7 +1191,7 @@
                 .mockStatic(SubscriptionManager.class)
                 .startMocking();
         when(SubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(DATA_SUBID);
-        doReturn(true).when(mTelephonyUtil).isImsiEncryptionInfoAvailable(anyInt());
+        doReturn(true).when(mWifiCarrierInfoManager).isImsiEncryptionInfoAvailable(anyInt());
 
         triggerConnect();
 
@@ -1236,7 +1245,7 @@
                 .mockStatic(SubscriptionManager.class)
                 .startMocking();
         when(SubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(DATA_SUBID);
-        doReturn(true).when(mTelephonyUtil).isImsiEncryptionInfoAvailable(anyInt());
+        doReturn(true).when(mWifiCarrierInfoManager).isImsiEncryptionInfoAvailable(anyInt());
 
         triggerConnect();
 
@@ -1724,8 +1733,6 @@
 
         verify(mWifiConfigManager).updateNetworkSelectionStatus(anyInt(),
                 eq(WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD));
-        verify(mWifiScoreCard, never()).detectAbnormalAuthFailure(any());
-
         assertEquals("DisconnectedState", getCurrentState().getName());
     }
 
@@ -1757,6 +1764,8 @@
                 .startMocking();
         when(SubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(DATA_SUBID);
         when(SubscriptionManager.isValidSubscriptionId(anyInt())).thenReturn(true);
+        when(mWifiScoreCard.detectAbnormalConnectionFailure(anyString()))
+                .thenReturn(WifiHealthMonitor.REASON_AUTH_FAILURE);
 
         mCmi.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT,
                 WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE,
@@ -1767,8 +1776,9 @@
                 WifiNative.EAP_SIM_VENDOR_SPECIFIC_CERT_EXPIRED, config);
         verify(mDataTelephonyManager).resetCarrierKeysForImsiEncryption();
         mockSession.finishMocking();
-        verify(mWifiScoreCard).detectAbnormalAuthFailure(anyString());
-        verify(mDeviceConfigFacade).isAbnormalEapAuthFailureBugreportEnabled();
+        verify(mDeviceConfigFacade).isAbnormalConnectionFailureBugreportEnabled();
+        verify(mWifiScoreCard).detectAbnormalConnectionFailure(anyString());
+        verify(mWifiDiagnostics).takeBugReport(anyString(), anyString());
     }
 
     /**
@@ -1799,8 +1809,6 @@
         mLooper.dispatchAll();
 
         verify(mDataTelephonyManager, never()).resetCarrierKeysForImsiEncryption();
-        verify(mWifiScoreCard).detectAbnormalAuthFailure(null);
-        verify(mDeviceConfigFacade).isAbnormalEapAuthFailureBugreportEnabled();
     }
 
     /**
@@ -1828,8 +1836,6 @@
         verify(mWifiConfigManager).updateNetworkSelectionStatus(anyInt(),
                 eq(WifiConfiguration.NetworkSelectionStatus
                         .DISABLED_AUTHENTICATION_NO_SUBSCRIPTION));
-        verify(mWifiScoreCard, never()).detectAbnormalAuthFailure(null);
-        verify(mDeviceConfigFacade, never()).isAbnormalEapAuthFailureBugreportEnabled();
     }
 
     @Test
@@ -1851,6 +1857,7 @@
         mLooper.dispatchAll();
 
         assertEquals("DisconnectedState", getCurrentState().getName());
+        verify(mWifiDiagnostics, never()).takeBugReport(anyString(), anyString());
     }
 
 
@@ -1865,6 +1872,8 @@
 
     @Test
     public void disconnect() throws Exception {
+        when(mWifiScoreCard.detectAbnormalDisconnection())
+                .thenReturn(WifiHealthMonitor.REASON_SHORT_CONNECTION_NONLOCAL);
         InOrder inOrderWifiLockManager = inOrder(mWifiLockManager);
         connect();
         inOrderWifiLockManager.verify(mWifiLockManager).updateWifiClientConnected(true);
@@ -1879,6 +1888,8 @@
         verify(mWifiNetworkSuggestionsManager).handleDisconnect(any(), any());
         assertEquals("DisconnectedState", getCurrentState().getName());
         inOrderWifiLockManager.verify(mWifiLockManager).updateWifiClientConnected(false);
+        verify(mWifiScoreCard).detectAbnormalDisconnection();
+        verify(mWifiDiagnostics).takeBugReport(anyString(), anyString());
     }
 
     /**
@@ -2411,11 +2422,8 @@
         assertFalse(mCmi.shouldEvaluateWhetherToSendExplicitlySelected(currentConfig));
     }
 
-    private void expectRegisterNetworkAgent() {
-        expectRegisterNetworkAgent((config) -> { });
-    }
-
-    private void expectRegisterNetworkAgent(Consumer<NetworkAgentConfig> configChecker) {
+    private void expectRegisterNetworkAgent(Consumer<NetworkAgentConfig> configChecker,
+            Consumer<NetworkCapabilities> networkCapabilitiesChecker) {
         // Expects that the code calls registerNetworkAgent and provides a way for the test to
         // verify the messages sent through the NetworkAgent to ConnectivityService.
         // We cannot just use a mock object here because mWifiNetworkAgent is private to CMI.
@@ -2423,23 +2431,34 @@
         ArgumentCaptor<Messenger> messengerCaptor = ArgumentCaptor.forClass(Messenger.class);
         ArgumentCaptor<NetworkAgentConfig> configCaptor =
                 ArgumentCaptor.forClass(NetworkAgentConfig.class);
+        ArgumentCaptor<NetworkCapabilities> networkCapabilitiesCaptor =
+                ArgumentCaptor.forClass(NetworkCapabilities.class);
         verify(mConnectivityManager).registerNetworkAgent(messengerCaptor.capture(),
-                any(NetworkInfo.class), any(LinkProperties.class), any(NetworkCapabilities.class),
+                any(NetworkInfo.class), any(LinkProperties.class),
+                networkCapabilitiesCaptor.capture(),
                 anyInt(), configCaptor.capture(), anyInt());
 
         registerAsyncChannel((x) -> {
             mNetworkAgentAsyncChannel = x;
         }, messengerCaptor.getValue(), mNetworkAgentHandler);
         configChecker.accept(configCaptor.getValue());
+        networkCapabilitiesChecker.accept(networkCapabilitiesCaptor.getValue());
 
         mNetworkAgentAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
         mLooper.dispatchAll();
     }
 
-    private void expectNetworkAgentMessage(int what, int arg1, int arg2, Object obj) {
-        verify(mNetworkAgentHandler).handleMessage(argThat(msg ->
-                what == msg.what && arg1 == msg.arg1 && arg2 == msg.arg2
-                && Objects.equals(obj, msg.obj)));
+    private void expectNetworkAgentUpdateCapabilities(
+            Consumer<NetworkCapabilities> networkCapabilitiesChecker) {
+        // We cannot just use a mock object here because mWifiNetworkAgent is private to CMI.
+        // TODO (b/134538181): consider exposing WifiNetworkAgent and using mocks.
+        ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
+        mLooper.dispatchAll();
+        verify(mNetworkAgentHandler).handleMessage(messageCaptor.capture());
+        Message message = messageCaptor.getValue();
+        assertNotNull(message);
+        assertEquals(NetworkAgent.EVENT_NETWORK_CAPABILITIES_CHANGED, message.what);
+        networkCapabilitiesChecker.accept((NetworkCapabilities) message.obj);
     }
 
     /**
@@ -2459,7 +2478,7 @@
             assertTrue(agentConfig.explicitlySelected);
             assertFalse(agentConfig.acceptUnvalidated);
             assertFalse(agentConfig.acceptPartialConnectivity);
-        });
+        }, (cap) -> { });
     }
 
     /**
@@ -2479,7 +2498,7 @@
             assertFalse(agentConfig.explicitlySelected);
             assertFalse(agentConfig.acceptUnvalidated);
             assertTrue(agentConfig.acceptPartialConnectivity);
-        });
+        }, (cap) -> { });
     }
 
     /**
@@ -2499,7 +2518,7 @@
             assertTrue(agentConfig.explicitlySelected);
             assertTrue(agentConfig.acceptUnvalidated);
             assertTrue(agentConfig.acceptPartialConnectivity);
-        });
+        }, (cap) -> { });
     }
 
     /**
@@ -3206,7 +3225,12 @@
         connect();
         mLooper.dispatchAll();
         verify(mWifiScoreCard).noteIpConfiguration(any());
-        verify(mIpClient).setL2KeyAndGroupHint(eq("Wad"), eq("Gab"));
+        ArgumentCaptor<Layer2InformationParcelable> captor =
+                ArgumentCaptor.forClass(Layer2InformationParcelable.class);
+        verify(mIpClient).updateLayer2Information(captor.capture());
+        final Layer2InformationParcelable info = captor.getValue();
+        assertEquals(info.l2Key, "Wad");
+        assertEquals(info.groupHint, "Gab");
     }
 
     /**
@@ -3324,6 +3348,7 @@
         mLooper.dispatchAll();
         verify(mIpClient).shutdown();
         verify(mWifiConfigManager).removeAllEphemeralOrPasspointConfiguredNetworks();
+        verify(mWifiConfigManager).clearUserTemporarilyDisabledList();
     }
 
     /**
@@ -4149,6 +4174,7 @@
         mCmi.sendMessage(WifiMonitor.MBO_OCE_BSS_TM_HANDLING_DONE, btmFrmData);
         mLooper.dispatchAll();
 
+        verify(mWifiMetrics, times(1)).incrementSteeringRequestCountIncludingMboAssocRetryDelay();
         verify(mBssidBlocklistMonitor).blockBssidForDurationMs(sBSSID, sSSID,
                 btmFrmData.mBlackListDurationMs);
     }
@@ -4808,4 +4834,155 @@
         assertEquals(mConnectedNetwork.trusted, mCmi.getWifiInfo().isTrusted());
         assertEquals(mConnectedNetwork.osu, mCmi.getWifiInfo().isOsuAp());
     }
+
+    /**
+     * Verify that we disconnect when we mark a previous unmetered network metered.
+     */
+    @Test
+    public void verifyDisconnectOnMarkingNetworkMetered() throws Exception {
+        connect();
+        expectRegisterNetworkAgent((config) -> { }, (cap) -> {
+            assertTrue(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+
+        WifiConfiguration oldConfig = new WifiConfiguration(mConnectedNetwork);
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_METERED;
+
+        mConfigUpdateListenerCaptor.getValue().onNetworkUpdated(mConnectedNetwork, oldConfig);
+        mLooper.dispatchAll();
+        assertEquals("DisconnectingState", getCurrentState().getName());
+    }
+
+    /**
+     * Verify that we only update capabilites when we mark a previous unmetered network metered.
+     */
+    @Test
+    public void verifyUpdateCapabilitiesOnMarkingNetworkUnmetered() throws Exception {
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_METERED;
+        connect();
+        expectRegisterNetworkAgent((config) -> { }, (cap) -> {
+            assertFalse(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+        reset(mNetworkAgentHandler);
+
+        WifiConfiguration oldConfig = new WifiConfiguration(mConnectedNetwork);
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NOT_METERED;
+
+        mConfigUpdateListenerCaptor.getValue().onNetworkUpdated(mConnectedNetwork, oldConfig);
+        mLooper.dispatchAll();
+        assertEquals("ConnectedState", getCurrentState().getName());
+
+        expectNetworkAgentUpdateCapabilities((cap) -> {
+            assertTrue(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+    }
+
+
+    /**
+     * Verify that we disconnect when we mark a previous unmetered network metered.
+     */
+    @Test
+    public void verifyDisconnectOnMarkingNetworkAutoMeteredWithMeteredHint() throws Exception {
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NOT_METERED;
+        connect();
+        expectRegisterNetworkAgent((config) -> { }, (cap) -> {
+            assertTrue(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+        reset(mNetworkAgentHandler);
+
+        // Mark network metered none.
+        WifiConfiguration oldConfig = new WifiConfiguration(mConnectedNetwork);
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NONE;
+
+        // Set metered hint in WifiInfo (either via DHCP or ScanResult IE).
+        WifiInfo wifiInfo = mCmi.getWifiInfo();
+        wifiInfo.setMeteredHint(true);
+
+        mConfigUpdateListenerCaptor.getValue().onNetworkUpdated(mConnectedNetwork, oldConfig);
+        mLooper.dispatchAll();
+        assertEquals("DisconnectingState", getCurrentState().getName());
+    }
+
+    /**
+     * Verify that we only update capabilites when we mark a previous unmetered network metered.
+     */
+    @Test
+    public void verifyUpdateCapabilitiesOnMarkingNetworkAutoMeteredWithoutMeteredHint()
+            throws Exception {
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_METERED;
+        connect();
+        expectRegisterNetworkAgent((config) -> { }, (cap) -> {
+            assertFalse(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+        reset(mNetworkAgentHandler);
+
+        WifiConfiguration oldConfig = new WifiConfiguration(mConnectedNetwork);
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NONE;
+
+        // Reset metered hint in WifiInfo.
+        WifiInfo wifiInfo = mCmi.getWifiInfo();
+        wifiInfo.setMeteredHint(false);
+
+        mConfigUpdateListenerCaptor.getValue().onNetworkUpdated(mConnectedNetwork, oldConfig);
+        mLooper.dispatchAll();
+        assertEquals("ConnectedState", getCurrentState().getName());
+
+        expectNetworkAgentUpdateCapabilities((cap) -> {
+            assertTrue(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+    }
+
+    /**
+     * Verify that we do nothing on no metered change.
+     */
+    @Test
+    public void verifyDoNothingMarkingNetworkAutoMeteredWithMeteredHint() throws Exception {
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_METERED;
+        connect();
+        expectRegisterNetworkAgent((config) -> { }, (cap) -> {
+            assertFalse(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+        reset(mNetworkAgentHandler);
+
+        // Mark network metered none.
+        WifiConfiguration oldConfig = new WifiConfiguration(mConnectedNetwork);
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NONE;
+
+        // Set metered hint in WifiInfo (either via DHCP or ScanResult IE).
+        WifiInfo wifiInfo = mCmi.getWifiInfo();
+        wifiInfo.setMeteredHint(true);
+
+        mConfigUpdateListenerCaptor.getValue().onNetworkUpdated(mConnectedNetwork, oldConfig);
+        mLooper.dispatchAll();
+        assertEquals("ConnectedState", getCurrentState().getName());
+
+        verifyNoMoreInteractions(mNetworkAgentHandler);
+    }
+
+    /**
+     * Verify that we do nothing on no metered change.
+     */
+    @Test
+    public void verifyDoNothingMarkingNetworkAutoMeteredWithoutMeteredHint() throws Exception {
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NOT_METERED;
+        connect();
+        expectRegisterNetworkAgent((config) -> { }, (cap) -> {
+            assertTrue(cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
+        });
+        reset(mNetworkAgentHandler);
+
+        // Mark network metered none.
+        WifiConfiguration oldConfig = new WifiConfiguration(mConnectedNetwork);
+        mConnectedNetwork.meteredOverride = METERED_OVERRIDE_NONE;
+
+        // Reset metered hint in WifiInfo.
+        WifiInfo wifiInfo = mCmi.getWifiInfo();
+        wifiInfo.setMeteredHint(false);
+
+        mConfigUpdateListenerCaptor.getValue().onNetworkUpdated(mConnectedNetwork, oldConfig);
+        mLooper.dispatchAll();
+        assertEquals("ConnectedState", getCurrentState().getName());
+
+        verifyNoMoreInteractions(mNetworkAgentHandler);
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/ClientModeManagerTest.java b/tests/wifitests/src/com/android/server/wifi/ClientModeManagerTest.java
index cb32514..182e8e4 100644
--- a/tests/wifitests/src/com/android/server/wifi/ClientModeManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ClientModeManagerTest.java
@@ -1198,4 +1198,24 @@
         assertNull(mImsMmTelManagerRegistrationCallback);
         verify(mWifiMetrics, never()).noteWifiOff(anyBoolean(), anyBoolean(), anyInt());
     }
+
+    /**
+     * ClientMode starts up in connect mode and then change connectivity roles.
+     */
+    @Test
+    public void clientInConnectModeChangeRoles() throws Exception {
+        startClientInConnectModeAndVerifyEnabled();
+        reset(mListener);
+
+        // Set the same role again, no-op.
+        assertEquals(ActiveModeManager.ROLE_CLIENT_PRIMARY, mClientModeManager.getRole());
+        mClientModeManager.setRole(ActiveModeManager.ROLE_CLIENT_PRIMARY);
+        mLooper.dispatchAll();
+        verify(mListener, never()).onStarted(); // no callback sent.
+
+        // Change the connectivity role.
+        mClientModeManager.setRole(ActiveModeManager.ROLE_CLIENT_SECONDARY);
+        mLooper.dispatchAll();
+        verify(mListener).onStarted(); // callback sent.
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
index d6a05c7..b7136d9 100644
--- a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
@@ -170,9 +170,12 @@
                 mDeviceConfigFacade.getAggressiveMacRandomizationSsidAllowlist());
         assertEquals(Collections.emptySet(),
                 mDeviceConfigFacade.getAggressiveMacRandomizationSsidBlocklist());
-        assertEquals(false, mDeviceConfigFacade.isAbnormalEapAuthFailureBugreportEnabled());
+        assertEquals(false, mDeviceConfigFacade.isAbnormalConnectionFailureBugreportEnabled());
+        assertEquals(false, mDeviceConfigFacade.isAbnormalDisconnectionBugreportEnabled());
         assertEquals(DeviceConfigFacade.DEFAULT_HEALTH_MONITOR_MIN_NUM_CONNECTION_ATTEMPT,
                 mDeviceConfigFacade.getHealthMonitorMinNumConnectionAttempt());
+        assertEquals(DeviceConfigFacade.DEFAULT_BUG_REPORT_MIN_WINDOW_MS,
+                mDeviceConfigFacade.getBugReportMinWindowMs());
     }
 
     /**
@@ -242,10 +245,15 @@
                 anyString())).thenReturn(testSsidList);
         when(DeviceConfig.getString(anyString(), eq("aggressive_randomization_ssid_blocklist"),
                 anyString())).thenReturn(testSsidList);
-        when(DeviceConfig.getBoolean(anyString(), eq("abnormal_eap_auth_failure_bugreport_enabled"),
+        when(DeviceConfig.getBoolean(anyString(),
+                eq("abnormal_connection_failure_bugreport_enabled"),
+                anyBoolean())).thenReturn(true);
+        when(DeviceConfig.getBoolean(anyString(), eq("abnormal_disconnection_bugreport_enabled"),
                 anyBoolean())).thenReturn(true);
         when(DeviceConfig.getInt(anyString(), eq("health_monitor_min_num_connection_attempt"),
                 anyInt())).thenReturn(20);
+        when(DeviceConfig.getInt(anyString(), eq("bug_report_min_window_ms"),
+                anyInt())).thenReturn(1000);
 
         mOnPropertiesChangedListenerCaptor.getValue().onPropertiesChanged(null);
 
@@ -285,7 +293,9 @@
                 mDeviceConfigFacade.getAggressiveMacRandomizationSsidAllowlist());
         assertEquals(testSsidSet,
                 mDeviceConfigFacade.getAggressiveMacRandomizationSsidBlocklist());
-        assertEquals(true, mDeviceConfigFacade.isAbnormalEapAuthFailureBugreportEnabled());
+        assertEquals(true, mDeviceConfigFacade.isAbnormalConnectionFailureBugreportEnabled());
+        assertEquals(true, mDeviceConfigFacade.isAbnormalDisconnectionBugreportEnabled());
         assertEquals(20, mDeviceConfigFacade.getHealthMonitorMinNumConnectionAttempt());
+        assertEquals(1000, mDeviceConfigFacade.getBugReportMinWindowMs());
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/DppManagerTest.java b/tests/wifitests/src/com/android/server/wifi/DppManagerTest.java
index 19d17c9..e274d68 100644
--- a/tests/wifitests/src/com/android/server/wifi/DppManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/DppManagerTest.java
@@ -481,6 +481,7 @@
         dppEventCallback.onSuccess(CONFIGURATION_SENT);
         mLooper.dispatchAll();
         verify(mDppCallback).onSuccess(eq(EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT));
+        verify(mDppMetrics, times(1)).updateDppR1CapableEnrolleeResponderDevices();
         verify(mDppCallback, never()).onSuccessConfigReceived(anyInt());
         verify(mDppCallback, never()).onFailure(anyInt(), anyString(), anyString(), any());
         verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
@@ -861,6 +862,7 @@
         mLooper.dispatchAll();
         verify(mDppCallback)
                 .onProgress(eq(EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE));
+        verify(mDppMetrics, times(1)).updateDppR2CapableEnrolleeResponderDevices();
 
         // Generate an onSuccess callback
         dppEventCallback.onSuccess(CONFIGURATION_APPLIED);
@@ -912,6 +914,10 @@
         verify(mDppMetrics).updateDppConfiguratorInitiatorRequests();
         verify(mDppMetrics).updateDppFailure(eq(appFailure));
         verify(mDppMetrics).updateDppOperationTime(anyInt());
+        if ((internalFailure == CANNOT_FIND_NETWORK)
+                && (appFailure == EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE)) {
+            verify(mDppMetrics, times(1)).updateDppR2EnrolleeResponderIncompatibleConfiguration();
+        }
         verifyNoMoreInteractions(mDppMetrics);
         verifyCleanUpResources();
     }
diff --git a/tests/wifitests/src/com/android/server/wifi/DppMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/DppMetricsTest.java
index fd43578..e43da8f 100644
--- a/tests/wifitests/src/com/android/server/wifi/DppMetricsTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/DppMetricsTest.java
@@ -18,13 +18,17 @@
 
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_BUSY;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT;
+import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED;
 import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT;
 
 import static com.android.server.wifi.DppMetrics.DPP_OPERATION_TIME;
@@ -185,10 +189,16 @@
         for (int i = 0; i < value; i++) {
             mDppMetrics.updateDppConfiguratorSuccess(EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT);
         }
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppConfiguratorSuccess(
+                    EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED);
+        }
 
         // Confirm that the consolidated log has the expected value
         checkDppSuccesses(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT,
                 value);
+        checkDppSuccesses(WifiMetricsProto.WifiDppLog
+                .EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED, value);
     }
 
     /**
@@ -378,6 +388,65 @@
     }
 
     /**
+     * Test EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testUpdateDppFailureCannotFindNetwork() throws Exception {
+        // Get a random value and call the update method 'value' times
+        int value = getNumOfTimes(MAX_ITERATIONS) + 1;
+
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK);
+        }
+
+        // Confirm that the consolidated log has the expected value
+        checkDppFailures(WifiMetricsProto.WifiDppLog.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK,
+                value);
+    }
+
+    /**
+     * Test EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testUpdateDppFailureEnrolleeAuthentication() throws Exception {
+        // Get a random value and call the update method 'value' times
+        int value = getNumOfTimes(MAX_ITERATIONS) + 1;
+
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppFailure(EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION);
+        }
+
+        // Confirm that the consolidated log has the expected value
+        checkDppFailures(WifiMetricsProto.WifiDppLog
+                .EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION, value);
+    }
+
+    /**
+     * Test
+     * EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testUpdateDppFailureEnrolleeRejectedConfiguration() throws Exception {
+        // Get a random value and call the update method 'value' times
+        int value = getNumOfTimes(MAX_ITERATIONS) + 1;
+
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppFailure(
+                    EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION);
+        }
+
+        // Confirm that the consolidated log has the expected value
+        checkDppFailures(WifiMetricsProto.WifiDppLog
+                .EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION, value);
+    }
+
+    /**
      * Test DPP operation time histogram. Pick a single time value from each bucket by selecting
      * the max value minus 1, and call the update method random amount of times with this value.
      * Then confirm that the output histogram has the expected value in each target bucket.
@@ -410,4 +479,61 @@
             checkOperationBucketEqualsTo(i, value);
         }
     }
+
+    /**
+     * Test numDppR1CapableEnrolleeResponderDevices
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testUpdateDppR1CapableEnrolleeResponderDevices() throws Exception {
+        // Get a random value and call the update method 'value' times
+        int value = getNumOfTimes(MAX_ITERATIONS) + 1;
+
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppR1CapableEnrolleeResponderDevices();
+        }
+
+        // Confirm that the consolidated log has the expected value
+        WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
+        assertEquals(mWifiDppLogProto.numDppR1CapableEnrolleeResponderDevices, value);
+    }
+
+    /**
+     * Test numDppR2CapableEnrolleeResponderDevices
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testUpdateDppR2CapableEnrolleeResponderDevices() throws Exception {
+        // Get a random value and call the update method 'value' times
+        int value = getNumOfTimes(MAX_ITERATIONS) + 1;
+
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppR2CapableEnrolleeResponderDevices();
+        }
+
+        // Confirm that the consolidated log has the expected value
+        WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
+        assertEquals(mWifiDppLogProto.numDppR2CapableEnrolleeResponderDevices, value);
+    }
+
+    /**
+     * Test numDppR2EnrolleeResponderIncompatibleConfiguration
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testUpdateDppR2EnrolleeResponderIncompatibleConfiguration() throws Exception {
+        // Get a random value and call the update method 'value' times
+        int value = getNumOfTimes(MAX_ITERATIONS) + 1;
+
+        for (int i = 0; i < value; i++) {
+            mDppMetrics.updateDppR2EnrolleeResponderIncompatibleConfiguration();
+        }
+
+        // Confirm that the consolidated log has the expected value
+        WifiMetricsProto.WifiDppLog mWifiDppLogProto = mDppMetrics.consolidateProto();
+        assertEquals(mWifiDppLogProto.numDppR2EnrolleeResponderIncompatibleConfiguration, value);
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java b/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java
index ea030a4..f2ec351 100644
--- a/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java
@@ -16,13 +16,14 @@
 
 package com.android.server.wifi;
 
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
-import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.net.wifi.WifiConfiguration;
@@ -32,12 +33,6 @@
 
 import androidx.test.filters.SmallTest;
 
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-
-import static org.mockito.Mockito.lenient;
-
-import com.android.server.wifi.util.TelephonyUtil;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -52,12 +47,13 @@
  */
 @SmallTest
 public class EapFailureNotifierTest extends WifiBaseTest {
-    @Mock Context mContext;
+    @Mock WifiContext mContext;
     @Mock Resources mResources;
     @Mock NotificationManager mNotificationManager;
     @Mock FrameworkFacade mFrameworkFacade;
     @Mock Notification mNotification;
-    @Mock TelephonyUtil mTelephonyUtil;
+    @Mock
+    WifiCarrierInfoManager mWifiCarrierInfoManager;
     @Mock WifiConfiguration mWifiConfiguration;
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Notification.Builder mNotificationBuilder;
@@ -82,7 +78,7 @@
             .startMocking();
         when(mContext.getSystemService(NotificationManager.class))
                 .thenReturn(mNotificationManager);
-        when(mTelephonyUtil.getBestMatchSubscriptionId(mWifiConfiguration)).thenReturn(0);
+        when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(mWifiConfiguration)).thenReturn(0);
         lenient().when(SubscriptionManager.getResourcesForSubId(eq(mContext), anyInt()))
                 .thenReturn(mResources);
         when(mContext.getResources()).thenReturn(mResources);
@@ -93,8 +89,9 @@
         when(mResources.getString(eq(0), anyString())).thenReturn(null);
         when(mResources.getString(eq(1), anyString())).thenReturn("Error Message");
         when(mContext.createPackageContext(anyString(), eq(0))).thenReturn(mContext);
+        when(mContext.getWifiOverlayApkPkgName()).thenReturn("test.com.android.wifi.resources");
         mEapFailureNotifier =
-                new EapFailureNotifier(mContext, mFrameworkFacade, mTelephonyUtil);
+                new EapFailureNotifier(mContext, mFrameworkFacade, mWifiCarrierInfoManager);
     }
 
     @After
diff --git a/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java b/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
index 2e68864..1b195cf 100644
--- a/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
@@ -56,6 +56,7 @@
 import android.os.IHwBinder;
 import android.os.test.TestLooper;
 import android.util.Log;
+import android.util.SparseArray;
 
 import androidx.test.filters.SmallTest;
 
@@ -328,7 +329,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 staAvailListener // availableListener
@@ -342,7 +342,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 nanAvailListener // availableListener
@@ -403,7 +402,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -554,7 +552,6 @@
                 IfaceType.STA,
                 "wlan0",
                 TestChipV1.STA_CHIP_MODE_ID,
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -601,7 +598,6 @@
                 IfaceType.STA,
                 "wlan0",
                 TestChipV1.STA_CHIP_MODE_ID,
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -627,7 +623,6 @@
                 IfaceType.AP,
                 "wlan0",
                 TestChipV1.AP_CHIP_MODE_ID,
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -644,7 +639,6 @@
                 IfaceType.STA,
                 "wlan0",
                 TestChipV1.STA_CHIP_MODE_ID,
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -682,7 +676,6 @@
                 IfaceType.STA,
                 "wlan0",
                 TestChipV2.CHIP_MODE_ID,
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -702,7 +695,6 @@
                 IfaceType.AP,
                 "wlan0",
                 TestChipV2.CHIP_MODE_ID,
-                false, // high priority
                 null, // tearDownList
                 null, // destroyedListener
                 null // availableListener
@@ -907,7 +899,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 name, // ifaceName
                 TestChipV1.AP_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 idl, // destroyedListener
                 iafrl // availableListener
@@ -968,7 +959,7 @@
                 any(IWifiIface.getTypeCallback.class));
         doAnswer(new CreateXxxIfaceAnswer(chipMock, mStatusOk, staIface)).when(
                 chipMock.chip).createStaIface(any(IWifiChip.createStaIfaceCallback.class));
-        assertEquals(staIface, mDut.createStaIface(false, staIdl, null));
+        assertEquals(staIface, mDut.createStaIface(staIdl, null));
 
         mInOrder.verify(chipMock.chip).configureChip(TestChipV1.STA_CHIP_MODE_ID);
         mInOrder.verify(staIafrl).onAvailabilityChanged(false);
@@ -1025,7 +1016,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 name, // ifaceName
                 TestChipV1.AP_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 idl, // destroyedListener
                 iafrl // availableListener
@@ -1123,7 +1113,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 null // availableListener
@@ -1133,7 +1122,7 @@
         inOrderAvail.verify(staAvailListener).onAvailabilityChanged(false);
 
         // request STA2: should fail
-        IWifiIface staIface2 = mDut.createStaIface(false, null, null);
+        IWifiIface staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         // register additional InterfaceDestroyedListeners - including a duplicate (verify that
@@ -1148,7 +1137,6 @@
                 IfaceType.P2P, // ifaceTypeToCreate
                 "p2p0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 p2pDestroyedListener, // destroyedListener
                 null // availableListener
@@ -1165,7 +1153,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.AP_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 new IWifiIface[]{staIface, p2pIface}, // tearDownList
                 apDestroyedListener, // destroyedListener
                 null, // availableListener
@@ -1197,7 +1184,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 null, // availableListener
@@ -1222,7 +1208,6 @@
                 IfaceType.P2P, // ifaceTypeToCreate
                 "p2p0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 p2pDestroyedListener2, // destroyedListener
                 null // availableListener
@@ -1253,7 +1238,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 nanAvailListener // availableListener
@@ -1312,7 +1296,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener1, // destroyedListener
                 staAvailListener1 // availableListener
@@ -1322,7 +1305,7 @@
         verify(staAvailListener1).onAvailabilityChanged(false);
 
         // get STA interface again
-        IWifiIface staIface2 = mDut.createStaIface(false, staDestroyedListener2, mHandler);
+        IWifiIface staIface2 = mDut.createStaIface(staDestroyedListener2, mHandler);
         collector.checkThat("STA created", staIface2, IsNull.nullValue());
 
         verifyNoMoreInteractions(mManagerStatusListenerMock, staDestroyedListener1,
@@ -1379,6 +1362,66 @@
         assertEquals(correctResults, results);
     }
 
+    /**
+     * Validate {@link HalDeviceManager#canSupportIfaceCombo(SparseArray)}
+     */
+    @Test
+    public void testCanSupportIfaceComboTestChipV1() throws Exception {
+        final String name = "wlan0";
+
+        TestChipV1 chipMock = new TestChipV1();
+        chipMock.initialize();
+        mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+                mManagerStatusListenerMock);
+        executeAndValidateInitializationSequence();
+        executeAndValidateStartupSequence();
+
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.AP, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.P2P, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.P2P, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+
+        assertFalse(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.AP, 1);
+            }}
+        ));
+        assertFalse(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 2);
+            }}
+        ));
+        assertFalse(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.P2P, 1);
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+
+        verifyNoMoreInteractions(mManagerStatusListenerMock);
+    }
+
+
     //////////////////////////////////////////////////////////////////////////////////////
     // TestChipV2 Specific Tests
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1455,7 +1498,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV2.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -1469,7 +1511,6 @@
                 IfaceType.P2P, // ifaceTypeToCreate
                 "p2p0", // ifaceName
                 TestChipV2.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 p2pDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -1490,7 +1531,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 "wlan1", // ifaceName
                 TestChipV2.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 apDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -1501,7 +1541,7 @@
         inOrderAvail.verify(staAvailListener).onAvailabilityChanged(false);
 
         // request STA2: should fail
-        IWifiIface staIface2 = mDut.createStaIface(false, null, null);
+        IWifiIface staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         // request AP2: should fail
@@ -1525,7 +1565,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan1", // ifaceName
                 TestChipV2.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener2, // destroyedListener
                 null // availableListener (already registered)
@@ -1535,7 +1574,7 @@
         inOrderAvail.verify(staAvailListener).onAvailabilityChanged(false);
 
         // request STA3: should fail
-        IWifiIface staIface3 = mDut.createStaIface(false, null, null);
+        IWifiIface staIface3 = mDut.createStaIface(null, null);
         collector.checkThat("STA3 should not be created", staIface3, IsNull.nullValue());
 
         // create AP - this will destroy the last STA created, i.e. STA2
@@ -1545,7 +1584,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 "wlan1", // ifaceName
                 TestChipV2.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 apDestroyedListener, // destroyedListener
                 null, // availableListener (already registered),
@@ -1573,7 +1611,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV2.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -1656,6 +1693,91 @@
         assertEquals(correctResults, results);
     }
 
+    /**
+     * Validate {@link HalDeviceManager#canSupportIfaceCombo(SparseArray)}
+     */
+    @Test
+    public void testCanSupportIfaceComboTestChipV2() throws Exception {
+        final String name = "wlan0";
+
+        TestChipV2 chipMock = new TestChipV2();
+        chipMock.initialize();
+        mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+                mManagerStatusListenerMock);
+        executeAndValidateInitializationSequence();
+        executeAndValidateStartupSequence();
+
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.AP, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.P2P, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.P2P, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.AP, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 2);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.P2P, 1);
+                put(IfaceType.AP, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.P2P, 1);
+                put(IfaceType.AP, 1);
+            }}
+        ));
+        assertTrue(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 1);
+                put(IfaceType.AP, 1);
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+
+        assertFalse(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.P2P, 1);
+                put(IfaceType.NAN, 1);
+            }}
+        ));
+        assertFalse(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.AP, 2);
+            }}
+        ));
+        assertFalse(mDut.canSupportIfaceCombo(new SparseArray<Integer>() {{
+                put(IfaceType.STA, 2);
+                put(IfaceType.AP, 1);
+            }}
+        ));
+
+        verifyNoMoreInteractions(mManagerStatusListenerMock);
+    }
+
     //////////////////////////////////////////////////////////////////////////////////////
     // TestChipV3 Specific Tests
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1732,7 +1854,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV3.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -1746,7 +1867,6 @@
                 IfaceType.P2P, // ifaceTypeToCreate
                 "p2p0", // ifaceName
                 TestChipV3.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 p2pDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -1768,7 +1888,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 "wlan1", // ifaceName
                 TestChipV3.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 apDestroyedListener, // destroyedListener
                 null, // availableListener (already registered)
@@ -1780,7 +1899,7 @@
         inOrderAvail.verify(apAvailListener).onAvailabilityChanged(false);
 
         // request STA2: should fail
-        IWifiIface staIface2 = mDut.createStaIface(false, null, null);
+        IWifiIface staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         // request AP2: should fail
@@ -1810,7 +1929,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan1", // ifaceName
                 TestChipV3.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener2, // destroyedListener
                 null // availableListener (already registered)
@@ -1820,7 +1938,7 @@
         inOrderAvail.verify(staAvailListener).onAvailabilityChanged(false);
 
         // request STA3: should fail
-        IWifiIface staIface3 = mDut.createStaIface(false, null, null);
+        IWifiIface staIface3 = mDut.createStaIface(null, null);
         collector.checkThat("STA3 should not be created", staIface3, IsNull.nullValue());
 
         // create NAN: should destroy the last created STA (STA2)
@@ -1830,7 +1948,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV3.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 null, // availableListener (already registered)
@@ -1844,7 +1961,7 @@
         verify(staDestroyedListener2).onDestroyed(getName(staIface2));
 
         // request STA2: should fail
-        staIface2 = mDut.createStaIface(false, null, null);
+        staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         verifyNoMoreInteractions(mManagerStatusListenerMock, staDestroyedListener,
@@ -1996,7 +2113,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -2011,7 +2127,6 @@
                 IfaceType.P2P, // ifaceTypeToCreate
                 "p2p0", // ifaceName
                 TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 p2pDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -2032,7 +2147,6 @@
                 IfaceType.AP, // ifaceTypeToCreate
                 "wlan1", // ifaceName
                 TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 apDestroyedListener, // destroyedListener
                 null, // availableListener (already registered)
@@ -2044,7 +2158,7 @@
         inOrderAvail.verify(apAvailListener).onAvailabilityChanged(false);
 
         // request STA2: should fail
-        IWifiIface staIface2 = mDut.createStaIface(false, null, null);
+        IWifiIface staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         // request AP2: should fail
@@ -2066,7 +2180,7 @@
         verify(apDestroyedListener).onDestroyed(getName(apIface));
 
         // request STA2: should fail
-        staIface2 = mDut.createStaIface(false, null, null);
+        staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         // create NAN
@@ -2076,7 +2190,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 null // availableListener (already registered)
@@ -2086,7 +2199,7 @@
         inOrderAvail.verify(nanAvailListener).onAvailabilityChanged(false);
 
         // request STA2: should fail
-        staIface2 = mDut.createStaIface(false, null, null);
+        staIface2 = mDut.createStaIface(null, null);
         collector.checkThat("STA2 should not be created", staIface2, IsNull.nullValue());
 
         // tear down STA
@@ -2171,222 +2284,6 @@
         assertEquals(correctResults, results);
     }
 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    // Tests targeting low priority STA creation
-    ///////////////////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Validate low priority STA management on Test Chip V1 (which has single STA capability).
-     * Procedure:
-     * - Create STA
-     * - Create STA(low priority): expect failure
-     * - Create AP: expect STA to be deleted
-     * - Create STA(low priority): expect failure
-     * - Delete AP
-     * - Create STA(low priority): success!
-     * - Create STA: expect STA(low priority) to be deleted
-     */
-    @Test
-    public void testLowPriorityStaTestChipV1() throws Exception {
-        TestChipV1 chipMock = new TestChipV1();
-        chipMock.initialize();
-        mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
-                mManagerStatusListenerMock);
-        executeAndValidateInitializationSequence();
-        executeAndValidateStartupSequence();
-
-        InterfaceDestroyedListener staDestroyedListener = mock(
-                InterfaceDestroyedListener.class);
-        InterfaceDestroyedListener staLpDestroyedListener = mock(
-                InterfaceDestroyedListener.class);
-        InterfaceDestroyedListener apDestroyedListener = mock(
-                InterfaceDestroyedListener.class);
-
-        // create STA
-        IWifiIface staIface = validateInterfaceSequence(chipMock,
-                false, // chipModeValid
-                -1000, // chipModeId (only used if chipModeValid is true)
-                IfaceType.STA, // ifaceTypeToCreate
-                "wlan0", // ifaceName
-                TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
-                null, // tearDownList
-                staDestroyedListener, // destroyedListener
-                null // availableListener (already registered)
-        );
-        collector.checkThat("STA interface wasn't created", staIface, IsNull.notNullValue());
-
-        // request STA(low priority): should fail
-        IWifiIface staLowIface = mDut.createStaIface(true, null, null);
-        collector.checkThat("STA(low priority) should not be created", staLowIface,
-                IsNull.nullValue());
-
-        // create AP: will destroy STA
-        IWifiIface apIface = validateInterfaceSequence(chipMock,
-                true, // chipModeValid
-                TestChipV1.STA_CHIP_MODE_ID, // chipModeId
-                IfaceType.AP, // ifaceTypeToCreate
-                "ap0", // ifaceName
-                TestChipV1.AP_CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
-                null, // tearDownList
-                apDestroyedListener, // destroyedListener
-                null, // availableListener (already registered)
-                new InterfaceDestroyedListenerWithIfaceName("wlan0", staDestroyedListener)
-        );
-        collector.checkThat("AP interface wasn't created", apIface, IsNull.notNullValue());
-
-        // request STA(low priority): should fail
-        staLowIface = mDut.createStaIface(true, null, null);
-        collector.checkThat("STA(low priority) should not be created", staLowIface,
-                IsNull.nullValue());
-
-        // tear down AP
-        mDut.removeIface(apIface);
-        mTestLooper.dispatchAll();
-        verify(chipMock.chip).removeApIface("ap0");
-        verify(apDestroyedListener).onDestroyed(getName(apIface));
-
-        // create STA(low priority)
-        staLowIface = validateInterfaceSequence(chipMock,
-                true, // chipModeValid
-                TestChipV1.AP_CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
-                IfaceType.STA, // ifaceTypeToCreate
-                "wlan1", // ifaceName
-                TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                true, // low priority
-                null, // tearDownList
-                staLpDestroyedListener, // destroyedListener
-                null // availableListener (already registered)
-        );
-        collector.checkThat("STA(low priority) interface wasn't created", staIface,
-                IsNull.notNullValue());
-
-        // create STA: should destroy the low priority STA
-        staIface = validateInterfaceSequence(chipMock,
-                true, // chipModeValid
-                TestChipV1.STA_CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
-                IfaceType.STA, // ifaceTypeToCreate
-                "wlan0", // ifaceName
-                TestChipV1.STA_CHIP_MODE_ID, // finalChipMode
-                false, // high priority
-                null, // tearDownList
-                staDestroyedListener, // destroyedListener
-                null, // availableListener (already registered)
-                new InterfaceDestroyedListenerWithIfaceName("wlan1", staLpDestroyedListener)
-        );
-        collector.checkThat("STA interface wasn't created", staIface,
-                IsNull.notNullValue());
-
-        verifyNoMoreInteractions(mManagerStatusListenerMock, staDestroyedListener,
-                apDestroyedListener, staLpDestroyedListener);
-    }
-
-    /**
-     * Validate low priority STA management on Test Chip V4 (which has single STA+AP capability).
-     * Procedure:
-     * - Create STA
-     * - Create STA(low priority): expect failure
-     * - Create AP
-     * - Create STA: expect failure
-     * - Destroy STA
-     * - Create STA(low priority): success!
-     * - Create STA: expect STA(low priority) to be deleted
-     */
-    @Test
-    public void testLowPriorityStaTestChipV4() throws Exception {
-        TestChipV4 chipMock = new TestChipV4();
-        chipMock.initialize();
-        mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
-                mManagerStatusListenerMock);
-        executeAndValidateInitializationSequence();
-        executeAndValidateStartupSequence();
-
-        InterfaceDestroyedListener staDestroyedListener = mock(
-                InterfaceDestroyedListener.class);
-        InterfaceDestroyedListener staLpDestroyedListener = mock(
-                InterfaceDestroyedListener.class);
-        InterfaceDestroyedListener apDestroyedListener = mock(
-                InterfaceDestroyedListener.class);
-
-        // create STA
-        IWifiIface staIface = validateInterfaceSequence(chipMock,
-                false, // chipModeValid
-                -1000, // chipModeId (only used if chipModeValid is true)
-                IfaceType.STA, // ifaceTypeToCreate
-                "wlan0", // ifaceName
-                TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
-                null, // tearDownList
-                staDestroyedListener, // destroyedListener
-                null // availableListener (already registered)
-        );
-        collector.checkThat("STA interface wasn't created", staIface, IsNull.notNullValue());
-
-        // request STA(low priority): should fail
-        IWifiIface staLowIface = mDut.createStaIface(true, null, null);
-        collector.checkThat("STA(low priority) should not be created", staLowIface,
-                IsNull.nullValue());
-
-        // create AP
-        IWifiIface apIface = validateInterfaceSequence(chipMock,
-                true, // chipModeValid
-                TestChipV4.CHIP_MODE_ID, // chipModeId
-                IfaceType.AP, // ifaceTypeToCreate
-                "ap0", // ifaceName
-                TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority (but irrelevant)
-                null, // tearDownList
-                apDestroyedListener, // destroyedListener
-                null // availableListener (already registered)
-        );
-        collector.checkThat("AP interface wasn't created", apIface, IsNull.notNullValue());
-
-        // request STA2: should fail
-        IWifiIface sta2Iface = mDut.createStaIface(true, null, null);
-        collector.checkThat("STA2 should not be created", sta2Iface,
-                IsNull.nullValue());
-
-        // tear down STA
-        mDut.removeIface(staIface);
-        mTestLooper.dispatchAll();
-        verify(chipMock.chip).removeStaIface("wlan0");
-        verify(staDestroyedListener).onDestroyed(getName(staIface));
-
-        // create STA(low priority)
-        staLowIface = validateInterfaceSequence(chipMock,
-                true, // chipModeValid
-                TestChipV4.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
-                IfaceType.STA, // ifaceTypeToCreate
-                "wlan1", // ifaceName
-                TestChipV4.CHIP_MODE_ID, // finalChipMode
-                true, // low priority
-                null, // tearDownList
-                staLpDestroyedListener, // destroyedListener
-                null // availableListener (already registered)
-        );
-        collector.checkThat("STA(low priority) interface wasn't created", staIface,
-                IsNull.notNullValue());
-
-        // create STA: should destroy the low priority STA
-        staIface = validateInterfaceSequence(chipMock,
-                true, // chipModeValid
-                TestChipV4.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
-                IfaceType.STA, // ifaceTypeToCreate
-                "wlan0", // ifaceName
-                TestChipV4.CHIP_MODE_ID, // finalChipMode
-                false, // high priority
-                null, // tearDownList
-                staDestroyedListener, // destroyedListener
-                null, // availableListener (already registered)
-                new InterfaceDestroyedListenerWithIfaceName("wlan1", staLpDestroyedListener)
-        );
-        collector.checkThat("STA interface wasn't created", staIface,
-                IsNull.notNullValue());
-
-        verifyNoMoreInteractions(mManagerStatusListenerMock, staDestroyedListener,
-                apDestroyedListener, staLpDestroyedListener);
-    }
 
     ///////////////////////////////////////////////////////////////////////////////////////
     // utilities
@@ -2472,7 +2369,6 @@
                 ifaceTypeToCreate,
                 ifaceName,
                 finalChipMode,
-                false, // high priority
                 null, // tearDownList
                 idl, // destroyedListener
                 iafrl // availableListener
@@ -2553,7 +2449,6 @@
                 IfaceType.STA, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 onlyChipMode, // finalChipMode
-                false, // high priority
                 null, // tearDownList
                 staDestroyedListener, // destroyedListener
                 staAvailListener // availableListener
@@ -2568,7 +2463,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 onlyChipMode, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 nanAvailListener // availableListener
@@ -2585,7 +2479,6 @@
                 IfaceType.P2P, // ifaceTypeToCreate
                 "p2p0", // ifaceName
                 onlyChipMode, // finalChipMode
-                false, // high priority (but irrelevant)
                 new IWifiIface[]{nanIface}, // tearDownList
                 p2pDestroyedListener, // destroyedListener
                 null, // availableListener
@@ -2619,7 +2512,6 @@
                 IfaceType.NAN, // ifaceTypeToCreate
                 "wlan0", // ifaceName
                 onlyChipMode, // finalChipMode
-                false, // high priority (but irrelevant)
                 null, // tearDownList
                 nanDestroyedListener, // destroyedListener
                 nanAvailListener // availableListener
@@ -2635,7 +2527,7 @@
 
     private IWifiIface validateInterfaceSequence(ChipMockBase chipMock,
             boolean chipModeValid, int chipModeId,
-            int ifaceTypeToCreate, String ifaceName, int finalChipMode, boolean lowPriority,
+            int ifaceTypeToCreate, String ifaceName, int finalChipMode,
             IWifiIface[] tearDownList,
             InterfaceDestroyedListener destroyedListener,
             HalDeviceManager.InterfaceAvailableForRequestListener availableListener,
@@ -2659,7 +2551,7 @@
                 doAnswer(new CreateXxxIfaceAnswer(chipMock, mStatusOk, iface)).when(
                         chipMock.chip).createStaIface(any(IWifiChip.createStaIfaceCallback.class));
 
-                mDut.createStaIface(lowPriority, destroyedListener, mHandler);
+                mDut.createStaIface(destroyedListener, mHandler);
                 break;
             case IfaceType.AP:
                 iface = mock(IWifiApIface.class);
diff --git a/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java b/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java
index f9e05cb..ec2142d 100644
--- a/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java
@@ -79,7 +79,7 @@
      */
     @Test
     public void verifyStoreFileId() throws Exception {
-        assertEquals(WifiConfigStore.STORE_FILE_USER_NETWORK_SUGGESTIONS,
+        assertEquals(WifiConfigStore.STORE_FILE_USER_GENERAL,
                 mImsiPrivacyProtectionExemptionStoreData.getStoreFileId());
     }
 
diff --git a/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java b/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java
index 17bb4c1..94b14ec 100644
--- a/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java
@@ -39,7 +39,6 @@
 import com.android.server.wifi.WifiNetworkSuggestionsManager.ExtendedWifiNetworkSuggestion;
 import com.android.server.wifi.WifiNetworkSuggestionsManager.PerAppInfo;
 import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -74,7 +73,8 @@
     private @Mock WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
     private @Mock PasspointNetworkNominateHelper mPasspointNetworkNominateHelper;
     private @Mock Clock mClock;
-    private @Mock TelephonyUtil mTelephonyUtil;
+    private @Mock
+    WifiCarrierInfoManager mWifiCarrierInfoManager;
     private NetworkSuggestionNominator mNetworkSuggestionNominator;
 
     /** Sets up test. */
@@ -83,7 +83,7 @@
         MockitoAnnotations.initMocks(this);
         mNetworkSuggestionNominator = new NetworkSuggestionNominator(
                 mWifiNetworkSuggestionsManager, mWifiConfigManager, mPasspointNetworkNominateHelper,
-                new LocalLog(100), mTelephonyUtil);
+                new LocalLog(100), mWifiCarrierInfoManager);
     }
 
     /**
@@ -470,11 +470,6 @@
                 .isNetworkTemporarilyDisabledByUser(anyString());
         verify(mWifiConfigManager)
                 .getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey());
-        verify(mWifiConfigManager).addOrUpdateNetwork(
-                argThat(new WifiConfigMatcher(suggestions[0].wns.wifiConfiguration)),
-                eq(suggestions[0].perAppInfo.uid), eq(suggestions[0].perAppInfo.packageName));
-        verify(mWifiConfigManager).getConfiguredNetwork(
-                suggestions[0].wns.wifiConfiguration.networkId);
         // Verify we did not try to add any new networks or other interactions with
         // WifiConfigManager.
         verifyNoMoreInteractions(mWifiConfigManager);
@@ -586,11 +581,6 @@
                 .isNetworkTemporarilyDisabledByUser(anyString());
         verify(mWifiConfigManager).getConfiguredNetwork(eq(
                 suggestions[0].wns.wifiConfiguration.getKey()));
-        verify(mWifiConfigManager).addOrUpdateNetwork(
-                argThat(new WifiConfigMatcher(suggestions[0].wns.wifiConfiguration)),
-                eq(suggestions[0].perAppInfo.uid), eq(suggestions[0].perAppInfo.packageName));
-        verify(mWifiConfigManager).getConfiguredNetwork(
-                suggestions[0].wns.wifiConfiguration.networkId);
         verify(mWifiConfigManager).tryEnableNetwork(eq(
                 suggestions[0].wns.wifiConfiguration.networkId));
         // Verify we did not try to add any new networks or other interactions with
@@ -655,11 +645,6 @@
                 .isNetworkTemporarilyDisabledByUser(anyString());
         verify(mWifiConfigManager).getConfiguredNetwork(eq(
                 suggestions[0].wns.wifiConfiguration.getKey()));
-        verify(mWifiConfigManager).addOrUpdateNetwork(
-                argThat(new WifiConfigMatcher(suggestions[0].wns.wifiConfiguration)),
-                eq(suggestions[0].perAppInfo.uid), eq(suggestions[0].perAppInfo.packageName));
-        verify(mWifiConfigManager).getConfiguredNetwork(
-                suggestions[0].wns.wifiConfiguration.networkId);
         verify(mWifiConfigManager).tryEnableNetwork(eq(
                 suggestions[0].wns.wifiConfiguration.networkId));
         // Verify we did not try to add any new networks or other interactions with
@@ -788,8 +773,9 @@
         eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
         eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
         eapSimConfig.carrierId = TEST_CARRIER_ID;
-        when(mTelephonyUtil.getBestMatchSubscriptionId(eapSimConfig)).thenReturn(TEST_SUB_ID);
-        when(mTelephonyUtil.isSimPresent(TEST_SUB_ID)).thenReturn(false);
+        when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(eapSimConfig))
+                .thenReturn(TEST_SUB_ID);
+        when(mWifiCarrierInfoManager.isSimPresent(TEST_SUB_ID)).thenReturn(false);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -833,10 +819,11 @@
         eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
         eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
         eapSimConfig.carrierId = TEST_CARRIER_ID;
-        when(mTelephonyUtil.getBestMatchSubscriptionId(eapSimConfig)).thenReturn(TEST_SUB_ID);
-        when(mTelephonyUtil.isSimPresent(TEST_SUB_ID)).thenReturn(true);
-        when(mTelephonyUtil.requiresImsiEncryption(TEST_SUB_ID)).thenReturn(true);
-        when(mTelephonyUtil.isImsiEncryptionInfoAvailable(TEST_SUB_ID)).thenReturn(false);
+        when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(eapSimConfig))
+                .thenReturn(TEST_SUB_ID);
+        when(mWifiCarrierInfoManager.isSimPresent(TEST_SUB_ID)).thenReturn(true);
+        when(mWifiCarrierInfoManager.requiresImsiEncryption(TEST_SUB_ID)).thenReturn(true);
+        when(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(TEST_SUB_ID)).thenReturn(false);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -969,7 +956,7 @@
                 securities, appInteractions, meteredness, priorities, uids,
                 packageNames, autojoin, shareWithUser);
         suggestions[0].wns.wifiConfiguration.meteredHint = true;
-        when(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(any())).thenReturn(true);
+        when(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(any())).thenReturn(true);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
 
diff --git a/tests/wifitests/src/com/android/server/wifi/SavedNetworkNominatorTest.java b/tests/wifitests/src/com/android/server/wifi/SavedNetworkNominatorTest.java
index 1a56fbb..cdc6762 100644
--- a/tests/wifitests/src/com/android/server/wifi/SavedNetworkNominatorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/SavedNetworkNominatorTest.java
@@ -29,7 +29,6 @@
 import com.android.server.wifi.WifiNetworkSelector.NetworkNominator.OnConnectableListener;
 import com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs;
 import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import org.junit.After;
 import org.junit.Before;
@@ -53,9 +52,9 @@
         MockitoAnnotations.initMocks(this);
         mLocalLog = new LocalLog(512);
         mSavedNetworkNominator = new SavedNetworkNominator(mWifiConfigManager,
-                mPasspointNetworkNominateHelper, mLocalLog, mTelephonyUtil);
-        when(mTelephonyUtil.isSimPresent(anyInt())).thenReturn(true);
-        when(mTelephonyUtil.getBestMatchSubscriptionId(any())).thenReturn(1);
+                mPasspointNetworkNominateHelper, mLocalLog, mWifiCarrierInfoManager);
+        when(mWifiCarrierInfoManager.isSimPresent(anyInt())).thenReturn(true);
+        when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(any())).thenReturn(1);
     }
 
     /** Cleans up test. */
@@ -74,7 +73,7 @@
     @Mock private WifiConfigManager mWifiConfigManager;
     @Mock private Clock mClock;
     @Mock private OnConnectableListener mOnConnectableListener;
-    @Mock private TelephonyUtil mTelephonyUtil;
+    @Mock private WifiCarrierInfoManager mWifiCarrierInfoManager;
     @Mock private PasspointNetworkNominateHelper mPasspointNetworkNominateHelper;
     private LocalLog mLocalLog;
 
@@ -122,9 +121,9 @@
         WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
         savedConfigs[0].carrierId = TEST_CARRIER_ID;
         // SIM is absent
-        when(mTelephonyUtil.getBestMatchSubscriptionId(any(WifiConfiguration.class)))
+        when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(any(WifiConfiguration.class)))
                 .thenReturn(INVALID_SUBID);
-        when(mTelephonyUtil.isSimPresent(eq(INVALID_SUBID))).thenReturn(false);
+        when(mWifiCarrierInfoManager.isSimPresent(eq(INVALID_SUBID))).thenReturn(false);
 
         mSavedNetworkNominator.nominateNetworks(scanDetails,
                 null, null, true, false, mOnConnectableListener);
@@ -250,13 +249,13 @@
                         freqs, levels, mWifiConfigManager, mClock);
         List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
         WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        when(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(savedConfigs[0]))
+        when(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(savedConfigs[0]))
                 .thenReturn(false);
         mSavedNetworkNominator.nominateNetworks(scanDetails,
                 null, null, true, false, mOnConnectableListener);
         verify(mOnConnectableListener).onConnectable(any(), any());
         reset(mOnConnectableListener);
-        when(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(savedConfigs[0]))
+        when(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(savedConfigs[0]))
                 .thenReturn(true);
         verify(mOnConnectableListener, never()).onConnectable(any(), any());
     }
diff --git a/tests/wifitests/src/com/android/server/wifi/SoftApManagerTest.java b/tests/wifitests/src/com/android/server/wifi/SoftApManagerTest.java
index 0e63b51..a7e21c9 100644
--- a/tests/wifitests/src/com/android/server/wifi/SoftApManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/SoftApManagerTest.java
@@ -117,7 +117,7 @@
     private SoftApInfo mTestSoftApInfo;
     private SoftApCapability mTestSoftApCapability;
 
-    @Mock Context mContext;
+    @Mock WifiContext mContext;
     @Mock Resources mResources;
     @Mock WifiNative mWifiNative;
     @Mock WifiManager.SoftApCallback mCallback;
@@ -153,6 +153,7 @@
         when(mContext.getResources()).thenReturn(mResources);
         when(mContext.getSystemService(NotificationManager.class))
                 .thenReturn(mNotificationManager);
+        when(mContext.getWifiOverlayApkPkgName()).thenReturn("test.com.android.wifi.resources");
 
         when(mResources.getInteger(R.integer.config_wifiFrameworkSoftApShutDownTimeoutMilliseconds))
                 .thenReturn((int) TEST_DEFAULT_SHUTDOWN_TIMEOUT_MILLS);
diff --git a/tests/wifitests/src/com/android/server/wifi/SoftApNotifierTest.java b/tests/wifitests/src/com/android/server/wifi/SoftApNotifierTest.java
index 9ff8934..3d4d239 100644
--- a/tests/wifitests/src/com/android/server/wifi/SoftApNotifierTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/SoftApNotifierTest.java
@@ -45,7 +45,7 @@
 public class SoftApNotifierTest extends WifiBaseTest {
     private static final String TEST_SSID = "Test SSID";
 
-    @Mock Context mContext;
+    @Mock WifiContext mContext;
     @Mock Resources mResources;
     @Mock NotificationManager mNotificationManager;
     @Mock FrameworkFacade mFrameworkFacade;
@@ -61,8 +61,8 @@
         when(mContext.getSystemService(NotificationManager.class))
                 .thenReturn(mNotificationManager);
         when(mContext.getResources()).thenReturn(mResources);
-        mSoftApNotifier =
-                new SoftApNotifier(mContext, mFrameworkFacade);
+        when(mContext.getWifiOverlayApkPkgName()).thenReturn("test.com.android.wifi.resources");
+        mSoftApNotifier = new SoftApNotifier(mContext, mFrameworkFacade);
     }
 
     /**
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
index 3abdb06..50fd4d8 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
@@ -23,6 +23,8 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.never;
@@ -35,6 +37,7 @@
 import android.net.MacAddress;
 import android.net.wifi.SoftApConfiguration;
 import android.net.wifi.SoftApConfiguration.Builder;
+import android.net.wifi.WifiInfo;
 import android.os.Build;
 import android.os.Handler;
 import android.os.test.TestLooper;
@@ -109,7 +112,7 @@
         mResources.setString(R.string.wifi_localhotspot_configure_ssid_default,
                              TEST_DEFAULT_HOTSPOT_SSID);
         /* Default to device that does not require ap band conversion */
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(false);
         when(mContext.getResources()).thenReturn(mResources);
 
@@ -279,7 +282,7 @@
      */
     @Test
     public void convertDevice5GhzToAny() throws Exception {
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(true);
 
         /* Initialize WifiApConfigStore with default configuration. */
@@ -318,7 +321,7 @@
      */
     @Test
     public void deviceAnyNotConverted() throws Exception {
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(true);
 
         /* Initialize WifiApConfigStore with default configuration. */
@@ -347,7 +350,7 @@
      */
     @Test
     public void deviceWithChannelNotConverted() throws Exception {
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(true);
 
         /* Initialize WifiApConfigStore with default configuration. */
@@ -377,7 +380,7 @@
      */
     @Test
     public void device5GhzConvertedToAnyAtRetrieval() throws Exception {
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(true);
 
         SoftApConfiguration persistedConfig = setupApConfig(
@@ -411,7 +414,7 @@
      */
     @Test
     public void deviceNotConvertedAtRetrieval() throws Exception {
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(true);
 
         SoftApConfiguration persistedConfig = setupApConfig(
@@ -492,6 +495,21 @@
     }
 
     @Test
+    public void randomizeBssid_fallbackPathWhenMacCalculationFails() throws Exception {
+        mResources.setBoolean(R.bool.config_wifi_ap_mac_randomization_supported, true);
+        // Setup the MAC calculation to fail.
+        when(mMacAddressUtil.calculatePersistentMac(any(), any())).thenReturn(null);
+        SoftApConfiguration baseConfig = new SoftApConfiguration.Builder().build();
+
+        WifiApConfigStore store = createWifiApConfigStore();
+        SoftApConfiguration config = store.randomizeBssidIfUnset(mContext, baseConfig);
+
+        // Verify that some randomized MAC address is still generated
+        assertNotNull(config.getBssid());
+        assertNotEquals(WifiInfo.DEFAULT_MAC_ADDRESS, config.getBssid().toString());
+    }
+
+    @Test
     public void randomizeBssid_usesFactoryMacWhenRandomizationOff() throws Exception {
         mResources.setBoolean(R.bool.config_wifi_ap_mac_randomization_supported, false);
         SoftApConfiguration baseConfig = new SoftApConfiguration.Builder().build();
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiBackupRestoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiBackupRestoreTest.java
index 878d3f5..30c171f 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiBackupRestoreTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiBackupRestoreTest.java
@@ -54,135 +54,178 @@
 public class WifiBackupRestoreTest extends WifiBaseTest {
 
     private static final String WIFI_BACKUP_DATA_WITH_UNSUPPORTED_TAG =
-            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
-            + "<WifiBackupData>"
-            + "<int name=\"Version\" value=\"1\" />"
-            + "<NetworkList>"
-            + "<Network>"
-            + "<WifiConfiguration>"
-            + "<string name=\"ConfigKey\">&quot;GoogleGuest-Legacy&quot;NONE</string>"
-            + "<string name=\"SSID\">&quot;GoogleGuest-Legacy&quot;</string>"
-            + "<null name=\"BSSID\" />"
-            + "<null name=\"PreSharedKey\" />"
-            + "<null name=\"WEPKeys\" />"
-            + "<int name=\"WEPTxKeyIndex\" value=\"0\" />"
-            + "<boolean name=\"HiddenSSID\" value=\"false\" />"
-            + "<boolean name=\"RequirePMF\" value=\"false\" />"
-            + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>"
-            + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>"
-            + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>"
-            + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>"
-            + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>"
-            + "<boolean name=\"Shared\" value=\"true\" />"
-            + "<null name=\"SimSlot\" />"
-            + "</WifiConfiguration>"
-            + "<IpConfiguration>"
-            + "<string name=\"IpAssignment\">DHCP</string>"
-            + "<string name=\"ProxySettings\">NONE</string>"
-            + "</IpConfiguration>"
-            + "</Network>"
-            + "</NetworkList>"
-            + "</WifiBackupData>";
+            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+            + "<WifiBackupData>\n"
+            + "<int name=\"Version\" value=\"1\" />\n"
+            + "<NetworkList>\n"
+            + "<Network>\n"
+            + "<WifiConfiguration>\n"
+            + "<string name=\"ConfigKey\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                    + "&quot;NONE</string>\n"
+            + "<string name=\"SSID\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                    + "&quot;</string>\n"
+            + "<null name=\"BSSID\" />\n"
+            + "<null name=\"PreSharedKey\" />\n"
+            + "<null name=\"WEPKeys\" />\n"
+            + "<int name=\"WEPTxKeyIndex\" value=\"0\" />\n"
+            + "<boolean name=\"HiddenSSID\" value=\"false\" />\n"
+            + "<boolean name=\"RequirePMF\" value=\"false\" />\n"
+            + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>\n"
+            + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>\n"
+            + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>\n"
+            + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>\n"
+            + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>\n"
+            + "<boolean name=\"Shared\" value=\"true\" />\n"
+            + "<null name=\"SimSlot\" />\n"
+            + "</WifiConfiguration>\n"
+            + "<IpConfiguration>\n"
+            + "<string name=\"IpAssignment\">DHCP</string>\n"
+            + "<string name=\"ProxySettings\">NONE</string>\n"
+            + "</IpConfiguration>\n"
+            + "</Network>\n"
+            + "</NetworkList>\n"
+            + "</WifiBackupData>\n";
 
     // |AllowedKeyMgmt|, |AllowedProtocols|, |AllowedAuthAlgorithms|, |AllowedGroupCiphers| and
     // |AllowedPairwiseCiphers| fields have invalid values in them.
     // NOTE: The byte values are encoded in little endian
     private static final String WIFI_BACKUP_DATA_WITH_UNSUPPORTED_VALUES_IN_BITSETS =
-            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
-                    + "<WifiBackupData>"
-                    + "<int name=\"Version\" value=\"1\" />"
-                    + "<NetworkList>"
-                    + "<Network>"
-                    + "<WifiConfiguration>"
-                    + "<string name=\"ConfigKey\">&quot;GoogleGuest-Legacy&quot;NONE</string>"
-                    + "<string name=\"SSID\">&quot;GoogleGuest-Legacy&quot;</string>"
-                    + "<null name=\"BSSID\" />"
-                    + "<null name=\"PreSharedKey\" />"
-                    + "<null name=\"WEPKeys\" />"
-                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />"
-                    + "<boolean name=\"HiddenSSID\" value=\"false\" />"
-                    + "<boolean name=\"RequirePMF\" value=\"false\" />"
+            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+                    + "<WifiBackupData>\n"
+                    + "<int name=\"Version\" value=\"1\" />\n"
+                    + "<NetworkList>\n"
+                    + "<Network>\n"
+                    + "<WifiConfiguration>\n"
+                    + "<string name=\"ConfigKey\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;NONE</string>\n"
+                    + "<string name=\"SSID\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;</string>\n"
+                    + "<null name=\"BSSID\" />\n"
+                    + "<null name=\"PreSharedKey\" />\n"
+                    + "<null name=\"WEPKeys\" />\n"
+                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />\n"
+                    + "<boolean name=\"HiddenSSID\" value=\"false\" />\n"
+                    + "<boolean name=\"RequirePMF\" value=\"false\" />\n"
                     // Valid Value: 01
-                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"3\">010002</byte-array>"
+                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"3\">010002</byte-array>\n"
                     // Valid Value: 03
-                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">13</byte-array>"
+                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">13</byte-array>\n"
                     // Valid Value: 01
-                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">11</byte-array>"
+                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">11</byte-array>\n"
                     // Valid Value: 0f
-                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">8f</byte-array>"
+                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">8f</byte-array>\n"
                     // Valid Value: 06
-                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">26</byte-array>"
-                    + "<boolean name=\"Shared\" value=\"true\" />"
-                    + "<null name=\"SimSlot\" />"
-                    + "</WifiConfiguration>"
-                    + "<IpConfiguration>"
-                    + "<string name=\"IpAssignment\">DHCP</string>"
-                    + "<string name=\"ProxySettings\">NONE</string>"
-                    + "</IpConfiguration>"
-                    + "</Network>"
-                    + "</NetworkList>"
-                    + "</WifiBackupData>";
+                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">26</byte-array>\n"
+                    + "<boolean name=\"Shared\" value=\"true\" />\n"
+                    + "<null name=\"SimSlot\" />\n"
+                    + "</WifiConfiguration>\n"
+                    + "<IpConfiguration>\n"
+                    + "<string name=\"IpAssignment\">DHCP</string>\n"
+                    + "<string name=\"ProxySettings\">NONE</string>\n"
+                    + "</IpConfiguration>\n"
+                    + "</Network>\n"
+                    + "</NetworkList>\n"
+                    + "</WifiBackupData>\n";
 
     private static final String WIFI_BACKUP_DATA_V1_0 =
-            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
-                    + "<WifiBackupData>"
-                    + "<float name=\"Version\" value=\"1.0\" />"
-                    + "<NetworkList>"
-                    + "<Network>"
-                    + "<WifiConfiguration>"
-                    + "<string name=\"ConfigKey\">&quot;GoogleGuest-Legacy&quot;NONE</string>"
-                    + "<string name=\"SSID\">&quot;GoogleGuest-Legacy&quot;</string>"
-                    + "<null name=\"BSSID\" />"
-                    + "<null name=\"PreSharedKey\" />"
-                    + "<null name=\"WEPKeys\" />"
-                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />"
-                    + "<boolean name=\"HiddenSSID\" value=\"false\" />"
-                    + "<boolean name=\"RequirePMF\" value=\"false\" />"
-                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>"
-                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>"
-                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>"
-                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>"
-                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>"
-                    + "<boolean name=\"Shared\" value=\"true\" />"
-                    + "</WifiConfiguration>"
-                    + "<IpConfiguration>"
-                    + "<string name=\"IpAssignment\">DHCP</string>"
-                    + "<string name=\"ProxySettings\">NONE</string>"
-                    + "</IpConfiguration>"
-                    + "</Network>"
-                    + "</NetworkList>"
-                    + "</WifiBackupData>";
+            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+                    + "<WifiBackupData>\n"
+                    + "<float name=\"Version\" value=\"1.0\" />\n"
+                    + "<NetworkList>\n"
+                    + "<Network>\n"
+                    + "<WifiConfiguration>\n"
+                    + "<string name=\"ConfigKey\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;NONE</string>\n"
+                    + "<string name=\"SSID\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;</string>\n"
+                    + "<null name=\"BSSID\" />\n"
+                    + "<null name=\"PreSharedKey\" />\n"
+                    + "<null name=\"WEPKeys\" />\n"
+                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />\n"
+                    + "<boolean name=\"HiddenSSID\" value=\"false\" />\n"
+                    + "<boolean name=\"RequirePMF\" value=\"false\" />\n"
+                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>\n"
+                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>\n"
+                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>\n"
+                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>\n"
+                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>\n"
+                    + "<boolean name=\"Shared\" value=\"true\" />\n"
+                    + "</WifiConfiguration>\n"
+                    + "<IpConfiguration>\n"
+                    + "<string name=\"IpAssignment\">DHCP</string>\n"
+                    + "<string name=\"ProxySettings\">NONE</string>\n"
+                    + "</IpConfiguration>\n"
+                    + "</Network>\n"
+                    + "</NetworkList>\n"
+                    + "</WifiBackupData>\n";
 
     private static final String WIFI_BACKUP_DATA_V1_1 =
-            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
-                    + "<WifiBackupData>"
-                    + "<float name=\"Version\" value=\"1.1\" />"
-                    + "<NetworkList>"
-                    + "<Network>"
-                    + "<WifiConfiguration>"
-                    + "<string name=\"ConfigKey\">&quot;GoogleGuest-Legacy&quot;NONE</string>"
-                    + "<string name=\"SSID\">&quot;GoogleGuest-Legacy&quot;</string>"
-                    + "<null name=\"BSSID\" />"
-                    + "<null name=\"PreSharedKey\" />"
-                    + "<null name=\"WEPKeys\" />"
-                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />"
-                    + "<boolean name=\"HiddenSSID\" value=\"false\" />"
-                    + "<boolean name=\"RequirePMF\" value=\"false\" />"
-                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>"
-                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>"
-                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>"
-                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>"
-                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>"
-                    + "<boolean name=\"Shared\" value=\"true\" />"
-                    + "<int name=\"MeteredOverride\" value=\"1\" />"
-                    + "</WifiConfiguration>"
-                    + "<IpConfiguration>"
-                    + "<string name=\"IpAssignment\">DHCP</string>"
-                    + "<string name=\"ProxySettings\">NONE</string>"
-                    + "</IpConfiguration>"
-                    + "</Network>"
-                    + "</NetworkList>"
-                    + "</WifiBackupData>";
+            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+                    + "<WifiBackupData>\n"
+                    + "<float name=\"Version\" value=\"1.1\" />\n"
+                    + "<NetworkList>\n"
+                    + "<Network>\n"
+                    + "<WifiConfiguration>\n"
+                    + "<string name=\"ConfigKey\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;NONE</string>\n"
+                    + "<string name=\"SSID\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;</string>\n"
+                    + "<null name=\"BSSID\" />\n"
+                    + "<null name=\"PreSharedKey\" />\n"
+                    + "<null name=\"WEPKeys\" />\n"
+                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />\n"
+                    + "<boolean name=\"HiddenSSID\" value=\"false\" />\n"
+                    + "<boolean name=\"RequirePMF\" value=\"false\" />\n"
+                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>\n"
+                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>\n"
+                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>\n"
+                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>\n"
+                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>\n"
+                    + "<boolean name=\"Shared\" value=\"true\" />\n"
+                    + "<int name=\"MeteredOverride\" value=\"1\" />\n"
+                    + "</WifiConfiguration>\n"
+                    + "<IpConfiguration>\n"
+                    + "<string name=\"IpAssignment\">DHCP</string>\n"
+                    + "<string name=\"ProxySettings\">NONE</string>\n"
+                    + "</IpConfiguration>\n"
+                    + "</Network>\n"
+                    + "</NetworkList>\n"
+                    + "</WifiBackupData>\n";
+
+    private static final String WIFI_BACKUP_DATA_V1_2 =
+            "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+                    + "<WifiBackupData>\n"
+                    + "<float name=\"Version\" value=\"1.2\" />\n"
+                    + "<NetworkList>\n"
+                    + "<Network>\n"
+                    + "<WifiConfiguration>\n"
+                    + "<string name=\"ConfigKey\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;NONE</string>\n"
+                    + "<string name=\"SSID\">&quot;" + WifiConfigurationTestUtil.TEST_SSID
+                        + "&quot;</string>\n"
+                    + "<null name=\"PreSharedKey\" />\n"
+                    + "<null name=\"WEPKeys\" />\n"
+                    + "<int name=\"WEPTxKeyIndex\" value=\"0\" />\n"
+                    + "<boolean name=\"HiddenSSID\" value=\"false\" />\n"
+                    + "<boolean name=\"RequirePMF\" value=\"false\" />\n"
+                    + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>\n"
+                    + "<byte-array name=\"AllowedProtocols\" num=\"1\">03</byte-array>\n"
+                    + "<byte-array name=\"AllowedAuthAlgos\" num=\"1\">01</byte-array>\n"
+                    + "<byte-array name=\"AllowedGroupCiphers\" num=\"1\">0f</byte-array>\n"
+                    + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"1\">06</byte-array>\n"
+                    + "<byte-array name=\"AllowedGroupMgmtCiphers\" num=\"0\"></byte-array>\n"
+                    + "<byte-array name=\"AllowedSuiteBCiphers\" num=\"0\"></byte-array>\n"
+                    + "<boolean name=\"Shared\" value=\"true\" />\n"
+                    + "<boolean name=\"AutoJoinEnabled\" value=\"false\" />\n"
+                    + "<int name=\"MeteredOverride\" value=\"1\" />\n"
+                    + "</WifiConfiguration>\n"
+                    + "<IpConfiguration>\n"
+                    + "<string name=\"IpAssignment\">DHCP</string>\n"
+                    + "<string name=\"ProxySettings\">NONE</string>\n"
+                    + "</IpConfiguration>\n"
+                    + "</Network>\n"
+                    + "</NetworkList>\n"
+                    + "</WifiBackupData>\n";
 
     @Mock WifiPermissionsUtil mWifiPermissionsUtil;
     private WifiBackupRestore mWifiBackupRestore;
@@ -334,7 +377,7 @@
      */
     private static WifiConfiguration createNetworkForConfigurationWithUnsupportedTag() {
         final WifiConfiguration config = new WifiConfiguration();
-        config.SSID = "\"GoogleGuest-Legacy\"";
+        config.SSID = "\"" + WifiConfigurationTestUtil.TEST_SSID + "\"";
         config.wepTxKeyIndex = 0;
         config.hiddenSSID = false;
         config.requirePmf = false;
@@ -387,7 +430,7 @@
     private static WifiConfiguration
             createNetworkForConfigurationWithUnsupportedValuesInBitsetsInRestore() {
         final WifiConfiguration config = new WifiConfiguration();
-        config.SSID = "\"GoogleGuest-Legacy\"";
+        config.SSID = "\"" + WifiConfigurationTestUtil.TEST_SSID + "\"";
         config.wepTxKeyIndex = 0;
         config.hiddenSSID = false;
         config.requirePmf = false;
@@ -954,9 +997,43 @@
                 mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
         WifiConfigurationTestUtil.assertConfigurationsEqualForBackup(
                 configurations, retrievedConfigurations);
+    }
 
-        // No valid data to check in dump.
-        mCheckDump = false;
+    /**
+     * Verify that restoring of configuration from a 1.1 version backup data.
+     */
+    @Test
+    public void testRestoreFromV1_1BackupData() {
+        List<WifiConfiguration> configurations = new ArrayList<>();
+        configurations.add(createNetworkForConfigurationWithV1_1Data());
+
+        byte[] backupData = WIFI_BACKUP_DATA_V1_1.getBytes();
+        List<WifiConfiguration> retrievedConfigurations =
+                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
+        WifiConfigurationTestUtil.assertConfigurationsEqualForBackup(
+                configurations, retrievedConfigurations);
+    }
+
+    /**
+     * Verify that restoring of configuration from a 1.2 version backup data.
+     */
+    @Test
+    public void testRestoreFromV1_2BackupData() {
+        List<WifiConfiguration> configurations = new ArrayList<>();
+        configurations.add(createNetworkForConfigurationWithV1_1Data());
+
+        byte[] backupData = WIFI_BACKUP_DATA_V1_2.getBytes();
+        List<WifiConfiguration> retrievedConfigurations =
+                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
+        WifiConfigurationTestUtil.assertConfigurationsEqualForBackup(
+                configurations, retrievedConfigurations);
+
+        // Also, assert in the reverse direction to ensure the serialization logic matches.
+        // Note: This will stop working when we bump up the version. Then we'll need to copy
+        // the below assert to the test for the latest version.
+        assertEquals(WIFI_BACKUP_DATA_V1_2,
+                new String(mWifiBackupRestore.retrieveBackupDataFromConfigurations(
+                        retrievedConfigurations)));
     }
 
     /**
@@ -965,7 +1042,7 @@
      */
     private static WifiConfiguration createNetworkForConfigurationWithV1_0Data() {
         final WifiConfiguration config = new WifiConfiguration();
-        config.SSID = "\"GoogleGuest-Legacy\"";
+        config.SSID = "\"" + WifiConfigurationTestUtil.TEST_SSID + "\"";
         config.wepTxKeyIndex = 0;
         config.hiddenSSID = false;
         config.requirePmf = false;
@@ -990,34 +1067,24 @@
     }
 
     /**
-     * Verify that restoring of configuration from a 1.1 version backup data.
-     */
-    @Test
-    public void testRestoreFromV1_1BackupData() {
-        List<WifiConfiguration> configurations = new ArrayList<>();
-        configurations.add(createNetworkForConfigurationWithV1_1Data());
-
-        byte[] backupData = WIFI_BACKUP_DATA_V1_1.getBytes();
-        List<WifiConfiguration> retrievedConfigurations =
-                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
-        WifiConfigurationTestUtil.assertConfigurationsEqualForBackup(
-                configurations, retrievedConfigurations);
-
-        // No valid data to check in dump.
-        mCheckDump = false;
-    }
-
-    /**
      * Creates correct WiFiConfiguration that should be parsed out of
      * {@link #WIFI_BACKUP_DATA_V1_1} configuration which contains 1.1 version backup.
      */
     private static WifiConfiguration createNetworkForConfigurationWithV1_1Data() {
         final WifiConfiguration config = createNetworkForConfigurationWithV1_0Data();
         config.meteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
-
         return config;
     }
 
+    /**
+     * Creates correct WiFiConfiguration that should be parsed out of
+     * {@link #WIFI_BACKUP_DATA_V1_1} configuration which contains 1.2 version backup.
+     */
+    private static WifiConfiguration createNetworkForConfigurationWithV1_2Data() {
+        final WifiConfiguration config = createNetworkForConfigurationWithV1_1Data();
+        config.allowAutojoin = false;
+        return config;
+    }
 
     /**
      * Helper method to write a list of networks in wpa_supplicant.conf format to the output stream.
diff --git a/tests/wifitests/src/com/android/server/wifi/util/TelephonyUtilTest.java b/tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java
similarity index 65%
rename from tests/wifitests/src/com/android/server/wifi/util/TelephonyUtilTest.java
rename to tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java
index a07dafb..1053d73 100644
--- a/tests/wifitests/src/com/android/server/wifi/util/TelephonyUtilTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiCarrierInfoManagerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2020 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.
@@ -14,18 +14,27 @@
  * limitations under the License.
  */
 
-package com.android.server.wifi.util;
+package com.android.server.wifi;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
+import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION;
+import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION;
+import static com.android.server.wifi.WifiCarrierInfoManager.NOTIFICATION_USER_DISMISSED_INTENT_ACTION;
 
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
+import android.app.AlertDialog;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.net.Uri;
 import android.net.wifi.WifiConfiguration;
@@ -42,20 +51,21 @@
 import android.telephony.TelephonyManager;
 import android.util.Base64;
 import android.util.Pair;
+import android.view.Window;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
-import com.android.server.wifi.FrameworkFacade;
-import com.android.server.wifi.WifiBaseTest;
-import com.android.server.wifi.WifiConfigurationTestUtil;
-import com.android.server.wifi.util.TelephonyUtil.SimAuthRequestData;
-import com.android.server.wifi.util.TelephonyUtil.SimAuthResponseData;
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.server.wifi.WifiCarrierInfoManager.SimAuthRequestData;
+import com.android.server.wifi.WifiCarrierInfoManager.SimAuthResponseData;
+import com.android.wifi.resources.R;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.mockito.MockitoSession;
@@ -71,11 +81,11 @@
 import javax.crypto.Cipher;
 
 /**
- * Unit tests for {@link com.android.server.wifi.util.TelephonyUtil}.
+ * Unit tests for {@link WifiCarrierInfoManager}.
  */
 @SmallTest
-public class TelephonyUtilTest extends WifiBaseTest {
-    private TelephonyUtil mTelephonyUtil;
+public class WifiCarrierInfoManagerTest extends WifiBaseTest {
+    private WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     private static final int DATA_SUBID = 1;
     private static final int NON_DATA_SUBID = 2;
@@ -97,29 +107,34 @@
     private static final String ANONYMOUS_IDENTITY = "anonymous@wlan.mnc456.mcc123.3gppnetwork.org";
     private static final String CARRIER_NAME = "Google";
 
-    @Mock
-    CarrierConfigManager mCarrierConfigManager;
-    @Mock
-    Context mContext;
-    @Mock
-    FrameworkFacade mFrameworkFacade;
-    @Mock
-    TelephonyManager mTelephonyManager;
-    @Mock
-    TelephonyManager mDataTelephonyManager;
-    @Mock
-    TelephonyManager mNonDataTelephonyManager;
-    @Mock
-    SubscriptionManager mSubscriptionManager;
-    @Mock
-    SubscriptionInfo mDataSubscriptionInfo;
-    @Mock
-    SubscriptionInfo mNonDataSubscriptionInfo;
+    @Mock CarrierConfigManager mCarrierConfigManager;
+    @Mock WifiContext mContext;
+    @Mock Resources mResources;
+    @Mock FrameworkFacade mFrameworkFacade;
+    @Mock TelephonyManager mTelephonyManager;
+    @Mock TelephonyManager mDataTelephonyManager;
+    @Mock TelephonyManager mNonDataTelephonyManager;
+    @Mock SubscriptionManager mSubscriptionManager;
+    @Mock SubscriptionInfo mDataSubscriptionInfo;
+    @Mock SubscriptionInfo mNonDataSubscriptionInfo;
+    @Mock WifiConfigStore mWifiConfigStore;
+    @Mock WifiInjector mWifiInjector;
+    @Mock WifiConfigManager mWifiConfigManager;
+    @Mock ImsiPrivacyProtectionExemptionStoreData mImsiPrivacyProtectionExemptionStoreData;
+    @Mock NotificationManager mNotificationManger;
+    @Mock Notification.Builder mNotificationBuilder;
+    @Mock Notification mNotification;
+    @Mock AlertDialog.Builder mAlertDialogBuilder;
+    @Mock AlertDialog mAlertDialog;
+    @Mock WifiCarrierInfoManager.OnUserApproveCarrierListener mListener;
 
     private List<SubscriptionInfo> mSubInfoList;
 
     MockitoSession mMockingSession = null;
     TestLooper mLooper;
+    private ImsiPrivacyProtectionExemptionStoreData.DataSource mImsiDataSource;
+    private ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor =
+            ArgumentCaptor.forClass(BroadcastReceiver.class);
 
     @Before
     public void setUp() throws Exception {
@@ -127,8 +142,48 @@
         mLooper = new TestLooper();
         when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
                 .thenReturn(mCarrierConfigManager);
-        mTelephonyUtil = new TelephonyUtil(mTelephonyManager, mSubscriptionManager,
-                mFrameworkFacade, mContext, new Handler(mLooper.getLooper()));
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mContext.getSystemService(Context.NOTIFICATION_SERVICE))
+                .thenReturn(mNotificationManger);
+        when(mContext.getWifiOverlayApkPkgName()).thenReturn("test.com.android.wifi.resources");
+        when(mFrameworkFacade.makeAlertDialogBuilder(any()))
+                .thenReturn(mAlertDialogBuilder);
+        when(mFrameworkFacade.makeNotificationBuilder(any(), anyString()))
+                .thenReturn(mNotificationBuilder);
+        when(mFrameworkFacade.getBroadcast(any(), anyInt(), any(), anyInt()))
+                .thenReturn(mock(PendingIntent.class));
+        when(mAlertDialogBuilder.setTitle(any())).thenReturn(mAlertDialogBuilder);
+        when(mAlertDialogBuilder.setMessage(any())).thenReturn(mAlertDialogBuilder);
+        when(mAlertDialogBuilder.setPositiveButton(any(), any())).thenReturn(mAlertDialogBuilder);
+        when(mAlertDialogBuilder.setNegativeButton(any(), any())).thenReturn(mAlertDialogBuilder);
+        when(mAlertDialogBuilder.setOnDismissListener(any())).thenReturn(mAlertDialogBuilder);
+        when(mAlertDialogBuilder.setOnCancelListener(any())).thenReturn(mAlertDialogBuilder);
+        when(mAlertDialogBuilder.create()).thenReturn(mAlertDialog);
+        when(mAlertDialog.getWindow()).thenReturn(mock(Window.class));
+        when(mNotificationBuilder.setSmallIcon(any())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setTicker(any())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setContentTitle(any())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setStyle(any())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setDeleteIntent(any())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setShowWhen(anyBoolean())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setLocalOnly(anyBoolean())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.setColor(anyInt())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.addAction(any())).thenReturn(mNotificationBuilder);
+        when(mNotificationBuilder.build()).thenReturn(mNotification);
+        when(mWifiInjector.makeImsiProtectionExemptionStoreData(any()))
+                .thenReturn(mImsiPrivacyProtectionExemptionStoreData);
+        when(mWifiInjector.getWifiConfigManager()).thenReturn(mWifiConfigManager);
+        mWifiCarrierInfoManager = new WifiCarrierInfoManager(mTelephonyManager,
+                mSubscriptionManager, mWifiInjector, mFrameworkFacade, mContext, mWifiConfigStore,
+                new Handler(mLooper.getLooper()));
+        ArgumentCaptor<ImsiPrivacyProtectionExemptionStoreData.DataSource>
+                imsiDataSourceArgumentCaptor =
+                ArgumentCaptor.forClass(ImsiPrivacyProtectionExemptionStoreData.DataSource.class);
+        verify(mContext).registerReceiver(mBroadcastReceiverCaptor.capture(), any(), any(), any());
+        verify(mWifiInjector).makeImsiProtectionExemptionStoreData(imsiDataSourceArgumentCaptor
+                .capture());
+        mImsiDataSource = imsiDataSourceArgumentCaptor.getValue();
+        assertNotNull(mImsiDataSource);
         mSubInfoList = new ArrayList<>();
         mSubInfoList.add(mDataSubscriptionInfo);
         mSubInfoList.add(mNonDataSubscriptionInfo);
@@ -163,6 +218,31 @@
         when(mNonDataTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_READY);
         when(mSubscriptionManager.getActiveSubscriptionIdList())
                 .thenReturn(new int[]{DATA_SUBID, NON_DATA_SUBID});
+
+        // setup resource strings for IMSI protection notification.
+        when(mResources.getString(eq(R.string.wifi_suggestion_imsi_privacy_title), anyString()))
+                .thenAnswer(s -> "blah" + s.getArguments()[1]);
+        when(mResources.getString(eq(R.string.wifi_suggestion_imsi_privacy_content)))
+                .thenReturn("blah");
+        when(mResources.getText(
+                eq(R.string.wifi_suggestion_action_allow_imsi_privacy_exemption_carrier)))
+                .thenReturn("blah");
+        when(mResources.getText(
+                eq(R.string.wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier)))
+                .thenReturn("blah");
+        when(mResources.getString(
+                eq(R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_title)))
+                .thenReturn("blah");
+        when(mResources.getString(
+                eq(R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_content),
+                anyString())).thenAnswer(s -> "blah" + s.getArguments()[1]);
+        when(mResources.getText(
+                eq(R.string.wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation)))
+                .thenReturn("blah");
+        when(mResources.getText(
+                eq(R.string.wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation)))
+                .thenReturn("blah");
+        mWifiCarrierInfoManager.addImsiExemptionUserApprovalListener(mListener);
     }
 
     @After
@@ -222,8 +302,8 @@
         receiver.getValue().onReceive(mContext,
                 new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
 
-        assertTrue(mTelephonyUtil.requiresImsiEncryption(DATA_SUBID));
-        assertFalse(mTelephonyUtil.requiresImsiEncryption(NON_DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(NON_DATA_SUBID));
     }
 
     /**
@@ -242,8 +322,8 @@
         receiver.getValue().onReceive(mContext,
                 new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
 
-        assertTrue(mTelephonyUtil.requiresImsiEncryption(DATA_SUBID));
-        assertTrue(mTelephonyUtil.requiresImsiEncryption(NON_DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.requiresImsiEncryption(NON_DATA_SUBID));
 
         when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
                 .thenReturn(generateTestCarrierConfig(false));
@@ -252,8 +332,8 @@
         receiver.getValue().onReceive(mContext,
                 new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
 
-        assertFalse(mTelephonyUtil.requiresImsiEncryption(DATA_SUBID));
-        assertFalse(mTelephonyUtil.requiresImsiEncryption(NON_DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(NON_DATA_SUBID));
     }
 
     /**
@@ -278,16 +358,16 @@
 
         observer.onChange(false);
 
-        assertTrue(mTelephonyUtil.requiresImsiEncryption(DATA_SUBID));
-        assertFalse(mTelephonyUtil.isImsiEncryptionInfoAvailable(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(DATA_SUBID));
 
         when(mDataTelephonyManager.getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN))
                 .thenReturn(mock(ImsiEncryptionInfo.class));
 
         observer.onChange(false);
 
-        assertTrue(mTelephonyUtil.requiresImsiEncryption(DATA_SUBID));
-        assertTrue(mTelephonyUtil.isImsiEncryptionInfoAvailable(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(DATA_SUBID));
     }
 
     /**
@@ -313,8 +393,8 @@
 
         observer.onChange(false);
 
-        assertTrue(mTelephonyUtil.isImsiEncryptionInfoAvailable(DATA_SUBID));
-        assertTrue(mTelephonyUtil.isImsiEncryptionInfoAvailable(NON_DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(NON_DATA_SUBID));
 
         when(mDataTelephonyManager.getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN))
                 .thenReturn(null);
@@ -323,8 +403,8 @@
 
         observer.onChange(false);
 
-        assertFalse(mTelephonyUtil.isImsiEncryptionInfoAvailable(DATA_SUBID));
-        assertFalse(mTelephonyUtil.isImsiEncryptionInfoAvailable(NON_DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(NON_DATA_SUBID));
     }
 
     @Test
@@ -341,14 +421,14 @@
                         WifiEnterpriseConfig.Phase2.NONE);
         simConfig.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(simConfig));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(simConfig));
 
         WifiConfiguration peapSimConfig =
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.PEAP,
                         WifiEnterpriseConfig.Phase2.SIM);
         peapSimConfig.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(peapSimConfig));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(peapSimConfig));
     }
 
     @Test
@@ -365,14 +445,14 @@
                         WifiEnterpriseConfig.Phase2.NONE);
         akaConfig.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(akaConfig));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(akaConfig));
 
         WifiConfiguration peapAkaConfig =
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.PEAP,
                         WifiEnterpriseConfig.Phase2.AKA);
         peapAkaConfig.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(peapAkaConfig));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(peapAkaConfig));
     }
 
     @Test
@@ -389,14 +469,14 @@
                         WifiEnterpriseConfig.Phase2.NONE);
         akaPConfig.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(akaPConfig));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(akaPConfig));
 
         WifiConfiguration peapAkaPConfig =
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.PEAP,
                         WifiEnterpriseConfig.Phase2.AKA_PRIME);
         peapAkaPConfig.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(peapAkaPConfig));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(peapAkaPConfig));
     }
 
     /**
@@ -434,7 +514,7 @@
                             WifiEnterpriseConfig.Phase2.NONE);
             config.carrierId = DATA_CARRIER_ID;
 
-            assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(config));
+            assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(config));
         } finally {
             session.finishMocking();
         }
@@ -470,7 +550,7 @@
                             WifiEnterpriseConfig.Phase2.NONE);
             config.carrierId = DATA_CARRIER_ID;
 
-            assertNull(mTelephonyUtil.getSimIdentity(config));
+            assertNull(mWifiCarrierInfoManager.getSimIdentity(config));
         } finally {
             session.finishMocking();
         }
@@ -490,7 +570,7 @@
                         WifiEnterpriseConfig.Phase2.NONE);
         config.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(config));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(config));
     }
 
     @Test
@@ -507,7 +587,7 @@
                         WifiEnterpriseConfig.Phase2.NONE);
         config.carrierId = DATA_CARRIER_ID;
 
-        assertEquals(expectedIdentity, mTelephonyUtil.getSimIdentity(config));
+        assertEquals(expectedIdentity, mWifiCarrierInfoManager.getSimIdentity(config));
     }
 
     @Test
@@ -517,16 +597,16 @@
         when(mDataTelephonyManager.getSimOperator()).thenReturn("32156");
 
         assertEquals(null,
-                mTelephonyUtil.getSimIdentity(WifiConfigurationTestUtil.createEapNetwork(
+                mWifiCarrierInfoManager.getSimIdentity(WifiConfigurationTestUtil.createEapNetwork(
                         WifiEnterpriseConfig.Eap.TTLS, WifiEnterpriseConfig.Phase2.SIM)));
         assertEquals(null,
-                mTelephonyUtil.getSimIdentity(WifiConfigurationTestUtil.createEapNetwork(
+                mWifiCarrierInfoManager.getSimIdentity(WifiConfigurationTestUtil.createEapNetwork(
                         WifiEnterpriseConfig.Eap.PEAP, WifiEnterpriseConfig.Phase2.MSCHAPV2)));
         assertEquals(null,
-                mTelephonyUtil.getSimIdentity(WifiConfigurationTestUtil.createEapNetwork(
+                mWifiCarrierInfoManager.getSimIdentity(WifiConfigurationTestUtil.createEapNetwork(
                         WifiEnterpriseConfig.Eap.TLS, WifiEnterpriseConfig.Phase2.NONE)));
         assertEquals(null,
-                mTelephonyUtil.getSimIdentity(new WifiConfiguration()));
+                mWifiCarrierInfoManager.getSimIdentity(new WifiConfiguration()));
     }
 
     /**
@@ -588,7 +668,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals("", mTelephonyUtil.getGsmSimAuthResponse(invalidRequests, config));
+        assertEquals("", mWifiCarrierInfoManager.getGsmSimAuthResponse(invalidRequests, config));
     }
 
     @Test
@@ -599,7 +679,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals(null, mTelephonyUtil.getGsmSimAuthResponse(failedRequests, config));
+        assertEquals(null, mWifiCarrierInfoManager.getGsmSimAuthResponse(failedRequests, config));
     }
 
     @Test
@@ -617,7 +697,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals(":3b4a:1d2c:1234:1111", mTelephonyUtil.getGsmSimAuthResponse(
+        assertEquals(":3b4a:1d2c:1234:1111", mWifiCarrierInfoManager.getGsmSimAuthResponse(
                         new String[] { "1B2B", "0122" }, config));
     }
 
@@ -628,7 +708,7 @@
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
         assertEquals("",
-                mTelephonyUtil.getGsmSimpleSimAuthResponse(invalidRequests, config));
+                mWifiCarrierInfoManager.getGsmSimpleSimAuthResponse(invalidRequests, config));
     }
 
     @Test
@@ -640,7 +720,7 @@
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
         assertEquals(null,
-                mTelephonyUtil.getGsmSimpleSimAuthResponse(failedRequests, config));
+                mWifiCarrierInfoManager.getGsmSimpleSimAuthResponse(failedRequests, config));
     }
 
     @Test
@@ -658,7 +738,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals(":3b4a:1d2c:1100:3322", mTelephonyUtil.getGsmSimpleSimAuthResponse(
+        assertEquals(":3b4a:1d2c:1100:3322", mWifiCarrierInfoManager.getGsmSimpleSimAuthResponse(
                         new String[] { "1A2B", "0123" }, config));
     }
 
@@ -668,8 +748,8 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals("", mTelephonyUtil.getGsmSimpleSimNoLengthAuthResponse(invalidRequests,
-                config));
+        assertEquals("", mWifiCarrierInfoManager.getGsmSimpleSimNoLengthAuthResponse(
+                invalidRequests, config));
     }
 
     @Test
@@ -680,8 +760,8 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals(null, mTelephonyUtil.getGsmSimpleSimNoLengthAuthResponse(failedRequests,
-                config));
+        assertEquals(null, mWifiCarrierInfoManager.getGsmSimpleSimNoLengthAuthResponse(
+                failedRequests, config));
     }
 
     @Test
@@ -700,7 +780,7 @@
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
 
         assertEquals(":1a2b3c4d5e6f7a1a:1a2b3c4d:1234567812345678:12345678",
-                mTelephonyUtil.getGsmSimpleSimNoLengthAuthResponse(
+                mWifiCarrierInfoManager.getGsmSimpleSimNoLengthAuthResponse(
                         new String[] { "1A2B", "0123" }, config));
     }
 
@@ -743,9 +823,9 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals(null, mTelephonyUtil.get3GAuthResponse(
+        assertEquals(null, mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"0123"}), config));
-        assertEquals(null, mTelephonyUtil.get3GAuthResponse(
+        assertEquals(null, mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"xyz2", "1234"}),
                 config));
         verifyNoMoreInteractions(mDataTelephonyManager);
@@ -757,7 +837,7 @@
                         TelephonyManager.AUTHTYPE_EAP_AKA, "AgEjAkVn")).thenReturn(null);
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
-        SimAuthResponseData response = mTelephonyUtil.get3GAuthResponse(
+        SimAuthResponseData response = mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"0123", "4567"}),
                 config);
 
@@ -771,7 +851,7 @@
                 .thenReturn(Base64.encodeToString(new byte[] {(byte) 0xdc}, Base64.NO_WRAP));
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
-        SimAuthResponseData response = mTelephonyUtil.get3GAuthResponse(
+        SimAuthResponseData response = mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"0123", "4567"}),
                 config);
 
@@ -786,7 +866,7 @@
                                 Base64.NO_WRAP));
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
-        SimAuthResponseData response = mTelephonyUtil.get3GAuthResponse(
+        SimAuthResponseData response = mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"0123", "4567"}),
                 config);
 
@@ -801,7 +881,7 @@
                                 new byte[] {0x21, 0x22, 0x23}, new byte[] {0x31}));
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
-        SimAuthResponseData response = mTelephonyUtil.get3GAuthResponse(
+        SimAuthResponseData response = mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"0123", "4567"}),
                 config);
 
@@ -817,7 +897,7 @@
                 .thenReturn(create3GSimAuthUmtsAutsResponse(new byte[] {0x22, 0x33}));
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
-        SimAuthResponseData response = mTelephonyUtil.get3GAuthResponse(
+        SimAuthResponseData response = mWifiCarrierInfoManager.get3GAuthResponse(
                 new SimAuthRequestData(0, 0, "SSID", new String[]{"0123", "4567"}),
                 config);
         assertNotNull(response);
@@ -838,7 +918,7 @@
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
 
         assertEquals(expectedIdentity,
-                mTelephonyUtil.getAnonymousIdentityWith3GppRealm(config));
+                mWifiCarrierInfoManager.getAnonymousIdentityWith3GppRealm(config));
     }
 
     /**
@@ -850,7 +930,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertNull(mTelephonyUtil.getAnonymousIdentityWith3GppRealm(config));
+        assertNull(mWifiCarrierInfoManager.getAnonymousIdentityWith3GppRealm(config));
     }
 
     /**
@@ -864,7 +944,7 @@
         when(subInfo2.getSubscriptionId()).thenReturn(NON_DATA_SUBID);
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Arrays.asList(subInfo1, subInfo2));
-        assertTrue(mTelephonyUtil.isSimPresent(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.isSimPresent(DATA_SUBID));
     }
 
     /**
@@ -875,13 +955,13 @@
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Collections.emptyList());
 
-        assertFalse(mTelephonyUtil.isSimPresent(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.isSimPresent(DATA_SUBID));
 
         SubscriptionInfo subInfo = mock(SubscriptionInfo.class);
         when(subInfo.getSubscriptionId()).thenReturn(NON_DATA_SUBID);
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Arrays.asList(subInfo));
-        assertFalse(mTelephonyUtil.isSimPresent(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.isSimPresent(DATA_SUBID));
     }
 
     /**
@@ -897,7 +977,7 @@
                 .thenReturn(Arrays.asList(subInfo1, subInfo2));
         when(mTelephonyManager.getSimState(anyInt()))
                 .thenReturn(TelephonyManager.SIM_STATE_NETWORK_LOCKED);
-        assertFalse(mTelephonyUtil.isSimPresent(DATA_SUBID));
+        assertFalse(mWifiCarrierInfoManager.isSimPresent(DATA_SUBID));
     }
 
     /**
@@ -910,12 +990,12 @@
         when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
         when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[0]);
 
-        assertEquals(INVALID_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(INVALID_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
 
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Collections.emptyList());
 
-        assertEquals(INVALID_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(INVALID_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
     }
 
     /**
@@ -926,7 +1006,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
 
-        assertEquals(DATA_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(DATA_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
     }
 
     /**
@@ -937,7 +1017,7 @@
     public void getBestMatchSubscriptionIdForEnterpriseWithoutCarrierIdFieldForNonSimConfig() {
         WifiConfiguration config = new WifiConfiguration();
 
-        assertEquals(INVALID_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(INVALID_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
     }
 
     /**
@@ -950,10 +1030,10 @@
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
         config.carrierId = NON_DATA_CARRIER_ID;
 
-        assertEquals(NON_DATA_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(NON_DATA_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
 
         config.carrierId = DATA_CARRIER_ID;
-        assertEquals(DATA_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(DATA_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
     }
 
     /**
@@ -967,7 +1047,7 @@
         WifiConfiguration spyConfig = spy(config);
         doReturn(true).when(spyConfig).isPasspoint();
 
-        assertEquals(DATA_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(spyConfig));
+        assertEquals(DATA_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(spyConfig));
     }
 
     /**
@@ -980,7 +1060,7 @@
         WifiConfiguration spyConfig = spy(config);
         doReturn(true).when(spyConfig).isPasspoint();
 
-        assertEquals(INVALID_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(spyConfig));
+        assertEquals(INVALID_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(spyConfig));
     }
 
     /**
@@ -993,7 +1073,7 @@
                 WifiEnterpriseConfig.Eap.AKA, WifiEnterpriseConfig.Phase2.NONE);
         config.carrierId = DEACTIVE_CARRIER_ID;
 
-        assertEquals(INVALID_SUBID, mTelephonyUtil.getBestMatchSubscriptionId(config));
+        assertEquals(INVALID_SUBID, mWifiCarrierInfoManager.getBestMatchSubscriptionId(config));
     }
 
     /**
@@ -1004,7 +1084,7 @@
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Collections.emptyList());
 
-        assertNull(mTelephonyUtil.getMatchingImsi(DEACTIVE_CARRIER_ID));
+        assertNull(mWifiCarrierInfoManager.getMatchingImsi(DEACTIVE_CARRIER_ID));
     }
 
     /**
@@ -1013,7 +1093,7 @@
      */
     @Test
     public void getMatchingImsiCarrierIdWithValidCarrierIdForImsiEncryptionCheck() {
-        TelephonyUtil spyTu = spy(mTelephonyUtil);
+        WifiCarrierInfoManager spyTu = spy(mWifiCarrierInfoManager);
         doReturn(true).when(spyTu).requiresImsiEncryption(DATA_SUBID);
         doReturn(false).when(spyTu).isImsiEncryptionInfoAvailable(DATA_SUBID);
 
@@ -1027,7 +1107,7 @@
     @Test
     public void getMatchingImsiCarrierIdWithValidCarrierId() {
         assertEquals(DATA_FULL_IMSI,
-                mTelephonyUtil.getMatchingImsi(DATA_CARRIER_ID));
+                mWifiCarrierInfoManager.getMatchingImsi(DATA_CARRIER_ID));
     }
 
     /**
@@ -1037,12 +1117,12 @@
     public void getMatchingImsiCarrierIdWithEmptyActiveSubscriptionInfoList() {
         when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
 
-        assertNull(mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+        assertNull(mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
 
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Collections.emptyList());
 
-        assertNull(mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+        assertNull(mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
     }
 
     /**
@@ -1057,7 +1137,7 @@
         when(mNonDataTelephonyManager.getCarrierIdFromSimMccMnc()).thenReturn(NON_DATA_CARRIER_ID);
         when(mNonDataTelephonyManager.getSimCarrierId()).thenReturn(NON_DATA_CARRIER_ID);
 
-        assertNull(mTelephonyUtil.getMatchingImsiCarrierId(NO_MATCH_PREFIX_IMSI));
+        assertNull(mWifiCarrierInfoManager.getMatchingImsiCarrierId(NO_MATCH_PREFIX_IMSI));
     }
 
     /**
@@ -1073,7 +1153,8 @@
         when(mNonDataTelephonyManager.getCarrierIdFromSimMccMnc()).thenReturn(NON_DATA_CARRIER_ID);
         when(mNonDataTelephonyManager.getSimCarrierId()).thenReturn(NON_DATA_CARRIER_ID);
 
-        Pair<String, Integer> ic = mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI);
+        Pair<String, Integer> ic = mWifiCarrierInfoManager
+                .getMatchingImsiCarrierId(MATCH_PREFIX_IMSI);
 
         assertEquals(new Pair<>(DATA_FULL_IMSI, DATA_CARRIER_ID), ic);
 
@@ -1083,7 +1164,7 @@
         when(mNonDataTelephonyManager.getSimCarrierId()).thenReturn(NON_DATA_CARRIER_ID);
 
         assertEquals(new Pair<>(DATA_FULL_IMSI, DATA_CARRIER_ID),
-                mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+                mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
 
         // non data SIM doesn't match.
         when(mNonDataTelephonyManager.getCarrierIdFromSimMccMnc()).thenReturn(NON_DATA_CARRIER_ID);
@@ -1093,7 +1174,7 @@
                 .thenReturn(NO_MATCH_OPERATOR_NUMERIC);
 
         assertEquals(new Pair<>(DATA_FULL_IMSI, DATA_CARRIER_ID),
-                mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+                mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
     }
 
     /**
@@ -1110,7 +1191,8 @@
                 .thenReturn(PARENT_NON_DATA_CARRIER_ID);
         when(mNonDataTelephonyManager.getSimCarrierId()).thenReturn(NON_DATA_CARRIER_ID);
 
-        Pair<String, Integer> ic = mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI);
+        Pair<String, Integer> ic = mWifiCarrierInfoManager
+                .getMatchingImsiCarrierId(MATCH_PREFIX_IMSI);
 
         assertEquals(new Pair<>(DATA_FULL_IMSI, DATA_CARRIER_ID), ic);
 
@@ -1122,7 +1204,7 @@
                 .thenReturn(NO_MATCH_OPERATOR_NUMERIC);
 
         assertEquals(new Pair<>(DATA_FULL_IMSI, DATA_CARRIER_ID),
-                mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+                mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
     }
 
     /**
@@ -1139,7 +1221,8 @@
         when(mNonDataTelephonyManager.getSimCarrierId()).thenReturn(NON_DATA_CARRIER_ID);
 
 
-        Pair<String, Integer> ic = mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI);
+        Pair<String, Integer> ic = mWifiCarrierInfoManager
+                .getMatchingImsiCarrierId(MATCH_PREFIX_IMSI);
 
         assertEquals(new Pair<>(NON_DATA_FULL_IMSI, NON_DATA_CARRIER_ID), ic);
 
@@ -1150,7 +1233,7 @@
         when(mDataTelephonyManager.getSimOperator()).thenReturn(NO_MATCH_OPERATOR_NUMERIC);
 
         assertEquals(new Pair<>(NON_DATA_FULL_IMSI, NON_DATA_CARRIER_ID),
-                mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+                mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
     }
 
     /**
@@ -1169,7 +1252,7 @@
         when(mNonDataTelephonyManager.getSimCarrierId()).thenReturn(NON_DATA_CARRIER_ID);
 
         assertEquals(new Pair<>(NON_DATA_FULL_IMSI, NON_DATA_CARRIER_ID),
-                mTelephonyUtil.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
+                mWifiCarrierInfoManager.getMatchingImsiCarrierId(MATCH_PREFIX_IMSI));
     }
 
     /**
@@ -1187,7 +1270,7 @@
         when(mNonDataTelephonyManager.getSubscriberId()).thenReturn(NO_MATCH_FULL_IMSI);
         when(mNonDataTelephonyManager.getSimOperator())
                 .thenReturn(NO_MATCH_OPERATOR_NUMERIC);
-        TelephonyUtil spyTu = spy(mTelephonyUtil);
+        WifiCarrierInfoManager spyTu = spy(mWifiCarrierInfoManager);
         doReturn(true).when(spyTu).requiresImsiEncryption(eq(DATA_SUBID));
         doReturn(false).when(spyTu).isImsiEncryptionInfoAvailable(eq(DATA_SUBID));
 
@@ -1203,12 +1286,12 @@
         when(config.getCarrierId()).thenReturn(DATA_CARRIER_ID);
         when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
 
-        assertFalse(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(config));
+        assertFalse(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(config));
 
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Collections.emptyList());
 
-        assertFalse(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(config));
+        assertFalse(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(config));
     }
 
     /**
@@ -1219,7 +1302,7 @@
         PasspointConfiguration config = mock(PasspointConfiguration.class);
         when(config.getCarrierId()).thenReturn(DATA_CARRIER_ID);
 
-        assertFalse(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(config));
+        assertFalse(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(config));
     }
 
     /**
@@ -1232,7 +1315,7 @@
         doReturn(credential).when(spyConfig).getCredential();
         when(credential.getSimCredential()).thenReturn(null);
 
-        assertFalse(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(spyConfig));
+        assertFalse(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(spyConfig));
     }
 
     /**
@@ -1248,7 +1331,7 @@
         when(credential.getSimCredential()).thenReturn(simCredential);
         when(simCredential.getImsi()).thenReturn(MATCH_PREFIX_IMSI);
 
-        assertFalse(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(spyConfig));
+        assertFalse(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(spyConfig));
     }
 
     /**
@@ -1264,7 +1347,7 @@
         when(credential.getSimCredential()).thenReturn(simCredential);
         when(simCredential.getImsi()).thenReturn(DATA_FULL_IMSI);
 
-        assertTrue(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(spyConfig));
+        assertTrue(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(spyConfig));
         assertEquals(DATA_CARRIER_ID, spyConfig.getCarrierId());
     }
 
@@ -1280,7 +1363,7 @@
         when(credential.getSimCredential()).thenReturn(simCredential);
         when(simCredential.getImsi()).thenReturn(NO_MATCH_PREFIX_IMSI);
 
-        assertFalse(mTelephonyUtil.tryUpdateCarrierIdForPasspoint(spyConfig));
+        assertFalse(mWifiCarrierInfoManager.tryUpdateCarrierIdForPasspoint(spyConfig));
     }
 
     private void testIdentityWithSimAndEapAkaMethodPrefix(int method, String methodStr)
@@ -1296,7 +1379,7 @@
         receiver.getValue().onReceive(mContext,
                 new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
 
-        assertTrue(mTelephonyUtil.requiresImsiEncryption(DATA_SUBID));
+        assertTrue(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
 
         String mccmnc = "123456";
         String expectedIdentity = methodStr + ANONYMOUS_IDENTITY;
@@ -1306,7 +1389,7 @@
                 method, WifiEnterpriseConfig.Phase2.NONE);
 
         assertEquals(expectedIdentity,
-                mTelephonyUtil.getAnonymousIdentityWith3GppRealm(config));
+                mWifiCarrierInfoManager.getAnonymousIdentityWith3GppRealm(config));
     }
 
     /**
@@ -1339,11 +1422,11 @@
      */
     @Test
     public void testIsAnonymousAtRealmIdentity() throws Exception {
-        assertTrue(mTelephonyUtil.isAnonymousAtRealmIdentity(ANONYMOUS_IDENTITY));
-        assertTrue(mTelephonyUtil.isAnonymousAtRealmIdentity("0" + ANONYMOUS_IDENTITY));
-        assertTrue(mTelephonyUtil.isAnonymousAtRealmIdentity("1" + ANONYMOUS_IDENTITY));
-        assertTrue(mTelephonyUtil.isAnonymousAtRealmIdentity("6" + ANONYMOUS_IDENTITY));
-        assertFalse(mTelephonyUtil.isAnonymousAtRealmIdentity("AKA" + ANONYMOUS_IDENTITY));
+        assertTrue(mWifiCarrierInfoManager.isAnonymousAtRealmIdentity(ANONYMOUS_IDENTITY));
+        assertTrue(mWifiCarrierInfoManager.isAnonymousAtRealmIdentity("0" + ANONYMOUS_IDENTITY));
+        assertTrue(mWifiCarrierInfoManager.isAnonymousAtRealmIdentity("1" + ANONYMOUS_IDENTITY));
+        assertTrue(mWifiCarrierInfoManager.isAnonymousAtRealmIdentity("6" + ANONYMOUS_IDENTITY));
+        assertFalse(mWifiCarrierInfoManager.isAnonymousAtRealmIdentity("AKA" + ANONYMOUS_IDENTITY));
     }
 
     /**
@@ -1354,12 +1437,12 @@
     public void getCarrierPrivilegeWithNoActiveSubscription() {
         when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
         assertEquals(TelephonyManager.UNKNOWN_CARRIER_ID,
-                mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
+                mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
 
         when(mSubscriptionManager.getActiveSubscriptionInfoList())
                 .thenReturn(Collections.emptyList());
         assertEquals(TelephonyManager.UNKNOWN_CARRIER_ID,
-                mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
+                mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
     }
 
     /**
@@ -1375,7 +1458,7 @@
         when(mDataTelephonyManager.checkCarrierPrivilegesForPackage(TEST_PACKAGE))
                 .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
         assertEquals(TelephonyManager.UNKNOWN_CARRIER_ID,
-                mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
+                mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
     }
 
     /**
@@ -1392,7 +1475,7 @@
         when(mDataTelephonyManager.checkCarrierPrivilegesForPackage(TEST_PACKAGE))
                 .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
         assertEquals(DATA_CARRIER_ID,
-                mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
+                mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE));
     }
 
     /**
@@ -1400,17 +1483,256 @@
      */
     @Test
     public void getCarrierNameFromSubId() {
-        assertEquals(CARRIER_NAME, mTelephonyUtil.getCarrierNameforSubId(DATA_SUBID));
-        assertNull(mTelephonyUtil.getCarrierNameforSubId(NON_DATA_SUBID));
+        assertEquals(CARRIER_NAME, mWifiCarrierInfoManager.getCarrierNameforSubId(DATA_SUBID));
+        assertNull(mWifiCarrierInfoManager.getCarrierNameforSubId(NON_DATA_SUBID));
     }
 
     @Test
     public void testIsCarrierNetworkFromNonDataSim() {
         WifiConfiguration config = new WifiConfiguration();
-        assertFalse(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config));
+        assertFalse(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config));
         config.carrierId = DATA_CARRIER_ID;
-        assertFalse(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config));
+        assertFalse(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config));
         config.carrierId = NON_DATA_CARRIER_ID;
-        assertTrue(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(config));
+        assertTrue(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(config));
+    }
+
+    @Test
+    public void testCheckSetClearImsiProtectionExemption() {
+        InOrder inOrder = inOrder(mWifiConfigManager);
+        assertFalse(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        mWifiCarrierInfoManager.setHasUserApprovedImsiPrivacyExemptionForCarrier(true,
+                DATA_CARRIER_ID);
+        verify(mListener).onUserAllowed(DATA_CARRIER_ID);
+        inOrder.verify(mWifiConfigManager).saveToStore(true);
+        assertTrue(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        mWifiCarrierInfoManager.clearImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID);
+        inOrder.verify(mWifiConfigManager).saveToStore(true);
+        assertFalse(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+    }
+
+    @Test
+    public void testSendImsiProtectionExemptionNotificationWithUserAllowed() {
+        // Setup carrier without IMSI privacy protection
+        when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
+                .thenReturn(generateTestCarrierConfig(false));
+        ArgumentCaptor<BroadcastReceiver> receiver =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
+
+        receiver.getValue().onReceive(mContext,
+                new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+        // Simulate user clicking on allow in the notification.
+        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
+                CARRIER_NAME, DATA_CARRIER_ID);
+        verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
+        validateUserApprovalDialog(CARRIER_NAME);
+
+        // Simulate user clicking on allow in the dialog.
+        ArgumentCaptor<DialogInterface.OnClickListener> clickListenerCaptor =
+                ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
+        verify(mAlertDialogBuilder, atLeastOnce()).setPositiveButton(
+                any(), clickListenerCaptor.capture());
+        assertNotNull(clickListenerCaptor.getValue());
+        clickListenerCaptor.getValue().onClick(mAlertDialog, 0);
+        mLooper.dispatchAll();
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mContext).sendBroadcast(intentCaptor.capture());
+        assertEquals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, intentCaptor.getValue().getAction());
+        verify(mWifiConfigManager).saveToStore(true);
+        assertTrue(mImsiDataSource.hasNewDataToSerialize());
+        assertTrue(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        verify(mListener).onUserAllowed(DATA_CARRIER_ID);
+    }
+
+    @Test
+    public void testSendImsiProtectionExemptionNotificationWithUserDisallowed() {
+        // Setup carrier without IMSI privacy protection
+        when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
+                .thenReturn(generateTestCarrierConfig(false));
+        ArgumentCaptor<BroadcastReceiver> receiver =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
+
+        receiver.getValue().onReceive(mContext,
+                new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+        // Simulate user clicking on disallow in the notification.
+        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION,
+                CARRIER_NAME, DATA_CARRIER_ID);
+        verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
+        verify(mAlertDialog, never()).show();
+
+        verify(mWifiConfigManager).saveToStore(true);
+        assertTrue(mImsiDataSource.hasNewDataToSerialize());
+        assertFalse(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        verify(mListener, never()).onUserAllowed(DATA_CARRIER_ID);
+    }
+
+    @Test
+    public void testSendImsiProtectionExemptionNotificationWithUserDismissal() {
+        // Setup carrier without IMSI privacy protection
+        when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
+                .thenReturn(generateTestCarrierConfig(false));
+        ArgumentCaptor<BroadcastReceiver> receiver =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
+
+        receiver.getValue().onReceive(mContext,
+                new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+        //Simulate user dismissal the notification
+        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
+                CARRIER_NAME, DATA_SUBID);
+        reset(mNotificationManger);
+        // No Notification is active, should send notification again.
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+        reset(mNotificationManger);
+
+        // As there is notification is active, should not send notification again.
+        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_DISMISSED_INTENT_ACTION,
+                CARRIER_NAME, DATA_SUBID);
+        verifyNoMoreInteractions(mNotificationManger);
+        verify(mWifiConfigManager, never()).saveToStore(true);
+        assertFalse(mImsiDataSource.hasNewDataToSerialize());
+        assertFalse(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        verify(mListener, never()).onUserAllowed(DATA_CARRIER_ID);
+    }
+
+    @Test
+    public void testSendImsiProtectionExemptionConfirmationDialogWithUserDisallowed() {
+        // Setup carrier without IMSI privacy protection
+        when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
+                .thenReturn(generateTestCarrierConfig(false));
+        ArgumentCaptor<BroadcastReceiver> receiver =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
+
+        receiver.getValue().onReceive(mContext,
+                new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+        // Simulate user clicking on allow in the notification.
+        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
+                CARRIER_NAME, DATA_SUBID);
+        verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
+        validateUserApprovalDialog(CARRIER_NAME);
+
+        // Simulate user clicking on disallow in the dialog.
+        ArgumentCaptor<DialogInterface.OnClickListener> clickListenerCaptor =
+                ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
+        verify(mAlertDialogBuilder, atLeastOnce()).setNegativeButton(
+                any(), clickListenerCaptor.capture());
+        assertNotNull(clickListenerCaptor.getValue());
+        clickListenerCaptor.getValue().onClick(mAlertDialog, 0);
+        mLooper.dispatchAll();
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mContext).sendBroadcast(intentCaptor.capture());
+        assertEquals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, intentCaptor.getValue().getAction());
+        verify(mWifiConfigManager).saveToStore(true);
+        assertTrue(mImsiDataSource.hasNewDataToSerialize());
+        assertFalse(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        verify(mListener, never()).onUserAllowed(DATA_CARRIER_ID);
+    }
+
+    @Test
+    public void testSendImsiProtectionExemptionConfirmationDialogWithUserDismissal() {
+        // Setup carrier without IMSI privacy protection
+        when(mCarrierConfigManager.getConfigForSubId(DATA_SUBID))
+                .thenReturn(generateTestCarrierConfig(false));
+        ArgumentCaptor<BroadcastReceiver> receiver =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
+
+        receiver.getValue().onReceive(mContext,
+                new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+        assertFalse(mWifiCarrierInfoManager.requiresImsiEncryption(DATA_SUBID));
+
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
+                CARRIER_NAME, DATA_SUBID);
+        verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
+        validateUserApprovalDialog(CARRIER_NAME);
+
+        // Simulate user clicking on dismissal in the dialog.
+        ArgumentCaptor<DialogInterface.OnDismissListener> dismissListenerCaptor =
+                ArgumentCaptor.forClass(DialogInterface.OnDismissListener.class);
+        verify(mAlertDialogBuilder, atLeastOnce()).setOnDismissListener(
+                dismissListenerCaptor.capture());
+        assertNotNull(dismissListenerCaptor.getValue());
+        dismissListenerCaptor.getValue().onDismiss(mAlertDialog);
+        mLooper.dispatchAll();
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mContext).sendBroadcast(intentCaptor.capture());
+        assertEquals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, intentCaptor.getValue().getAction());
+
+        // As no notification is active, new notification should be sent
+        mWifiCarrierInfoManager.sendImsiProtectionExemptionNotificationIfRequired(DATA_CARRIER_ID);
+        validateImsiProtectionNotification(CARRIER_NAME);
+
+        verify(mWifiConfigManager, never()).saveToStore(true);
+        assertFalse(mImsiDataSource.hasNewDataToSerialize());
+        assertFalse(mWifiCarrierInfoManager
+                .hasUserApprovedImsiPrivacyExemptionForCarrier(DATA_CARRIER_ID));
+        verify(mListener, never()).onUserAllowed(DATA_CARRIER_ID);
+    }
+
+    private void validateImsiProtectionNotification(String carrierName) {
+        verify(mNotificationManger, atLeastOnce()).notify(
+                eq(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE),
+                eq(mNotification));
+        ArgumentCaptor<CharSequence> contentCaptor =
+                ArgumentCaptor.forClass(CharSequence.class);
+        verify(mNotificationBuilder, atLeastOnce()).setContentTitle(contentCaptor.capture());
+        CharSequence content = contentCaptor.getValue();
+        assertNotNull(content);
+        assertTrue(content.toString().contains(carrierName));
+    }
+
+    private void validateUserApprovalDialog(String... anyOfExpectedAppNames) {
+        verify(mAlertDialog, atLeastOnce()).show();
+        ArgumentCaptor<CharSequence> contentCaptor =
+                ArgumentCaptor.forClass(CharSequence.class);
+        verify(mAlertDialogBuilder, atLeastOnce()).setMessage(contentCaptor.capture());
+        CharSequence content = contentCaptor.getValue();
+        assertNotNull(content);
+
+        boolean foundMatch = false;
+        for (int i = 0; i < anyOfExpectedAppNames.length; i++) {
+            foundMatch = content.toString().contains(anyOfExpectedAppNames[i]);
+            if (foundMatch) break;
+        }
+        assertTrue(foundMatch);
+    }
+
+    private void sendBroadcastForUserActionOnImsi(String action, String carrierName,
+            int carrierId) {
+        Intent intent = new Intent()
+                .setAction(action)
+                .putExtra(WifiCarrierInfoManager.EXTRA_CARRIER_NAME, carrierName)
+                .putExtra(WifiCarrierInfoManager.EXTRA_CARRIER_ID, carrierId);
+        assertNotNull(mBroadcastReceiverCaptor.getValue());
+        mBroadcastReceiverCaptor.getValue().onReceive(mContext, intent);
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
index 5af8b5d..d993810 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -44,6 +44,7 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.Pair;
 
 import androidx.test.filters.SmallTest;
@@ -51,7 +52,6 @@
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
 import com.android.server.wifi.WifiScoreCard.PerNetwork;
 import com.android.server.wifi.util.LruConnectionTracker;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 import com.android.wifi.resources.R;
@@ -71,6 +71,7 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -141,7 +142,7 @@
     @Mock private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
     @Mock private WifiScoreCard mWifiScoreCard;
     @Mock private PerNetwork mPerNetwork;
-    @Mock private LruConnectionTracker mLruConnectionTracker;
+    private LruConnectionTracker mLruConnectionTracker;
 
     private MockResources mResources;
     private InOrder mContextConfigStoreMockOrder;
@@ -150,7 +151,7 @@
     private boolean mStoreReadTriggered = false;
     private TestLooper mLooper = new TestLooper();
     private MockitoSession mSession;
-    private TelephonyUtil mTelephonyUtil;
+    private WifiCarrierInfoManager mWifiCarrierInfoManager;
 
 
     /**
@@ -175,6 +176,7 @@
                 R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
                 TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN);
         mResources.setBoolean(R.bool.config_wifi_connected_mac_randomization_supported, true);
+        mResources.setInteger(R.integer.config_wifiMaxPnoSsidCount, 16);
         when(mContext.getResources()).thenReturn(mResources);
 
         // Setup UserManager profiles for the default user.
@@ -223,8 +225,10 @@
         when(mMacAddressUtil.calculatePersistentMac(any(), any())).thenReturn(TEST_RANDOMIZED_MAC);
         when(mWifiScoreCard.lookupNetwork(any())).thenReturn(mPerNetwork);
 
-        mTelephonyUtil = new TelephonyUtil(mTelephonyManager, mSubscriptionManager,
-                mock(FrameworkFacade.class), mock(Context.class), mock(Handler.class));
+        mWifiCarrierInfoManager = new WifiCarrierInfoManager(mTelephonyManager,
+                mSubscriptionManager, mWifiInjector, mock(FrameworkFacade.class),
+                mock(WifiContext.class), mock(WifiConfigStore.class), mock(Handler.class));
+        mLruConnectionTracker = new LruConnectionTracker(100, mContext);
         createWifiConfigManager();
         mWifiConfigManager.addOnNetworkUpdateListener(mWcmListener);
         // static mocking
@@ -504,7 +508,7 @@
         // Now change BSSID for the network.
         assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
         // Change the trusted bit.
-        openNetwork.trusted = true;
+        openNetwork.trusted = false;
         verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
 
         // Now verify that the modification has been effective.
@@ -512,8 +516,77 @@
                 mWifiConfigManager.getConfiguredNetworksWithPasswords();
         WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
                 networks, retrievedNetworks);
-        verify(mWcmListener).onNetworkUpdated(wifiConfigCaptor.capture());
+        verify(mWcmListener).onNetworkUpdated(
+                wifiConfigCaptor.capture(), wifiConfigCaptor.capture());
+        WifiConfiguration newConfig = wifiConfigCaptor.getAllValues().get(1);
+        WifiConfiguration oldConfig = wifiConfigCaptor.getAllValues().get(0);
+        assertEquals(openNetwork.networkId, newConfig.networkId);
+        assertFalse(newConfig.trusted);
+        assertEquals(TEST_BSSID, newConfig.BSSID);
+        assertEquals(openNetwork.networkId, oldConfig.networkId);
+        assertTrue(oldConfig.trusted);
+        assertNull(oldConfig.BSSID);
+    }
+
+    /**
+     * Verifies the modification of a single network will remove its bssid from
+     * the blocklist.
+     */
+    @Test
+    public void testUpdateSingleOpenNetworkInBlockList() {
+        ArgumentCaptor<WifiConfiguration> wifiConfigCaptor =
+                ArgumentCaptor.forClass(WifiConfiguration.class);
+        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+        List<WifiConfiguration> networks = new ArrayList<>();
+        networks.add(openNetwork);
+
+        verifyAddNetworkToWifiConfigManager(openNetwork);
+        verify(mWcmListener).onNetworkAdded(wifiConfigCaptor.capture());
         assertEquals(openNetwork.networkId, wifiConfigCaptor.getValue().networkId);
+        reset(mWcmListener);
+
+        // mock the simplest bssid block list
+        Map<String, String> mBssidStatusMap = new ArrayMap<>();
+        doAnswer(new AnswerWithArguments() {
+            public void answer(String ssid) {
+                mBssidStatusMap.entrySet().removeIf(e -> e.getValue().equals(ssid));
+            }
+        }).when(mBssidBlocklistMonitor).clearBssidBlocklistForSsid(
+                anyString());
+        doAnswer(new AnswerWithArguments() {
+            public int answer(String ssid) {
+                return (int) mBssidStatusMap.entrySet().stream()
+                        .filter(e -> e.getValue().equals(ssid)).count();
+            }
+        }).when(mBssidBlocklistMonitor).getNumBlockedBssidsForSsid(
+                anyString());
+        // add bssid to the blocklist
+        mBssidStatusMap.put(TEST_BSSID, openNetwork.SSID);
+        mBssidStatusMap.put("aa:bb:cc:dd:ee:ff", openNetwork.SSID);
+
+        // Now change BSSID for the network.
+        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
+        // Change the trusted bit.
+        openNetwork.trusted = false;
+        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
+
+        // Now verify that the modification has been effective.
+        List<WifiConfiguration> retrievedNetworks =
+                mWifiConfigManager.getConfiguredNetworksWithPasswords();
+        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
+                networks, retrievedNetworks);
+        verify(mWcmListener).onNetworkUpdated(
+                wifiConfigCaptor.capture(), wifiConfigCaptor.capture());
+        WifiConfiguration newConfig = wifiConfigCaptor.getAllValues().get(1);
+        WifiConfiguration oldConfig = wifiConfigCaptor.getAllValues().get(0);
+        assertEquals(openNetwork.networkId, newConfig.networkId);
+        assertFalse(newConfig.trusted);
+        assertEquals(TEST_BSSID, newConfig.BSSID);
+        assertEquals(openNetwork.networkId, oldConfig.networkId);
+        assertTrue(oldConfig.trusted);
+        assertNull(oldConfig.BSSID);
+
+        assertEquals(0, mBssidBlocklistMonitor.getNumBlockedBssidsForSsid(openNetwork.SSID));
     }
 
     /**
@@ -2625,331 +2698,6 @@
     }
 
     /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForPartialScan(long, int)}.
-     */
-    @Test
-    public void testFetchChannelSetForPartialScan() {
-        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
-        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network1);
-
-        // Set it to enabled.
-        verifyUpdateNetworkSelectionStatus(
-                result.getNetworkId(), NetworkSelectionStatus.DISABLED_NONE, 0);
-
-        WifiConfiguration network2 = WifiConfigurationTestUtil.createOpenNetwork();
-        result = verifyAddNetworkToWifiConfigManager(network2);
-        // Set it to enabled.
-        verifyUpdateNetworkSelectionStatus(
-                result.getNetworkId(), NetworkSelectionStatus.DISABLED_NONE, 0);
-
-        // Create 3 scan results with different bssid's & frequencies to network1
-        String test_bssid_base = "af:89:56:34:56:6";
-        for (int i = 0; i < 3; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network1, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-        }
-
-        // Create 2 scan results with different bssid's & frequencies to network2
-        for (int i = 3; i < TEST_FREQ_LIST.length; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network2, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-        }
-
-        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
-                mWifiConfigManager.fetchChannelSetForPartialScan(100, 5));
-    }
-
-    /**
-     * Verify that the length of frequency set will not exceed the provided max value
-     */
-    @Test
-    public void testFetchChannelSetForPartialScanMaxCount() {
-        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
-        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network1);
-
-        // Set it to enabled.
-        verifyUpdateNetworkSelectionStatus(
-                result.getNetworkId(), NetworkSelectionStatus.DISABLED_NONE, 0);
-
-        WifiConfiguration network2 = WifiConfigurationTestUtil.createOpenNetwork();
-        result = verifyAddNetworkToWifiConfigManager(network2);
-        // Set it to enabled.
-        verifyUpdateNetworkSelectionStatus(
-                result.getNetworkId(), NetworkSelectionStatus.DISABLED_NONE, 0);
-
-        // Create 3 scan results with different bssid's & frequencies to network1
-        String test_bssid_base = "af:89:56:34:56:6";
-        for (int i = 0; i < 3; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network1, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-        }
-
-        // Create 2 scan results with different bssid's & frequencies to network2
-        for (int i = 3; i < TEST_FREQ_LIST.length; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network2, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-        }
-
-        assertEquals(3, mWifiConfigManager.fetchChannelSetForPartialScan(100, 3).size());
-    }
-
-    /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)}.
-     */
-    @Test
-    public void testFetchChannelSetForNetwork() {
-        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
-        verifyAddNetworkToWifiConfigManager(network);
-
-        // Create 5 scan results with different bssid's & frequencies.
-        String test_bssid_base = "af:89:56:34:56:6";
-        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-
-        }
-        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network.networkId, 1,
-                        TEST_FREQ_LIST[4]));
-    }
-
-    /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
-     * ensures that the frequenecy of the currently connected network is in the returned
-     * channel set.
-     */
-    @Test
-    public void testFetchChannelSetForNetworkIncludeCurrentNetwork() {
-        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
-        verifyAddNetworkToWifiConfigManager(network);
-
-        // Create 5 scan results with different bssid's & frequencies.
-        String test_bssid_base = "af:89:56:34:56:6";
-        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-
-        }
-
-        // Currently connected network frequency 2427 is not in the TEST_FREQ_LIST
-        Set<Integer> freqs = mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
-                network.networkId, 1, 2427);
-
-        assertEquals(true, freqs.contains(2427));
-    }
-
-    /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
-     * ensures that scan results which have a timestamp  beyond the provided age are not used
-     * in the channel list.
-     */
-    @Test
-    public void testFetchChannelSetForNetworkIgnoresStaleScanResults() {
-        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
-        verifyAddNetworkToWifiConfigManager(network);
-
-        long wallClockBase = 0;
-        // Create 5 scan results with different bssid's & frequencies.
-        String test_bssid_base = "af:89:56:34:56:6";
-        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
-            // Increment the seen value in the scan results for each of them.
-            when(mClock.getWallClockMillis()).thenReturn(wallClockBase + i);
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-
-        }
-        int ageInMillis = 4;
-        // Now fetch only scan results which are 4 millis stale. This should ignore the first
-        // scan result.
-        assertEquals(
-                new HashSet<>(Arrays.asList(
-                        Arrays.copyOfRange(
-                                TEST_FREQ_LIST,
-                                TEST_FREQ_LIST.length - ageInMillis, TEST_FREQ_LIST.length))),
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
-                        network.networkId, ageInMillis, TEST_FREQ_LIST[4]));
-    }
-
-    /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
-     * ensures that the list size does not exceed the max configured for the device.
-     */
-    @Test
-    public void testFetchChannelSetForNetworkIsLimitedToConfiguredSize() {
-        // Need to recreate the WifiConfigManager instance for this test to modify the config
-        // value which is read only in the constructor.
-        int maxListSize = 3;
-        mResources.setInteger(
-                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
-                maxListSize);
-        createWifiConfigManager();
-
-        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
-        verifyAddNetworkToWifiConfigManager(network);
-
-        // Create 5 scan results with different bssid's & frequencies.
-        String test_bssid_base = "af:89:56:34:56:6";
-        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-            verify(mPerNetwork).addFrequency(TEST_FREQ_LIST[i]);
-
-        }
-        // Ensure that the fetched list size is limited.
-        assertEquals(maxListSize,
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
-                        network.networkId, 1, TEST_FREQ_LIST[4]).size());
-    }
-
-    /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
-     * ensures that scan results from linked networks are used in the channel list.
-     */
-    @Test
-    public void testFetchChannelSetForNetworkIncludesLinkedNetworks() {
-        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
-        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
-        verifyAddNetworkToWifiConfigManager(network1);
-        verifyAddNetworkToWifiConfigManager(network2);
-
-        String test_bssid_base = "af:89:56:34:56:6";
-        int TEST_FREQ_LISTIdx = 0;
-        // Create 3 scan results with different bssid's & frequencies for network 1.
-        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
-                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-
-        }
-        // Create 3 scan results with different bssid's & frequencies for network 2.
-        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
-                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-        }
-
-        // Link the 2 configurations together using the GwMacAddress.
-        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
-                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
-        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
-                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
-
-        // The channel list fetched should include scan results from both the linked networks.
-        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network1.networkId, 1,
-                        TEST_FREQ_LIST[0]));
-        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network2.networkId, 1,
-                        TEST_FREQ_LIST[0]));
-    }
-
-    /**
-     * Verifies the creation of channel list using
-     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
-     * ensures that scan results from linked networks are used in the channel list and that the
-     * list size does not exceed the max configured for the device.
-     */
-    @Test
-    public void testFetchChannelSetForNetworkIncludesLinkedNetworksIsLimitedToConfiguredSize() {
-        // Need to recreate the WifiConfigManager instance for this test to modify the config
-        // value which is read only in the constructor.
-        int maxListSize = 3;
-        mResources.setInteger(
-                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
-                maxListSize);
-
-        createWifiConfigManager();
-        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
-        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
-        verifyAddNetworkToWifiConfigManager(network1);
-        verifyAddNetworkToWifiConfigManager(network2);
-
-        String test_bssid_base = "af:89:56:34:56:6";
-        int TEST_FREQ_LISTIdx = 0;
-        // Create 3 scan results with different bssid's & frequencies for network 1.
-        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
-                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-
-        }
-        // Create 3 scan results with different bssid's & frequencies for network 2.
-        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
-            ScanDetail networkScanDetail =
-                    createScanDetailForNetwork(
-                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
-                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
-            assertNotNull(
-                    mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(
-                            networkScanDetail));
-        }
-
-        // Link the 2 configurations together using the GwMacAddress.
-        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
-                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
-        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
-                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
-
-        // Ensure that the fetched list size is limited.
-        assertEquals(maxListSize,
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
-                        network1.networkId, 1, TEST_FREQ_LIST[0]).size());
-        assertEquals(maxListSize,
-                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
-                        network2.networkId, 1, TEST_FREQ_LIST[0]).size());
-    }
-
-    /**
      * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
      * and ensures that any shared private networks networkId is not changed.
      * Test scenario:
@@ -4008,25 +3756,20 @@
         verifyAddNetworkToWifiConfigManager(network1);
         verifyAddNetworkToWifiConfigManager(network2);
         verifyAddNetworkToWifiConfigManager(network3);
+        mWifiConfigManager.updateNetworkAfterConnect(network3.networkId);
 
-        // Now set scan results in 2 of them to set the corresponding
+        // Now set scan results of network2 to set the corresponding
         // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
-        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
-                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
-        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
-                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
-
-        // Now increment |network3|'s association count. This should ensure that this network
-        // is preferred over |network1|.
-        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
+        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(network2.networkId,
+                createScanDetailForNetwork(network2).getScanResult(), 54));
 
         // Retrieve the hidden network list & verify the order of the networks returned.
         List<WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks =
                 mWifiConfigManager.retrieveHiddenNetworkList();
         assertEquals(3, hiddenNetworks.size());
         assertEquals(network3.SSID, hiddenNetworks.get(0).ssid);
-        assertEquals(network1.SSID, hiddenNetworks.get(1).ssid);
-        assertEquals(network2.SSID, hiddenNetworks.get(2).ssid);
+        assertEquals(network2.SSID, hiddenNetworks.get(1).ssid);
+        assertEquals(network1.SSID, hiddenNetworks.get(2).ssid);
     }
 
     /**
@@ -4549,7 +4292,7 @@
 
     /**
      * {@link WifiConfigManager#resetSimNetworks()} should reset all non-PEAP SIM networks, no
-     * matter if {@link TelephonyUtil#getSimIdentity()} returns null or not.
+     * matter if {@link WifiCarrierInfoManager#getSimIdentity()} returns null or not.
      */
     @Test
     public void testResetSimNetworks_getSimIdentityNull_shouldResetAllNonPeapSimIdentities() {
@@ -4856,7 +4599,7 @@
     private void createWifiConfigManager() {
         mWifiConfigManager =
                 new WifiConfigManager(
-                        mContext, mClock, mUserManager, mTelephonyUtil,
+                        mContext, mClock, mUserManager, mWifiCarrierInfoManager,
                         mWifiKeyStore, mWifiConfigStore,
                         mWifiPermissionsUtil, mWifiPermissionsWrapper, mWifiInjector,
                         mNetworkListSharedStoreData, mNetworkListUserStoreData,
@@ -5332,10 +5075,6 @@
         // Verify if the config store write was triggered without this new configuration.
         verifyNetworkNotInConfigStoreData(configuration);
         verify(mBssidBlocklistMonitor, atLeastOnce()).handleNetworkRemoved(configuration.SSID);
-        ArgumentCaptor<WifiConfiguration> captor = ArgumentCaptor.forClass(WifiConfiguration.class);
-        verify(mLruConnectionTracker).removeNetwork(captor.capture());
-        assertEquals(configuration.networkId, captor.getValue().networkId);
-        reset(mLruConnectionTracker);
     }
 
     /**
@@ -5531,9 +5270,7 @@
         WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
         assertTrue("hasEverConnected expected to be true after connection.",
                 retrievedNetwork.getNetworkSelectionStatus().hasEverConnected());
-        ArgumentCaptor<WifiConfiguration> captor = ArgumentCaptor.forClass(WifiConfiguration.class);
-        verify(mLruConnectionTracker).addNetwork(captor.capture());
-        assertEquals(networkId, captor.getValue().networkId);
+        assertEquals(0, mLruConnectionTracker.getAgeIndexOfNetwork(retrievedNetwork));
     }
 
     /**
@@ -5668,8 +5405,7 @@
         verifyAddNetworkToWifiConfigManager(testNetwork1);
         WifiConfiguration testNetwork2 = WifiConfigurationTestUtil.createOpenNetwork();
         verifyAddNetworkToWifiConfigManager(testNetwork2);
-        when(mLruConnectionTracker.isMostRecentlyConnected(any()))
-                .thenReturn(false).thenReturn(true);
+        mWifiConfigManager.updateNetworkAfterConnect(testNetwork2.networkId);
         mWifiConfigManager.saveToStore(true);
         Pair<List<WifiConfiguration>, List<WifiConfiguration>> networkStoreData =
                 captureWriteNetworksListStoreData();
@@ -5677,4 +5413,39 @@
         assertFalse(sharedNetwork.get(0).isMostRecentlyConnected);
         assertTrue(sharedNetwork.get(1).isMostRecentlyConnected);
     }
+
+    /**
+     * Verify scan comparator gives the most recently connected network highest priority
+     */
+    @Test
+    public void testScanComparator() {
+        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
+        verifyAddNetworkToWifiConfigManager(network1);
+        WifiConfiguration network2 = WifiConfigurationTestUtil.createOpenNetwork();
+        verifyAddNetworkToWifiConfigManager(network2);
+        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenNetwork();
+        verifyAddNetworkToWifiConfigManager(network3);
+        WifiConfiguration network4 = WifiConfigurationTestUtil.createOpenNetwork();
+        verifyAddNetworkToWifiConfigManager(network4);
+
+        // Connect two network in order, network3 --> network2
+        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(network3.networkId);
+        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(network2.networkId);
+        // Set network4 {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} to true.
+        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(network4.networkId,
+                createScanDetailForNetwork(network4).getScanResult(), 54));
+        List<WifiConfiguration> networkList = mWifiConfigManager.getConfiguredNetworks();
+        // Expected order should be based on connection order and last qualified selection.
+        Collections.sort(networkList, mWifiConfigManager.getScanListComparator());
+        assertEquals(network2.SSID, networkList.get(0).SSID);
+        assertEquals(network3.SSID, networkList.get(1).SSID);
+        assertEquals(network4.SSID, networkList.get(2).SSID);
+        assertEquals(network1.SSID, networkList.get(3).SSID);
+        // Remove network to check the age index changes.
+        mWifiConfigManager.removeNetwork(network3.networkId, TEST_CREATOR_UID, TEST_CREATOR_NAME);
+        assertEquals(Integer.MAX_VALUE, mLruConnectionTracker.getAgeIndexOfNetwork(network3));
+        assertEquals(0, mLruConnectionTracker.getAgeIndexOfNetwork(network2));
+        mWifiConfigManager.removeNetwork(network2.networkId, TEST_CREATOR_UID, TEST_CREATOR_NAME);
+        assertEquals(Integer.MAX_VALUE, mLruConnectionTracker.getAgeIndexOfNetwork(network2));
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index 028bf02..f03c536 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -54,6 +54,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.server.wifi.hotspot2.PasspointManager;
+import com.android.server.wifi.util.LruConnectionTracker;
 import com.android.server.wifi.util.ScanResultUtil;
 import com.android.wifi.resources.R;
 
@@ -73,6 +74,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -105,8 +107,6 @@
         mWifiConnectivityHelper = mockWifiConnectivityHelper();
         mWifiNS = mockWifiNetworkSelector();
         when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
-        when(mWifiInjector.getWifiNetworkSuggestionsManager())
-                .thenReturn(mWifiNetworkSuggestionsManager);
         when(mWifiNetworkSuggestionsManager.retrieveHiddenNetworkList())
                 .thenReturn(new ArrayList<>());
         when(mWifiNetworkSuggestionsManager.getAllNetworkSuggestions())
@@ -120,13 +120,20 @@
         when(mPasspointManager.getProviderConfigs(anyInt(), anyBoolean()))
                 .thenReturn(new ArrayList<>());
         mWifiConnectivityManager = createConnectivityManager();
-        verify(mWifiConfigManager).addOnNetworkUpdateListener(anyObject());
+        verify(mWifiConfigManager).addOnNetworkUpdateListener(
+                mNetworkUpdateListenerCaptor.capture());
+        verify(mWifiNetworkSuggestionsManager).addOnSuggestionUpdateListener(
+                mSuggestionUpdateListenerCaptor.capture());
         mWifiConnectivityManager.setTrustedConnectionAllowed(true);
         mWifiConnectivityManager.setWifiEnabled(true);
         when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
         mMinPacketRateActiveTraffic = mResources.getInteger(
                 R.integer.config_wifiFrameworkMinPacketPerSecondActiveTraffic);
         when(mWifiLastResortWatchdog.shouldIgnoreBssidUpdate(anyString())).thenReturn(false);
+        mLruConnectionTracker = new LruConnectionTracker(100, mContext);
+        Comparator<WifiConfiguration> comparator =
+                Comparator.comparingInt(mLruConnectionTracker::getAgeIndexOfNetwork);
+        when(mWifiConfigManager.getScanListComparator()).thenReturn(comparator);
     }
 
     private void setUpResources(MockResources resources) {
@@ -175,6 +182,7 @@
     private WifiConfigManager mWifiConfigManager;
     private WifiInfo mWifiInfo;
     private LocalLog mLocalLog;
+    private LruConnectionTracker mLruConnectionTracker;
     @Mock private WifiInjector mWifiInjector;
     @Mock private NetworkScoreManager mNetworkScoreManager;
     @Mock private Clock mClock;
@@ -201,6 +209,8 @@
     @Captor ArgumentCaptor<ArrayList<String>> mSsidWhitelistCaptor;
     @Captor ArgumentCaptor<WifiConfigManager.OnNetworkUpdateListener>
             mNetworkUpdateListenerCaptor;
+    @Captor ArgumentCaptor<WifiNetworkSuggestionsManager.OnSuggestionUpdateListener>
+            mSuggestionUpdateListenerCaptor;
     private MockResources mResources;
     private int mMinPacketRateActiveTraffic;
 
@@ -224,6 +234,7 @@
     private static final int TEST_FREQUENCY_1 = 2412;
     private static final int TEST_FREQUENCY_2 = 5180;
     private static final int TEST_FREQUENCY_3 = 5240;
+    private static final int TEST_CURRENT_CONNECTED_FREQUENCY = 2427;
     private static final int HIGH_MVMT_SCAN_DELAY_MS = 10000;
     private static final int HIGH_MVMT_RSSI_DELTA = 10;
     private static final String TEST_FQDN = "FQDN";
@@ -377,8 +388,6 @@
         networkList.add(config);
         when(wifiConfigManager.getConfiguredNetwork(anyInt())).thenReturn(null);
         when(wifiConfigManager.getSavedNetworks(anyInt())).thenReturn(networkList);
-        doNothing().when(wifiConfigManager).addOnNetworkUpdateListener(
-                mNetworkUpdateListenerCaptor.capture());
 
         return wifiConfigManager;
     }
@@ -386,11 +395,11 @@
     WifiConnectivityManager createConnectivityManager() {
         return new WifiConnectivityManager(mContext,
                 mScoringParams,
-                mClientModeImpl, mWifiInjector,
-                mWifiConfigManager, mWifiInfo, mWifiNS, mWifiConnectivityHelper,
+                mClientModeImpl, mWifiInjector, mWifiConfigManager, mWifiNetworkSuggestionsManager,
+                mWifiInfo, mWifiNS, mWifiConnectivityHelper,
                 mWifiLastResortWatchdog, mOpenNetworkNotifier,
                 mWifiMetrics, new Handler(mLooper.getLooper()), mClock,
-                mLocalLog);
+                mLocalLog, mWifiScoreCard);
     }
 
     void setWifiStateConnected() {
@@ -1760,15 +1769,18 @@
         when(mWifiNS.hasActiveStream(eq(mWifiInfo))).thenReturn(false);
         when(mWifiNS.hasSufficientLinkQuality(eq(mWifiInfo))).thenReturn(false);
 
-        final HashSet<Integer> channelList = new HashSet<>();
-        channelList.add(1);
-        channelList.add(2);
-        channelList.add(3);
-
+        final List<Integer> channelList = new ArrayList<>();
+        channelList.add(TEST_FREQUENCY_1);
+        channelList.add(TEST_FREQUENCY_2);
+        channelList.add(TEST_FREQUENCY_3);
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
         when(mClientModeImpl.getCurrentWifiConfiguration())
-                .thenReturn(new WifiConfiguration());
-        when(mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(anyInt(), anyLong(),
-                anyInt())).thenReturn(channelList);
+                .thenReturn(configuration);
+        when(mWifiScoreCard.lookupNetwork(configuration.SSID)).thenReturn(mPerNetwork);
+        when(mPerNetwork.getFrequencies()).thenReturn(channelList);
 
         doAnswer(new AnswerWithArguments() {
             public void answer(ScanSettings settings, ScanListener listener,
@@ -1814,15 +1826,24 @@
         when(mWifiNS.hasActiveStream(eq(mWifiInfo))).thenReturn(true);
         when(mWifiNS.hasSufficientLinkQuality(eq(mWifiInfo))).thenReturn(false);
 
-        final HashSet<Integer> channelList = new HashSet<>();
-        channelList.add(1);
-        channelList.add(2);
-        channelList.add(3);
+        mResources.setInteger(
+                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
+                10);
+
+        final List<Integer> channelList = new ArrayList<>();
+        channelList.add(TEST_FREQUENCY_1);
+        channelList.add(TEST_FREQUENCY_2);
+        channelList.add(TEST_FREQUENCY_3);
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
+        when(mWifiScoreCard.lookupNetwork(configuration.SSID)).thenReturn(mPerNetwork);
+        when(mPerNetwork.getFrequencies()).thenReturn(channelList);
 
         when(mClientModeImpl.getCurrentWifiConfiguration())
-                .thenReturn(new WifiConfiguration());
-        when(mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(anyInt(), anyLong(),
-                anyInt())).thenReturn(channelList);
+                .thenReturn(configuration);
+
         when(mWifiConnectivityHelper.isFirmwareRoamingSupported()).thenReturn(false);
 
         doAnswer(new AnswerWithArguments() {
@@ -1859,15 +1880,23 @@
         when(mWifiNS.hasActiveStream(eq(mWifiInfo))).thenReturn(false);
         when(mWifiNS.hasSufficientLinkQuality(eq(mWifiInfo))).thenReturn(true);
 
-        final HashSet<Integer> channelList = new HashSet<>();
-        channelList.add(1);
-        channelList.add(2);
-        channelList.add(3);
+        mResources.setInteger(
+                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
+                10);
+
+        final List<Integer> channelList = new ArrayList<>();
+        channelList.add(TEST_FREQUENCY_1);
+        channelList.add(TEST_FREQUENCY_2);
+        channelList.add(TEST_FREQUENCY_3);
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
+        when(mWifiScoreCard.lookupNetwork(configuration.SSID)).thenReturn(mPerNetwork);
+        when(mPerNetwork.getFrequencies()).thenReturn(channelList);
 
         when(mClientModeImpl.getCurrentWifiConfiguration())
-                .thenReturn(new WifiConfiguration());
-        when(mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(anyInt(), anyLong(),
-                anyInt())).thenReturn(channelList);
+                .thenReturn(configuration);
         when(mWifiConnectivityHelper.isFirmwareRoamingSupported()).thenReturn(false);
 
         doAnswer(new AnswerWithArguments() {
@@ -1904,12 +1933,19 @@
         when(mWifiNS.isNetworkSufficient(eq(mWifiInfo))).thenReturn(true);
         when(mWifiNS.hasActiveStream(eq(mWifiInfo))).thenReturn(true);
 
-        final HashSet<Integer> channelList = new HashSet<>();
+        final List<Integer> channelList = new ArrayList<>();
+        channelList.add(TEST_FREQUENCY_1);
+        channelList.add(TEST_FREQUENCY_2);
+        channelList.add(TEST_FREQUENCY_3);
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
+        when(mWifiScoreCard.lookupNetwork(configuration.SSID)).thenReturn(mPerNetwork);
+        when(mPerNetwork.getFrequencies()).thenReturn(channelList);
 
         when(mClientModeImpl.getCurrentWifiConfiguration())
                 .thenReturn(new WifiConfiguration());
-        when(mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(anyInt(), anyLong(),
-                anyInt())).thenReturn(channelList);
 
         doAnswer(new AnswerWithArguments() {
             public void answer(ScanSettings settings, Executor executor, ScanListener listener,
@@ -2910,11 +2946,14 @@
         networkList.add(network1);
         networkList.add(network2);
         networkList.add(network3);
+        mLruConnectionTracker.addNetwork(network3);
+        mLruConnectionTracker.addNetwork(network2);
+        mLruConnectionTracker.addNetwork(network1);
         when(mWifiConfigManager.getSavedNetworks(anyInt())).thenReturn(networkList);
         // Retrieve the Pno network list & verify.
         List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
                 mWifiConnectivityManager.retrievePnoNetworkList();
-        verify(mWifiNetworkSuggestionsManager).getAllPnoAvailableSuggestionNetworks();
+        verify(mWifiNetworkSuggestionsManager).getAllScanOptimizationSuggestionNetworks();
         assertEquals(3, pnoNetworks.size());
         assertEquals(network1.SSID, pnoNetworks.get(0).ssid);
         assertEquals(network2.SSID, pnoNetworks.get(1).ssid);
@@ -2950,8 +2989,9 @@
         List<WifiConfiguration> networkList = new ArrayList<>();
         networkList.add(network1);
         networkList.add(network2);
+        mLruConnectionTracker.addNetwork(network2);
+        mLruConnectionTracker.addNetwork(network1);
         when(mWifiConfigManager.getSavedNetworks(anyInt())).thenReturn(networkList);
-
         // Retrieve the Pno network list and verify.
         // Frequencies should be empty since no scan results have been received yet.
         List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
@@ -3006,39 +3046,147 @@
         WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork();
         WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
         WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
+        mLruConnectionTracker.addNetwork(network1);
+        mLruConnectionTracker.addNetwork(network2);
+        mLruConnectionTracker.addNetwork(network3);
         List<WifiConfiguration> networkList = new ArrayList<>();
         networkList.add(network1);
         networkList.add(network2);
         networkList.add(network3);
         when(mWifiConfigManager.getSavedNetworks(anyInt())).thenReturn(networkList);
-        // Set up network as:
-        // Network2 has the highest association number.
-        // Network3 is most recently connected.
-        // Network1 the second for both association number and most recently.
-        long firstConnectionTimeMillis = 45677;
-        long secondConnectionTimeMillis = firstConnectionTimeMillis + 45;
-        network1.numAssociation = 2;
-        network2.numAssociation = 3;
-        network3.numAssociation = 1;
-        network1.lastConnected = firstConnectionTimeMillis;
-        network3.lastConnected = secondConnectionTimeMillis;
-        //When config_wifiPnoRecencySortingEnabled is false, will prefer most connected network.
-        mResources.setBoolean(R.bool.config_wifiPnoRecencySortingEnabled, false);
         List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
                 mWifiConnectivityManager.retrievePnoNetworkList();
         assertEquals(3, pnoNetworks.size());
-        assertEquals(network2.SSID, pnoNetworks.get(0).ssid);
-        assertEquals(network1.SSID, pnoNetworks.get(1).ssid);
-        assertEquals(network3.SSID, pnoNetworks.get(2).ssid);
-
-        //When config_wifiPnoRecencySortingEnabled is true, after prefer most connected network.
-        //The most recently connected network will move the first.
-        mResources.setBoolean(R.bool.config_wifiPnoRecencySortingEnabled, true);
-        pnoNetworks =
-                mWifiConnectivityManager.retrievePnoNetworkList();
-        assertEquals(3, pnoNetworks.size());
         assertEquals(network3.SSID, pnoNetworks.get(0).ssid);
         assertEquals(network2.SSID, pnoNetworks.get(1).ssid);
         assertEquals(network1.SSID, pnoNetworks.get(2).ssid);
     }
+
+    private List<List<Integer>> linkScoreCardFreqsToNetwork(WifiConfiguration... configs) {
+        List<List<Integer>> results = new ArrayList<>();
+        int i = 0;
+        for (WifiConfiguration config : configs) {
+            List<Integer> channelList = new ArrayList<>();
+            channelList.add(TEST_FREQUENCY_1 + i);
+            channelList.add(TEST_FREQUENCY_2 + i);
+            channelList.add(TEST_FREQUENCY_3 + i);
+            WifiScoreCard.PerNetwork perNetwork = mock(WifiScoreCard.PerNetwork.class);
+            when(mWifiScoreCard.lookupNetwork(config.SSID)).thenReturn(perNetwork);
+            when(perNetwork.getFrequencies()).thenReturn(channelList);
+            results.add(channelList);
+            i++;
+        }
+        return results;
+    }
+
+    /**
+     * Verify that the length of frequency set will not exceed the provided max value
+     */
+    @Test
+    public void testFetchChannelSetForPartialScanMaxCount() {
+        WifiConfiguration configuration1 = WifiConfigurationTestUtil.createOpenNetwork();
+        WifiConfiguration configuration2 = WifiConfigurationTestUtil.createOpenNetwork();
+        when(mWifiConfigManager.getSavedNetworks(anyInt()))
+                .thenReturn(Arrays.asList(configuration1, configuration2));
+
+        List<List<Integer>> freqs = linkScoreCardFreqsToNetwork(configuration1, configuration2);
+
+        mLruConnectionTracker.addNetwork(configuration2);
+        mLruConnectionTracker.addNetwork(configuration1);
+
+        assertEquals(new HashSet<>(freqs.get(0)),
+                mWifiConnectivityManager.fetchChannelSetForPartialScan(3));
+    }
+
+    /**
+     * Verifies the creation of channel list using
+     * {@link WifiConnectivityManager#fetchChannelSetForNetworkForPartialScan(int)}.
+     */
+    @Test
+    public void testFetchChannelSetForNetwork() {
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
+        List<List<Integer>> freqs = linkScoreCardFreqsToNetwork(configuration);
+
+        assertEquals(new HashSet<>(freqs.get(0)), mWifiConnectivityManager
+                .fetchChannelSetForNetworkForPartialScan(configuration.networkId));
+    }
+
+    /**
+     * Verifies the creation of channel list using
+     * {@link WifiConnectivityManager#fetchChannelSetForNetworkForPartialScan(int)} and
+     * ensures that the frequenecy of the currently connected network is in the returned
+     * channel set.
+     */
+    @Test
+    public void testFetchChannelSetForNetworkIncludeCurrentNetwork() {
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
+        linkScoreCardFreqsToNetwork(configuration);
+
+        mWifiInfo.setFrequency(TEST_CURRENT_CONNECTED_FREQUENCY);
+
+        // Currently connected network frequency 2427 is not in the TEST_FREQ_LIST
+        Set<Integer> freqs = mWifiConnectivityManager.fetchChannelSetForNetworkForPartialScan(
+                configuration.networkId);
+
+        assertTrue(freqs.contains(2427));
+    }
+
+    /**
+     * Verifies the creation of channel list using
+     * {@link WifiConnectivityManager#fetchChannelSetForNetworkForPartialScan(int)} and
+     * ensures that the list size does not exceed the max configured for the device.
+     */
+    @Test
+    public void testFetchChannelSetForNetworkIsLimitedToConfiguredSize() {
+        // Need to recreate the WifiConfigManager instance for this test to modify the config
+        // value which is read only in the constructor.
+        int maxListSize = 2;
+        mResources.setInteger(
+                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
+                maxListSize);
+
+        WifiConfiguration configuration = WifiConfigurationTestUtil.createOpenNetwork();
+        configuration.networkId = TEST_CONNECTED_NETWORK_ID;
+        when(mWifiConfigManager.getConfiguredNetwork(TEST_CONNECTED_NETWORK_ID))
+                .thenReturn(configuration);
+        List<List<Integer>> freqs = linkScoreCardFreqsToNetwork(configuration);
+        // Ensure that the fetched list size is limited.
+        Set<Integer> results = mWifiConnectivityManager.fetchChannelSetForNetworkForPartialScan(
+                configuration.networkId);
+        assertEquals(maxListSize, results.size());
+        assertFalse(results.contains(freqs.get(0).get(2)));
+    }
+
+    @Test
+    public void restartPnoScanForNetworkChanges() {
+        mWifiConnectivityManager.setWifiEnabled(true);
+
+        // starts a PNO scan
+        mWifiConnectivityManager.handleConnectionStateChanged(
+                WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+        mWifiConnectivityManager.setTrustedConnectionAllowed(true);
+
+        InOrder inOrder = inOrder(mWifiScanner);
+
+        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+
+        // Add or update suggestions.
+        mSuggestionUpdateListenerCaptor.getValue().onSuggestionsAddedOrUpdated(
+                Arrays.asList(mWifiNetworkSuggestion));
+        // Ensure that we restarted PNO.
+        inOrder.verify(mWifiScanner).stopPnoScan(any());
+        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+
+        // Add saved network
+        mNetworkUpdateListenerCaptor.getValue().onNetworkAdded(new WifiConfiguration());
+        // Ensure that we restarted PNO.
+        inOrder.verify(mWifiScanner).stopPnoScan(any());
+        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java b/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java
index bb8c74d..cfe1ee8 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java
@@ -204,17 +204,21 @@
     }
 
     /**
-     * Verify throughtput when Rx link speed is unavailable
+     * Verify throughtput when Rx link speed is unavailable.
+     * Also verify the logging of channel utilization and throughput.
      */
     @Test
     public void verifyThroughputNoRxLinkSpeed() throws Exception {
         mWifiDataStall.checkDataStallAndThroughputSufficiency(null, mNewLlStats, mWifiInfo);
+        verify(mWifiMetrics).incrementChannelUtilizationCount(10, 5850);
+        verify(mWifiMetrics).incrementThroughputKbpsCount(50_000, 150_000, 5850);
         assertEquals(50_000, mWifiDataStall.getTxThroughputKbps());
         assertEquals(150_000, mWifiDataStall.getRxThroughputKbps());
         when(mWifiInfo.getRxLinkSpeedMbps()).thenReturn(-1);
         mWifiDataStall.checkDataStallAndThroughputSufficiency(mOldLlStats, mNewLlStats, mWifiInfo);
         assertEquals(960, mWifiDataStall.getTxThroughputKbps());
         assertEquals(-1, mWifiDataStall.getRxThroughputKbps());
+        verify(mWifiMetrics).incrementThroughputKbpsCount(960, -1, 5850);
     }
 
     /**
@@ -226,6 +230,7 @@
 
         assertEquals(WifiIsUnusableEvent.TYPE_UNKNOWN, mWifiDataStall
                 .checkDataStallAndThroughputSufficiency(mOldLlStats, mNewLlStats, mWifiInfo));
+        verify(mWifiMetrics).incrementThroughputKbpsCount(960, 9609, 5850);
         verifyUpdateWifiIsUnusableLinkLayerStats();
         when(mClock.getElapsedSinceBootMillis()).thenReturn(
                 10L + DeviceConfigFacade.DEFAULT_DATA_STALL_DURATION_MS);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java
index acfc78d..6b235b9 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java
@@ -64,6 +64,7 @@
     @Mock BuildProperties mBuildProperties;
     @Mock Context mContext;
     @Mock WifiInjector mWifiInjector;
+    @Mock DeviceConfigFacade mDeviceConfigFacade;
     @Spy FakeWifiLog mLog;
     @Mock LastMileLogger mLastMileLogger;
     @Mock Runtime mJavaRuntime;
@@ -86,6 +87,7 @@
     private static final int[] FATAL_FW_ALERT_LIST = {256, 257, 258};
     /** Mock a non fatal firmware alert */
     private static final int NON_FATAL_FW_ALERT = 0;
+    private static final int BUG_REPORT_MIN_WINDOW_MS = 3600_000;
 
     private WifiNative.RingBufferStatus mFakeRbs;
     /**
@@ -131,7 +133,8 @@
         when(mWifiInjector.makeLog(anyString())).thenReturn(mLog);
         when(mWifiInjector.getJavaRuntime()).thenReturn(mJavaRuntime);
         when(mWifiInjector.getWifiMetrics()).thenReturn(mWifiMetrics);
-
+        when(mWifiInjector.getDeviceConfigFacade()).thenReturn(mDeviceConfigFacade);
+        when(mDeviceConfigFacade.getBugReportMinWindowMs()).thenReturn(BUG_REPORT_MIN_WINDOW_MS);
         mWifiDiagnostics = new WifiDiagnostics(
                 mContext, mWifiInjector, mWifiNative, mBuildProperties, mLastMileLogger, mClock);
         mWifiNative.enableVerboseLogging(0);
@@ -888,7 +891,7 @@
         mWifiDiagnostics.takeBugReport("", "");
         verify(mBugreportManager, times(1)).requestBugreport(any(), any(), any());
         // 2nd attempt should fail
-        when(mClock.getWallClockMillis()).thenReturn(1000_000L);
+        when(mClock.getWallClockMillis()).thenReturn(BUG_REPORT_MIN_WINDOW_MS - 20L);
         mWifiDiagnostics.takeBugReport("", "");
         verify(mBugreportManager, times(1)).requestBugreport(any(), any(), any());
     }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiInjectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiInjectorTest.java
index 2c73d09..6af10d0 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiInjectorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiInjectorTest.java
@@ -16,10 +16,6 @@
 
 package com.android.server.wifi;
 
-import static org.mockito.Mockito.*;
-
-import android.content.Context;
-
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -31,7 +27,7 @@
 @SmallTest
 public class WifiInjectorTest extends WifiBaseTest {
 
-    @Mock private Context mContext;
+    @Mock private WifiContext mContext;
     private WifiInjector mInjector;
 
     /**
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
index 315a17b..ab02f0f 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
@@ -44,6 +44,7 @@
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyBoolean;
 import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
@@ -110,6 +111,7 @@
 import com.android.server.wifi.proto.nano.WifiMetricsProto.WpsMetrics;
 import com.android.server.wifi.rtt.RttMetrics;
 import com.android.server.wifi.util.ExternalCallbackTracker;
+import com.android.server.wifi.util.InformationElementUtil;
 import com.android.wifi.resources.R;
 
 import org.junit.Before;
@@ -164,6 +166,10 @@
     @Mock ExternalCallbackTracker<IOnWifiUsabilityStatsListener> mListenerTracker;
     @Mock WifiP2pMetrics mWifiP2pMetrics;
     @Mock DppMetrics mDppMetrics;
+    @Mock WifiScoreCard mWifiScoreCard;
+    @Mock WifiScoreCard.PerNetwork mPerNetwork;
+    @Mock WifiScoreCard.NetworkConnectionStats mNetworkConnectionStats;
+    @Mock WifiConfiguration mWifiConfig;
 
     @Before
     public void setUp() throws Exception {
@@ -183,6 +189,9 @@
         mWifiMetrics.setWifiNetworkSelector(mWns);
         mWifiMetrics.setWifiDataStall(mWifiDataStall);
         mWifiMetrics.setWifiHealthMonitor(mWifiHealthMonitor);
+        mWifiMetrics.setWifiScoreCard(mWifiScoreCard);
+        when(mWifiScoreCard.lookupNetwork(anyString())).thenReturn(mPerNetwork);
+        when(mPerNetwork.getRecentStats()).thenReturn(mNetworkConnectionStats);
     }
 
     /**
@@ -466,17 +475,22 @@
     private static final long NUM_MBO_CELL_DATA_AWARE_NETWORKS_SCAN_RESULTS = 2;
     private static final long NUM_OCE_SUPPORTED_NETWORKS_SCAN_RESULTS = 2;
     private static final long NUM_FILS_SUPPORTED_NETWORKS_SCAN_RESULTS = 2;
+    private static final long NUM_11AX_NETWORKS_SCAN_RESULTS = 3;
+    private static final long NUM_6G_NETWORKS_SCAN_RESULTS = 2;
     private static final long NUM_BSSID_FILTERED_DUE_TO_MBO_ASSOC_DISALLOW_IND = 3;
     private static final long NUM_CONNECT_TO_MBO_SUPPORTED_NETWORKS = 4;
     private static final long NUM_CONNECT_TO_OCE_SUPPORTED_NETWORKS = 3;
     private static final long NUM_FORCE_SCAN_DUE_TO_STEERING_REQUEST = 2;
     private static final long NUM_MBO_CELLULAR_SWITCH_REQUEST = 3;
+    private static final long NUM_STEERING_REQUEST_INCLUDING_MBO_ASSOC_RETRY_DELAY = 3;
     private static final long NUM_CONNECT_REQUEST_WITH_FILS_AKM = 4;
     private static final long NUM_L2_CONNECTION_THROUGH_FILS_AUTHENTICATION = 3;
 
     public static final int FEATURE_MBO = 1 << 0;
     public static final int FEATURE_MBO_CELL_DATA_AWARE = 1 << 1;
     public static final int FEATURE_OCE = 1 << 2;
+    public static final int FEATURE_11AX = 1 << 3;
+    public static final int FEATURE_6G = 1 << 4;
 
     private ScanDetail buildMockScanDetail(boolean hidden, NetworkDetail.HSRelease hSRelease,
             String capabilities, int supportedFeatures) {
@@ -497,6 +511,13 @@
         if ((supportedFeatures & FEATURE_OCE) != 0) {
             when(mockNetworkDetail.isOceSupported()).thenReturn(true);
         }
+        if ((supportedFeatures & FEATURE_11AX) != 0) {
+            when(mockNetworkDetail.getWifiMode())
+                    .thenReturn(InformationElementUtil.WifiMode.MODE_11AX);
+        }
+        if ((supportedFeatures & FEATURE_6G) != 0) {
+            when(mockScanResult.is6GHz()).thenReturn(true);
+        }
         return mockScanDetail;
     }
 
@@ -546,16 +567,18 @@
     private List<ScanDetail> buildMockScanDetailList() {
         List<ScanDetail> mockScanDetails = new ArrayList<ScanDetail>();
         mockScanDetails.add(buildMockScanDetail(true, null, "[ESS]", 0));
-        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-PSK-CCMP][ESS]", 0));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-PSK-CCMP][ESS]", FEATURE_11AX));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]", 0));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-SAE-CCMP]", FEATURE_MBO));
-        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]", 0));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]",
+                FEATURE_11AX | FEATURE_6G));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WEP]", 0));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-SAE-CCMP]",
                 FEATURE_MBO | FEATURE_MBO_CELL_DATA_AWARE));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-OWE-CCMP]",
                 FEATURE_MBO | FEATURE_MBO_CELL_DATA_AWARE | FEATURE_OCE));
-        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-EAP-SUITE-B-192]", 0));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-EAP-SUITE-B-192]",
+                FEATURE_11AX | FEATURE_6G));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WAPI-WAPI-PSK-SMS4-SMS4]", 0));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WAPI-WAPI-CERT-SMS4-SMS4]", 0));
         mockScanDetails.add(buildMockScanDetail(false, null, "[WAPI-WAPI-CERT-SMS4-SMS4]", 0));
@@ -963,6 +986,9 @@
         for (int i = 0; i < NUM_MBO_CELLULAR_SWITCH_REQUEST; i++) {
             mWifiMetrics.incrementMboCellularSwitchRequestCount();
         }
+        for (int i = 0; i < NUM_STEERING_REQUEST_INCLUDING_MBO_ASSOC_RETRY_DELAY; i++) {
+            mWifiMetrics.incrementSteeringRequestCountIncludingMboAssocRetryDelay();
+        }
         for (int i = 0; i < NUM_CONNECT_REQUEST_WITH_FILS_AKM; i++) {
             mWifiMetrics.incrementConnectRequestWithFilsAkmCount();
         }
@@ -1206,6 +1232,10 @@
                 mDecodedProto.numOceSupportedNetworkScanResults);
         assertEquals(NUM_FILS_SUPPORTED_NETWORKS_SCAN_RESULTS * NUM_SCANS,
                 mDecodedProto.numFilsSupportedNetworkScanResults);
+        assertEquals(NUM_11AX_NETWORKS_SCAN_RESULTS * NUM_SCANS,
+                mDecodedProto.num11AxNetworkScanResults);
+        assertEquals(NUM_6G_NETWORKS_SCAN_RESULTS * NUM_SCANS,
+                mDecodedProto.num6GNetworkScanResults);
         assertEquals(NUM_SCANS,
                 mDecodedProto.numScans);
         assertEquals(NUM_CONNECTIVITY_ONESHOT_SCAN_EVENT,
@@ -1375,6 +1405,8 @@
                 mDecodedProto.numForceScanDueToSteeringRequest);
         assertEquals(NUM_MBO_CELLULAR_SWITCH_REQUEST,
                 mDecodedProto.numMboCellularSwitchRequest);
+        assertEquals(NUM_STEERING_REQUEST_INCLUDING_MBO_ASSOC_RETRY_DELAY,
+                mDecodedProto.numSteeringRequestIncludingMboAssocRetryDelay);
         assertEquals(NUM_CONNECT_REQUEST_WITH_FILS_AKM,
                 mDecodedProto.numConnectRequestWithFilsAkm);
         assertEquals(NUM_L2_CONNECTION_THROUGH_FILS_AUTHENTICATION,
@@ -2623,10 +2655,13 @@
     }
 
     /**
-     * Check max supported link speed
+     * Check max supported link speed and consecutive connection failure count
      */
     @Test
-    public void testConnectionMaxSupportedLinkSpeed() throws Exception {
+    public void testConnectionMaxSupportedLinkSpeedConsecutiveFailureCnt() throws Exception {
+        mWifiMetrics.setScreenState(true);
+        when(mNetworkConnectionStats.getCount(WifiScoreCard.CNT_CONSECUTIVE_CONNECTION_FAILURE))
+                .thenReturn(2);
         mWifiMetrics.startConnectionEvent(mTestWifiConfig, "TestNetwork",
                 WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
         mWifiMetrics.setConnectionMaxSupportedLinkSpeedMbps(MAX_SUPPORTED_TX_LINK_SPEED_MBPS,
@@ -2640,6 +2675,8 @@
                 .routerFingerprint.maxSupportedTxLinkSpeedMbps);
         assertEquals(MAX_SUPPORTED_RX_LINK_SPEED_MBPS, mDecodedProto.connectionEvent[0]
                 .routerFingerprint.maxSupportedRxLinkSpeedMbps);
+        assertEquals(2, mDecodedProto.connectionEvent[0].numConsecutiveConnectionFailure);
+        assertEquals(true, mDecodedProto.connectionEvent[0].screenOn);
     }
 
     /**
@@ -2759,6 +2796,7 @@
 
     private WifiConfiguration createComplexWifiConfig() {
         WifiConfiguration config = new WifiConfiguration();
+        config.SSID = SSID;
         config.allowedKeyManagement = intToBitSet(TEST_ALLOWED_KEY_MANAGEMENT);
         config.allowedProtocols = intToBitSet(TEST_ALLOWED_PROTOCOLS);
         config.allowedAuthAlgorithms = intToBitSet(TEST_ALLOWED_AUTH_ALGORITHMS);
@@ -4564,4 +4602,82 @@
                 mDecodedProto.softApConfigLimitationMetrics.maxClientSettingWhenReachHistogram);
     }
 
+    /**
+     * Test the logging of channel utilization
+     */
+    @Test
+    public void testChannelUtilization() throws Exception {
+        mWifiMetrics.incrementChannelUtilizationCount(180, 2412);
+        mWifiMetrics.incrementChannelUtilizationCount(150, 2412);
+        mWifiMetrics.incrementChannelUtilizationCount(230, 2412);
+        mWifiMetrics.incrementChannelUtilizationCount(20, 5510);
+        mWifiMetrics.incrementChannelUtilizationCount(50, 5510);
+
+        dumpProtoAndDeserialize();
+
+        HistogramBucketInt32[] expected2GHistogram = {
+                buildHistogramBucketInt32(150, 175, 1),
+                buildHistogramBucketInt32(175, 200, 1),
+                buildHistogramBucketInt32(225, Integer.MAX_VALUE, 1),
+        };
+
+        HistogramBucketInt32[] expectedAbove2GHistogram = {
+                buildHistogramBucketInt32(Integer.MIN_VALUE, 25, 1),
+                buildHistogramBucketInt32(50, 75, 1),
+        };
+
+        assertHistogramBucketsEqual(expected2GHistogram,
+                mDecodedProto.channelUtilizationHistogram.utilization2G);
+        assertHistogramBucketsEqual(expectedAbove2GHistogram,
+                mDecodedProto.channelUtilizationHistogram.utilizationAbove2G);
+    }
+
+    /**
+     * Test the logging of Tx and Rx throughput
+     */
+    @Test
+    public void testThroughput() throws Exception {
+        mWifiMetrics.incrementThroughputKbpsCount(500, 800, 2412);
+        mWifiMetrics.incrementThroughputKbpsCount(5_000, 4_000, 2412);
+        mWifiMetrics.incrementThroughputKbpsCount(54_000, 48_000, 2412);
+        mWifiMetrics.incrementThroughputKbpsCount(50_000, 49_000, 5510);
+        mWifiMetrics.incrementThroughputKbpsCount(801_000, 790_000, 5510);
+        mWifiMetrics.incrementThroughputKbpsCount(1100_000, 1200_000, 5510);
+        mWifiMetrics.incrementThroughputKbpsCount(1599_000, 1800_000, 6120);
+        dumpProtoAndDeserialize();
+
+        HistogramBucketInt32[] expectedTx2GHistogramMbps = {
+                buildHistogramBucketInt32(Integer.MIN_VALUE, 1, 1),
+                buildHistogramBucketInt32(5, 10, 1),
+                buildHistogramBucketInt32(50, 100, 1),
+        };
+
+        HistogramBucketInt32[] expectedRx2GHistogramMbps = {
+                buildHistogramBucketInt32(Integer.MIN_VALUE, 1, 1),
+                buildHistogramBucketInt32(1, 5, 1),
+                buildHistogramBucketInt32(25, 50, 1),
+        };
+
+        HistogramBucketInt32[] expectedTxAbove2GHistogramMbps = {
+                buildHistogramBucketInt32(50, 100, 1),
+                buildHistogramBucketInt32(800, 1200, 2),
+                buildHistogramBucketInt32(1200, 1600, 1),
+        };
+
+        HistogramBucketInt32[] expectedRxAbove2GHistogramMbps = {
+                buildHistogramBucketInt32(25, 50, 1),
+                buildHistogramBucketInt32(600, 800, 1),
+                buildHistogramBucketInt32(1200, 1600, 1),
+                buildHistogramBucketInt32(1600, Integer.MAX_VALUE, 1),
+        };
+
+        assertHistogramBucketsEqual(expectedTx2GHistogramMbps,
+                mDecodedProto.throughputMbpsHistogram.tx2G);
+        assertHistogramBucketsEqual(expectedTxAbove2GHistogramMbps,
+                mDecodedProto.throughputMbpsHistogram.txAbove2G);
+        assertHistogramBucketsEqual(expectedRx2GHistogramMbps,
+                mDecodedProto.throughputMbpsHistogram.rx2G);
+        assertHistogramBucketsEqual(expectedRxAbove2GHistogramMbps,
+                mDecodedProto.throughputMbpsHistogram.rxAbove2G);
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMonitorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMonitorTest.java
index 6652e9b..24bb968 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiMonitorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiMonitorTest.java
@@ -39,7 +39,6 @@
 import com.android.server.wifi.MboOceController.BtmFrameData;
 import com.android.server.wifi.hotspot2.AnqpEvent;
 import com.android.server.wifi.hotspot2.IconEvent;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -264,8 +263,8 @@
         ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
         verify(mHandlerSpy).handleMessage(messageCaptor.capture());
         assertEquals(WifiMonitor.SUP_REQUEST_SIM_AUTH, messageCaptor.getValue().what);
-        TelephonyUtil.SimAuthRequestData authData =
-                (TelephonyUtil.SimAuthRequestData) messageCaptor.getValue().obj;
+        WifiCarrierInfoManager.SimAuthRequestData authData =
+                (WifiCarrierInfoManager.SimAuthRequestData) messageCaptor.getValue().obj;
         assertEquals(networkId, authData.networkId);
         assertEquals(ssid, authData.ssid);
         assertEquals(WifiEnterpriseConfig.Eap.SIM, authData.protocol);
@@ -288,8 +287,8 @@
         ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
         verify(mHandlerSpy).handleMessage(messageCaptor.capture());
         assertEquals(WifiMonitor.SUP_REQUEST_SIM_AUTH, messageCaptor.getValue().what);
-        TelephonyUtil.SimAuthRequestData authData =
-                (TelephonyUtil.SimAuthRequestData) messageCaptor.getValue().obj;
+        WifiCarrierInfoManager.SimAuthRequestData authData =
+                (WifiCarrierInfoManager.SimAuthRequestData) messageCaptor.getValue().obj;
         assertEquals(networkId, authData.networkId);
         assertEquals(ssid, authData.ssid);
         assertEquals(WifiEnterpriseConfig.Eap.AKA, authData.protocol);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java
index e2a2337..7d76eac 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java
@@ -22,7 +22,6 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
@@ -120,7 +119,7 @@
                 mWifiVendorHalRadioModeChangeHandlerCaptor.capture());
         when(mWifiVendorHal.isVendorHalSupported()).thenReturn(true);
         when(mWifiVendorHal.startVendorHal()).thenReturn(true);
-        when(mWifiVendorHal.createStaIface(anyBoolean(), any())).thenReturn(IFACE_NAME_0);
+        when(mWifiVendorHal.createStaIface(any())).thenReturn(IFACE_NAME_0);
         when(mWifiVendorHal.createApIface(any())).thenReturn(IFACE_NAME_0);
         when(mWifiVendorHal.removeStaIface(any())).thenReturn(true);
         when(mWifiVendorHal.removeApIface(any())).thenReturn(true);
@@ -466,12 +465,11 @@
         // Trigger the AP interface teardown when STA interface is created.
         // The iface name will remain the same.
         doAnswer(new MockAnswerUtil.AnswerWithArguments() {
-            public String answer(boolean lowPrioritySta,
-                    InterfaceDestroyedListener destroyedListener) {
+            public String answer(InterfaceDestroyedListener destroyedListener) {
                 mIfaceDestroyedListenerCaptor0.getValue().onDestroyed(IFACE_NAME_0);
                 return IFACE_NAME_0;
             }
-        }).when(mWifiVendorHal).createStaIface(anyBoolean(), any());
+        }).when(mWifiVendorHal).createStaIface(any());
 
         assertEquals(IFACE_NAME_0,
                 mWifiNative.setupInterfaceForClientInConnectivityMode(mIfaceCallback1));
@@ -482,7 +480,7 @@
         mInOrder.verify(mSupplicantStaIfaceHal).isInitializationComplete();
         mInOrder.verify(mSupplicantStaIfaceHal).registerDeathHandler(any());
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
-        mInOrder.verify(mWifiVendorHal).createStaIface(eq(false),
+        mInOrder.verify(mWifiVendorHal).createStaIface(
                 mIfaceDestroyedListenerCaptor1.capture());
         // Creation of STA interface should trigger the AP interface destroy.
         validateOnDestroyedSoftApInterface(
@@ -848,7 +846,7 @@
      */
     @Test
     public void testSetupClientInterfaceFailureInHalCreateStaIface() throws Exception {
-        when(mWifiVendorHal.createStaIface(anyBoolean(), any())).thenReturn(null);
+        when(mWifiVendorHal.createStaIface(any())).thenReturn(null);
         assertNull(mWifiNative.setupInterfaceForClientInConnectivityMode(mIfaceCallback0));
 
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
@@ -859,7 +857,7 @@
         mInOrder.verify(mSupplicantStaIfaceHal).isInitializationComplete();
         mInOrder.verify(mSupplicantStaIfaceHal).registerDeathHandler(any());
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
-        mInOrder.verify(mWifiVendorHal).createStaIface(eq(false), any());
+        mInOrder.verify(mWifiVendorHal).createStaIface(any());
         mInOrder.verify(mWifiMetrics).incrementNumSetupClientInterfaceFailureDueToHal();
 
         // To test if the failure is handled cleanly, invoke teardown and ensure that
@@ -886,7 +884,7 @@
         mInOrder.verify(mSupplicantStaIfaceHal).isInitializationComplete();
         mInOrder.verify(mSupplicantStaIfaceHal).registerDeathHandler(any());
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
-        mInOrder.verify(mWifiVendorHal).createStaIface(eq(false),
+        mInOrder.verify(mWifiVendorHal).createStaIface(
                 mIfaceDestroyedListenerCaptor0.capture());
         mInOrder.verify(mWificondControl).setupInterfaceForClientMode(any(), any(), any(), any());
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
@@ -920,7 +918,7 @@
         mInOrder.verify(mSupplicantStaIfaceHal).isInitializationComplete();
         mInOrder.verify(mSupplicantStaIfaceHal).registerDeathHandler(any());
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
-        mInOrder.verify(mWifiVendorHal).createStaIface(eq(false),
+        mInOrder.verify(mWifiVendorHal).createStaIface(
                 mIfaceDestroyedListenerCaptor0.capture());
         mInOrder.verify(mWificondControl).setupInterfaceForClientMode(any(), any(), any(), any());
         mInOrder.verify(mSupplicantStaIfaceHal).setupIface(any());
@@ -1332,7 +1330,7 @@
             String ifaceName, @Mock WifiNative.InterfaceCallback callback,
             ArgumentCaptor<InterfaceDestroyedListener> destroyedListenerCaptor,
             ArgumentCaptor<NetdEventObserver> networkObserverCaptor) throws Exception {
-        when(mWifiVendorHal.createStaIface(anyBoolean(), any())).thenReturn(ifaceName);
+        when(mWifiVendorHal.createStaIface(any())).thenReturn(ifaceName);
         assertEquals(ifaceName, mWifiNative.setupInterfaceForClientInConnectivityMode(callback));
 
         validateSetupClientInterface(
@@ -1356,7 +1354,7 @@
             mInOrder.verify(mSupplicantStaIfaceHal).registerDeathHandler(any());
         }
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
-        mInOrder.verify(mWifiVendorHal).createStaIface(eq(false),
+        mInOrder.verify(mWifiVendorHal).createStaIface(
                 destroyedListenerCaptor.capture());
         mInOrder.verify(mWificondControl).setupInterfaceForClientMode(eq(ifaceName), any(), any(),
                 any());
@@ -1417,7 +1415,7 @@
             String ifaceName, @Mock WifiNative.InterfaceCallback callback,
             ArgumentCaptor<InterfaceDestroyedListener> destroyedListenerCaptor,
             ArgumentCaptor<NetdEventObserver> networkObserverCaptor) throws Exception {
-        when(mWifiVendorHal.createStaIface(anyBoolean(), any())).thenReturn(ifaceName);
+        when(mWifiVendorHal.createStaIface(any())).thenReturn(ifaceName);
         assertEquals(ifaceName, mWifiNative.setupInterfaceForClientInScanMode(callback));
 
         validateSetupClientInterfaceForScan(
@@ -1434,7 +1432,7 @@
             mInOrder.verify(mWifiVendorHal).startVendorHal();
         }
         mInOrder.verify(mWifiVendorHal).isVendorHalSupported();
-        mInOrder.verify(mWifiVendorHal).createStaIface(eq(false),
+        mInOrder.verify(mWifiVendorHal).createStaIface(
                 destroyedListenerCaptor.capture());
         mInOrder.verify(mWificondControl).setupInterfaceForClientMode(eq(ifaceName), any(), any(),
                 any());
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
index f82c13f..07532fd 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
@@ -248,7 +248,7 @@
         when(mWifiVendorHal.startVendorHal()).thenReturn(true);
         when(mWifiVendorHal.startVendorHalSta()).thenReturn(true);
         when(mWifiVendorHal.startVendorHalAp()).thenReturn(true);
-        when(mWifiVendorHal.createStaIface(anyBoolean(), any())).thenReturn(WIFI_IFACE_NAME);
+        when(mWifiVendorHal.createStaIface(any())).thenReturn(WIFI_IFACE_NAME);
 
         when(mWificondControl.setupInterfaceForClientMode(any(), any(), any(), any())).thenReturn(
                 true);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java
index afa9ffd..b495b49 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java
@@ -1579,6 +1579,36 @@
     }
 
     /**
+     * Verify handling of request release after starting connection to the network.
+     */
+    @Test
+    public void testHandleNetworkReleaseWithSpecifierAfterConnectionStart() throws Exception {
+        sendNetworkRequestAndSetupForConnectionStatus();
+
+        assertNotNull(mSelectedNetwork);
+
+        // Now release the network request.
+        WifiConfiguration wcmNetwork = new WifiConfiguration(mSelectedNetwork);
+        wcmNetwork.networkId = TEST_NETWORK_ID_1;
+        wcmNetwork.creatorUid = TEST_UID_1;
+        wcmNetwork.creatorName = TEST_PACKAGE_NAME_1;
+        wcmNetwork.shared = false;
+        wcmNetwork.fromWifiNetworkSpecifier = true;
+        wcmNetwork.ephemeral = true;
+        when(mWifiConfigManager.getConfiguredNetwork(wcmNetwork.getKey()))
+                .thenReturn(wcmNetwork);
+        mWifiNetworkFactory.releaseNetworkFor(mNetworkRequest);
+        // verify we canceled the timeout alarm.
+        verify(mAlarmManager).cancel(mConnectionTimeoutAlarmListenerArgumentCaptor.getValue());
+        // Verify that we triggered a disconnect.
+        verify(mClientModeImpl, times(2)).disconnectCommand();
+        verify(mWifiConfigManager).removeNetwork(
+                TEST_NETWORK_ID_1, TEST_UID_1, TEST_PACKAGE_NAME_1);
+        // Re-enable connectivity manager .
+        verify(mWifiConnectivityManager).setSpecificNetworkRequestInProgress(false);
+    }
+
+    /**
      * Verify handling of request release after connecting to the network.
      */
     @Test
@@ -1601,9 +1631,10 @@
         wcmNetwork.networkId = TEST_NETWORK_ID_1;
         wcmNetwork.creatorUid = TEST_UID_1;
         wcmNetwork.creatorName = TEST_PACKAGE_NAME_1;
+        wcmNetwork.shared = false;
         wcmNetwork.fromWifiNetworkSpecifier = true;
         wcmNetwork.ephemeral = true;
-        when(mWifiConfigManager.getConfiguredNetwork(mSelectedNetwork.getKey()))
+        when(mWifiConfigManager.getConfiguredNetwork(wcmNetwork.getKey()))
                 .thenReturn(wcmNetwork);
         mWifiNetworkFactory.releaseNetworkFor(mNetworkRequest);
         // Verify that we triggered a disconnect.
@@ -2510,6 +2541,54 @@
 
     /**
      * Verify the user approval bypass for a specific request for an access point that was already
+     * approved previously via shell command and the scan result is present in the cached scan
+     * results.
+     */
+    @Test
+    public void
+            testNetworkSpecifierMatchSuccessUsingLiteralSsidAndBssidMatchApprovedViaShellWithCache()
+            throws Exception {
+        // Setup scan data for WPA-PSK networks.
+        setupScanData(SCAN_RESULT_TYPE_WPA_PSK,
+                TEST_SSID_1, TEST_SSID_2, TEST_SSID_3, TEST_SSID_4);
+
+        // Choose the matching scan result.
+        ScanResult matchingScanResult = mTestScanDatas[0].getResults()[0];
+
+        // Setup shell approval for the scan result.
+        mWifiNetworkFactory.setUserApprovedApp(TEST_PACKAGE_NAME_1, true);
+
+        // simulate no cache expiry
+        when(mClock.getElapsedSinceBootMillis()).thenReturn(0L);
+        // Simulate the cached results matching.
+        when(mWifiScanner.getSingleScanResults())
+                .thenReturn(Arrays.asList(mTestScanDatas[0].getResults()));
+
+        PatternMatcher ssidPatternMatch =
+                new PatternMatcher(TEST_SSID_1, PatternMatcher.PATTERN_LITERAL);
+        Pair<MacAddress, MacAddress> bssidPatternMatch =
+                Pair.create(MacAddress.fromString(matchingScanResult.BSSID),
+                        MacAddress.BROADCAST_ADDRESS);
+        attachWifiNetworkSpecifierAndAppInfo(
+                ssidPatternMatch, bssidPatternMatch,
+                WifiConfigurationTestUtil.createPskNetwork(), TEST_UID_1, TEST_PACKAGE_NAME_1);
+        mWifiNetworkFactory.needNetworkFor(mNetworkRequest, 0);
+
+        // Verify we did not trigger the UI for the second request.
+        verify(mContext, never()).startActivityAsUser(any(), any());
+        // Verify we did not trigger a scan.
+        verify(mWifiScanner, never()).startScan(any(), any(), any(), any());
+        // Verify we did not trigger the match callback.
+        verify(mNetworkRequestMatchCallback, never()).onMatch(anyList());
+        // Verify that we sent a connection attempt to ClientModeImpl
+        verify(mClientModeImpl).connect(eq(null), anyInt(),
+                any(Binder.class), mConnectListenerArgumentCaptor.capture(), anyInt(), anyInt());
+
+        verify(mWifiMetrics).incrementNetworkRequestApiNumUserApprovalBypass();
+    }
+
+    /**
+     * Verify the user approval bypass for a specific request for an access point that was already
      * approved previously and the scan result is present in the cached scan results, but the
      * results are stale.
      */
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java
index f26ceb6..3899453 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java
@@ -18,6 +18,7 @@
 
 import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
 import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE;
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
 import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.app.AppOpsManager.MODE_IGNORED;
 import static android.app.AppOpsManager.OPSTR_CHANGE_WIFI_STATE;
@@ -25,9 +26,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
 import static com.android.server.wifi.WifiNetworkSuggestionsManager.NOTIFICATION_USER_ALLOWED_APP_INTENT_ACTION;
-import static com.android.server.wifi.WifiNetworkSuggestionsManager.NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION;
 import static com.android.server.wifi.WifiNetworkSuggestionsManager.NOTIFICATION_USER_DISALLOWED_APP_INTENT_ACTION;
-import static com.android.server.wifi.WifiNetworkSuggestionsManager.NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION;
 import static com.android.server.wifi.WifiNetworkSuggestionsManager.NOTIFICATION_USER_DISMISSED_INTENT_ACTION;
 
 import static org.junit.Assert.assertEquals;
@@ -50,6 +49,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.net.NetworkScoreManager;
 import android.net.util.MacAddressUtils;
 import android.net.wifi.EAPConstants;
 import android.net.wifi.ISuggestionConnectionStatusListener;
@@ -78,7 +78,6 @@
 import com.android.server.wifi.WifiNetworkSuggestionsManager.PerAppInfo;
 import com.android.server.wifi.hotspot2.PasspointManager;
 import com.android.server.wifi.util.LruConnectionTracker;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
 
@@ -106,6 +105,7 @@
  */
 @SmallTest
 public class WifiNetworkSuggestionsManagerTest extends WifiBaseTest {
+
     private static final String TEST_PACKAGE_1 = "com.test12345";
     private static final String TEST_PACKAGE_2 = "com.test54321";
     private static final String TEST_APP_NAME_1 = "test12345";
@@ -124,10 +124,11 @@
     private static final int TEST_NETWORK_ID = 110;
     private static final int TEST_CARRIER_ID = 1911;
 
-    private @Mock Context mContext;
+    private @Mock WifiContext mContext;
     private @Mock Resources mResources;
     private @Mock AppOpsManager mAppOpsManager;
     private @Mock NotificationManager mNotificationManger;
+    private @Mock NetworkScoreManager mNetworkScoreManager;
     private @Mock PackageManager mPackageManager;
     private @Mock WifiPermissionsUtil mWifiPermissionsUtil;
     private @Mock WifiInjector mWifiInjector;
@@ -135,9 +136,8 @@
     private @Mock WifiConfigStore mWifiConfigStore;
     private @Mock WifiConfigManager mWifiConfigManager;
     private @Mock NetworkSuggestionStoreData mNetworkSuggestionStoreData;
-    private @Mock ImsiPrivacyProtectionExemptionStoreData mImsiPrivacyProtectionExemptionStoreData;
     private @Mock WifiMetrics mWifiMetrics;
-    private @Mock TelephonyUtil mTelephonyUtil;
+    private @Mock WifiCarrierInfoManager mWifiCarrierInfoManager;
     private @Mock PasspointManager mPasspointManager;
     private @Mock ISuggestionConnectionStatusListener mListener;
     private @Mock IBinder mBinder;
@@ -154,12 +154,14 @@
             ArgumentCaptor.forClass(AppOpsManager.OnOpChangedListener.class);
     private ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor =
             ArgumentCaptor.forClass(BroadcastReceiver.class);
+    private ArgumentCaptor<WifiCarrierInfoManager.OnUserApproveCarrierListener>
+            mUserApproveCarrierListenerArgumentCaptor = ArgumentCaptor.forClass(
+            WifiCarrierInfoManager.OnUserApproveCarrierListener.class);
 
     private InOrder mInorder;
 
     private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
     private NetworkSuggestionStoreData.DataSource mDataSource;
-    private ImsiPrivacyProtectionExemptionStoreData.DataSource mImsiDataSource;
 
     /**
      * Setup the mocks.
@@ -173,8 +175,6 @@
 
         when(mWifiInjector.makeNetworkSuggestionStoreData(any()))
                 .thenReturn(mNetworkSuggestionStoreData);
-        when(mWifiInjector.makeImsiProtectionExemptionStoreData(any()))
-                .thenReturn(mImsiPrivacyProtectionExemptionStoreData);
         when(mWifiInjector.getFrameworkFacade()).thenReturn(mFrameworkFacade);
         when(mWifiInjector.getPasspointManager()).thenReturn(mPasspointManager);
         when(mWifiInjector.getWifiScoreCard()).thenReturn(mWifiScoreCard);
@@ -206,10 +206,12 @@
         when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
         when(mContext.getSystemService(Context.NOTIFICATION_SERVICE))
                 .thenReturn(mNotificationManger);
+        when(mContext.getSystemService(NetworkScoreManager.class)).thenReturn(mNetworkScoreManager);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getSystemService(ActivityManager.class)).thenReturn(mActivityManager);
         when(mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                 .thenReturn(mock(LayoutInflater.class));
+        when(mContext.getWifiOverlayApkPkgName()).thenReturn("test.com.android.wifi.resources");
         when(mActivityManager.isLowRamDevice()).thenReturn(false);
         when(mActivityManager.getPackageImportance(any())).thenReturn(
                 IMPORTANCE_FOREGROUND_SERVICE);
@@ -224,30 +226,6 @@
         when(mResources.getText(eq(R.string.wifi_suggestion_action_disallow_app)))
                 .thenReturn("blah");
 
-        // setup resource strings for IMSI protection notification.
-        when(mResources.getString(eq(R.string.wifi_suggestion_imsi_privacy_title), anyString()))
-                .thenAnswer(s -> "blah" + s.getArguments()[1]);
-        when(mResources.getString(eq(R.string.wifi_suggestion_imsi_privacy_content)))
-                .thenReturn("blah");
-        when(mResources.getText(
-                eq(R.string.wifi_suggestion_action_allow_imsi_privacy_exemption_carrier)))
-                .thenReturn("blah");
-        when(mResources.getText(
-                eq(R.string.wifi_suggestion_action_disallow_imsi_privacy_exemption_carrier)))
-                .thenReturn("blah");
-        when(mResources.getString(
-                eq(R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_title)))
-                .thenReturn("blah");
-        when(mResources.getString(
-                eq(R.string.wifi_suggestion_imsi_privacy_exemption_confirmation_content),
-                anyString())).thenAnswer(s -> "blah" + s.getArguments()[1]);
-        when(mResources.getText(
-                eq(R.string.wifi_suggestion_action_allow_imsi_privacy_exemption_confirmation)))
-                .thenReturn("blah");
-        when(mResources.getText(
-                eq(R.string.wifi_suggestion_action_disallow_imsi_privacy_exemption_confirmation)))
-                .thenReturn("blah");
-
 
         // Our app Info. Needed for notification builder.
         ApplicationInfo ourAppInfo = new ApplicationInfo();
@@ -261,7 +239,7 @@
         when(mPackageManager.getApplicationInfoAsUser(eq(TEST_PACKAGE_2), eq(0), any()))
             .thenReturn(appInfO2);
         when(mPackageManager.getApplicationLabel(appInfO2)).thenReturn(TEST_APP_NAME_2);
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(any())).thenReturn(
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(any())).thenReturn(
                 TelephonyManager.UNKNOWN_CARRIER_ID);
 
         when(mWifiKeyStore.updateNetworkKeys(any(), any())).thenReturn(true);
@@ -269,7 +247,8 @@
         mWifiNetworkSuggestionsManager =
                 new WifiNetworkSuggestionsManager(mContext, new Handler(mLooper.getLooper()),
                         mWifiInjector, mWifiPermissionsUtil, mWifiConfigManager, mWifiConfigStore,
-                        mWifiMetrics, mTelephonyUtil, mWifiKeyStore, mLruConnectionTracker);
+                        mWifiMetrics, mWifiCarrierInfoManager, mWifiKeyStore,
+                        mLruConnectionTracker);
         verify(mContext).getResources();
         verify(mContext).getSystemService(Context.APP_OPS_SERVICE);
         verify(mContext).getSystemService(Context.NOTIFICATION_SERVICE);
@@ -283,13 +262,8 @@
         mDataSource = dataSourceArgumentCaptor.getValue();
         assertNotNull(mDataSource);
 
-        ArgumentCaptor<ImsiPrivacyProtectionExemptionStoreData.DataSource>
-                imsiDataSourceArgumentCaptor =
-                ArgumentCaptor.forClass(ImsiPrivacyProtectionExemptionStoreData.DataSource.class);
-        verify(mWifiInjector).makeImsiProtectionExemptionStoreData(imsiDataSourceArgumentCaptor
-                .capture());
-        mImsiDataSource = imsiDataSourceArgumentCaptor.getValue();
-        assertNotNull(mImsiDataSource);
+        verify(mWifiCarrierInfoManager).addImsiExemptionUserApprovalListener(
+                mUserApproveCarrierListenerArgumentCaptor.capture());
 
         mWifiNetworkSuggestionsManager.enableVerboseLogging(1);
     }
@@ -515,7 +489,7 @@
      * Verify that modify networks that are already active is allowed.
      */
     @Test
-    public void testAddNetworkSuggestionsSuccessOnInPlaceModification() {
+    public void testAddNetworkSuggestionsSuccessOnInPlaceModificationWhenNotInWcm() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
                 WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
@@ -527,7 +501,15 @@
                 mWifiNetworkSuggestionsManager.add(networkSuggestionList1, TEST_UID_1,
                         TEST_PACKAGE_1, TEST_FEATURE));
 
-        // Modify the original suggestion.
+        // Assert that the original config was not metered.
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
+                networkSuggestion.wifiConfiguration.meteredOverride);
+
+        // Nothing in WCM.
+        when(mWifiConfigManager.getConfiguredNetwork(networkSuggestion.wifiConfiguration.getKey()))
+                .thenReturn(null);
+
+        // Modify the original suggestion to mark it metered.
         networkSuggestion.wifiConfiguration.meteredOverride =
                 WifiConfiguration.METERED_OVERRIDE_METERED;
 
@@ -538,6 +520,61 @@
         assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
                 mWifiNetworkSuggestionsManager
                         .get(TEST_PACKAGE_1).get(0).wifiConfiguration.meteredOverride);
+        // Verify we did not update config in WCM.
+        verify(mWifiConfigManager, never()).addOrUpdateNetwork(any(), anyInt(), any());
+    }
+
+    /**
+     * Verify that modify networks that are already active and is cached in WifiConfigManager is
+     * allowed and also updates the cache in WifiConfigManager.
+     */
+    @Test
+    public void testAddNetworkSuggestionsSuccessOnInPlaceModificationWhenInWcm() {
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList1 =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion);
+                }};
+
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList1, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+
+        // Assert that the original config was not metered.
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
+                networkSuggestion.wifiConfiguration.meteredOverride);
+
+        // Store the original WifiConfiguration from WifiConfigManager.
+        WifiConfiguration configInWcm =
+                new WifiConfiguration(networkSuggestion.wifiConfiguration);
+        configInWcm.creatorUid = TEST_UID_1;
+        configInWcm.creatorName = TEST_PACKAGE_1;
+        configInWcm.fromWifiNetworkSuggestion = true;
+        setupGetConfiguredNetworksFromWcm(configInWcm);
+
+        // Modify the original suggestion to mark it metered.
+        networkSuggestion.wifiConfiguration.meteredOverride =
+                WifiConfiguration.METERED_OVERRIDE_METERED;
+
+        when(mWifiConfigManager.addOrUpdateNetwork(any(), eq(TEST_UID_1), eq(TEST_PACKAGE_1)))
+                .thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID));
+        // Replace attempt should success.
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList1, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
+                mWifiNetworkSuggestionsManager
+                        .get(TEST_PACKAGE_1).get(0).wifiConfiguration.meteredOverride);
+
+        // Verify we did update config in WCM.
+        ArgumentCaptor<WifiConfiguration> configCaptor =
+                ArgumentCaptor.forClass(WifiConfiguration.class);
+        verify(mWifiConfigManager).addOrUpdateNetwork(
+                configCaptor.capture(), eq(TEST_UID_1), eq(TEST_PACKAGE_1));
+        assertNotNull(configCaptor.getValue());
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
+                configCaptor.getValue().meteredOverride);
     }
 
     /**
@@ -649,6 +686,24 @@
     }
 
     /**
+     * Verify add or remove suggestion list with null object will result error code.
+     */
+    @Test
+    public void testAddRemoveNetworkSuggestionWithNullObject() {
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID,
+                mWifiNetworkSuggestionsManager.add(Collections.singletonList(null),
+                        TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE));
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(Collections.singletonList(networkSuggestion),
+                        TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE));
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID,
+                mWifiNetworkSuggestionsManager.remove(Collections.singletonList(null),
+                        TEST_UID_1, TEST_PACKAGE_1));
+    }
+
+    /**
      * Verify a successful lookup of a single network suggestion matching the provided scan detail.
      */
     @Test
@@ -1006,7 +1061,7 @@
         assertTrue(mWifiNetworkSuggestionsManager
                 .registerSuggestionConnectionStatusListener(mBinder, mListener,
                         NETWORK_CALLBACK_ID, TEST_PACKAGE_1));
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(TEST_CARRIER_ID);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
                 WifiConfigurationTestUtil.createPskNetwork(), null, true, false, true, true);
@@ -2568,6 +2623,50 @@
         validateUserApprovalNotification(TEST_APP_NAME_1);
     }
 
+    @Test
+    public void testAddNetworkSuggestions_activeFgScorer_doesNotRequestForApproval() {
+        // Fg app
+        when(mActivityManager.getPackageImportance(any())).thenReturn(IMPORTANCE_FOREGROUND);
+        // Active scorer
+        when(mNetworkScoreManager.getActiveScorerPackage()).thenReturn(TEST_PACKAGE_1);
+
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion);
+                }};
+
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+
+        verifyZeroInteractions(mAlertDialog);
+        verifyZeroInteractions(mNotificationManger);
+    }
+
+    @Test
+    public void testAddNetworkSuggestions_activeBgScorer_doesNotRequestForApproval() {
+        // Bg app
+        when(mActivityManager.getPackageImportance(any())).thenReturn(IMPORTANCE_SERVICE);
+        // Active scorer
+        when(mNetworkScoreManager.getActiveScorerPackage()).thenReturn(TEST_PACKAGE_1);
+
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion);
+                }};
+
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+
+        verifyZeroInteractions(mAlertDialog);
+        verifyZeroInteractions(mNotificationManger);
+    }
+
     /**
      * Verify handling of user clicking allow on the user approval notification when first time
      * add suggestions.
@@ -2602,6 +2701,26 @@
         verifyNoMoreInteractions(mNotificationManger);
     }
 
+    @Test
+    public void getNetworkSuggestionsForScanDetail_exemptsActiveScorerFromUserApproval() {
+        when(mNetworkScoreManager.getActiveScorerPackage()).thenReturn(TEST_PACKAGE_1);
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion);
+                }};
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+
+        mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail(
+                createScanDetailForNetwork(networkSuggestion.wifiConfiguration));
+
+        verifyZeroInteractions(mNotificationManger);
+        verifyZeroInteractions(mAlertDialog);
+    }
+
     /**
      * Verify handling of user clicking Disallow on the user approval notification when first time
      * add suggestions.
@@ -2734,18 +2853,6 @@
         assertEquals(expectedNetworkSuggestion, networkSuggestion);
     }
 
-    private void validateImsiProtectionNotification(String carrierName) {
-        verify(mNotificationManger, atLeastOnce()).notify(
-                eq(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE),
-                eq(mNotification));
-        ArgumentCaptor<CharSequence> contentCaptor =
-                ArgumentCaptor.forClass(CharSequence.class);
-        verify(mNotificationBuilder, atLeastOnce()).setContentTitle(contentCaptor.capture());
-        CharSequence content = contentCaptor.getValue();
-        assertNotNull(content);
-        assertTrue(content.toString().contains(carrierName));
-    }
-
     private void validateUserApprovalDialog(String... anyOfExpectedAppNames) {
         verify(mAlertDialog, atLeastOnce()).show();
         ArgumentCaptor<CharSequence> contentCaptor =
@@ -2789,16 +2896,6 @@
         mBroadcastReceiverCaptor.getValue().onReceive(mContext, intent);
     }
 
-    private void sendBroadcastForUserActionOnImsi(String action, String carrierName,
-            int carrierId) {
-        Intent intent = new Intent()
-                .setAction(action)
-                .putExtra(WifiNetworkSuggestionsManager.EXTRA_CARRIER_NAME, carrierName)
-                .putExtra(WifiNetworkSuggestionsManager.EXTRA_CARRIER_ID, carrierId);
-        assertNotNull(mBroadcastReceiverCaptor.getValue());
-        mBroadcastReceiverCaptor.getValue().onReceive(mContext, intent);
-    }
-
     @Test
     public void testAddSuggestionWithValidCarrierIdWithCarrierProvisionPermission() {
         WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
@@ -2898,6 +2995,30 @@
         assertNull(ewns);
     }
 
+    @Test
+    public void getNetworkSuggestionsForFqdn_activeScorer_doesNotRequestForUserApproval() {
+        when(mNetworkScoreManager.getActiveScorerPackage()).thenReturn(TEST_PACKAGE_1);
+        PasspointConfiguration passpointConfiguration =
+                createTestConfigWithUserCredential(TEST_FQDN, TEST_FRIENDLY_NAME);
+        WifiConfiguration dummyConfiguration = createDummyWifiConfigurationForPasspoint(TEST_FQDN);
+        dummyConfiguration.FQDN = TEST_FQDN;
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(dummyConfiguration,
+                passpointConfiguration, true, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList = Arrays.asList(networkSuggestion);
+        dummyConfiguration.creatorUid = TEST_UID_1;
+        when(mPasspointManager.addOrUpdateProvider(any(PasspointConfiguration.class),
+                anyInt(), anyString(), eq(true), eq(true))).thenReturn(true);
+        assertEquals(mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
+                TEST_PACKAGE_1, TEST_FEATURE), WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS);
+
+        Set<ExtendedWifiNetworkSuggestion> ewns =
+                mWifiNetworkSuggestionsManager.getNetworkSuggestionsForFqdn(TEST_FQDN);
+
+        assertEquals(1, ewns.size());
+        verifyZeroInteractions(mAlertDialog);
+        verifyZeroInteractions(mNotificationManger);
+    }
+
     /**
      * Verify return true when allow user manually connect and user approved the app
      */
@@ -2925,7 +3046,7 @@
         assertTrue(mWifiNetworkSuggestionsManager
                 .isPasspointSuggestionSharedWithUser(dummyConfiguration));
         dummyConfiguration.meteredHint = true;
-        when(mTelephonyUtil.isCarrierNetworkFromNonDefaultDataSim(dummyConfiguration))
+        when(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(dummyConfiguration))
                 .thenReturn(true);
         assertFalse(mWifiNetworkSuggestionsManager
                 .isPasspointSuggestionSharedWithUser(dummyConfiguration));
@@ -2963,6 +3084,7 @@
      *  - app without user approval will not be returned.
      *  - open network will not be returned.
      *  - suggestion doesn't allow user manually connect will not be return.
+     *  - Multiple duplicate ScanResults will only return single matched config.
      */
     @Test
     public void testGetWifiConfigForMatchedNetworkSuggestionsSharedWithUser() {
@@ -2977,19 +3099,25 @@
                 createScanDetailForNetwork(networkSuggestion1.wifiConfiguration).getScanResult());
         scanResults.add(
                 createScanDetailForNetwork(networkSuggestion2.wifiConfiguration).getScanResult());
-        scanResults.add(
-                createScanDetailForNetwork(networkSuggestion3.wifiConfiguration).getScanResult());
+
+        // Create two same ScanResult for networkSuggestion3
+        ScanResult scanResult1 = createScanDetailForNetwork(networkSuggestion3.wifiConfiguration)
+                .getScanResult();
+        ScanResult scanResult2 = new ScanResult(scanResult1);
+        scanResults.add(scanResult1);
+        scanResults.add(scanResult2);
+
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
                     add(networkSuggestion2);
                     add(networkSuggestion3);
                 }};
-        setupAddToWifiConfigManager(networkSuggestion1.wifiConfiguration,
-                networkSuggestion2.wifiConfiguration, networkSuggestion3.wifiConfiguration);
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
                 mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
                         TEST_PACKAGE_1, TEST_FEATURE));
+        setupGetConfiguredNetworksFromWcm(networkSuggestion1.wifiConfiguration,
+                networkSuggestion2.wifiConfiguration, networkSuggestion3.wifiConfiguration);
         // When app is not approved, empty list will be returned
         mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(false, TEST_PACKAGE_1);
         List<WifiConfiguration> wifiConfigurationList = mWifiNetworkSuggestionsManager
@@ -2999,6 +3127,7 @@
         mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(true, TEST_PACKAGE_1);
         wifiConfigurationList = mWifiNetworkSuggestionsManager
                 .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(scanResults);
+        assertEquals(1, wifiConfigurationList.size());
         assertEquals(networkSuggestion3.wifiConfiguration, wifiConfigurationList.get(0));
     }
 
@@ -3010,20 +3139,9 @@
         assertEquals(expectedSuggestions, actualSuggestions);
     }
 
-    private void setupAddToWifiConfigManager(WifiConfiguration...configs) {
+    private void setupGetConfiguredNetworksFromWcm(WifiConfiguration...configs) {
         for (int i = 0; i < configs.length; i++) {
             WifiConfiguration config = configs[i];
-            config.fromWifiNetworkSuggestion = true;
-            config.ephemeral = true;
-            // setup & verify the WifiConfigmanager interactions for adding/enabling the network.
-            when(mWifiConfigManager.addOrUpdateNetwork(
-                    eq(config), anyInt(), anyString()))
-                    .thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID + i));
-            when(mWifiConfigManager.updateNetworkSelectionStatus(eq(TEST_NETWORK_ID + i), anyInt()))
-                    .thenReturn(true);
-            config.networkId = TEST_NETWORK_ID + i;
-            when(mWifiConfigManager.getConfiguredNetwork(TEST_NETWORK_ID + i))
-                    .thenReturn(config);
             when(mWifiConfigManager.getConfiguredNetwork(config.getKey())).thenReturn(config);
         }
     }
@@ -3042,7 +3160,7 @@
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
                 .thenReturn(false);
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(TelephonyManager.UNKNOWN_CARRIER_ID);
         int status = mWifiNetworkSuggestionsManager
                 .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
@@ -3065,7 +3183,7 @@
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
                 .thenReturn(false);
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(VALID_CARRIER_ID);
         int status = mWifiNetworkSuggestionsManager
                 .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
@@ -3088,7 +3206,7 @@
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
                 .thenReturn(true);
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(TelephonyManager.UNKNOWN_CARRIER_ID);
         int status = mWifiNetworkSuggestionsManager
                 .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
@@ -3111,12 +3229,12 @@
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
                 .thenReturn(false);
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(VALID_CARRIER_ID);
-        when(mTelephonyUtil.getMatchingSubId(VALID_CARRIER_ID)).thenReturn(TEST_SUBID);
-        when(mTelephonyUtil.isSimPresent(TEST_SUBID)).thenReturn(true);
-        when(mTelephonyUtil.requiresImsiEncryption(TEST_SUBID)).thenReturn(true);
-        when(mTelephonyUtil.isImsiEncryptionInfoAvailable(TEST_SUBID)).thenReturn(true);
+        when(mWifiCarrierInfoManager.getMatchingSubId(VALID_CARRIER_ID)).thenReturn(TEST_SUBID);
+        when(mWifiCarrierInfoManager.isSimPresent(TEST_SUBID)).thenReturn(true);
+        when(mWifiCarrierInfoManager.requiresImsiEncryption(TEST_SUBID)).thenReturn(true);
+        when(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(TEST_SUBID)).thenReturn(true);
         ScanDetail scanDetail = createScanDetailForNetwork(config);
         int status = mWifiNetworkSuggestionsManager
                 .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
@@ -3147,13 +3265,13 @@
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
                 .thenReturn(false);
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(VALID_CARRIER_ID);
         int status = mWifiNetworkSuggestionsManager
                 .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, status);
         verify(mNotificationManger, never()).notify(anyInt(), any());
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(TelephonyManager.UNKNOWN_CARRIER_ID);
         mWifiNetworkSuggestionsManager.resetCarrierPrivilegedApps();
         assertEquals(0,  mWifiNetworkSuggestionsManager.get(TEST_PACKAGE_1).size());
@@ -3292,6 +3410,7 @@
         List<ScanResult> allSrList = new ArrayList<>() {{
                 add(passpointScanResult);
                 add(nonPasspointScanResult);
+                add(null);
                 }};
         when(mPasspointManager.getMatchingScanResults(eq(mockPasspoint), eq(allSrList)))
                 .thenReturn(ppSrList);
@@ -3387,15 +3506,20 @@
     }
 
     /**
-     * Test the IMSI protection notification and user click on the allow.
+     * Verify when matching a SIM-Based network without IMSI protection, framework will mark it
+     * auto-join disable and send notification. If user click on allow, will restore the auto-join
+     * config.
      */
     @Test
     public void testSendImsiProtectionNotificationOnUserAllowed() {
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
+        when(mWifiCarrierInfoManager.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
                 .thenReturn(TEST_CARRIER_ID);
-        when(mTelephonyUtil.getMatchingSubId(TEST_CARRIER_ID)).thenReturn(TEST_SUBID);
-        when(mTelephonyUtil.getCarrierNameforSubId(TEST_SUBID)).thenReturn(TEST_CARRIER_NAME);
-        when(mTelephonyUtil.requiresImsiEncryption(TEST_SUBID)).thenReturn(false);
+        when(mWifiCarrierInfoManager.getMatchingSubId(TEST_CARRIER_ID)).thenReturn(TEST_SUBID);
+        when(mWifiCarrierInfoManager.getCarrierNameforSubId(TEST_SUBID))
+                .thenReturn(TEST_CARRIER_NAME);
+        when(mWifiCarrierInfoManager.requiresImsiEncryption(TEST_SUBID)).thenReturn(false);
+        when(mWifiCarrierInfoManager.hasUserApprovedImsiPrivacyExemptionForCarrier(TEST_CARRIER_ID))
+                .thenReturn(false);
         WifiConfiguration eapSimConfig = WifiConfigurationTestUtil.createEapNetwork(
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
@@ -3410,33 +3534,19 @@
         verifyNoMoreInteractions(mNotificationManger);
         Set<ExtendedWifiNetworkSuggestion> matchedSuggestion = mWifiNetworkSuggestionsManager
                 .getNetworkSuggestionsForScanDetail(createScanDetailForNetwork(eapSimConfig));
-        validateImsiProtectionNotification(TEST_CARRIER_NAME);
+        verify(mWifiCarrierInfoManager)
+                .sendImsiProtectionExemptionNotificationIfRequired(TEST_CARRIER_ID);
         for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestion) {
             assertFalse(ewns.isAutojoinEnabled);
         }
-        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_ALLOWED_CARRIER_INTENT_ACTION,
-                TEST_CARRIER_NAME, TEST_CARRIER_ID);
-        verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
-        validateUserApprovalDialog(TEST_CARRIER_NAME);
 
-        // Simulate user clicking on allow in the dialog.
-        ArgumentCaptor<DialogInterface.OnClickListener> clickListenerCaptor =
-                ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
-        verify(mAlertDialogBuilder, atLeastOnce()).setPositiveButton(
-                any(), clickListenerCaptor.capture());
-        assertNotNull(clickListenerCaptor.getValue());
-        clickListenerCaptor.getValue().onClick(mAlertDialog, 0);
-        mLooper.dispatchAll();
-        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-        verify(mContext).sendBroadcast(intentCaptor.capture());
-        assertEquals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, intentCaptor.getValue().getAction());
-        verify(mWifiConfigManager, times(2)).saveToStore(true);
-        assertTrue(mImsiDataSource.hasNewDataToSerialize());
+        // Simulate user approved carrier
+        mUserApproveCarrierListenerArgumentCaptor.getValue().onUserAllowed(TEST_CARRIER_ID);
+        when(mWifiCarrierInfoManager.hasUserApprovedImsiPrivacyExemptionForCarrier(TEST_CARRIER_ID))
+                .thenReturn(true);
+
         matchedSuggestion = mWifiNetworkSuggestionsManager
                 .getNetworkSuggestionsForScanDetail(createScanDetailForNetwork(eapSimConfig));
-        verifyNoMoreInteractions(mNotificationManger);
-        assertTrue(mWifiNetworkSuggestionsManager
-                .hasUserApprovedImsiPrivacyExemptionForCarrier(TEST_CARRIER_ID));
 
         for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestion) {
             assertTrue(ewns.isAutojoinEnabled);
@@ -3444,84 +3554,6 @@
     }
 
     /**
-     * Test the IMSI protection notification and user click on the disallow.
-     */
-    @Test
-    public void testSendImsiProtectionNotificationOnUserDisallowed() {
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
-                .thenReturn(TEST_CARRIER_ID);
-        when(mTelephonyUtil.getMatchingSubId(TEST_CARRIER_ID)).thenReturn(TEST_SUBID);
-        when(mTelephonyUtil.getCarrierNameforSubId(TEST_SUBID)).thenReturn(TEST_CARRIER_NAME);
-        when(mTelephonyUtil.requiresImsiEncryption(TEST_SUBID)).thenReturn(false);
-        WifiConfiguration eapSimConfig = WifiConfigurationTestUtil.createEapNetwork(
-                WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
-        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                eapSimConfig, null, true, false, true, true);
-        List<WifiNetworkSuggestion> networkSuggestionList =
-                new ArrayList<WifiNetworkSuggestion>() {{
-                    add(networkSuggestion);
-                }};
-        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
-                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
-                        TEST_PACKAGE_1, TEST_FEATURE));
-        Set<ExtendedWifiNetworkSuggestion> matchedSuggestion = mWifiNetworkSuggestionsManager
-                .getNetworkSuggestionsForScanDetail(createScanDetailForNetwork(eapSimConfig));
-        validateImsiProtectionNotification(TEST_CARRIER_NAME);
-        for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestion) {
-            assertFalse(ewns.isAutojoinEnabled);
-        }
-        sendBroadcastForUserActionOnImsi(NOTIFICATION_USER_DISALLOWED_CARRIER_INTENT_ACTION,
-                TEST_CARRIER_NAME, TEST_CARRIER_ID);
-        verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE);
-
-        verify(mWifiConfigManager, times(2)).saveToStore(true);
-        assertTrue(mImsiDataSource.hasNewDataToSerialize());
-        matchedSuggestion = mWifiNetworkSuggestionsManager
-                .getNetworkSuggestionsForScanDetail(createScanDetailForNetwork(eapSimConfig));
-        verifyNoMoreInteractions(mNotificationManger);
-        assertFalse(mWifiNetworkSuggestionsManager
-                .hasUserApprovedImsiPrivacyExemptionForCarrier(TEST_CARRIER_ID));
-
-        for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestion) {
-            assertFalse(ewns.isAutojoinEnabled);
-        }
-    }
-
-    /**
-     * Test when carrier start to support IMSI protection, imsiExemptionMap will update too.
-     */
-    @Test
-    public void testUpdateImsiExemptionMapWhenCarrierFromWithoutProtectionToWithProtection() {
-        // Simulate user click on disallow before.
-        mWifiNetworkSuggestionsManager
-                .setHasUserApprovedImsiPrivacyExemptionForCarrier(false, TEST_CARRIER_ID);
-        verifyNoMoreInteractions(mNotificationManger);
-        // Now carrier upgrade to support Imsi protection
-        when(mTelephonyUtil.getCarrierIdForPackageWithCarrierPrivileges(TEST_PACKAGE_1))
-                .thenReturn(TEST_CARRIER_ID);
-        when(mTelephonyUtil.getMatchingSubId(TEST_CARRIER_ID)).thenReturn(TEST_SUBID);
-        when(mTelephonyUtil.requiresImsiEncryption(TEST_SUBID)).thenReturn(true);
-        WifiConfiguration eapSimConfig = WifiConfigurationTestUtil.createEapNetwork(
-                WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
-        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                eapSimConfig, null, true, false, true, true);
-        List<WifiNetworkSuggestion> networkSuggestionList =
-                new ArrayList<WifiNetworkSuggestion>() {{
-                    add(networkSuggestion);
-                }};
-        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
-                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
-                        TEST_PACKAGE_1, TEST_FEATURE));
-        Set<ExtendedWifiNetworkSuggestion> matchedSuggestion = mWifiNetworkSuggestionsManager
-                .getNetworkSuggestionsForScanDetail(createScanDetailForNetwork(eapSimConfig));
-        // Should be no more notification and suggestion restore to the initial auto join configure.
-        verifyNoMoreInteractions(mNotificationManger);
-        for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestion) {
-            assertTrue(ewns.isAutojoinEnabled);
-        }
-    }
-
-    /**
      * Verify adding invalid suggestions will return right error reason code.
      */
     @Test
@@ -3562,7 +3594,7 @@
     }
 
     /**
-     * Verify getAllPnoAvailableSuggestionNetworks will only return user approved,
+     * Verify getAllScanOptimizationSuggestionNetworks will only return user approved,
      * non-passpoint network.
      */
     @Test
@@ -3585,14 +3617,33 @@
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
                 mWifiNetworkSuggestionsManager
                         .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE));
-        assertTrue(mWifiNetworkSuggestionsManager.getAllPnoAvailableSuggestionNetworks().isEmpty());
+        assertTrue(mWifiNetworkSuggestionsManager
+                .getAllScanOptimizationSuggestionNetworks().isEmpty());
         mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(true, TEST_PACKAGE_1);
         List<WifiConfiguration> pnoNetwork =
-                mWifiNetworkSuggestionsManager.getAllPnoAvailableSuggestionNetworks();
+                mWifiNetworkSuggestionsManager.getAllScanOptimizationSuggestionNetworks();
         assertEquals(1, pnoNetwork.size());
         assertEquals(network1.SSID, pnoNetwork.get(0).SSID);
     }
 
+    @Test
+    public void getAllScanOptimizationSuggestionNetworks_returnsActiveScorerWithoutUserApproval() {
+        when(mNetworkScoreManager.getActiveScorerPackage()).thenReturn(TEST_PACKAGE_1);
+        WifiConfiguration network = WifiConfigurationTestUtil.createOpenNetwork();
+        WifiNetworkSuggestion networkSuggestion =
+                new WifiNetworkSuggestion(network, null, false, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList = Arrays.asList(networkSuggestion);
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager
+                        .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE));
+        mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(false, TEST_PACKAGE_1);
+
+        List<WifiConfiguration> networks =
+                mWifiNetworkSuggestionsManager.getAllScanOptimizationSuggestionNetworks();
+
+        assertEquals(1, networks.size());
+    }
+
     /**
      * Verify if a suggestion is mostRecently connected, flag will be persist.
      */
@@ -3624,6 +3675,32 @@
         verify(mLruConnectionTracker, never()).addNetwork(any());
     }
 
+    @Test
+    public void testOnSuggestionUpdateListener() {
+        WifiNetworkSuggestionsManager.OnSuggestionUpdateListener listener =
+                mock(WifiNetworkSuggestionsManager.OnSuggestionUpdateListener.class);
+        mWifiNetworkSuggestionsManager.addOnSuggestionUpdateListener(listener);
+
+        WifiConfiguration dummyConfiguration = createDummyWifiConfigurationForPasspoint(TEST_FQDN);
+        dummyConfiguration.FQDN = TEST_FQDN;
+        WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
+
+        List<WifiNetworkSuggestion> networkSuggestionList1 =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion1);
+                }};
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList1, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+        verify(listener).onSuggestionsAddedOrUpdated(networkSuggestionList1);
+
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.remove(networkSuggestionList1, TEST_UID_1,
+                        TEST_PACKAGE_1));
+        verify(listener).onSuggestionsRemoved(networkSuggestionList1);
+    }
+
     /**
      * Helper function for creating a test configuration with user credential.
      *
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScoreCardTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScoreCardTest.java
index e98b03a..498b18d 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiScoreCardTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiScoreCardTest.java
@@ -29,6 +29,7 @@
 import static com.android.server.wifi.WifiScoreCard.CNT_CONNECTION_ATTEMPT;
 import static com.android.server.wifi.WifiScoreCard.CNT_CONNECTION_DURATION_SEC;
 import static com.android.server.wifi.WifiScoreCard.CNT_CONNECTION_FAILURE;
+import static com.android.server.wifi.WifiScoreCard.CNT_CONSECUTIVE_CONNECTION_FAILURE;
 import static com.android.server.wifi.WifiScoreCard.CNT_DISCONNECTION_NONLOCAL;
 import static com.android.server.wifi.WifiScoreCard.CNT_SHORT_CONNECTION_NONLOCAL;
 import static com.android.server.wifi.util.NativeUtil.hexStringFromByteArray;
@@ -154,6 +155,7 @@
                 DeviceConfigFacade.DEFAULT_HEALTH_MONITOR_RATIO_THR_NUMERATOR);
         when(mDeviceConfigFacade.getHealthMonitorMinNumConnectionAttempt()).thenReturn(
                 DeviceConfigFacade.DEFAULT_HEALTH_MONITOR_MIN_NUM_CONNECTION_ATTEMPT);
+        when(mDeviceConfigFacade.getBugReportThresholdExtraRatio()).thenReturn(1);
         mWifiScoreCard.enableVerboseLogging(true);
     }
 
@@ -757,6 +759,7 @@
         assertEquals(0, dailyStats.getCount(CNT_ASSOCIATION_REJECTION));
         assertEquals(1, dailyStats.getCount(CNT_ASSOCIATION_TIMEOUT));
         assertEquals(0, dailyStats.getCount(CNT_AUTHENTICATION_FAILURE));
+        assertEquals(1, dailyStats.getCount(CNT_CONSECUTIVE_CONNECTION_FAILURE));
     }
 
     private void makeAuthFailureAndWrongPassword() {
@@ -793,6 +796,10 @@
         assertEquals(0, dailyStats.getCount(CNT_ASSOCIATION_REJECTION));
         assertEquals(0, dailyStats.getCount(CNT_ASSOCIATION_TIMEOUT));
         assertEquals(1, dailyStats.getCount(CNT_AUTHENTICATION_FAILURE));
+        assertEquals(1, dailyStats.getCount(CNT_CONSECUTIVE_CONNECTION_FAILURE));
+
+        makeNormalConnectionExample();
+        assertEquals(0, dailyStats.getCount(CNT_CONSECUTIVE_CONNECTION_FAILURE));
     }
 
     /**
@@ -877,6 +884,7 @@
         assertEquals(0, stats.getCount(CNT_AUTHENTICATION_FAILURE));
         assertEquals(1 * scale, stats.getCount(CNT_SHORT_CONNECTION_NONLOCAL));
         assertEquals(1 * scale, stats.getCount(CNT_DISCONNECTION_NONLOCAL));
+        assertEquals(0, stats.getCount(CNT_CONSECUTIVE_CONNECTION_FAILURE));
     }
 
     private void makeShortConnectionOldRssiPollingExample() {
@@ -1106,6 +1114,8 @@
         perNetwork.updateAfterDailyDetection();
         checkShortConnectionExample(perNetwork.getRecentStats(), 1);
         checkShortConnectionExample(perNetwork.getStatsPrevBuild(), 0);
+        assertEquals(WifiHealthMonitor.REASON_NO_FAILURE,
+                mWifiScoreCard.detectAbnormalConnectionFailure(mWifiInfo.getSSID()));
     }
 
     /**
@@ -1131,11 +1141,13 @@
         // Add >2x failures after the SW build change
         int numBadConnectionDays = 4;
         for (int i = 0; i < numBadConnectionDays; i++) {
-            makeRecentStatsWithShortConnection();
             makeRecentStatsWithAssocTimeOut();
             makeRecentStatsWithAuthFailure();
+            makeRecentStatsWithShortConnection();
         }
 
+        assertEquals(WifiHealthMonitor.REASON_SHORT_CONNECTION_NONLOCAL,
+                mWifiScoreCard.detectAbnormalDisconnection());
         FailureStats statsDec = new FailureStats();
         FailureStats statsInc = new FailureStats();
         FailureStats statsHigh = new FailureStats();
@@ -1175,6 +1187,8 @@
         checkStatsDeltaExample(statsDec, 0);
         checkStatsDeltaExample(statsInc, 0);
         checkStatsDeltaExample(statsHigh, 0);
+        assertEquals(WifiHealthMonitor.REASON_NO_FAILURE,
+                mWifiScoreCard.detectAbnormalConnectionFailure(mWifiInfo.getSSID()));
     }
 
     /**
@@ -1197,10 +1211,12 @@
         for (int i = 0; i < numGoodConnectionDays; i++) {
             makeRecentStatsWithGoodConnection();
         }
-        makeRecentStatsWithShortConnection();
         makeRecentStatsWithAssocTimeOut();
         makeRecentStatsWithAuthFailure();
+        makeRecentStatsWithShortConnection();
 
+        assertEquals(WifiHealthMonitor.REASON_NO_FAILURE,
+                mWifiScoreCard.detectAbnormalConnectionFailure(mWifiInfo.getSSID()));
         FailureStats statsDec = new FailureStats();
         FailureStats statsInc = new FailureStats();
         FailureStats statsHigh = new FailureStats();
@@ -1215,9 +1231,11 @@
         PerNetwork perNetwork = mWifiScoreCard.lookupNetwork(mWifiInfo.getSSID());
 
         makeRecentStatsWithShortConnection(); // Day 1
-        makeRecentStatsWithAssocTimeOut();
         makeRecentStatsWithAuthFailure();
+        makeRecentStatsWithAssocTimeOut();
 
+        assertEquals(WifiHealthMonitor.REASON_ASSOC_TIMEOUT,
+                mWifiScoreCard.detectAbnormalConnectionFailure(mWifiInfo.getSSID()));
         FailureStats statsDec = new FailureStats();
         FailureStats statsInc = new FailureStats();
         FailureStats statsHigh = new FailureStats();
@@ -1226,12 +1244,13 @@
         checkStatsDeltaExample(statsDec, 0);
         checkStatsDeltaExample(statsInc, 0);
         checkStatsDeltaExample(statsHigh, 1);
-        assertEquals(false, mWifiScoreCard.detectAbnormalAuthFailure(mWifiInfo.getSSID()));
     }
 
     @Test
     public void testHighAuthFailureRate() throws Exception {
+        makeRecentStatsWithGoodConnection();
         makeRecentStatsWithAuthFailure();
-        assertEquals(true, mWifiScoreCard.detectAbnormalAuthFailure(mWifiInfo.getSSID()));
+        assertEquals(WifiHealthMonitor.REASON_AUTH_FAILURE,
+                mWifiScoreCard.detectAbnormalConnectionFailure(mWifiInfo.getSSID()));
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
index 41775ec..5fe8eaa 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
@@ -60,7 +60,6 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -82,7 +81,8 @@
         }
     }
 
-    private static final int TEST_SESSION_ID = 8603706;
+    private static final int TEST_NETWORK_ID = 860370;
+    private static final int TEST_SESSION_ID = 8603703; // last digit is a check digit
 
     FakeClock mClock;
     WifiConfiguration mWifiConfiguration;
@@ -100,6 +100,7 @@
     @Mock IWifiConnectedNetworkScorer mWifiConnectedNetworkScorer;
     @Mock WifiNative mWifiNative;
     @Mock BssidBlocklistMonitor mBssidBlocklistMonitor;
+    @Mock Network mNetwork;
     private TestLooper mLooper;
 
     public class WifiConnectedNetworkScorerImpl extends IWifiConnectedNetworkScorer.Stub {
@@ -189,10 +190,11 @@
         final ConnectivityManager cm = mock(ConnectivityManager.class);
         when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(cm);
         when(cm.registerNetworkAgent(any(), any(), any(), any(), anyInt(), any(), anyInt()))
-                .thenReturn(mock(Network.class));
+                .thenReturn(mNetwork);
+        when(mNetwork.getNetId()).thenReturn(0);
         mNetworkAgent = spy(new TestNetworkAgent(mContext));
         mClock = new FakeClock();
-        mScoringParams = new ScoringParams(mContext);
+        mScoringParams = new ScoringParams();
         mWifiThreadRunner = new WifiThreadRunner(new Handler(mLooper.getLooper()));
         mWifiScoreReport = new WifiScoreReport(mScoringParams, mClock, mWifiMetrics, mWifiInfo,
                 mWifiNative, mBssidBlocklistMonitor, mWifiThreadRunner);
@@ -412,7 +414,7 @@
                 asks++;
             }
         }
-        assertTrue(oops + " asks:" + asks, asks > 5 && asks < 12);
+        assertTrue(oops + " asks:" + asks, asks > 5 && asks < 15);
     }
 
 
@@ -609,16 +611,45 @@
     }
 
     /**
+     * Verify netId to sessionId conversion.
+     */
+    @Test
+    public void testSessionId() throws Exception {
+        assertEquals(-1, WifiScoreReport.sessionIdFromNetId(Integer.MIN_VALUE));
+        assertEquals(-1, WifiScoreReport.sessionIdFromNetId(-42));
+        assertEquals(-1, WifiScoreReport.sessionIdFromNetId(-1));
+        assertEquals(-1, WifiScoreReport.sessionIdFromNetId(0));
+        assertEquals(18, WifiScoreReport.sessionIdFromNetId(1));
+        assertEquals(3339, WifiScoreReport.sessionIdFromNetId(333));
+        assertEquals(TEST_SESSION_ID, WifiScoreReport.sessionIdFromNetId(TEST_NETWORK_ID));
+        int dangerOfOverflow = Integer.MAX_VALUE / 10;
+        assertEquals(214748364, dangerOfOverflow);
+        assertEquals(2147483646, WifiScoreReport.sessionIdFromNetId(dangerOfOverflow));
+        assertEquals(8, WifiScoreReport.sessionIdFromNetId(dangerOfOverflow + 1));
+        assertEquals(8, WifiScoreReport.sessionIdFromNetId(Integer.MAX_VALUE));
+    }
+
+    /**
      * Verify that client gets session ID when onStart() method is called.
      */
     @Test
     public void testClientGetSessionIdOnStart() throws Exception {
-        ArgumentCaptor<Integer> startId = ArgumentCaptor.forClass(Integer.class);
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, mWifiConnectedNetworkScorer);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
-        verify(mWifiConnectedNetworkScorer).onStart(startId.capture());
-        assertEquals((int) startId.getValue(), TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
+        verify(mWifiConnectedNetworkScorer).onStart(TEST_SESSION_ID);
+    }
+
+    /**
+     * Verify that onStart is called if there is already an active network when registered.
+     */
+    @Test
+    public void testClientStartOnRegWhileActive() throws Exception {
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
+        mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, mWifiConnectedNetworkScorer);
+        verify(mWifiConnectedNetworkScorer).onStart(TEST_SESSION_ID);
     }
 
     /**
@@ -626,13 +657,12 @@
      */
     @Test
     public void testClientGetSessionIdOnStop() throws Exception {
-        ArgumentCaptor<Integer> stopId = ArgumentCaptor.forClass(Integer.class);
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, mWifiConnectedNetworkScorer);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
         mWifiScoreReport.stopConnectedNetworkScorer();
-        verify(mWifiConnectedNetworkScorer).onStop(stopId.capture());
-        assertEquals((int) stopId.getValue(), TEST_SESSION_ID);
+        verify(mWifiConnectedNetworkScorer).onStop(TEST_SESSION_ID);
     }
 
     /**
@@ -655,7 +685,8 @@
         WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
 
         assertEquals(TEST_SESSION_ID, scorerImpl.mSessionId);
 
@@ -687,7 +718,8 @@
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
         mWifiScoreReport.setInterfaceName("wlan0");
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
 
         scorerImpl.mScoreUpdateObserver.triggerUpdateOfWifiUsabilityStats(scorerImpl.mSessionId);
         mLooper.dispatchAll();
@@ -703,7 +735,8 @@
         WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
         mClock.mStepMillis = 0;
 
         mClock.mWallClockMillis = 5001;
@@ -732,7 +765,8 @@
         WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
         mClock.mStepMillis = 0;
 
         mClock.mWallClockMillis = 10;
@@ -755,7 +789,8 @@
         WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
         mClock.mStepMillis = 0;
 
         mClock.mWallClockMillis = 10;
@@ -777,7 +812,8 @@
         WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
         // Register Client for verification.
         mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
-        mWifiScoreReport.startConnectedNetworkScorer(TEST_SESSION_ID);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
         mClock.mStepMillis = 0;
 
         mClock.mWallClockMillis = 10;
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index 8286f1d..b5c5e7b 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -174,6 +174,7 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -225,6 +226,12 @@
     private static final int TEST_AP_FREQUENCY = 2412;
     private static final int TEST_AP_BANDWIDTH = SoftApInfo.CHANNEL_WIDTH_20MHZ;
     private static final int NETWORK_CALLBACK_ID = 1100;
+    private static final String TEST_CAP = "[RSN-PSK-CCMP]";
+    private static final String TEST_SSID = "Sid's Place";
+    private static final String TEST_SSID_WITH_QUOTES = "\"" + TEST_SSID + "\"";
+    private static final String TEST_BSSID = "01:02:03:04:05:06";
+    private static final String TEST_PACKAGE = "package";
+    private static final int TEST_NETWORK_ID = 567;
 
     private SoftApInfo mTestSoftApInfo;
     private AsyncChannel mAsyncChannel;
@@ -1558,12 +1565,6 @@
         verify(mScanRequestProxy).startScan(Binder.getCallingUid(), SCAN_PACKAGE_NAME);
     }
 
-    static final String TEST_SSID = "Sid's Place";
-    static final String TEST_SSID_WITH_QUOTES = "\"" + TEST_SSID + "\"";
-    static final String TEST_BSSID = "01:02:03:04:05:06";
-    static final String TEST_PACKAGE = "package";
-    static final int TEST_NETWORK_ID = 567;
-
     private void setupForGetConnectionInfo() {
         WifiInfo wifiInfo = new WifiInfo();
         wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
@@ -3138,9 +3139,9 @@
     }
 
     /**
-     * Verify that the call to getAllMatchingFqdnsForScanResults is not redirected to specific API
-     * syncGetAllMatchingFqdnsForScanResults when the caller doesn't have NETWORK_SETTINGS
-     * permissions and NETWORK_SETUP_WIZARD.
+     * Verify that the call to getAllMatchingPasspointProfilesForScanResults is not redirected to
+     * specific API getAllMatchingPasspointProfilesForScanResults when the caller doesn't have
+     * NETWORK_SETTINGS permissions and NETWORK_SETUP_WIZARD.
      */
     @Test(expected = SecurityException.class)
     public void testGetAllMatchingPasspointProfilesForScanResultsWithoutPermissions() {
@@ -3148,6 +3149,34 @@
     }
 
     /**
+     * Verify that the call to getAllMatchingPasspointProfilesForScanResults is redirected to
+     * specific API getAllMatchingPasspointProfilesForScanResults when the caller have
+     * NETWORK_SETTINGS permissions and NETWORK_SETUP_WIZARD.
+     */
+    @Test
+    public void testGetAllMatchingPasspointProfilesForScanResultsWithPermissions() {
+        when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS),
+                anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
+        mWifiServiceImpl.getAllMatchingPasspointProfilesForScanResults(createScanResultList());
+        mLooper.dispatchAll();
+        verify(mPasspointManager).getAllMatchingPasspointProfilesForScanResults(any());
+    }
+
+    /**
+     * Verify that the call to getAllMatchingPasspointProfilesForScanResults is not redirected to
+     * specific API getAllMatchingPasspointProfilesForScanResults when the caller provider invalid
+     * ScanResult.
+     */
+    @Test
+    public void testGetAllMatchingPasspointProfilesForScanResultsWithInvalidScanResult() {
+        when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS),
+                anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
+        mWifiServiceImpl.getAllMatchingPasspointProfilesForScanResults(new ArrayList<>());
+        mLooper.dispatchAll();
+        verify(mPasspointManager, never()).getAllMatchingPasspointProfilesForScanResults(any());
+    }
+
+    /**
      * Verify that the call to getWifiConfigsForPasspointProfiles is not redirected to specific API
      * syncGetWifiConfigsForPasspointProfiles when the caller doesn't have NETWORK_SETTINGS
      * permissions and NETWORK_SETUP_WIZARD.
@@ -3168,6 +3197,33 @@
     }
 
     /**
+     * Verify that the call to getMatchingOsuProviders is redirected to specific API
+     * syncGetMatchingOsuProviders when the caller have NETWORK_SETTINGS
+     * permissions and NETWORK_SETUP_WIZARD.
+     */
+    @Test
+    public void testGetMatchingOsuProvidersWithPermissions() {
+        when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS),
+                anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
+        mWifiServiceImpl.getMatchingOsuProviders(createScanResultList());
+        mLooper.dispatchAll();
+        verify(mPasspointManager).getMatchingOsuProviders(any());
+    }
+
+    /**
+     * Verify that the call to getMatchingOsuProviders is not redirected to specific API
+     * syncGetMatchingOsuProviders when the caller provider invalid ScanResult
+     */
+    @Test
+    public void testGetMatchingOsuProvidersWithInvalidScanResult() {
+        when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS),
+                anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
+        mWifiServiceImpl.getMatchingOsuProviders(new ArrayList<>());
+        mLooper.dispatchAll();
+        verify(mPasspointManager, never()).getMatchingOsuProviders(any());
+    }
+
+    /**
      * Verify that the call to getMatchingPasspointConfigsForOsuProviders is not redirected to
      * specific API syncGetMatchingPasspointConfigsForOsuProviders when the caller doesn't have
      * NETWORK_SETTINGS permissions and NETWORK_SETUP_WIZARD.
@@ -5372,7 +5428,8 @@
     public void testGetWifiConfigsForMatchedNetworkSuggestionsWithSettingPermissions() {
         when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS),
                 anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
-        mWifiServiceImpl.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(new ArrayList<>());
+        mWifiServiceImpl
+                .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(createScanResultList());
         mLooper.dispatchAll();
         verify(mWifiNetworkSuggestionsManager)
                 .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(any());
@@ -5387,12 +5444,24 @@
     public void testGetWifiConfigsForMatchedNetworkSuggestionsWithSetupWizardPermissions() {
         when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETUP_WIZARD),
                 anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
-        mWifiServiceImpl.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(new ArrayList<>());
+        mWifiServiceImpl
+                .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(createScanResultList());
         mLooper.dispatchAll();
         verify(mWifiNetworkSuggestionsManager)
                 .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(any());
     }
 
+    @Test
+    public void testGetWifiConfigsForMatchedNetworkSuggestionsWithInvalidScanResults() {
+        when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS),
+                anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED);
+        mWifiServiceImpl
+                .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(new ArrayList<>());
+        mLooper.dispatchAll();
+        verify(mWifiNetworkSuggestionsManager, never())
+                .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(any());
+    }
+
     /**
      * Verify that a call to setWifiConnectedNetworkScorer throws a SecurityException if
      * the caller does not have WIFI_UPDATE_USABILITY_STATS_SCORE permission.
@@ -5563,14 +5632,14 @@
         when(mClientModeImpl.syncGetSupportedFeatures(
                 any())).thenReturn(supportedFeaturesFromClientModeImpl);
 
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(false);
         mLooper.startAutoDispatch();
         assertEquals(supportedFeaturesFromClientModeImpl,
                         mWifiServiceImpl.getSupportedFeatures());
         mLooper.stopAutoDispatchAndIgnoreExceptions();
 
-        when(mActiveModeWarden.canSupportAtleastOneConcurrentClientAndSoftApManager())
+        when(mActiveModeWarden.isStaApConcurrencySupported())
                 .thenReturn(true);
         mLooper.startAutoDispatch();
         assertEquals(supportedFeaturesFromClientModeImpl | WifiManager.WIFI_FEATURE_AP_STA,
@@ -5670,4 +5739,9 @@
         verify(mSettingsStore, never()).handleWifiScanAlwaysAvailableToggled(anyBoolean());
         verify(mActiveModeWarden, never()).scanAlwaysModeChanged();
     }
+
+    private List<ScanResult> createScanResultList() {
+        return Collections.singletonList(new ScanResult(WifiSsid.createFromAsciiEncoded(TEST_SSID),
+                TEST_SSID, TEST_BSSID, 1245, 0, TEST_CAP, -78, 2450, 1025, 22, 33, 20, 0, 0, true));
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiTrafficPollerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiTrafficPollerTest.java
index 1c7afef..ecdf490 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiTrafficPollerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiTrafficPollerTest.java
@@ -19,6 +19,7 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import android.net.wifi.ITrafficStateCallback;
@@ -30,8 +31,6 @@
 
 import androidx.test.filters.SmallTest;
 
-import com.android.server.wifi.util.ExternalCallbackTracker;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -50,10 +49,13 @@
     private final static long TX_PACKET_COUNT = 40;
     private final static long RX_PACKET_COUNT = 50;
     private static final int TEST_TRAFFIC_STATE_CALLBACK_IDENTIFIER = 14;
+    private static final int TEST_TRAFFIC_STATE_CALLBACK_IDENTIFIER2 = 42;
 
     @Mock IBinder mAppBinder;
     @Mock ITrafficStateCallback mTrafficStateCallback;
-    @Mock ExternalCallbackTracker<ITrafficStateCallback> mCallbackTracker;
+
+    @Mock IBinder mAppBinder2;
+    @Mock ITrafficStateCallback mTrafficStateCallback2;
 
     /**
      * Called before each test
@@ -148,4 +150,64 @@
         // Client should not get any message callback add failed.
         verify(mTrafficStateCallback, never()).onStateChanged(anyInt());
     }
+
+    /** Test that if the data activity didn't change, the client is not notified. */
+    @Test
+    public void unchangedDataActivityNotNotified() throws Exception {
+        mWifiTrafficPoller.addCallback(
+                mAppBinder, mTrafficStateCallback, TEST_TRAFFIC_STATE_CALLBACK_IDENTIFIER);
+        mWifiTrafficPoller.notifyOnDataActivity(TX_PACKET_COUNT, RX_PACKET_COUNT);
+
+        verify(mTrafficStateCallback).onStateChanged(
+                WifiManager.TrafficStateCallback.DATA_ACTIVITY_INOUT);
+
+        // since TX and RX both increased, should still be INOUT. But since it's the same data
+        // activity as before, the callback should not be triggered again.
+        mWifiTrafficPoller.notifyOnDataActivity(TX_PACKET_COUNT + 1, RX_PACKET_COUNT + 1);
+
+        // still only called once
+        verify(mTrafficStateCallback).onStateChanged(anyInt());
+    }
+
+    /**
+     * If there are 2 callbacks, but the data activity only changed for one of them, only that
+     * callback should be triggered.
+     */
+    @Test
+    public void multipleCallbacksOnlyChangedNotified() throws Exception {
+        mWifiTrafficPoller.addCallback(
+                mAppBinder, mTrafficStateCallback, TEST_TRAFFIC_STATE_CALLBACK_IDENTIFIER);
+        mWifiTrafficPoller.notifyOnDataActivity(TX_PACKET_COUNT, RX_PACKET_COUNT);
+
+        verify(mTrafficStateCallback).onStateChanged(
+                WifiManager.TrafficStateCallback.DATA_ACTIVITY_INOUT);
+        verify(mTrafficStateCallback2, never()).onStateChanged(anyInt());
+
+        mWifiTrafficPoller.addCallback(
+                mAppBinder2, mTrafficStateCallback2, TEST_TRAFFIC_STATE_CALLBACK_IDENTIFIER2);
+        mWifiTrafficPoller.notifyOnDataActivity(TX_PACKET_COUNT + 1, RX_PACKET_COUNT + 1);
+
+        // still only called once
+        verify(mTrafficStateCallback).onStateChanged(anyInt());
+        // called for the first time with INOUT
+        verify(mTrafficStateCallback2)
+                .onStateChanged(WifiManager.TrafficStateCallback.DATA_ACTIVITY_INOUT);
+        // not called with anything else
+        verify(mTrafficStateCallback2).onStateChanged(anyInt());
+
+        // now only TX increased
+        mWifiTrafficPoller.notifyOnDataActivity(TX_PACKET_COUNT + 2, RX_PACKET_COUNT + 1);
+
+        // called once with OUT
+        verify(mTrafficStateCallback)
+                .onStateChanged(WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT);
+        // called twice total
+        verify(mTrafficStateCallback, times(2)).onStateChanged(anyInt());
+
+        // called once with OUT
+        verify(mTrafficStateCallback2)
+                .onStateChanged(WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT);
+        // called twice total
+        verify(mTrafficStateCallback2, times(2)).onStateChanged(anyInt());
+    }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
index 8778c55..2cdcf2d 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
@@ -380,7 +380,7 @@
                 mLooper.dispatchAll();
             }
         }).when(mHalDeviceManager).stop();
-        when(mHalDeviceManager.createStaIface(anyBoolean(), any(), eq(null)))
+        when(mHalDeviceManager.createStaIface(any(), eq(null)))
                 .thenReturn(mIWifiStaIface);
         when(mHalDeviceManager.createApIface(any(), eq(null)))
                 .thenReturn(mIWifiApIface);
@@ -456,7 +456,7 @@
         assertTrue(mWifiVendorHal.isHalStarted());
 
         verify(mHalDeviceManager).start();
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
         verify(mHalDeviceManager).isReady();
         verify(mHalDeviceManager).isStarted();
@@ -481,7 +481,7 @@
         verify(mHalDeviceManager).isReady();
         verify(mHalDeviceManager).isStarted();
 
-        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
+        verify(mHalDeviceManager, never()).createStaIface(any(), eq(null));
     }
 
     /**
@@ -502,7 +502,7 @@
 
         verify(mHalDeviceManager).start();
 
-        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
+        verify(mHalDeviceManager, never()).createStaIface(any(), eq(null));
         verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
         verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
         verify(mIWifiStaIface, never())
@@ -515,12 +515,12 @@
      */
     @Test
     public void testStartHalFailureInIfaceCreationInStaMode() throws Exception {
-        when(mHalDeviceManager.createStaIface(anyBoolean(), any(), eq(null))).thenReturn(null);
+        when(mHalDeviceManager.createStaIface(any(), eq(null))).thenReturn(null);
         assertFalse(mWifiVendorHal.startVendorHalSta());
         assertFalse(mWifiVendorHal.isHalStarted());
 
         verify(mHalDeviceManager).start();
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         verify(mHalDeviceManager).stop();
 
         verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
@@ -540,7 +540,7 @@
         assertFalse(mWifiVendorHal.isHalStarted());
 
         verify(mHalDeviceManager).start();
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         verify(mHalDeviceManager).getChip(any(IWifiIface.class));
         verify(mHalDeviceManager).stop();
         verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
@@ -560,7 +560,7 @@
         assertFalse(mWifiVendorHal.isHalStarted());
 
         verify(mHalDeviceManager).start();
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         verify(mHalDeviceManager).stop();
         verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
 
@@ -580,7 +580,7 @@
         assertFalse(mWifiVendorHal.isHalStarted());
 
         verify(mHalDeviceManager).start();
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         verify(mHalDeviceManager).getChip(any(IWifiIface.class));
         verify(mHalDeviceManager).stop();
         verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
@@ -603,7 +603,7 @@
         verify(mHalDeviceManager).createApIface(any(), eq(null));
         verify(mHalDeviceManager).stop();
 
-        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
+        verify(mHalDeviceManager, never()).createStaIface(any(), eq(null));
         verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
     }
 
@@ -621,7 +621,7 @@
 
         verify(mHalDeviceManager).start();
         verify(mHalDeviceManager).stop();
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
         verify(mHalDeviceManager, times(2)).isReady();
         verify(mHalDeviceManager, times(2)).isStarted();
@@ -648,7 +648,7 @@
         verify(mHalDeviceManager, times(2)).isReady();
         verify(mHalDeviceManager, times(2)).isStarted();
 
-        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
+        verify(mHalDeviceManager, never()).createStaIface(any(), eq(null));
     }
 
     /**
@@ -661,11 +661,11 @@
         InterfaceDestroyedListener externalLister = mock(InterfaceDestroyedListener.class);
 
         assertTrue(mWifiVendorHal.startVendorHal());
-        assertNotNull(mWifiVendorHal.createStaIface(false, externalLister));
+        assertNotNull(mWifiVendorHal.createStaIface(externalLister));
         assertTrue(mWifiVendorHal.isHalStarted());
 
         verify(mHalDeviceManager).start();
-        verify(mHalDeviceManager).createStaIface(eq(false), internalListenerCaptor.capture(),
+        verify(mHalDeviceManager).createStaIface(internalListenerCaptor.capture(),
                 eq(null));
         verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
         verify(mHalDeviceManager).isReady();
@@ -2831,8 +2831,8 @@
         }).when(mIWifiStaIface).getName(any(IWifiIface.getNameCallback.class));
 
         assertTrue(mWifiVendorHal.startVendorHal());
-        assertNull(mWifiVendorHal.createStaIface(true, null));
-        verify(mHalDeviceManager).createStaIface(eq(true), any(), eq(null));
+        assertNull(mWifiVendorHal.createStaIface(null));
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
     }
 
     /**
@@ -2858,8 +2858,8 @@
     @Test
     public void testCreateRemoveStaIface() throws RemoteException {
         assertTrue(mWifiVendorHal.startVendorHal());
-        String ifaceName = mWifiVendorHal.createStaIface(false, null);
-        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
+        String ifaceName = mWifiVendorHal.createStaIface(null);
+        verify(mHalDeviceManager).createStaIface(any(), eq(null));
         assertEquals(TEST_IFACE_NAME, ifaceName);
         assertTrue(mWifiVendorHal.removeStaIface(ifaceName));
         verify(mHalDeviceManager).removeIface(eq(mIWifiStaIface));
diff --git a/tests/wifitests/src/com/android/server/wifi/WrongPasswordNotifierTest.java b/tests/wifitests/src/com/android/server/wifi/WrongPasswordNotifierTest.java
index 3b4bdfd..4afcfba 100644
--- a/tests/wifitests/src/com/android/server/wifi/WrongPasswordNotifierTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WrongPasswordNotifierTest.java
@@ -42,7 +42,7 @@
 public class WrongPasswordNotifierTest extends WifiBaseTest {
     private static final String TEST_SSID = "Test SSID";
 
-    @Mock Context mContext;
+    @Mock WifiContext mContext;
     @Mock Resources mResources;
     @Mock NotificationManager mNotificationManager;
     @Mock FrameworkFacade mFrameworkFacade;
@@ -58,8 +58,8 @@
         when(mContext.getSystemService(Context.NOTIFICATION_SERVICE))
                 .thenReturn(mNotificationManager);
         when(mContext.getResources()).thenReturn(mResources);
-        mWrongPassNotifier =
-                new WrongPasswordNotifier(mContext, mFrameworkFacade);
+        when(mContext.getWifiOverlayApkPkgName()).thenReturn("test.com.android.wifi.resources");
+        mWrongPassNotifier = new WrongPasswordNotifier(mContext, mFrameworkFacade);
     }
 
     /**
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointConfigUserStoreDataTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointConfigUserStoreDataTest.java
index cfa6044..697f831 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointConfigUserStoreDataTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointConfigUserStoreDataTest.java
@@ -36,9 +36,9 @@
 
 import com.android.internal.util.FastXmlSerializer;
 import com.android.server.wifi.WifiBaseTest;
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiConfigStore;
 import com.android.server.wifi.WifiKeyStore;
-import com.android.server.wifi.util.TelephonyUtil;
 import com.android.server.wifi.util.WifiConfigStoreEncryptionUtil;
 
 import org.junit.Before;
@@ -77,7 +77,7 @@
     private static final boolean TEST_SHARED = false;
 
     @Mock WifiKeyStore mKeyStore;
-    @Mock TelephonyUtil mTelephonyUtil;
+    @Mock WifiCarrierInfoManager mWifiCarrierInfoManager;
     @Mock PasspointConfigUserStoreData.DataSource mDataSource;
     PasspointConfigUserStoreData mConfigStoreData;
 
@@ -85,7 +85,8 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mConfigStoreData = new PasspointConfigUserStoreData(mKeyStore, mTelephonyUtil, mDataSource);
+        mConfigStoreData = new PasspointConfigUserStoreData(mKeyStore, mWifiCarrierInfoManager,
+                mDataSource);
     }
 
     /**
@@ -251,12 +252,12 @@
         // Setup expected data.
         List<PasspointProvider> providerList = new ArrayList<>();
         PasspointProvider provider1 = new PasspointProvider(createFullPasspointConfiguration(),
-                mKeyStore, mTelephonyUtil, TEST_PROVIDER_ID, TEST_CREATOR_UID, TEST_CREATOR_PACKAGE,
-                false, Arrays.asList(TEST_CA_CERTIFICATE_ALIAS),
+                mKeyStore, mWifiCarrierInfoManager, TEST_PROVIDER_ID, TEST_CREATOR_UID,
+                TEST_CREATOR_PACKAGE, false, Arrays.asList(TEST_CA_CERTIFICATE_ALIAS),
                 TEST_CLIENT_PRIVATE_KEY_AND_CERT_ALIAS, null,
                 TEST_HAS_EVER_CONNECTED, TEST_SHARED);
         PasspointProvider provider2 = new PasspointProvider(createFullPasspointConfiguration(),
-                mKeyStore, mTelephonyUtil, TEST_PROVIDER_ID_2, TEST_CREATOR_UID,
+                mKeyStore, mWifiCarrierInfoManager, TEST_PROVIDER_ID_2, TEST_CREATOR_UID,
                 TEST_CREATOR_PACKAGE, true,
                 Arrays.asList(TEST_CA_CERTIFICATE_ALIAS, TEST_CA_CERTIFICATE_ALIAS_2),
                 TEST_CLIENT_PRIVATE_KEY_AND_CERT_ALIAS, TEST_REMEDIATION_CA_CERTIFICATE_ALIAS,
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java
index 98dbcb9..73c5713 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java
@@ -32,6 +32,7 @@
 import static android.net.wifi.WifiManager.EXTRA_URL;
 
 import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_EAP;
+import static com.android.server.wifi.WifiConfigurationTestUtil.TEST_NETWORK_ID;
 
 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
 import static org.junit.Assert.assertEquals;
@@ -39,6 +40,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyBoolean;
@@ -88,10 +90,13 @@
 import com.android.server.wifi.Clock;
 import com.android.server.wifi.FakeKeys;
 import com.android.server.wifi.FrameworkFacade;
+import com.android.server.wifi.NetworkUpdateResult;
 import com.android.server.wifi.WifiBaseTest;
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiConfigManager;
 import com.android.server.wifi.WifiConfigStore;
 import com.android.server.wifi.WifiConfigurationTestUtil;
+import com.android.server.wifi.WifiContext;
 import com.android.server.wifi.WifiInjector;
 import com.android.server.wifi.WifiKeyStore;
 import com.android.server.wifi.WifiMetrics;
@@ -105,7 +110,6 @@
 import com.android.server.wifi.hotspot2.anqp.OsuProviderInfo;
 import com.android.server.wifi.util.InformationElementUtil;
 import com.android.server.wifi.util.InformationElementUtil.RoamingConsortium;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -201,7 +205,7 @@
     PasspointManager mManager;
     ArgumentCaptor<AppOpsManager.OnOpChangedListener> mAppOpChangedListenerCaptor =
             ArgumentCaptor.forClass(AppOpsManager.OnOpChangedListener.class);
-    TelephonyUtil mTelephonyUtil;
+    WifiCarrierInfoManager mWifiCarrierInfoManager;
 
     /** Sets up test. */
     @Before
@@ -223,13 +227,14 @@
         when(mWifiInjector.getClientModeImpl()).thenReturn(mClientModeImpl);
         when(mWifiInjector.getWifiNetworkSuggestionsManager())
                 .thenReturn(mWifiNetworkSuggestionsManager);
-        mTelephonyUtil = new TelephonyUtil(mTelephonyManager, mSubscriptionManager,
-                mock(FrameworkFacade.class), mock(Context.class), mock(Handler.class));
+        mWifiCarrierInfoManager = new WifiCarrierInfoManager(mTelephonyManager,
+                mSubscriptionManager, mWifiInjector, mock(FrameworkFacade.class),
+                mock(WifiContext.class), mWifiConfigStore, mock(Handler.class));
         mLooper = new TestLooper();
         mHandler = new Handler(mLooper.getLooper());
         mManager = new PasspointManager(mContext, mWifiInjector, mHandler, mWifiNative,
                 mWifiKeyStore, mClock, mObjectFactory, mWifiConfigManager,
-                mWifiConfigStore, mWifiMetrics, mTelephonyUtil);
+                mWifiConfigStore, mWifiMetrics, mWifiCarrierInfoManager);
         ArgumentCaptor<PasspointEventHandler.Callbacks> callbacks =
                 ArgumentCaptor.forClass(PasspointEventHandler.Callbacks.class);
         verify(mObjectFactory).makePasspointEventHandler(any(WifiNative.class),
@@ -239,8 +244,8 @@
         verify(mObjectFactory).makePasspointConfigSharedStoreData(sharedDataSource.capture());
         ArgumentCaptor<PasspointConfigUserStoreData.DataSource> userDataSource =
                 ArgumentCaptor.forClass(PasspointConfigUserStoreData.DataSource.class);
-        verify(mObjectFactory).makePasspointConfigUserStoreData(
-                any(WifiKeyStore.class), any(TelephonyUtil.class), userDataSource.capture());
+        verify(mObjectFactory).makePasspointConfigUserStoreData(any(WifiKeyStore.class),
+                any(WifiCarrierInfoManager.class), userDataSource.capture());
         mCallbacks = callbacks.getValue();
         mSharedDataSource = sharedDataSource.getValue();
         mUserDataSource = userDataSource.getValue();
@@ -396,7 +401,7 @@
         wifiConfig.setPasspointUniqueId(config.getUniqueId());
         PasspointProvider provider = createMockProvider(config, wifiConfig, isSuggestion);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(isSuggestion))).thenReturn(provider);
         when(provider.getPackageName()).thenReturn(packageName);
         assertTrue(mManager.addOrUpdateProvider(
@@ -639,7 +644,7 @@
         PasspointProvider provider = createMockProvider(config);
         when(provider.getPackageName()).thenReturn(TEST_PACKAGE);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(provider);
         assertTrue(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -781,7 +786,7 @@
                 TEST_REALM);
         PasspointProvider provider = createMockProvider(config);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(provider);
         assertTrue(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -843,7 +848,7 @@
                 .thenReturn(true);
         PasspointManager ut = new PasspointManager(mContext, mWifiInjector, mHandler, mWifiNative,
                 mWifiKeyStore, mClock, spyFactory, mWifiConfigManager,
-                mWifiConfigStore, mWifiMetrics, mTelephonyUtil);
+                mWifiConfigStore, mWifiMetrics, mWifiCarrierInfoManager);
 
         assertTrue(ut.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 true, true));
@@ -870,7 +875,7 @@
                 TEST_REALM);
         PasspointProvider origProvider = createMockProvider(origConfig);
         when(mObjectFactory.makePasspointProvider(eq(origConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(origProvider);
         assertTrue(mManager.addOrUpdateProvider(origConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -887,14 +892,37 @@
         assertEquals(origConfig, origProviders.get(0).getConfig());
         assertEquals(1, mSharedDataSource.getProviderIndex());
 
+        // Add same provider as existing suggestion provider
+        // This should be no WifiConfig deletion
+        WifiConfiguration origWifiConfig = origProvider.getWifiConfig();
+        when(mWifiConfigManager.getConfiguredNetwork(origWifiConfig.getKey()))
+                .thenReturn(origWifiConfig);
+        when(mWifiConfigManager.addOrUpdateNetwork(
+                origWifiConfig, TEST_CREATOR_UID, TEST_PACKAGE))
+                .thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID));
+        assertTrue(mManager.addOrUpdateProvider(origConfig, TEST_CREATOR_UID, TEST_PACKAGE,
+                false, true));
+        verify(mWifiConfigManager, never()).removePasspointConfiguredNetwork(
+                origWifiConfig.getKey());
+        verify(mWifiConfigManager).addOrUpdateNetwork(
+                argThat((c) -> c.FQDN.equals(TEST_FQDN)), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE));
+        verify(mWifiConfigManager).saveToStore(true);
+        verify(mWifiMetrics).incrementNumPasspointProviderInstallation();
+        verify(mWifiMetrics).incrementNumPasspointProviderInstallSuccess();
+        assertEquals(2, mSharedDataSource.getProviderIndex());
+        reset(mWifiMetrics);
+        reset(mWifiConfigManager);
+
         // Add another provider with the same base domain as the existing provider.
         // This should replace the existing provider with the new configuration.
         PasspointConfiguration newConfig = createTestConfigWithUserCredential(TEST_FQDN,
                 TEST_FRIENDLY_NAME);
         PasspointProvider newProvider = createMockProvider(newConfig);
         when(mObjectFactory.makePasspointProvider(eq(newConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(newProvider);
+        when(mWifiConfigManager.getConfiguredNetwork(origProvider.getWifiConfig().getKey()))
+                .thenReturn(origWifiConfig);
         assertTrue(mManager.addOrUpdateProvider(newConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
 
@@ -913,7 +941,7 @@
         assertEquals(2, newProviders.size());
         assertTrue(newConfig.equals(newProviders.get(0).getConfig())
                 || newConfig.equals(newProviders.get(1).getConfig()));
-        assertEquals(2, mSharedDataSource.getProviderIndex());
+        assertEquals(3, mSharedDataSource.getProviderIndex());
     }
 
     /**
@@ -928,7 +956,8 @@
                 TEST_FRIENDLY_NAME);
         PasspointProvider provider = mock(PasspointProvider.class);
         when(provider.installCertsAndKeys()).thenReturn(false);
-        when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore), eq(mTelephonyUtil),
+        when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore), eq(
+                mWifiCarrierInfoManager),
                 anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE), eq(false))).thenReturn(provider);
         assertFalse(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -948,7 +977,7 @@
                 TEST_FRIENDLY_NAME);
         PasspointProvider provider = createMockProvider(config);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(provider);
         assertTrue(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -970,7 +999,7 @@
         config.setUpdateIdentifier(1);
         PasspointProvider provider = createMockProvider(config);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(provider);
         assertTrue(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -1577,7 +1606,7 @@
         PasspointProvider provider = createMockProvider(config);
         // Verify the provider ID used to create the new provider.
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), eq(providerIndex), eq(TEST_CREATOR_UID),
+                eq(mWifiCarrierInfoManager), eq(providerIndex), eq(TEST_CREATOR_UID),
                 eq(TEST_PACKAGE), eq(false))).thenReturn(provider);
 
         assertTrue(
@@ -1934,7 +1963,7 @@
                 TEST_REALM);
         PasspointProvider provider = createMockProvider(config);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(provider);
         assertTrue(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -1977,7 +2006,7 @@
         when(provider.getPackageName()).thenReturn(TEST_PACKAGE);
         when(provider.isFromSuggestion()).thenReturn(true);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(true))).thenReturn(provider);
         assertTrue(mManager.addOrUpdateProvider(config, TEST_CREATOR_UID, TEST_PACKAGE,
                 true, true));
@@ -2047,7 +2076,7 @@
         PasspointProvider origProvider = createMockProvider(origConfig);
         when(origProvider.getPackageName()).thenReturn(TEST_PACKAGE);
         when(mObjectFactory.makePasspointProvider(eq(origConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(true))).thenReturn(origProvider);
         assertTrue(mManager.addOrUpdateProvider(origConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 true, true));
@@ -2064,10 +2093,21 @@
 
         // Add same provider as existing suggestion provider
         // This should be no WifiConfig deletion
+        WifiConfiguration origWifiConfig = origProvider.getWifiConfig();
+        origWifiConfig.fromWifiNetworkSuggestion = true;
+        origWifiConfig.creatorUid = TEST_CREATOR_UID;
+        origWifiConfig.creatorName = TEST_PACKAGE;
+        when(mWifiConfigManager.getConfiguredNetwork(origWifiConfig.getKey()))
+                .thenReturn(origWifiConfig);
+        when(mWifiConfigManager.addOrUpdateNetwork(
+                origWifiConfig, TEST_CREATOR_UID, TEST_PACKAGE))
+                .thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID));
         assertTrue(mManager.addOrUpdateProvider(origConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 true, true));
         verify(mWifiConfigManager, never()).removePasspointConfiguredNetwork(
-                origProvider.getWifiConfig().getKey());
+                origWifiConfig.getKey());
+        verify(mWifiConfigManager).addOrUpdateNetwork(
+                argThat((c) -> c.FQDN.equals(TEST_FQDN)), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE));
         verify(mWifiConfigManager).saveToStore(true);
         verify(mWifiMetrics).incrementNumPasspointProviderInstallation();
         verify(mWifiMetrics).incrementNumPasspointProviderInstallSuccess();
@@ -2083,7 +2123,7 @@
         when(newProvider.isFromSuggestion()).thenReturn(true);
         when(newProvider.getPackageName()).thenReturn(TEST_PACKAGE);
         when(mObjectFactory.makePasspointProvider(eq(newConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(true))).thenReturn(newProvider);
         assertTrue(mManager.addOrUpdateProvider(newConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 true, true));
@@ -2116,7 +2156,7 @@
         PasspointProvider origProvider = createMockProvider(origConfig);
         when(origProvider.getPackageName()).thenReturn(TEST_PACKAGE);
         when(mObjectFactory.makePasspointProvider(eq(origConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(true))).thenReturn(origProvider);
         assertTrue(mManager.addOrUpdateProvider(origConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 true, true));
@@ -2137,7 +2177,7 @@
                 TEST_FRIENDLY_NAME);
         PasspointProvider newProvider = createMockProvider(newConfig);
         when(mObjectFactory.makePasspointProvider(eq(newConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(newProvider);
         assertTrue(mManager.addOrUpdateProvider(newConfig, TEST_CREATOR_UID, TEST_PACKAGE,
                 false, true));
@@ -2169,7 +2209,7 @@
         PasspointProvider origProvider = createMockProvider(origConfig);
         when(origProvider.getPackageName()).thenReturn(TEST_PACKAGE);
         when(mObjectFactory.makePasspointProvider(eq(origConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(false))).thenReturn(origProvider);
         assertTrue(mManager.addOrUpdateProvider(origConfig, TEST_CREATOR_UID, TEST_PACKAGE, false,
                 true));
@@ -2194,7 +2234,7 @@
         when(newProvider.isFromSuggestion()).thenReturn(true);
         when(newProvider.getPackageName()).thenReturn(TEST_PACKAGE1);
         when(mObjectFactory.makePasspointProvider(eq(newConfig), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE1),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE1),
                 eq(true))).thenReturn(newProvider);
         assertTrue(mManager.addOrUpdateProvider(newConfig, TEST_CREATOR_UID, TEST_PACKAGE1, true,
                 true));
@@ -2374,7 +2414,7 @@
                 createTestConfigWithUserCredential(TEST_FQDN, TEST_FRIENDLY_NAME);
         PasspointProvider provider = createMockProvider(config, wifiConfig, true);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(true))).thenReturn(provider);
         when(provider.getPackageName()).thenReturn(TEST_PACKAGE);
         assertTrue(mManager.addOrUpdateProvider(
@@ -2393,7 +2433,7 @@
                 createTestConfigWithUserCredential(TEST_FQDN, TEST_FRIENDLY_NAME);
         PasspointProvider provider = createMockProvider(config, wifiConfig, false);
         when(mObjectFactory.makePasspointProvider(eq(config), eq(mWifiKeyStore),
-                eq(mTelephonyUtil), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
+                eq(mWifiCarrierInfoManager), anyLong(), eq(TEST_CREATOR_UID), eq(TEST_PACKAGE),
                 eq(true))).thenReturn(provider);
         when(provider.getPackageName()).thenReturn(TEST_PACKAGE);
         assertFalse(mManager.addOrUpdateProvider(
@@ -2410,7 +2450,7 @@
         PasspointConfiguration config = mock(PasspointConfiguration.class);
         PasspointProvider mockProvider = mock(PasspointProvider.class);
         when(mObjectFactory.makePasspointProvider(config, null,
-                mTelephonyUtil, 0, 0, null, false))
+                mWifiCarrierInfoManager, 0, 0, null, false))
                 .thenReturn(mockProvider);
         List<ScanResult> scanResults = new ArrayList<>() {{
                 add(mock(ScanResult.class));
@@ -2432,7 +2472,7 @@
         PasspointConfiguration config = mock(PasspointConfiguration.class);
         PasspointProvider mockProvider = mock(PasspointProvider.class);
         when(mObjectFactory.makePasspointProvider(config, null,
-                mTelephonyUtil, 0, 0, null, false))
+                mWifiCarrierInfoManager, 0, 0, null, false))
                 .thenReturn(mockProvider);
         List<ScanResult> scanResults = new ArrayList<>() {{
                 add(mock(ScanResult.class));
@@ -2456,7 +2496,7 @@
         PasspointProvider mockProvider = mock(PasspointProvider.class);
 
         when(mObjectFactory.makePasspointProvider(config, null,
-                mTelephonyUtil, 0, 0, null, false))
+                mWifiCarrierInfoManager, 0, 0, null, false))
                 .thenReturn(mockProvider);
 
         List<ScanResult> scanResults = new ArrayList<>() {{
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java
index 5a20ef5..19ced12 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java
@@ -39,6 +39,7 @@
 
 import com.android.server.wifi.FakeKeys;
 import com.android.server.wifi.WifiBaseTest;
+import com.android.server.wifi.WifiCarrierInfoManager;
 import com.android.server.wifi.WifiKeyStore;
 import com.android.server.wifi.hotspot2.anqp.ANQPElement;
 import com.android.server.wifi.hotspot2.anqp.CellularNetwork;
@@ -53,7 +54,6 @@
 import com.android.server.wifi.hotspot2.anqp.eap.NonEAPInnerAuth;
 import com.android.server.wifi.util.ArrayUtils;
 import com.android.server.wifi.util.InformationElementUtil.RoamingConsortium;
-import com.android.server.wifi.util.TelephonyUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -118,7 +118,8 @@
     }
 
     @Mock WifiKeyStore mKeyStore;
-    @Mock TelephonyUtil mTelephonyUtil;
+    @Mock
+    WifiCarrierInfoManager mWifiCarrierInfoManager;
     @Mock RoamingConsortium mRoamingConsortium;
     PasspointProvider mProvider;
     X509Certificate mRemediationCaCertificate;
@@ -152,8 +153,8 @@
      * @return {@link com.android.server.wifi.hotspot2.PasspointProvider}
      */
     private PasspointProvider createProvider(PasspointConfiguration config) {
-        return new PasspointProvider(config, mKeyStore, mTelephonyUtil, PROVIDER_ID, CREATOR_UID,
-                CREATOR_PACKAGE, false);
+        return new PasspointProvider(config, mKeyStore, mWifiCarrierInfoManager, PROVIDER_ID,
+                CREATOR_UID, CREATOR_PACKAGE, false);
     }
 
     /**
@@ -704,7 +705,7 @@
         // Setup test provider.
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
-        when(mTelephonyUtil.getMatchingImsiCarrierId(TEST_IMSI))
+        when(mWifiCarrierInfoManager.getMatchingImsiCarrierId(TEST_IMSI))
                 .thenReturn(new Pair<String, Integer>(TEST_IMSI, VALID_CARRIER_ID));
         mProvider = createProvider(config);
 
@@ -729,7 +730,7 @@
         // Setup test provider.
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
-        when(mTelephonyUtil.getMatchingImsiCarrierId(TEST_IMSI))
+        when(mWifiCarrierInfoManager.getMatchingImsiCarrierId(TEST_IMSI))
                 .thenReturn(new Pair<String, Integer>(TEST_IMSI, VALID_CARRIER_ID));
         mProvider = createProvider(config);
 
@@ -758,7 +759,7 @@
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
         mProvider = createProvider(config);
-        when(mTelephonyUtil.getMatchingImsiCarrierId(
+        when(mWifiCarrierInfoManager.getMatchingImsiCarrierId(
                 eq(config.getCredential().getSimCredential().getImsi())))
                 .thenReturn(new Pair<String, Integer>(TEST_IMSI, VALID_CARRIER_ID));
 
@@ -941,7 +942,7 @@
         // Setup test provider.
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
-        when(mTelephonyUtil.getMatchingImsiCarrierId(TEST_IMSI))
+        when(mWifiCarrierInfoManager.getMatchingImsiCarrierId(TEST_IMSI))
                 .thenReturn(new Pair<String, Integer>(TEST_IMSI, VALID_CARRIER_ID));
         mProvider = createProvider(config);
 
@@ -971,7 +972,7 @@
         // Setup test provider.
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
-        when(mTelephonyUtil.getMatchingImsiCarrierId(TEST_IMSI))
+        when(mWifiCarrierInfoManager.getMatchingImsiCarrierId(TEST_IMSI))
                 .thenReturn(new Pair<String, Integer>(TEST_IMSI, VALID_CARRIER_ID));
         mProvider = createProvider(config);
 
@@ -1001,7 +1002,7 @@
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
         config.setCarrierId(VALID_CARRIER_ID);
-        when(mTelephonyUtil.getMatchingImsi(eq(VALID_CARRIER_ID)))
+        when(mWifiCarrierInfoManager.getMatchingImsi(eq(VALID_CARRIER_ID)))
                 .thenReturn(null);
         mProvider = createProvider(config);
 
@@ -1029,7 +1030,7 @@
         // Setup test provider.
         PasspointConfiguration config = generateTestPasspointConfiguration(
                 CredentialType.SIM, false);
-        when(mTelephonyUtil.getMatchingImsiCarrierId(eq(TEST_IMSI)))
+        when(mWifiCarrierInfoManager.getMatchingImsiCarrierId(eq(TEST_IMSI)))
                 .thenReturn(null);
         mProvider = createProvider(config);
 
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProvisionerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProvisionerTest.java
index f234a1e..6423f95 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProvisionerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProvisionerTest.java
@@ -62,7 +62,6 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
-import com.android.server.wifi.MockResources;
 import com.android.server.wifi.WifiBaseTest;
 import com.android.server.wifi.WifiMetrics;
 import com.android.server.wifi.WifiNative;
@@ -80,7 +79,6 @@
 import com.android.server.wifi.hotspot2.soap.command.BrowserUri;
 import com.android.server.wifi.hotspot2.soap.command.PpsMoData;
 import com.android.server.wifi.hotspot2.soap.command.SppCommand;
-import com.android.wifi.resources.R;
 
 import org.junit.After;
 import org.junit.Before;
@@ -258,16 +256,13 @@
         when(mOsuServerConnection.exchangeSoapMessage(
                 any(SoapSerializationEnvelope.class))).thenReturn(true);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        MockResources mockResources = new MockResources();
-        mockResources.setString(R.string.config_wifiOsuLoginPackage, OSU_APP_PACKAGE);
-        when(mContext.getResources()).thenReturn(mockResources);
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.activityInfo = new ActivityInfo();
         resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
         resolveInfo.activityInfo.name = OSU_APP_NAME;
         resolveInfo.activityInfo.applicationInfo.packageName = OSU_APP_PACKAGE;
-        when(mPackageManager.resolveActivity(any(Intent.class),
-                eq(PackageManager.MATCH_DEFAULT_ONLY))).thenReturn(resolveInfo);
+        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
+                .thenReturn(Arrays.asList(resolveInfo));
 
         Map<String, byte[]> trustCertInfo = new HashMap<>();
         trustCertInfo.put("https://testurl.com", "testData".getBytes());
@@ -632,7 +627,7 @@
         verifyNoMoreInteractions(mCallback);
     }
 
-   /**
+    /**
      * Verifies that the right provisioning callbacks are invoked as the provisioner connects
      * to OSU AP and OSU server and that invalid server URL generates the right error callback.
      */
@@ -782,8 +777,7 @@
     @Test
     public void verifyNoOsuActivityFoundFailure() throws RemoteException {
         // There is no activity found for the intent
-        when(mPackageManager.resolveActivity(any(Intent.class),
-                eq(PackageManager.MATCH_DEFAULT_ONLY))).thenReturn(null);
+        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt())).thenReturn(null);
         stopAfterStep(STEP_SERVER_CONNECT);
 
         // Server validation passed
diff --git a/tests/wifitests/src/com/android/server/wifi/util/ScanResultUtilTest.java b/tests/wifitests/src/com/android/server/wifi/util/ScanResultUtilTest.java
index 0f69316..e58d083 100644
--- a/tests/wifitests/src/com/android/server/wifi/util/ScanResultUtilTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/util/ScanResultUtilTest.java
@@ -31,7 +31,9 @@
 import org.junit.Test;
 
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * Unit tests for {@link com.android.server.wifi.util.ScanResultUtil}.
@@ -243,6 +245,26 @@
         assertTrue(ScanResultUtil.isScanResultForFilsSha384Network(input));
     }
 
+    /**
+     * Verify ScanResultList validation.
+     */
+    @Test
+    public void testValidateScanResultList() {
+        List<ScanResult> scanResults = new ArrayList<>();
+        assertFalse(ScanResultUtil.validateScanResultList(null));
+        assertFalse(ScanResultUtil.validateScanResultList(scanResults));
+        scanResults.add(null);
+        assertFalse(ScanResultUtil.validateScanResultList(scanResults));
+        ScanResult scanResult = new ScanResult();
+        scanResults.clear();
+        scanResults.add(scanResult);
+        assertFalse(ScanResultUtil.validateScanResultList(scanResults));
+        scanResult.SSID = "test";
+        scanResult.capabilities = "[RSN-PSK-CCMP]";
+        scanResult.BSSID = "ab:cd:01:ef:45:89";
+        assertTrue(ScanResultUtil.validateScanResultList(scanResults));
+    }
+
     private static InformationElement createIE(int id, byte[] bytes) {
         InformationElement ie = new InformationElement();
         ie.id = id;