[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: c0be01cfc3 -s ours

am skip reason: subject contains skip directive

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/opt/net/wifi/+/25565332

Change-Id: Id6e3710bec73a2c1867f7a86b522988e709a75fc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/OWNERS b/OWNERS
index 583ac1f..a0ab9e6 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1 +1,2 @@
+# Bug component: 33618
 include platform/packages/modules/Wifi:/WIFI_OWNERS
diff --git a/libs/WifiTrackerLib/Android.bp b/libs/WifiTrackerLib/Android.bp
index ca94243..ae16f1a 100644
--- a/libs/WifiTrackerLib/Android.bp
+++ b/libs/WifiTrackerLib/Android.bp
@@ -20,6 +20,9 @@
 android_library {
     name: "WifiTrackerLib",
     defaults: ["WifiTrackerLibDefaults"],
+    static_libs: [
+        "wifi_aconfig_flags_lib",
+    ],
     srcs: ["src/**/*.java"],
 }
 
diff --git a/libs/WifiTrackerLib/res/values-af/strings.xml b/libs/WifiTrackerLib/res/values-af/strings.xml
index 2d42d17..d5e1c94 100644
--- a/libs/WifiTrackerLib/res/values-af/strings.xml
+++ b/libs/WifiTrackerLib/res/values-af/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Lae gehalte"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Word nie deur jou organisasie toegelaat nie"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> van <xliff:g id="MODEL_NAME">%2$s</xliff:g> af"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} van jou foon af}TABLET{{NETWORK_NAME} van jou tablet af}COMPUTER{{NETWORK_NAME} van jou rekenaar af}WATCH{{NETWORK_NAME} van jou horlosie af}VEHICLE{{NETWORK_NAME} van jou voertuig af}other{{NETWORK_NAME} van jou toestel af}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> van <xliff:g id="DEVICE_NAME">%2$s</xliff:g> af"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Koppel tans …"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Beskikbaar vanaf <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> op <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-am/strings.xml b/libs/WifiTrackerLib/res/values-am/strings.xml
index 62b6857..16fdea9 100644
--- a/libs/WifiTrackerLib/res/values-am/strings.xml
+++ b/libs/WifiTrackerLib/res/values-am/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"አነስተኛ ጥራት"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"በእርስዎ ድርጅት አልተፈቀደም"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ከ<xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} ከስልክዎ}TABLET{{NETWORK_NAME} ከጡባዊዎ}COMPUTER{{NETWORK_NAME} ከኮምፒውተርዎ}WATCH{{NETWORK_NAME}ከሰዓትዎ}VEHICLE{{NETWORK_NAME} ከተሽከርካሪዎ}other{{NETWORK_NAME} ከመሣሪያዎ}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ከ<xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"በማገናኘት ላይ…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"ከ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ጀምሮ የሚገኝ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 ጊኸ"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ጊኸ"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ጊኸ"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"፣"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"፣ "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> ሜቢ/ሴ"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> በ<xliff:g id="BAND">%2$s</xliff:g> ላይ"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ar/strings.xml b/libs/WifiTrackerLib/res/values-ar/strings.xml
index 298ecfe..fcca613 100644
--- a/libs/WifiTrackerLib/res/values-ar/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ar/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"جودة منخفضة"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"لا تسمح بها مؤسستك"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"\"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>\" من \"<xliff:g id="MODEL_NAME">%2$s</xliff:g>\""</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{شبكة \"{NETWORK_NAME}\" من هاتفك}TABLET{شبكة \"{NETWORK_NAME}\" من جهازك اللوحي}COMPUTER{شبكة \"{NETWORK_NAME}\" من جهاز الكمبيوتر}WATCH{شبكة \"{NETWORK_NAME}\" من ساعتك}VEHICLE{شبكة \"{NETWORK_NAME}\" من مركبتك}other{شبكة \"{NETWORK_NAME}\" من جهازك}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"\"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>\" من \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"جارٍ الاتصال…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"تتوفّر من \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"٢٫٤ غيغاهرتز"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"٥ غيغاهرتز"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"٤ غيغاهرتز"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"،"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"، "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"‫<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> ميغابت في الثانية"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"‫<xliff:g id="LINK_SPEED">%1$s</xliff:g> على <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-as/strings.xml b/libs/WifiTrackerLib/res/values-as/strings.xml
index 6ec5720..792fe50 100644
--- a/libs/WifiTrackerLib/res/values-as/strings.xml
+++ b/libs/WifiTrackerLib/res/values-as/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"নিম্ন মানৰ"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"আপোনাৰ প্ৰতিষ্ঠানে অনুমতি নিদিয়ে"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{আপোনাৰ ফ’নৰ পৰা {NETWORK_NAME}}TABLET{আপোনাৰ টেবলেটৰ পৰা {NETWORK_NAME}}COMPUTER{আপোনাৰ কম্পিউটাৰৰ পৰা {NETWORK_NAME}}WATCH{আপোনাৰ ঘড়ীৰ পৰা {NETWORK_NAME}}VEHICLE{আপোনাৰ বাহনৰ পৰা {NETWORK_NAME}}other{আপোনাৰ ডিভাইচৰ পৰা {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"সংযোগ কৰি থকা হৈছে…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ পৰা উপলব্ধ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"২.৪ গিগাহাৰ্টজ"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"৫ গিগাহাৰ্টজ"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"৬ গিগাহাৰ্টজ"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> এমবিপিএছ"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>ত <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-az/strings.xml b/libs/WifiTrackerLib/res/values-az/strings.xml
index c1d7049..47f97cb 100644
--- a/libs/WifiTrackerLib/res/values-az/strings.xml
+++ b/libs/WifiTrackerLib/res/values-az/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Aşağı keyfiyyət"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Təşkilatınız icazə vermir"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> tərəfindən <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Telefonunuzdan: {NETWORK_NAME}}TABLET{Planşetinizdən: {NETWORK_NAME}}COMPUTER{Komputerinizdən: {NETWORK_NAME}}WATCH{Saatınızdan: {NETWORK_NAME}}VEHICLE{Avtomobilinizdən: {NETWORK_NAME}}other{Cihazınızdan: {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> tərəfindən <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Qoşulur…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazından əlçatandır"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/san"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> ilə <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</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 df09f83..ce23d6c 100644
--- a/libs/WifiTrackerLib/res/values-b+sr+Latn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-b+sr+Latn/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Loš kvalitet"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Ne dozvoljava vaša organizacija"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> – <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} sa telefona}TABLET{{NETWORK_NAME} sa tableta}COMPUTER{{NETWORK_NAME} sa računara}WATCH{{NETWORK_NAME} sa sata}VEHICLE{{NETWORK_NAME} sa vozila}other{{NETWORK_NAME} sa uređaja}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> – <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Povezuje se…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Dostupno sa uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> MB/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-be/strings.xml b/libs/WifiTrackerLib/res/values-be/strings.xml
index 7e3137c..6da86bd 100644
--- a/libs/WifiTrackerLib/res/values-be/strings.xml
+++ b/libs/WifiTrackerLib/res/values-be/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Нізкая якасць"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Забаронена ў вашай арганізацыі"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ад <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} (з вашага тэлефона)}TABLET{{NETWORK_NAME} (з вашага планшэта)}COMPUTER{{NETWORK_NAME} (з вашага камп\'ютара)}WATCH{{NETWORK_NAME} (з вашага гадзінніка)}VEHICLE{{NETWORK_NAME} (з вашага аўтамабіля)}other{{NETWORK_NAME} (з вашай прылады)}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ад прылады <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Падключэнне…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Даступна тут: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ГГц"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Мбіт/с"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> – <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-bg/strings.xml b/libs/WifiTrackerLib/res/values-bg/strings.xml
index 239e7da..e85489d 100644
--- a/libs/WifiTrackerLib/res/values-bg/strings.xml
+++ b/libs/WifiTrackerLib/res/values-bg/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Ниско качество"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Не се разрешава от организацията ви"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> от <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} от телефона ви}TABLET{{NETWORK_NAME} от таблета ви}COMPUTER{{NETWORK_NAME} от компютъра ви}WATCH{{NETWORK_NAME} от часовника ви}VEHICLE{{NETWORK_NAME} от превозното ви средство}other{{NETWORK_NAME} от устройството ви}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> от <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Свързва се…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Налице от <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> на <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-bn/strings.xml b/libs/WifiTrackerLib/res/values-bn/strings.xml
index 39cc301..862a27d 100644
--- a/libs/WifiTrackerLib/res/values-bn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-bn/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"খারাপ কোয়ালিটি"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"আপনার প্রতিষ্ঠানের অননুমোদিত নেটওয়ার্ক"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> থেকে <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} আপনার ফোন থেকে}TABLET{{NETWORK_NAME} আপনার ট্যাবলেট থেকে}COMPUTER{{NETWORK_NAME} আপনার কম্পিউটার থেকে}WATCH{{NETWORK_NAME} আপনার ঘড়ি থেকে}VEHICLE{{NETWORK_NAME} আপনার গাড়ি থেকে}other{{NETWORK_NAME} আপনার ডিভাইস থেকে}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> থেকে <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"কানেক্ট করা হচ্ছে…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> থেকে উপলভ্য"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"২.৪ GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"৫ GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"৬ GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> এমবিপিএস"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>-এ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-bs/strings.xml b/libs/WifiTrackerLib/res/values-bs/strings.xml
index c26b7c7..5b80355 100644
--- a/libs/WifiTrackerLib/res/values-bs/strings.xml
+++ b/libs/WifiTrackerLib/res/values-bs/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Nizak kvalitet"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Ne dozvoljava vaša organizacija"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> s uređaja <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} s telefona}TABLET{{NETWORK_NAME} s tableta}COMPUTER{{NETWORK_NAME} s računara}WATCH{{NETWORK_NAME} sa sata}VEHICLE{{NETWORK_NAME} iz vozila}other{{NETWORK_NAME} s uređaja}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> s uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Povezivanje…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Dostupno je s uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> pri <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ca/strings.xml b/libs/WifiTrackerLib/res/values-ca/strings.xml
index 5d1002f..1b6204b 100644
--- a/libs/WifiTrackerLib/res/values-ca/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ca/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Qualitat baixa"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"No permesa per la teva organització"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} des del telèfon}TABLET{{NETWORK_NAME} des de la tauleta}COMPUTER{{NETWORK_NAME} des de l\'ordinador}WATCH{{NETWORK_NAME} des del rellotge}VEHICLE{{NETWORK_NAME} des del vehicle}other{{NETWORK_NAME} des del dispositiu}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"S\'està connectant…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponible des de: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> a <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-cs/strings.xml b/libs/WifiTrackerLib/res/values-cs/strings.xml
index ed574bb..f533d6d 100644
--- a/libs/WifiTrackerLib/res/values-cs/strings.xml
+++ b/libs/WifiTrackerLib/res/values-cs/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Nízká kvalita"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Není povoleno vaší organizací"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ze zařízení <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} z vašeho telefonu}TABLET{{NETWORK_NAME} z vašeho tabletu}COMPUTER{{NETWORK_NAME} z vašeho počítače}WATCH{{NETWORK_NAME} z vašich hodinek}VEHICLE{{NETWORK_NAME} z vašeho auta}other{{NETWORK_NAME} z vašeho zařízení}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ze zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Připojování…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"K dispozici ze zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> na <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-da/strings.xml b/libs/WifiTrackerLib/res/values-da/strings.xml
index daf732a..2c07941 100644
--- a/libs/WifiTrackerLib/res/values-da/strings.xml
+++ b/libs/WifiTrackerLib/res/values-da/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Dårlig kvalitet"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Tillades ikke af din organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> fra <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} fra din telefon}TABLET{{NETWORK_NAME} fra din tablet}COMPUTER{{NETWORK_NAME} fra din computer}WATCH{{NETWORK_NAME} fra dit ur}VEHICLE{{NETWORK_NAME} fra dit køretøj}other{{NETWORK_NAME} fra din enhed}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> fra <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Opretter forbindelse…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Tilgængelig fra <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/sek."</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> på <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-de/strings.xml b/libs/WifiTrackerLib/res/values-de/strings.xml
index f5ad110..85f9f34 100644
--- a/libs/WifiTrackerLib/res/values-de/strings.xml
+++ b/libs/WifiTrackerLib/res/values-de/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Niedrige Qualität"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Von deiner Organisation nicht zugelassen"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> von <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} von deinem Smartphone}TABLET{{NETWORK_NAME} von deinem Tablet}COMPUTER{{NETWORK_NAME} von deinem Computer}WATCH{{NETWORK_NAME} von deiner Smartwatch}VEHICLE{{NETWORK_NAME} von deinem Fahrzeug}other{{NETWORK_NAME} von deinem Gerät}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> von <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Wird verbunden…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Verfügbar auf <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> bei <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-el/strings.xml b/libs/WifiTrackerLib/res/values-el/strings.xml
index 61eaa40..ade59b8 100644
--- a/libs/WifiTrackerLib/res/values-el/strings.xml
+++ b/libs/WifiTrackerLib/res/values-el/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Χαμηλή ποιότητα"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Δεν επιτρέπεται από τον οργανισμό σας"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> από <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} από το τηλέφωνό σας}TABLET{{NETWORK_NAME} από το tablet σας}COMPUTER{{NETWORK_NAME} από τον υπολογιστή σας}WATCH{{NETWORK_NAME} από το ρολόι σας}VEHICLE{{NETWORK_NAME} από το όχημά σας}other{{NETWORK_NAME} από τη συσκευή σας}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> από <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Σύνδεση…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Διαθέσιμο από <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> στο <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-en-rAU/strings.xml b/libs/WifiTrackerLib/res/values-en-rAU/strings.xml
index 9761f90..cfbfddc 100644
--- a/libs/WifiTrackerLib/res/values-en-rAU/strings.xml
+++ b/libs/WifiTrackerLib/res/values-en-rAU/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Low quality"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Not allowed by your organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} from your phone}TABLET{{NETWORK_NAME} from your tablet}COMPUTER{{NETWORK_NAME} from your computer}WATCH{{NETWORK_NAME} from your watch}VEHICLE{{NETWORK_NAME} from your vehicle}other{{NETWORK_NAME} from your device}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connecting…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Available from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> on <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-en-rCA/strings.xml b/libs/WifiTrackerLib/res/values-en-rCA/strings.xml
index fefc6f0..0811be7 100644
--- a/libs/WifiTrackerLib/res/values-en-rCA/strings.xml
+++ b/libs/WifiTrackerLib/res/values-en-rCA/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Low quality"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Not allowed by your organization"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} from your phone}TABLET{{NETWORK_NAME} from your tablet}COMPUTER{{NETWORK_NAME} from your computer}WATCH{{NETWORK_NAME} from your watch}VEHICLE{{NETWORK_NAME} from your vehicle}other{{NETWORK_NAME} from your device}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connecting…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Available from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> on <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-en-rGB/strings.xml b/libs/WifiTrackerLib/res/values-en-rGB/strings.xml
index 9761f90..cfbfddc 100644
--- a/libs/WifiTrackerLib/res/values-en-rGB/strings.xml
+++ b/libs/WifiTrackerLib/res/values-en-rGB/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Low quality"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Not allowed by your organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} from your phone}TABLET{{NETWORK_NAME} from your tablet}COMPUTER{{NETWORK_NAME} from your computer}WATCH{{NETWORK_NAME} from your watch}VEHICLE{{NETWORK_NAME} from your vehicle}other{{NETWORK_NAME} from your device}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connecting…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Available from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> on <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-en-rIN/strings.xml b/libs/WifiTrackerLib/res/values-en-rIN/strings.xml
index 9761f90..cfbfddc 100644
--- a/libs/WifiTrackerLib/res/values-en-rIN/strings.xml
+++ b/libs/WifiTrackerLib/res/values-en-rIN/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Low quality"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Not allowed by your organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} from your phone}TABLET{{NETWORK_NAME} from your tablet}COMPUTER{{NETWORK_NAME} from your computer}WATCH{{NETWORK_NAME} from your watch}VEHICLE{{NETWORK_NAME} from your vehicle}other{{NETWORK_NAME} from your device}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> from <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connecting…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Available from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> on <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-en-rXC/strings.xml b/libs/WifiTrackerLib/res/values-en-rXC/strings.xml
index b8b58e9..79c776a 100644
--- a/libs/WifiTrackerLib/res/values-en-rXC/strings.xml
+++ b/libs/WifiTrackerLib/res/values-en-rXC/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎Low quality‎‏‎‎‏‎"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎Not allowed by your organization‎‏‎‎‏‎"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="NETWORK_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from ‎‏‎‎‏‏‎<xliff:g id="MODEL_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎{NETWORK_NAME}‎‏‎‎‏‏‏‎ from your phone‎‏‎‎‏‎}TABLET{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎{NETWORK_NAME}‎‏‎‎‏‏‏‎ from your tablet‎‏‎‎‏‎}COMPUTER{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎{NETWORK_NAME}‎‏‎‎‏‏‏‎ from your computer‎‏‎‎‏‎}WATCH{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎{NETWORK_NAME}‎‏‎‎‏‏‏‎ from your watch‎‏‎‎‏‎}VEHICLE{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎{NETWORK_NAME}‎‏‎‎‏‏‏‎ from your vehicle‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎{NETWORK_NAME}‎‏‎‎‏‏‏‎ from your device‎‏‎‎‏‎}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="NETWORK_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‎Connecting…‎‏‎‎‏‎"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎Available from ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎2.4 GHz‎‏‎‎‏‎"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎5 GHz‎‏‎‎‏‎"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎6 GHz‎‏‎‎‏‎"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎,‎‏‎‎‏‎"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎, ‎‏‎‎‏‎ "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g>‎‏‎‎‏‏‏‎ Mbps‎‏‎‎‏‎"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="LINK_SPEED">%1$s</xliff:g>‎‏‎‎‏‏‏‎ on ‎‏‎‎‏‏‎<xliff:g id="BAND">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-es-rUS/strings.xml b/libs/WifiTrackerLib/res/values-es-rUS/strings.xml
index 126c0c8..986a6a4 100644
--- a/libs/WifiTrackerLib/res/values-es-rUS/strings.xml
+++ b/libs/WifiTrackerLib/res/values-es-rUS/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Baja calidad"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Tu organización no lo permite"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} en tu teléfono}TABLET{{NETWORK_NAME} en tu tablet}COMPUTER{{NETWORK_NAME} en tu computadora}WATCH{{NETWORK_NAME} en tu reloj}VEHICLE{{NETWORK_NAME} en tu vehículo}other{{NETWORK_NAME} en tu dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Estableciendo conexión…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponible desde <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> en <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-es/strings.xml b/libs/WifiTrackerLib/res/values-es/strings.xml
index 94a47f1..be7ef52 100644
--- a/libs/WifiTrackerLib/res/values-es/strings.xml
+++ b/libs/WifiTrackerLib/res/values-es/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Calidad baja"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"No permitido por tu organización"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} desde tu teléfono}TABLET{{NETWORK_NAME} desde tu tablet}COMPUTER{{NETWORK_NAME} desde tu ordenador}WATCH{{NETWORK_NAME} desde tu smartwatch}VEHICLE{{NETWORK_NAME} desde tu vehículo}other{{NETWORK_NAME} desde tu dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Conectando…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponible en <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> de <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-et/strings.xml b/libs/WifiTrackerLib/res/values-et/strings.xml
index a0a39ab..6385088 100644
--- a/libs/WifiTrackerLib/res/values-et/strings.xml
+++ b/libs/WifiTrackerLib/res/values-et/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Kehva kvaliteediga"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Teie organisatsioon pole seda lubanud"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> seadmest <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} teie telefonist}TABLET{{NETWORK_NAME} teie tahvelarvutist}COMPUTER{{NETWORK_NAME} teie arvutist}WATCH{{NETWORK_NAME} teie kellast}VEHICLE{{NETWORK_NAME} teie sõidukist}other{{NETWORK_NAME} teie seadmest}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> seadmest <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Ühendamine …"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Saadaval seadmest <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> <xliff:g id="BAND">%2$s</xliff:g>s"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-eu/strings.xml b/libs/WifiTrackerLib/res/values-eu/strings.xml
index 9e5526f..20fa536 100644
--- a/libs/WifiTrackerLib/res/values-eu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-eu/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Kalitate txikia"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Erakundeak ez du baimenik eman"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (<xliff:g id="MODEL_NAME">%2$s</xliff:g>)"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} telefonoaren bidez}TABLET{{NETWORK_NAME} tabletaren bidez}COMPUTER{{NETWORK_NAME} ordenagailuaren bidez}WATCH{{NETWORK_NAME} erlojuaren bidez}VEHICLE{{NETWORK_NAME} ibilgailuaren bidez}other{{NETWORK_NAME} gailuaren bidez}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Konektatzen…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailuaren bidez erabilgarri"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> (<xliff:g id="BAND">%2$s</xliff:g>)"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fa/strings.xml b/libs/WifiTrackerLib/res/values-fa/strings.xml
index 67483d8..b3dbf1b 100644
--- a/libs/WifiTrackerLib/res/values-fa/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fa/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"کیفیت پایین"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"سازمان شما آن را مجاز نکرده است"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> از <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} از تلفن شما}TABLET{{NETWORK_NAME} از رایانه لوحی شما}COMPUTER{{NETWORK_NAME} از رایانه شما}WATCH{{NETWORK_NAME}از ساعت شما}VEHICLE{{NETWORK_NAME} از خودرو شما}other{{NETWORK_NAME} از دستگاه شما}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> از <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"درحال اتصال…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"ازطریق <xliff:g id="DEVICE_NAME">%1$s</xliff:g> دردسترس است"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"۲٫۴ گیگاهرتز"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"۵ گیگاهرتز"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"۶ گیگاهرتز"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"،"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"، "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> مگابیت در ثانیه"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> در <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fi/strings.xml b/libs/WifiTrackerLib/res/values-fi/strings.xml
index d8dacf6..bf55c21 100644
--- a/libs/WifiTrackerLib/res/values-fi/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fi/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Heikko laatu"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Ei sallita organisaatiossasi"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> laitteesta <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} puhelimelta}TABLET{{NETWORK_NAME} tabletilta}COMPUTER{{NETWORK_NAME} tietokoneelta}WATCH{{NETWORK_NAME} kellosta}VEHICLE{{NETWORK_NAME} ajoneuvosta}other{{NETWORK_NAME} omalta laitteeltasi}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> laitteesta <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Yhdistetään…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Saatavilla: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>, <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml b/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml
index 968ceac..6741bc1 100644
--- a/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Faible qualité"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Non autorisé par votre organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} à partir de votre téléphone}TABLET{{NETWORK_NAME} à partir de votre tablette}COMPUTER{{NETWORK_NAME} à partir de votre ordinateur}WATCH{{NETWORK_NAME} à partir de votre montre}VEHICLE{{NETWORK_NAME} à partir de votre véhicule}other{{NETWORK_NAME} à partir de votre appareil}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connexion en cours…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Accessible à partir de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> sur <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-fr/strings.xml b/libs/WifiTrackerLib/res/values-fr/strings.xml
index 65b5f81..1e23580 100644
--- a/libs/WifiTrackerLib/res/values-fr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-fr/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Faible qualité"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Non autorisé par votre organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (<xliff:g id="MODEL_NAME">%2$s</xliff:g>)"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} sur votre téléphone}TABLET{{NETWORK_NAME} sur votre tablette}COMPUTER{{NETWORK_NAME} sur votre ordinateur}WATCH{{NETWORK_NAME} sur votre montre}VEHICLE{{NETWORK_NAME} dans votre véhicule}other{{NETWORK_NAME} sur votre appareil}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connexion…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponible sur <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> sur <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-gl/strings.xml b/libs/WifiTrackerLib/res/values-gl/strings.xml
index 1867912..8cd2278 100644
--- a/libs/WifiTrackerLib/res/values-gl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-gl/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Pouca calidade"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Non permitida pola túa organización"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} desde o teléfono}TABLET{{NETWORK_NAME} desde a tableta}COMPUTER{{NETWORK_NAME} desde o ordenador}WATCH{{NETWORK_NAME} desde o reloxo}VEHICLE{{NETWORK_NAME} desde o vehículo}other{{NETWORK_NAME} desde o dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Conectando…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Dispoñible desde <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> en <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-gu/strings.xml b/libs/WifiTrackerLib/res/values-gu/strings.xml
index f9a9199..3a7b5f2 100644
--- a/libs/WifiTrackerLib/res/values-gu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-gu/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"ઓછી ક્વૉલિટી"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"તમારી સંસ્થા દ્વારા મંજૂર નથી"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> તરફથી <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} તમારા ફોન પરથી}TABLET{{NETWORK_NAME} તમારા ટૅબ્લેટ પરથી}COMPUTER{{NETWORK_NAME} તમારા કમ્પ્યૂટર પરથી}WATCH{{NETWORK_NAME} તમારી વૉચ પરથી}VEHICLE{{NETWORK_NAME} તમારા વાહન પરથી}other{{NETWORK_NAME} તમારા ડિવાઇસ પરથી}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> તરફથી <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"કનેક્ટ કરી રહ્યાં છીએ…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> પરથી ઉપલબ્ધ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> પર <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hi/strings.xml b/libs/WifiTrackerLib/res/values-hi/strings.xml
index f7f3d94..4c21293 100644
--- a/libs/WifiTrackerLib/res/values-hi/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hi/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"खराब कनेक्शन"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"आपके संगठन ने इसकी अनुमति नहीं दी है"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> से <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{आपके फ़ोन से {NETWORK_NAME} लिया गया है}TABLET{आपके टैबलेट से {NETWORK_NAME} लिया गया है}COMPUTER{आपके कंप्यूटर से {NETWORK_NAME} लिया गया है}WATCH{आपकी स्मार्टवॉच से {NETWORK_NAME} लिया गया है}VEHICLE{आपकी गाड़ी से {NETWORK_NAME} लिया गया है}other{आपके डिवाइस से {NETWORK_NAME} लिया गया है}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"कनेक्ट हो रहा है…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से उपलब्ध"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 गीगाहर्ट्ज़"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 गीगाहर्ट्ज़"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 गीगाहर्ट्ज़"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> एमबीपीएस"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> पर <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hr/strings.xml b/libs/WifiTrackerLib/res/values-hr/strings.xml
index 8b4193f..3ec6885 100644
--- a/libs/WifiTrackerLib/res/values-hr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hr/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Niska kvaliteta"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Vaša organizacija ne dopušta upotrebu"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>, <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} s vašeg telefona}TABLET{{NETWORK_NAME} s vašeg tableta}COMPUTER{{NETWORK_NAME} s vašeg računala}WATCH{{NETWORK_NAME} s vašeg sata}VEHICLE{{NETWORK_NAME} iz vašeg vozila}other{{NETWORK_NAME} s vašeg uređaja}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Povezivanje…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Dostupno s uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>, <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hu/strings.xml b/libs/WifiTrackerLib/res/values-hu/strings.xml
index cecfb5d..60a2281 100644
--- a/libs/WifiTrackerLib/res/values-hu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hu/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Gyenge minőségű"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Szervezete nem engedélyezte"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> – <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} a telefonjáról}TABLET{{NETWORK_NAME} a táblagépéről}COMPUTER{{NETWORK_NAME} a számítógépéről}WATCH{{NETWORK_NAME} az órájáról}VEHICLE{{NETWORK_NAME} a járművéről}other{{NETWORK_NAME} az eszközéről}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> a következőtől: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Csatlakozás…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Innen áll rendelkezésre: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>, <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-hy/strings.xml b/libs/WifiTrackerLib/res/values-hy/strings.xml
index f1749bb..6f2e90d 100644
--- a/libs/WifiTrackerLib/res/values-hy/strings.xml
+++ b/libs/WifiTrackerLib/res/values-hy/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Ցածր որակ"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Թույլատրված չէ ձեր կազմակերպության կողմից"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>՝ <xliff:g id="MODEL_NAME">%2$s</xliff:g>-ից"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} ձեր հեռախոսից}TABLET{{NETWORK_NAME} ձեր պլանշետից}COMPUTER{{NETWORK_NAME} ձեր համակարգչից}WATCH{{NETWORK_NAME} ձեր ժամացույցից}VEHICLE{{NETWORK_NAME} ձեր մեքենայից}other{{NETWORK_NAME} ձեր սարքից}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>՝ «<xliff:g id="DEVICE_NAME">%2$s</xliff:g>»-ից"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Միացում…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Հասանելի է <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքից"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 ԳՀց"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ԳՀց"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ԳՀց"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Մբիթ/վ"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>՝ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-in/strings.xml b/libs/WifiTrackerLib/res/values-in/strings.xml
index 2fe6abe..8f7a2f3 100644
--- a/libs/WifiTrackerLib/res/values-in/strings.xml
+++ b/libs/WifiTrackerLib/res/values-in/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Kualitas rendah"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Tidak diizinkan oleh organisasi Anda"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> dari <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} dari ponsel Anda}TABLET{{NETWORK_NAME} dari tablet Anda}COMPUTER{{NETWORK_NAME} dari komputer Anda}WATCH{{NETWORK_NAME} dari smartwatch Anda}VEHICLE{{NETWORK_NAME} dari kendaraan Anda}other{{NETWORK_NAME} dari perangkat Anda}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> dari <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Menghubungkan…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Tersedia dari <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> di <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-is/strings.xml b/libs/WifiTrackerLib/res/values-is/strings.xml
index ecfc40c..cc256dd 100644
--- a/libs/WifiTrackerLib/res/values-is/strings.xml
+++ b/libs/WifiTrackerLib/res/values-is/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Lítil gæði"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Fyrirtækið leyfir þetta ekki"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> frá <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} úr símanum þínum}TABLET{{NETWORK_NAME} úr spjaldtölvunni þinni}COMPUTER{{NETWORK_NAME} úr tölvunni þinni}WATCH{{NETWORK_NAME} úr úrinu þínu}VEHICLE{{NETWORK_NAME} úr ökutækinu þínu}other{{NETWORK_NAME} úr tækinu þínu}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> frá <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Tengist…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Í boði frá <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/sek."</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> á <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-it/strings.xml b/libs/WifiTrackerLib/res/values-it/strings.xml
index b21cf4c..d2e406a 100644
--- a/libs/WifiTrackerLib/res/values-it/strings.xml
+++ b/libs/WifiTrackerLib/res/values-it/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Bassa qualità"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Uso non consentito dall\'organizzazione"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> da <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} dal tuo smartphone}TABLET{{NETWORK_NAME} dal tuo tablet}COMPUTER{{NETWORK_NAME} dal tuo computer}WATCH{{NETWORK_NAME} dal tuo smartwatch}VEHICLE{{NETWORK_NAME} dal tuo veicolo}other{{NETWORK_NAME} dal tuo dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> da <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Connessione in corso…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponibile da <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> su <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-iw/strings.xml b/libs/WifiTrackerLib/res/values-iw/strings.xml
index 500806c..9d8cf82 100644
--- a/libs/WifiTrackerLib/res/values-iw/strings.xml
+++ b/libs/WifiTrackerLib/res/values-iw/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"איכות נמוכה"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"הארגון שלך לא מתיר את האפשרות הזו"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> מ-<xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} מהטלפון שלך}TABLET{{NETWORK_NAME} מהטאבלט שלך}COMPUTER{{NETWORK_NAME} מהמחשב שלך}WATCH{{NETWORK_NAME} מהשעון שלך}VEHICLE{{NETWORK_NAME} מהרכב שלך}other{{NETWORK_NAME} מהמכשיר שלך}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> מהמכשיר <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"מתבצעת התחברות…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"מקור הרשת: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"‎2.4GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"‎5GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6GHz‎"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"‏‎Mbps‏ <xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g>"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> ב-<xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ja/strings.xml b/libs/WifiTrackerLib/res/values-ja/strings.xml
index ee86d00..478a57d 100644
--- a/libs/WifiTrackerLib/res/values-ja/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ja/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"低品質"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"組織によって許可されていません"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> から <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME}(スマートフォン)}TABLET{{NETWORK_NAME}(タブレット)}COMPUTER{{NETWORK_NAME}(パソコン)}WATCH{{NETWORK_NAME}(スマートウォッチ)}VEHICLE{{NETWORK_NAME}(車)}other{{NETWORK_NAME}(デバイス)}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>から <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"接続しています…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> から利用可能"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"、"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"、 "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>(<xliff:g id="BAND">%2$s</xliff:g>)"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ka/strings.xml b/libs/WifiTrackerLib/res/values-ka/strings.xml
index e3f49b6..8fb91f0 100644
--- a/libs/WifiTrackerLib/res/values-ka/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ka/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"დაბალი ხარისხი"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"არ არის დაშვებული თქვენი ორგანიზაციის მიერ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>, წყარო: <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} თქვენი ტელეფონიდან}TABLET{{NETWORK_NAME} თქვენი ტაბლეტიდან}COMPUTER{{NETWORK_NAME} თქვენი კომპიუტერიდან}WATCH{{NETWORK_NAME} თქვენი საათიდან}VEHICLE{{NETWORK_NAME} თქვენი მანქანიდან}other{{NETWORK_NAME} თქვენი მოწყობილობიდან}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>, წყარო: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"უკავშირდება…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"ხელმისაწვდომია <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-დან"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 გჰც"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 გჰც"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 გჰც"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> მბიტი/წმ"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>, <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-kk/strings.xml b/libs/WifiTrackerLib/res/values-kk/strings.xml
index c4e719a..363eef9 100644
--- a/libs/WifiTrackerLib/res/values-kk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-kk/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Төмен сапа"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Ұйымыңыз рұқсат етпеген"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> ұсынған <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Телефондағы {NETWORK_NAME}}TABLET{Планшеттегі {NETWORK_NAME}}COMPUTER{Компьютердегі {NETWORK_NAME}}WATCH{Сағаттағы {NETWORK_NAME}}VEHICLE{Көліктегі {NETWORK_NAME}}other{Құрылғыдағы {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ұсынған <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Қосылып жатыр…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысынан қолжетімді."</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ГГц"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Мбит/с"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>: <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-km/strings.xml b/libs/WifiTrackerLib/res/values-km/strings.xml
index 0860dc5..9bba84d 100644
--- a/libs/WifiTrackerLib/res/values-km/strings.xml
+++ b/libs/WifiTrackerLib/res/values-km/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"គុណភាព​ទាប"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"មិនបាន​អនុញ្ញាត​ដោយ​ស្ថាប័ន​របស់​អ្នកទេ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ពី <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} ពីទូរសព្ទរបស់អ្នក}TABLET{{NETWORK_NAME} ពីថេប្លេតរបស់អ្នក}COMPUTER{{NETWORK_NAME} ពីកុំព្យូទ័ររបស់អ្នក}WATCH{{NETWORK_NAME} ពីនាឡិការបស់អ្នក}VEHICLE{{NETWORK_NAME} ពីយានជំនិះរបស់អ្នក}other{{NETWORK_NAME} ពីឧបករណ៍របស់អ្នក}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ពី <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"កំពុងភ្ជាប់…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"អាចប្រើបានពី <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> នៅលើ <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-kn/strings.xml b/libs/WifiTrackerLib/res/values-kn/strings.xml
index e479285..717e753 100644
--- a/libs/WifiTrackerLib/res/values-kn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-kn/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"ಕಳಪೆ ಕನೆಕ್ಷನ್"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯಿಂದ ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> ನಿಂದ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{ನಿಮ್ಮ ಫೋನ್‌ನಿಂದ {NETWORK_NAME}}TABLET{ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಿಂದ {NETWORK_NAME}}COMPUTER{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಿಂದ {NETWORK_NAME}}WATCH{ನಿಮ್ಮ ವಾಚ್‌ನಿಂದ {NETWORK_NAME}}VEHICLE{ನಿಮ್ಮ ವಾಹನದಿಂದ {NETWORK_NAME}}other{ನಿಮ್ಮ ಸಾಧನದಿಂದ {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ನಿಂದ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"ಕನೆಕ್ಟ್ ಆಗುತ್ತಿದೆ…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ನಿಂದ ಲಭ್ಯವಿದೆ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> ನಲ್ಲಿ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ko/strings.xml b/libs/WifiTrackerLib/res/values-ko/strings.xml
index e812dfd..1c23f5b 100644
--- a/libs/WifiTrackerLib/res/values-ko/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ko/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"품질 낮음"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"조직에서 허용하지 않음"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g>의 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{휴대전화의 {NETWORK_NAME}}TABLET{태블릿의 {NETWORK_NAME}}COMPUTER{컴퓨터의 {NETWORK_NAME}}WATCH{시계의 {NETWORK_NAME}}VEHICLE{차량의 {NETWORK_NAME}}other{기기의 {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>의 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"연결 중…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에서 사용 가능"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g>Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>, <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ky/strings.xml b/libs/WifiTrackerLib/res/values-ky/strings.xml
index 2975c81..495d5d3 100644
--- a/libs/WifiTrackerLib/res/values-ky/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ky/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Начар сапат"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Уюмуңуз тыюу салган"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g>–<xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Телефонуңуздагы {NETWORK_NAME} тармагы}TABLET{Планшетиңиздеги {NETWORK_NAME} тармагы}COMPUTER{Компьютериңиздеги {NETWORK_NAME} тармагы}WATCH{Саатыңыздагы {NETWORK_NAME} тармагы}VEHICLE{Унааңыздагы {NETWORK_NAME} тармагы}other{Түзмөгүңүздөгү {NETWORK_NAME} тармагы}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>–<xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Туташууда…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүндө жеткиликтүү"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ГГц"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Мб/ск"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g>, <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-lo/strings.xml b/libs/WifiTrackerLib/res/values-lo/strings.xml
index 0297e21..b8da291 100644
--- a/libs/WifiTrackerLib/res/values-lo/strings.xml
+++ b/libs/WifiTrackerLib/res/values-lo/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"ຄຸນນະພາບຕໍ່າ"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"ອົງການຂອງທ່ານບໍ່ອະນຸຍາດ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ຈາກ <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} ຈາກໂທລະສັບຂອງທ່ານ}TABLET{{NETWORK_NAME} ຈາກແທັບເລັດຂອງທ່ານ}COMPUTER{{NETWORK_NAME} ຈາກຄອມພິວເຕີຂອງທ່ານ}WATCH{{NETWORK_NAME} ຈາກໂມງຂອງທ່ານ}VEHICLE{{NETWORK_NAME} ຈາກລົດຂອງທ່ານ}other{{NETWORK_NAME} ຈາກອຸປະກອນຂອງທ່ານ}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ຈາກ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"ກຳລັງເຊື່ອມຕໍ່…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"ມີໃຫ້ຈາກ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> ໃນ <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-lt/strings.xml b/libs/WifiTrackerLib/res/values-lt/strings.xml
index f640260..5c6bd7f 100644
--- a/libs/WifiTrackerLib/res/values-lt/strings.xml
+++ b/libs/WifiTrackerLib/res/values-lt/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Prastas ryšys"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Jūsų organizacijoje neleidžiama"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"„<xliff:g id="NETWORK_NAME">%1$s</xliff:g>“ iš „<xliff:g id="MODEL_NAME">%2$s</xliff:g>“"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{„{NETWORK_NAME}“ iš telefono}TABLET{„{NETWORK_NAME}“ iš planšetinio kompiuterio}COMPUTER{„{NETWORK_NAME}“ iš kompiuterio}WATCH{„{NETWORK_NAME}“ iš laikrodžio}VEHICLE{„{NETWORK_NAME}“ iš transporto priemonės}other{„{NETWORK_NAME}“ iš įrenginio}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"„<xliff:g id="NETWORK_NAME">%1$s</xliff:g>“ iš <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Prisijungiama…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Pasiekiama iš „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-lv/strings.xml b/libs/WifiTrackerLib/res/values-lv/strings.xml
index d1d25fe..b8014a6 100644
--- a/libs/WifiTrackerLib/res/values-lv/strings.xml
+++ b/libs/WifiTrackerLib/res/values-lv/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Zema kvalitāte"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Jūsu organizācija to neatļauj"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> no <xliff:g id="MODEL_NAME">%2$s</xliff:g> ierīces"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} no jūsu tālruņa}TABLET{{NETWORK_NAME} no jūsu planšetdatora}COMPUTER{{NETWORK_NAME} no jūsu datora}WATCH{{NETWORK_NAME} no jūsu pulksteņa}VEHICLE{{NETWORK_NAME} no jūsu transportlīdzekļa}other{{NETWORK_NAME} no jūsu ierīces}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> no ierīces “<xliff:g id="DEVICE_NAME">%2$s</xliff:g>”"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Notiek savienojuma izveide…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Pieejams šādā ierīcē: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> joslā <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-mk/strings.xml b/libs/WifiTrackerLib/res/values-mk/strings.xml
index 04f5188..3854282 100644
--- a/libs/WifiTrackerLib/res/values-mk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-mk/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Лош квалитет"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Не е дозволено од вашата организација"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> од <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} од вашиот телефон}TABLET{{NETWORK_NAME} од вашиот таблет}COMPUTER{{NETWORK_NAME} од вашиот компјутер}WATCH{{NETWORK_NAME} од вашиот часовник}VEHICLE{{NETWORK_NAME} од вашето возило}other{{NETWORK_NAME} од вашиот уред}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> од <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Се поврзува…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Достапно од <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> на <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ml/strings.xml b/libs/WifiTrackerLib/res/values-ml/strings.xml
index 55c0208..a505f8d 100644
--- a/libs/WifiTrackerLib/res/values-ml/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ml/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"കുറഞ്ഞ നിലവാരം"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"നിങ്ങളുടെ ഓർഗനൈസേഷൻ അനുവദിക്കുന്നില്ല"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{നിങ്ങളുടെ ഫോണിൽ നിന്നുള്ള {NETWORK_NAME}}TABLET{നിങ്ങളുടെ ടാബ്‌ലെറ്റിൽ നിന്നുള്ള {NETWORK_NAME}}COMPUTER{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്നുള്ള {NETWORK_NAME}}WATCH{നിങ്ങളുടെ വാച്ചിൽ നിന്നുള്ള {NETWORK_NAME}}VEHICLE{നിങ്ങളുടെ വാഹനത്തിൽ നിന്നുള്ള {NETWORK_NAME}}other{നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്നുള്ള {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"കണക്റ്റ് ചെയ്യുന്നു…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിൽ നിന്ന് ലഭ്യമാണ്"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> എന്നതിലെ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-mn/strings.xml b/libs/WifiTrackerLib/res/values-mn/strings.xml
index 241ae3c..6afb9b2 100644
--- a/libs/WifiTrackerLib/res/values-mn/strings.xml
+++ b/libs/WifiTrackerLib/res/values-mn/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Чанар муу"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Танай байгууллагаас зөвшөөрдөггүй"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g>-с ирсэн <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Таны утасны {NETWORK_NAME}}TABLET{Таны таблетын {NETWORK_NAME}}COMPUTER{Таны компьютерын {NETWORK_NAME}}WATCH{Таны цагны {NETWORK_NAME}}VEHICLE{Таны тээврийн хэрэгслийн {NETWORK_NAME}}other{Таны төхөөрөмжийн {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>-с ирсэн <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Холбогдож байна…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-с ашиглах боломжтой"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ГГц"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>-д <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-mr/strings.xml b/libs/WifiTrackerLib/res/values-mr/strings.xml
index 84e9662..8a89a77 100644
--- a/libs/WifiTrackerLib/res/values-mr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-mr/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"कमी गुणवत्ता"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"तुमच्या संस्थेने अनुमती दिलेली नाही"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> वरील <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{तुमच्या फोनवरून {NETWORK_NAME}}TABLET{तुमच्या टॅबलेटवरून {NETWORK_NAME}}COMPUTER{तुमच्या काँप्युटरवरून {NETWORK_NAME}}WATCH{तुमच्या वॉचवरून {NETWORK_NAME}}VEHICLE{तुमच्या वाहनावरून {NETWORK_NAME}}other{तुमच्या डिव्हाइसवरून {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> वरील <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"कनेक्ट करत आहे…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> वरून उपलब्ध आहे"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"२.४ GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"५ GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"६ GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> वरील <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ms/strings.xml b/libs/WifiTrackerLib/res/values-ms/strings.xml
index d0474ae..4fe2a4b 100644
--- a/libs/WifiTrackerLib/res/values-ms/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ms/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Kualiti rendah"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Tidak dibenarkan oleh organisasi anda"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> daripada <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} daripada telefon anda}TABLET{{NETWORK_NAME} daripada tablet anda}COMPUTER{{NETWORK_NAME} daripada komputer anda}WATCH{{NETWORK_NAME} daripada jam tangan anda}VEHICLE{{NETWORK_NAME} daripada kenderaan anda}other{{NETWORK_NAME} daripada peranti anda}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> daripada <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Menyambung…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Tersedia daripada <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> pada <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-my/strings.xml b/libs/WifiTrackerLib/res/values-my/strings.xml
index 8ae8223..3f163a8 100644
--- a/libs/WifiTrackerLib/res/values-my/strings.xml
+++ b/libs/WifiTrackerLib/res/values-my/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"အရည်အသွေး နိမ့်သည်"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> ထံမှ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{သင့်ဖုန်းမှ {NETWORK_NAME}}TABLET{သင့်တက်ဘလက်မှ {NETWORK_NAME}}COMPUTER{သင့်ကွန်ပျူတာမှ {NETWORK_NAME}}WATCH{သင့်လက်ပတ်နာရီမှ {NETWORK_NAME}}VEHICLE{သင့်ယာဉ်မှ {NETWORK_NAME}}other{သင့်စက်ပစ္စည်းမှ {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ထံမှ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"ချိတ်ဆက်နေသည်…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> တွင် ရနိုင်သည်"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"၂.၄ GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"၅ GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"၆ GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"၊"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"၊ "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> ရှိ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-nb/strings.xml b/libs/WifiTrackerLib/res/values-nb/strings.xml
index e5f7d7f..827e196 100644
--- a/libs/WifiTrackerLib/res/values-nb/strings.xml
+++ b/libs/WifiTrackerLib/res/values-nb/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Lav kvalitet"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Ikke tillatt av organisasjonen din"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> fra <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} fra telefonen}TABLET{{NETWORK_NAME} fra nettbrettet}COMPUTER{{NETWORK_NAME} fra datamaskinen}WATCH{{NETWORK_NAME} fra klokken}VEHICLE{{NETWORK_NAME} fra kjøretøyet}other{{NETWORK_NAME} fra enheten}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> fra <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Kobler til …"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Tilgjengelig fra <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> på <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ne/strings.xml b/libs/WifiTrackerLib/res/values-ne/strings.xml
index d16f244..1ae1020 100644
--- a/libs/WifiTrackerLib/res/values-ne/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ne/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"न्यून गुणस्तर"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"तपाईंको सङ्गठनले अनुमति दिएको छैन"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> को <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{तपाईंको फोनबाट: {NETWORK_NAME}}TABLET{तपाईंको ट्याब्लेटबाट: {NETWORK_NAME}}COMPUTER{तपाईंको कम्प्युटरबाट: {NETWORK_NAME}}WATCH{तपाईंको स्मार्ट वाचबाट: {NETWORK_NAME}}VEHICLE{तपाईंको गाडीबाट: {NETWORK_NAME}}other{तपाईंको डिभाइसबाट: {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> को <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"कनेक्ट गरिँदै छ…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> बाट उपलब्ध"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"२.४ GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"५ GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"६ GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> मा <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-nl/strings.xml b/libs/WifiTrackerLib/res/values-nl/strings.xml
index 10c9119..eb2d63c 100644
--- a/libs/WifiTrackerLib/res/values-nl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-nl/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Lage kwaliteit"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Niet toegestaan door je organisatie"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> van <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} op je telefoon}TABLET{{NETWORK_NAME} op je tablet}COMPUTER{{NETWORK_NAME} op je computer}WATCH{{NETWORK_NAME} op je smartwatch}VEHICLE{{NETWORK_NAME} via je voertuig}other{{NETWORK_NAME} op je apparaat}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> van <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Verbinden…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Beschikbaar vanaf <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> in <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-or/strings.xml b/libs/WifiTrackerLib/res/values-or/strings.xml
index 9e992f9..37accf4 100644
--- a/libs/WifiTrackerLib/res/values-or/strings.xml
+++ b/libs/WifiTrackerLib/res/values-or/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"ନିମ୍ନ ଗୁଣବତ୍ତା"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ଅନୁମତି ଦିଆଯାଏ ନାହିଁ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g>ରୁ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{ଆପଣଙ୍କ ଫୋନରୁ {NETWORK_NAME}}TABLET{ଆପଣଙ୍କ ଟାବଲେଟରୁ {NETWORK_NAME}}COMPUTER{ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରୁ {NETWORK_NAME}}WATCH{ଆପଣଙ୍କ ୱାଚରୁ {NETWORK_NAME}}VEHICLE{ଆପଣଙ୍କ ଗାଡ଼ିରୁ {NETWORK_NAME}}other{ଆପଣଙ୍କ ଡିଭାଇସରୁ {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>ରୁ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"କନେକ୍ଟ କରାଯାଉଛି…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ରୁ ଉପଲବ୍ଧ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>ରେ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pa/strings.xml b/libs/WifiTrackerLib/res/values-pa/strings.xml
index 8aa68dc..a1e3dda 100644
--- a/libs/WifiTrackerLib/res/values-pa/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pa/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"ਠੀਕ-ਠਾਕ ਕਨੈਕਸ਼ਨ"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਇਸਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੱਤੀ ਗਈ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> ਤੋਂ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ {NETWORK_NAME}}TABLET{ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਤੋਂ {NETWORK_NAME}}COMPUTER{ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੋਂ {NETWORK_NAME}}WATCH{ਤੁਹਾਡੀ ਘੜੀ ਤੋਂ {NETWORK_NAME}}VEHICLE{ਤੁਹਾਡੇ ਵਾਹਨ ਤੋਂ {NETWORK_NAME}}other{ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੋਂ {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਤੋਂ <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਤੋਂ ਉਪਲਬਧ ਹੈ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> \'ਤੇ <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pl/strings.xml b/libs/WifiTrackerLib/res/values-pl/strings.xml
index 19c7a0a..4d7c12b 100644
--- a/libs/WifiTrackerLib/res/values-pl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pl/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Niska jakość"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Niedozwolone przez Twoją organizację"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> z urządzenia <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} z Twojego telefonu}TABLET{{NETWORK_NAME} z Twojego tabletu}COMPUTER{{NETWORK_NAME} z Twojego komputera}WATCH{{NETWORK_NAME} z Twojego zegarka}VEHICLE{{NETWORK_NAME} z Twojego pojazdu}other{{NETWORK_NAME} z Twojego urządzenia}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> z urządzenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Łączę…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Sieć dostępna z urządzenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>: <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml b/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml
index b68025a..cfaf0c7 100644
--- a/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pt-rBR/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Conexão lenta"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Não permitido por sua organização"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> do <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} do smartphone}TABLET{{NETWORK_NAME} do tablet}COMPUTER{{NETWORK_NAME} do computador}WATCH{{NETWORK_NAME} do relógio}VEHICLE{{NETWORK_NAME} do veículo}other{{NETWORK_NAME} do dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> do dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Conectando…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponível no dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> no <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml b/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml
index 0ba5796..f787c45 100644
--- a/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Baixa qualidade"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Não é permitido pela sua organização"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} a partir do telemóvel}TABLET{{NETWORK_NAME} a partir do tablet}COMPUTER{{NETWORK_NAME} a partir do computador}WATCH{{NETWORK_NAME} a partir do relógio}VEHICLE{{NETWORK_NAME} a partir do veículo}other{{NETWORK_NAME} a partir do dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"A ligar…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponível a partir de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> em <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-pt/strings.xml b/libs/WifiTrackerLib/res/values-pt/strings.xml
index b68025a..cfaf0c7 100644
--- a/libs/WifiTrackerLib/res/values-pt/strings.xml
+++ b/libs/WifiTrackerLib/res/values-pt/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Conexão lenta"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Não permitido por sua organização"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> do <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} do smartphone}TABLET{{NETWORK_NAME} do tablet}COMPUTER{{NETWORK_NAME} do computador}WATCH{{NETWORK_NAME} do relógio}VEHICLE{{NETWORK_NAME} do veículo}other{{NETWORK_NAME} do dispositivo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> do dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Conectando…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponível no dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> no <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ro/strings.xml b/libs/WifiTrackerLib/res/values-ro/strings.xml
index 9764d90..bd29b34 100644
--- a/libs/WifiTrackerLib/res/values-ro/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ro/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Calitate slabă"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Nu este acceptată de organizația ta"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de la <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} de pe telefon}TABLET{{NETWORK_NAME} de pe tabletă}COMPUTER{{NETWORK_NAME} de pe computer}WATCH{{NETWORK_NAME} de pe ceas}VEHICLE{{NETWORK_NAME} din mașină}other{{NETWORK_NAME} de pe dispozitiv}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> de la <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Se conectează…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Disponibilă de pe <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> pe <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ru/strings.xml b/libs/WifiTrackerLib/res/values-ru/strings.xml
index b25060f..21f7b63 100644
--- a/libs/WifiTrackerLib/res/values-ru/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ru/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"низкое качество"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Запрещено системным администратором"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"Сеть \"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>\", устройство <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Сеть \"{NETWORK_NAME}\" на телефоне}TABLET{Сеть \"{NETWORK_NAME}\" на планшете}COMPUTER{Сеть \"{NETWORK_NAME}\" на компьютере}WATCH{Сеть \"{NETWORK_NAME}\" на часах}VEHICLE{Сеть \"{NETWORK_NAME}\" в автомобиле}other{Сеть \"{NETWORK_NAME}\" на устройстве}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"Сеть \"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>\", устройство \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Подключение…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Доступно с устройства \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\""</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ГГц"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Мбит/с"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> в диапазоне <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-si/strings.xml b/libs/WifiTrackerLib/res/values-si/strings.xml
index b3ce814..09f6c6a 100644
--- a/libs/WifiTrackerLib/res/values-si/strings.xml
+++ b/libs/WifiTrackerLib/res/values-si/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"අඩු ගුණත්වය"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"ඔබගේ සංවිධානය විසින් ඉඩ නොදේ"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> සිට <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{ඔබේ දුරකථනයෙන් {NETWORK_NAME}}TABLET{ඔබේ ටැබ්ලටයෙන් {NETWORK_NAME}}COMPUTER{ඔබේ පරිගණකයෙන් {NETWORK_NAME}}WATCH{ඔබේ ඔරලෝසුවෙන් {NETWORK_NAME}}VEHICLE{ඔබේ වාහනයෙන් {NETWORK_NAME}}other{ඔබේ උපාංගයෙන් {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> සිට <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"සම්බන්ධ වෙමින්…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> වෙතින් තිබේ"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> මත <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sk/strings.xml b/libs/WifiTrackerLib/res/values-sk/strings.xml
index c757dc7..e95a751 100644
--- a/libs/WifiTrackerLib/res/values-sk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sk/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Nízka kvalita"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Nie je povolené vašou organizáciou"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> zariadenia <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} z telefónu}TABLET{{NETWORK_NAME} z tabletu}COMPUTER{{NETWORK_NAME} z počítača}WATCH{{NETWORK_NAME} z hodiniek}VEHICLE{{NETWORK_NAME} z vozidla}other{{NETWORK_NAME} zo zariadenia}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> zariadenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Pripája sa…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"K dispozícii zo zariadenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> v pásme <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sl/strings.xml b/libs/WifiTrackerLib/res/values-sl/strings.xml
index 4ba0418..c8d5545 100644
--- a/libs/WifiTrackerLib/res/values-sl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sl/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Nizka kakovost"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Organizacija tega ne dovoljuje."</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"Omrežje <xliff:g id="NETWORK_NAME">%1$s</xliff:g> (<xliff:g id="MODEL_NAME">%2$s</xliff:g>)"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} iz vašega telefona}TABLET{{NETWORK_NAME} iz vašega tabličnega računalnika}COMPUTER{{NETWORK_NAME} iz vašega računalnika}WATCH{{NETWORK_NAME} iz vaše ure}VEHICLE{{NETWORK_NAME} iz vašega vozila}other{{NETWORK_NAME} iz vaše naprave}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"Omrežje <xliff:g id="NETWORK_NAME">%1$s</xliff:g> (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Vzpostavljanje povezave …"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Na voljo iz naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> v pasu <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sq/strings.xml b/libs/WifiTrackerLib/res/values-sq/strings.xml
index f4d9db1..9df7fe3 100644
--- a/libs/WifiTrackerLib/res/values-sq/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sq/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Cilësi e ulët"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Nuk lejohet nga organizata jote"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> nga <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} nga telefoni yt}TABLET{{NETWORK_NAME} nga tableti yt}COMPUTER{{NETWORK_NAME} nga kompjuteri yt}WATCH{{NETWORK_NAME} nga ora jote}VEHICLE{{NETWORK_NAME} nga automjeti yt}other{{NETWORK_NAME} nga pajisja jote}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> nga <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Po lidhet…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Ofrohet nga <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> në <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sr/strings.xml b/libs/WifiTrackerLib/res/values-sr/strings.xml
index b487cc5..109759e 100644
--- a/libs/WifiTrackerLib/res/values-sr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sr/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Лош квалитет"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Не дозвољава ваша организација"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> – <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} са телефона}TABLET{{NETWORK_NAME} са таблета}COMPUTER{{NETWORK_NAME} са рачунара}WATCH{{NETWORK_NAME} са сата}VEHICLE{{NETWORK_NAME} са возила}other{{NETWORK_NAME} са уређаја}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> – <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Повезује се…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Доступно са уређаја <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> MB/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sv/strings.xml b/libs/WifiTrackerLib/res/values-sv/strings.xml
index 53fee41..d21968f 100644
--- a/libs/WifiTrackerLib/res/values-sv/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sv/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Låg kvalitet"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Tillåts inte av din organisation"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> från <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} från telefonen}TABLET{{NETWORK_NAME} från surfplattan}COMPUTER{{NETWORK_NAME} från datorn}WATCH{{NETWORK_NAME} från klockan}VEHICLE{{NETWORK_NAME} från fordonet}other{{NETWORK_NAME} från enheten}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> från <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Ansluter …"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Tillgängligt från <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> på <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-sw/strings.xml b/libs/WifiTrackerLib/res/values-sw/strings.xml
index 25dde5d..8d7b45b 100644
--- a/libs/WifiTrackerLib/res/values-sw/strings.xml
+++ b/libs/WifiTrackerLib/res/values-sw/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Ubora wa chini"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Shirika lako haliruhusu"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> kutoka kwenye <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} kutoka kwenye simu yako}TABLET{{NETWORK_NAME} kutoka kwenye kishikwambi chako}COMPUTER{{NETWORK_NAME} kutoka kwenye kompyuta yako}WATCH{{NETWORK_NAME} kutoka kwenye saa yako}VEHICLE{{NETWORK_NAME} kutoka kwenye gari lako}other{{NETWORK_NAME} kutoka kwenye kifaa chako}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> kutoka kwenye <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Inaunganisha…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Unapatikana kwenye <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"GHz 2.4"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"GHz 5"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"GHz 6"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"Mbps <xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g>"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> kwenye <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ta/strings.xml b/libs/WifiTrackerLib/res/values-ta/strings.xml
index 7261376..b67557d 100644
--- a/libs/WifiTrackerLib/res/values-ta/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ta/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"குறைந்த தரம்"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"உங்கள் நிறுவனத்தால் அனுமதிக்கப்படவில்லை"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> வழங்கும் <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{உங்கள் மொபைலில் இருந்து {NETWORK_NAME}}TABLET{உங்கள் டேப்லெட்டில் இருந்து {NETWORK_NAME}}COMPUTER{உங்கள் கம்ப்யூட்டரில் இருந்து {NETWORK_NAME}}WATCH{உங்கள் வாட்ச்சில் இருந்து {NETWORK_NAME}}VEHICLE{உங்கள் வாகனத்தில் இருந்து {NETWORK_NAME}}other{உங்கள் சாதனத்தில் இருந்து {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> வழங்கும் <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"இணைக்கிறது…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்தில் இருந்து கிடைக்கும்"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> இல் <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-te/strings.xml b/libs/WifiTrackerLib/res/values-te/strings.xml
index cc16b49..5f5ac6c 100644
--- a/libs/WifiTrackerLib/res/values-te/strings.xml
+++ b/libs/WifiTrackerLib/res/values-te/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"తక్కువ క్వాలిటీ"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"మీ సంస్థచే అనుమతించబడదు"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> నుండి <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{మీ ఫోన్ నుండి {NETWORK_NAME}}TABLET{మీ టాబ్లెట్ నుండి {NETWORK_NAME}}COMPUTER{మీ కంప్యూటర్ నుండి {NETWORK_NAME}}WATCH{మీ వాచ్ నుండి {NETWORK_NAME}}VEHICLE{మీ వాహనం నుండి {NETWORK_NAME}}other{మీ పరికరం నుండి {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> నుండి <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"కనెక్ట్ అవుతోంది…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> నుండి అందుబాటులో ఉంది"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>లో <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-th/strings.xml b/libs/WifiTrackerLib/res/values-th/strings.xml
index 3d1c33f..87dc99c 100644
--- a/libs/WifiTrackerLib/res/values-th/strings.xml
+++ b/libs/WifiTrackerLib/res/values-th/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"คุณภาพต่ำ"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"องค์กรของคุณไม่อนุญาต"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> จาก <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} จากโทรศัพท์ของคุณ}TABLET{{NETWORK_NAME} จากแท็บเล็ตของคุณ}COMPUTER{{NETWORK_NAME} จากคอมพิวเตอร์ของคุณ}WATCH{{NETWORK_NAME} จากนาฬิกาของคุณ}VEHICLE{{NETWORK_NAME} จากรถของคุณ}other{{NETWORK_NAME} จากอุปกรณ์ของคุณ}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> จาก <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"กำลังเชื่อมต่อ…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"พร้อมใช้งานจาก <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> ใน <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-tl/strings.xml b/libs/WifiTrackerLib/res/values-tl/strings.xml
index 0333eb7..685fdeb 100644
--- a/libs/WifiTrackerLib/res/values-tl/strings.xml
+++ b/libs/WifiTrackerLib/res/values-tl/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Mababang kalidad"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Hindi pinapayagan ng iyong organisasyon"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> mula sa <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} mula sa telepono mo}TABLET{{NETWORK_NAME} mula sa tablet mo}COMPUTER{{NETWORK_NAME} mula sa computer mo}WATCH{{NETWORK_NAME} mula sa relo mo}VEHICLE{{NETWORK_NAME} mula sa sasakyan mo}other{{NETWORK_NAME} mula sa device mo}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> mula sa <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Kumokonekta…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Available mula sa <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> sa <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-tr/strings.xml b/libs/WifiTrackerLib/res/values-tr/strings.xml
index b8df72e..a42dd9a 100644
--- a/libs/WifiTrackerLib/res/values-tr/strings.xml
+++ b/libs/WifiTrackerLib/res/values-tr/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Düşük kalite"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Kuruluşunuz tarafından izin verilmiyor"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> kaynağından <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Telefonunuzdaki {NETWORK_NAME}}TABLET{Tabletinizdeki {NETWORK_NAME}}COMPUTER{Bilgisayarınızdaki {NETWORK_NAME}}WATCH{Kol saatinizdeki {NETWORK_NAME}}VEHICLE{Aracınızdaki {NETWORK_NAME}}other{Cihazınızdaki {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> tarafından gönderilen <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Bağlanıyor…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazında erişilebilir"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/sn."</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> üzerinde <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-uk/strings.xml b/libs/WifiTrackerLib/res/values-uk/strings.xml
index a9efd59..6cb88b1 100644
--- a/libs/WifiTrackerLib/res/values-uk/strings.xml
+++ b/libs/WifiTrackerLib/res/values-uk/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Низька якість"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Заборонено у вашій організації"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> з пристрою <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} з вашого телефона}TABLET{{NETWORK_NAME} з вашого планшета}COMPUTER{{NETWORK_NAME} з вашого комп’ютера}WATCH{{NETWORK_NAME} з вашого годинника}VEHICLE{{NETWORK_NAME} з вашого автомобіля}other{{NETWORK_NAME} з вашого пристрою}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> з пристрою \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Підключення…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Доступно з пристрою \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\""</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 ГГц"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 ГГц"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Мбіт/с"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> на частоті <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-ur/strings.xml b/libs/WifiTrackerLib/res/values-ur/strings.xml
index 22d944c..9a98e87 100644
--- a/libs/WifiTrackerLib/res/values-ur/strings.xml
+++ b/libs/WifiTrackerLib/res/values-ur/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"ادنٰی معیار"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"آپ کی تنظیم کی طرف سے اجازت نہیں ہے"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> منجانب <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{آپ کے فون سے {NETWORK_NAME}}TABLET{آپ کے ٹیبلیٹ سے {NETWORK_NAME}}COMPUTER{آپ کے کمپیوٹر سے {NETWORK_NAME}}WATCH{آپ کی گھڑی سے {NETWORK_NAME}}VEHICLE{آپ کی گاڑی سے {NETWORK_NAME}}other{آپ کے آلے سے {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> منجانب <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"منسلک ہو رہا ہے…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> کی طرف سے دستیاب ہیں"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4‎ GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5‎ GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"‏GHz ‏6"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"،"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"، "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"‎<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> پر <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-uz/strings.xml b/libs/WifiTrackerLib/res/values-uz/strings.xml
index f5011c9..2ab99b5 100644
--- a/libs/WifiTrackerLib/res/values-uz/strings.xml
+++ b/libs/WifiTrackerLib/res/values-uz/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Sifati past"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Tashkilotingiz ruxsat bermagan"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="MODEL_NAME">%2$s</xliff:g> <xliff:g id="NETWORK_NAME">%1$s</xliff:g> yubordi"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{Telefoningizdan: {NETWORK_NAME}}TABLET{Planshetingizdan: {NETWORK_NAME}}COMPUTER{Kompyuteringizdan: {NETWORK_NAME}}WATCH{Soatingizdan: {NETWORK_NAME}}VEHICLE{Avtomobilingizdan: {NETWORK_NAME}}other{Qurilmangizdan: {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> <xliff:g id="NETWORK_NAME">%1$s</xliff:g> yubordi"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Ulanmoqda…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Sotuvga chiqadi: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GGs"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GGs"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GGs"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbit/s"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> — <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-vi/strings.xml b/libs/WifiTrackerLib/res/values-vi/strings.xml
index aae2359..48bf9e4 100644
--- a/libs/WifiTrackerLib/res/values-vi/strings.xml
+++ b/libs/WifiTrackerLib/res/values-vi/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Chất lượng thấp"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Không được tổ chức của bạn cho phép"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> trên <xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME} trên điện thoại của bạn}TABLET{{NETWORK_NAME} trên máy tính bảng của bạn}COMPUTER{{NETWORK_NAME} trên máy tính của bạn}WATCH{{NETWORK_NAME} trên đồng hồ của bạn}VEHICLE{{NETWORK_NAME} trên xe của bạn}other{{NETWORK_NAME} trên thiết bị của bạn}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> trên <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Đang kết nối…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Nguồn Internet: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2,4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mb/giây"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> trên <xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml b/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml
index ce8fe10..0584ebe 100644
--- a/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"质量不佳"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"您的组织不允许使用"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"来自 <xliff:g id="MODEL_NAME">%2$s</xliff:g> 的“<xliff:g id="NETWORK_NAME">%1$s</xliff:g>”"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{{NETWORK_NAME}(来自您的手机)}TABLET{{NETWORK_NAME}(来自您的平板电脑)}COMPUTER{{NETWORK_NAME}(来自您的计算机)}WATCH{{NETWORK_NAME}(来自您的手表)}VEHICLE{{NETWORK_NAME}(来自您的汽车)}other{{NETWORK_NAME}(来自您的设备)}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"来自“<xliff:g id="DEVICE_NAME">%2$s</xliff:g>”的<xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"正在连接…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"来自以下设备:<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"、"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"、 "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="LINK_SPEED">%1$s</xliff:g> (<xliff:g id="BAND">%2$s</xliff:g>)"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml b/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml
index 2efe97c..ac750fb 100644
--- a/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"品質欠佳"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"你的機構禁止使用"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"來自「<xliff:g id="MODEL_NAME">%2$s</xliff:g>」的「<xliff:g id="NETWORK_NAME">%1$s</xliff:g>」"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{手機的 {NETWORK_NAME}}TABLET{平板電腦的 {NETWORK_NAME}}COMPUTER{電腦的 {NETWORK_NAME}}WATCH{手錶的 {NETWORK_NAME}}VEHICLE{汽車的 {NETWORK_NAME}}other{裝置的 {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (來自<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"正在連線…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"網絡來源:<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"、"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"、 "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g> <xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml b/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml
index ac7f36d..b723184 100644
--- a/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zh-rTW/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"品質不佳"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"貴機構禁止使用"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (來自<xliff:g id="MODEL_NAME">%2$s</xliff:g>)"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{手機的 {NETWORK_NAME}}TABLET{平板電腦的 {NETWORK_NAME}}COMPUTER{電腦的 {NETWORK_NAME}}WATCH{手錶的 {NETWORK_NAME}}VEHICLE{車輛的 {NETWORK_NAME}}other{裝置的 {NETWORK_NAME}}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> (來自<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"連線中…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"網路來源:<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">"、"</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">"、 "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"<xliff:g id="BAND">%2$s</xliff:g>:<xliff:g id="LINK_SPEED">%1$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values-zu/strings.xml b/libs/WifiTrackerLib/res/values-zu/strings.xml
index 49566b4..11753f4 100644
--- a/libs/WifiTrackerLib/res/values-zu/strings.xml
+++ b/libs/WifiTrackerLib/res/values-zu/strings.xml
@@ -45,6 +45,15 @@
     <string name="wifi_connected_low_quality" msgid="4478331645458058445">"Ikhwalithi ephansi"</string>
     <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"Ayivunyelwe yinhlangano yakho"</string>
     <string name="wifitrackerlib_hotspot_network_summary" msgid="7661086683527884190">"I-<xliff:g id="NETWORK_NAME">%1$s</xliff:g> evela ku-<xliff:g id="MODEL_NAME">%2$s</xliff:g>"</string>
+    <string name="wifitrackerlib_hotspot_network_summary_new" msgid="1165705867298669621">"{DEVICE_TYPE,select, PHONE{I-{NETWORK_NAME} ukusuka kufoni yakho}TABLET{I-{NETWORK_NAME} ukusuka kuthebhulethi yakho}COMPUTER{I-{NETWORK_NAME} ukusuka kukhompyutha yakho}WATCH{I-{NETWORK_NAME} ukusuka kuwashi lakho}VEHICLE{I-{NETWORK_NAME} ukusuka emotweni yakho}other{I-{NETWORK_NAME} ukusuka kudivayisi yakho}}"</string>
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_generic (2339836723160908882) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_settings (6928234716406336668) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_block (359780026027619177) -->
+    <skip />
+    <!-- no translation found for wifitrackerlib_hotspot_network_summary_error_carrier_incomplete (3407132390461094984) -->
+    <skip />
     <string name="wifitrackerlib_hotspot_network_alternate" msgid="4966814473758893807">"I-<xliff:g id="NETWORK_NAME">%1$s</xliff:g> evela ku-<xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="wifitrackerlib_hotspot_network_connecting" msgid="2072252282318270780">"Iyaxhuma…"</string>
     <string name="wifitrackerlib_known_network_summary" msgid="6035425130009353268">"Kutholakala ukusukela ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -88,5 +97,7 @@
     <string name="wifitrackerlib_wifi_band_24_ghz" msgid="5374362780653321244">"2.4 GHz"</string>
     <string name="wifitrackerlib_wifi_band_5_ghz" msgid="2179047349922091556">"5 GHz"</string>
     <string name="wifitrackerlib_wifi_band_6_ghz" msgid="6532408050869498777">"6 GHz"</string>
-    <string name="wifitrackerlib_multiband_separator" msgid="2696920984391378575">","</string>
+    <string name="wifitrackerlib_multiband_separator" msgid="6838172120482590336">", "</string>
+    <string name="wifitrackerlib_link_speed_mbps" msgid="5880214340478706112">"<xliff:g id="LINK_SPEED_MBPS">%1$d</xliff:g> Mbps"</string>
+    <string name="wifitrackerlib_link_speed_on_band" msgid="2433114336144744962">"I-<xliff:g id="LINK_SPEED">%1$s</xliff:g> ku-<xliff:g id="BAND">%2$s</xliff:g>"</string>
 </resources>
diff --git a/libs/WifiTrackerLib/res/values/config.xml b/libs/WifiTrackerLib/res/values/config.xml
new file mode 100644
index 0000000..8ec73f5
--- /dev/null
+++ b/libs/WifiTrackerLib/res/values/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Enables verbose logging on user debug builds by default -->
+    <bool name="wifitrackerlib_enable_verbose_logging_for_userdebug">true</bool>
+</resources>
diff --git a/libs/WifiTrackerLib/res/values/strings.xml b/libs/WifiTrackerLib/res/values/strings.xml
index 691fb21..5be3c7d 100644
--- a/libs/WifiTrackerLib/res/values/strings.xml
+++ b/libs/WifiTrackerLib/res/values/strings.xml
@@ -121,6 +121,35 @@
     <!-- Summary for a hotspot network (used on "Internet" page) [CHAR LIMIT=NONE] -->
     <string name="wifitrackerlib_hotspot_network_summary"><xliff:g id="network name" example="Google Fi">%1$s</xliff:g> from <xliff:g id="model name" example="Pixel 7">%2$s</xliff:g></string>
 
+    <!-- New format summary for a hotspot network (used on "Internet" page) [CHAR LIMIT=NONE] -->
+    <string name="wifitrackerlib_hotspot_network_summary_new">{DEVICE_TYPE, select,
+        PHONE {{NETWORK_NAME} from your phone}
+        TABLET {{NETWORK_NAME} from your tablet}
+        COMPUTER {{NETWORK_NAME} from your computer}
+        WATCH {{NETWORK_NAME} from your watch}
+        VEHICLE {{NETWORK_NAME} from your vehicle}
+        other {{NETWORK_NAME} from your device}
+    }</string>
+
+    <!-- Summary for a hotspot network with generic error [CHAR LIMIT=NONE] -->
+    <string name="wifitrackerlib_hotspot_network_summary_error_generic">Can\'t connect. Try connecting again.</string>
+
+    <!-- Summary for a hotspot network with settings related error [CHAR LIMIT=NONE] -->
+    <string name="wifitrackerlib_hotspot_network_summary_error_settings">{DEVICE_TYPE, select,
+        PHONE {Can\'t connect. Check phone settings and try again.}
+        TABLET {Can\'t connect. Check tablet settings and try again.}
+        COMPUTER {Can\'t connect. Check computer settings and try again.}
+        WATCH {Can\'t connect. Check watch settings and try again.}
+        VEHICLE {Can\'t connect. Check vehicle settings and try again.}
+        other {Can\'t connect. Check device settings and try again.}
+    }</string>
+
+    <!-- Summary for a hotspot network with carrier entitlement block error [CHAR LIMIT=NONE] -->
+    <string name="wifitrackerlib_hotspot_network_summary_error_carrier_block"><xliff:g id="network name" example="Google Fi">%1$s</xliff:g> doesn\'t allow this connection</string>
+
+    <!-- Summary for a hotspot network with carrier entitlement incomplete error [CHAR LIMIT=NONE] -->
+    <string name="wifitrackerlib_hotspot_network_summary_error_carrier_incomplete">Can\'t connect. Contact <xliff:g id="network name" example="Google Fi">%1$s</xliff:g> for help.</string>
+
     <!-- Alternate summary for a hotspot network (used on "Network & internet" page) [CHAR LIMIT=NONE] -->
     <string name="wifitrackerlib_hotspot_network_alternate"><xliff:g id="network name" example="Google Fi">%1$s</xliff:g> from <xliff:g id="device name" example="Matt's Phone">%2$s</xliff:g></string>
 
@@ -247,5 +276,9 @@
     <!-- Summary for the Wi-Fi 6Ghz band [CHAR LIMIT=50]-->
     <string name="wifitrackerlib_wifi_band_6_ghz">6 GHz</string>
     <!-- Separator between Wi-Fi bands in a list [CHAR LIMIT=50]-->
-    <string name="wifitrackerlib_multiband_separator">, </string>
+    <string name="wifitrackerlib_multiband_separator">", "</string>
+    <!-- Summary for link speed on Mbps -->
+    <string name="wifitrackerlib_link_speed_mbps"><xliff:g id="link_speed_mbps" example="233">%1$d</xliff:g> Mbps</string>
+    <!-- Summary for link speed on a specific band -->
+    <string name="wifitrackerlib_link_speed_on_band"><xliff:g id="link_speed" example="233 Mbps">%1$s</xliff:g> on <xliff:g id="band" example="2.4 GHz">%2$s</xliff:g></string>
 </resources>
diff --git a/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java b/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java
index 52c5155..4ea4862 100644
--- a/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java
+++ b/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java
@@ -101,4 +101,12 @@
         // Return null since SUW does not have QUERY_ADMIN_POLICY permission.
         return null;
     }
+
+    /**
+     * Whether the hotspot network provider battery charging status flag is enabled.
+     */
+    static boolean isNetworkProviderBatteryChargingStatusEnabled() {
+        // Google3 can't access trunk stable flags, so default to false.
+        return false;
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java
index 5f1abd9..d704d39 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java
@@ -91,17 +91,14 @@
 public class BaseWifiTracker {
     private final String mTag;
 
-    private static boolean sVerboseLogging;
-
-    public static boolean mEnableSharedConnectivityFeature = false;
-
-    public static boolean isVerboseLoggingEnabled() {
-        return BaseWifiTracker.sVerboseLogging;
+    public boolean isVerboseLoggingEnabled() {
+        return mInjector.isVerboseLoggingEnabled();
     }
 
     private int mWifiState = WifiManager.WIFI_STATE_DISABLED;
 
     private boolean mIsInitialized = false;
+    private boolean mIsScanningDisabled = false;
 
     // Registered on the worker thread
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@@ -126,6 +123,8 @@
                 handleConfiguredNetworksChangedAction(intent);
             } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
                 handleNetworkStateChangedAction(intent);
+            } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
+                handleRssiChangedAction(intent);
             } else if (TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED.equals(action)) {
                 handleDefaultSubscriptionChanged(intent.getIntExtra(
                         "subscription", SubscriptionManager.INVALID_SUBSCRIPTION_ID));
@@ -134,6 +133,7 @@
     };
     private final BaseWifiTracker.Scanner mScanner;
     private final BaseWifiTrackerCallback mListener;
+    private final @NonNull LifecycleObserver mLifecycleObserver;
 
     protected final WifiTrackerInjector mInjector;
     protected final Context mContext;
@@ -189,6 +189,22 @@
                 @WorkerThread
                 public void onCapabilitiesChanged(@NonNull Network network,
                         @NonNull NetworkCapabilities networkCapabilities) {
+                    // If the default network has an underlying Wi-Fi network (e.g. it's
+                    // a VPN), treat the Wi-Fi network as the default network.
+                    List<Network> underlyingNetworks = BuildCompat.isAtLeastT()
+                            ? networkCapabilities.getUnderlyingNetworks() : null;
+                    if (underlyingNetworks != null) {
+                        for (Network underlyingNetwork : underlyingNetworks) {
+                            NetworkCapabilities underlyingNetworkCapabilities =
+                                    mConnectivityManager.getNetworkCapabilities(underlyingNetwork);
+                            if (underlyingNetworkCapabilities != null
+                                    && underlyingNetworkCapabilities.hasTransport(TRANSPORT_WIFI)) {
+                                handleDefaultNetworkCapabilitiesChanged(
+                                        underlyingNetwork, underlyingNetworkCapabilities);
+                                return;
+                            }
+                        }
+                    }
                     handleDefaultNetworkCapabilitiesChanged(network, networkCapabilities);
                 }
 
@@ -279,7 +295,12 @@
     /**
      * Constructor for BaseWifiTracker.
      * @param injector Injector for commonly referenced objects.
-     * @param lifecycle Lifecycle this is tied to for lifecycle callbacks.
+     * @param lifecycle Lifecycle to register the internal LifecycleObserver with. Note that we
+     *                  register the LifecycleObserver inside the constructor, which may cause an
+     *                  NPE if the Lifecycle invokes onStart/onStop/onDestroyed within
+     *                  {@link Lifecycle#addObserver}. To avoid this, pass {@code null} here and
+     *                  register the LifecycleObserver from {@link #getLifecycleObserver()}
+     *                  instead.
      * @param context Context for registering broadcast receiver and for resource strings.
      * @param wifiManager Provides all Wi-Fi info.
      * @param connectivityManager Provides network info.
@@ -292,7 +313,7 @@
     @SuppressWarnings("StaticAssignmentInConstructor")
     BaseWifiTracker(
             @NonNull WifiTrackerInjector injector,
-            @NonNull Lifecycle lifecycle, @NonNull Context context,
+            @Nullable Lifecycle lifecycle, @NonNull Context context,
             @NonNull WifiManager wifiManager,
             @NonNull ConnectivityManager connectivityManager,
             @NonNull Handler mainHandler,
@@ -304,7 +325,7 @@
             String tag) {
         mInjector = injector;
         mActivityManager = context.getSystemService(ActivityManager.class);
-        lifecycle.addObserver(new LifecycleObserver() {
+        mLifecycleObserver = new LifecycleObserver() {
             @OnLifecycleEvent(Lifecycle.Event.ON_START)
             @MainThread
             public void onStart() {
@@ -322,13 +343,13 @@
             public void onDestroy() {
                 BaseWifiTracker.this.onDestroy();
             }
-        });
+        };
         mContext = context;
         mWifiManager = wifiManager;
         mConnectivityManager = connectivityManager;
         mConnectivityDiagnosticsManager =
                 context.getSystemService(ConnectivityDiagnosticsManager.class);
-        if (mEnableSharedConnectivityFeature && BuildCompat.isAtLeastU()) {
+        if (mInjector.isSharedConnectivityFeatureEnabled() && BuildCompat.isAtLeastU()) {
             mSharedConnectivityManager = context.getSystemService(SharedConnectivityManager.class);
             mSharedConnectivityCallback = createSharedConnectivityCallback();
         }
@@ -342,7 +363,28 @@
         mScanResultUpdater = new ScanResultUpdater(clock,
                 maxScanAgeMillis + scanIntervalMillis);
         mScanner = new BaseWifiTracker.Scanner(workerHandler.getLooper());
-        sVerboseLogging = mWifiManager.isVerboseLoggingEnabled();
+
+        if (lifecycle != null) { // Need to add after mScanner is initialized.
+            lifecycle.addObserver(mLifecycleObserver);
+        }
+    }
+
+    /**
+     * Disable the scanning mechanism permanently.
+     */
+    public void disableScanning() {
+        mIsScanningDisabled = true;
+        // This method indicates SystemUI usage, which shouldn't output verbose logs since it's
+        // always up.
+        mInjector.disableVerboseLogging();
+    }
+
+    /**
+     * Returns the LifecycleObserver to listen on the app's lifecycle state.
+     */
+    @AnyThread
+    public LifecycleObserver getLifecycleObserver() {
+        return mLifecycleObserver;
     }
 
     /**
@@ -360,6 +402,9 @@
             filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
             filter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
             filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+            if (isVerboseLoggingEnabled()) {
+                filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+            }
             filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
             filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
             mContext.registerReceiver(mBroadcastReceiver, filter,
@@ -502,6 +547,14 @@
     }
 
     /**
+     * Handle receiving the WifiManager.NETWORK_STATE_CHANGED_ACTION broadcast
+     */
+    @WorkerThread
+    protected void handleRssiChangedAction(@NonNull Intent intent) {
+        // Do nothing.
+    }
+
+    /**
      * Handle link property changes for the given network.
      */
     @WorkerThread
@@ -751,7 +804,7 @@
          * Scanning should only happen when Wi-Fi is enabled and the activity is started.
          */
         private boolean shouldScan() {
-            return mIsWifiEnabled && mIsStartedState;
+            return mIsWifiEnabled && mIsStartedState && !mIsScanningDisabled;
         }
 
         @WorkerThread
@@ -769,6 +822,8 @@
                 WifiScanner.ScanSettings scanSettings = new WifiScanner.ScanSettings();
                 scanSettings.band = WifiScanner.WIFI_BAND_BOTH;
                 scanSettings.setRnrSetting(WifiScanner.WIFI_RNR_ENABLED);
+                scanSettings.reportEvents = WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
+                        | WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
                 WifiScanner wifiScanner = mContext.getSystemService(WifiScanner.class);
                 if (wifiScanner != null) {
                     wifiScanner.stopScan(mFirstScanListener);
@@ -776,6 +831,7 @@
                         Log.v(mTag, "Issuing scan request from WifiScanner");
                     }
                     wifiScanner.startScan(scanSettings, mFirstScanListener);
+                    notifyOnScanRequested();
                     return;
                 } else {
                     Log.e(mTag, "Failed to retrieve WifiScanner!");
@@ -810,6 +866,7 @@
             // Remove any pending scanLoops in case possiblyStartScanning was called more than once.
             removeCallbacksAndMessages(null);
             mWifiManager.startScan();
+            notifyOnScanRequested();
             postDelayed(this::scanLoop, mScanIntervalMillis);
         }
     }
@@ -832,6 +889,16 @@
     }
 
     /**
+     * Posts onScanRequested callback on the main thread.
+     */
+    @WorkerThread
+    private void notifyOnScanRequested() {
+        if (mListener != null) {
+            mMainHandler.post(mListener::onScanRequested);
+        }
+    }
+
+    /**
      * Base callback handling Wi-Fi state changes
      *
      * Subclasses should extend this for their own needs.
@@ -842,5 +909,10 @@
          */
         @MainThread
         void onWifiStateChanged();
+
+        @MainThread
+        default void onScanRequested() {
+            // Do nothing.
+        }
     }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java
index a30dd5e..e223ec4 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java
@@ -111,10 +111,14 @@
     @WorkerThread
     @Override
     protected void handleServiceConnected() {
-        if (mEnableSharedConnectivityFeature && mSharedConnectivityManager != null) {
-            mHotspotNetworkData = mSharedConnectivityManager.getHotspotNetworks().stream().filter(
-                    network -> network.getDeviceId() == mChosenEntry.getHotspotNetworkEntryKey()
-                            .getDeviceId()).findFirst().orElse(null);
+        if (mInjector.isSharedConnectivityFeatureEnabled() && mSharedConnectivityManager != null) {
+            List<HotspotNetwork> hotspotNetworks = mSharedConnectivityManager.getHotspotNetworks();
+            if (hotspotNetworks != null) {
+                mHotspotNetworkData = hotspotNetworks.stream().filter(
+                                network -> network.getDeviceId()
+                                        == mChosenEntry.getHotspotNetworkEntryKey().getDeviceId())
+                        .findFirst().orElse(null);
+            }
         }
         if (mHotspotNetworkData == null) {
             throw new IllegalArgumentException(
@@ -126,7 +130,7 @@
     @WorkerThread
     @Override
     protected void handleHotspotNetworksUpdated(List<HotspotNetwork> networks) {
-        if (mEnableSharedConnectivityFeature) {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
             mHotspotNetworkData = networks.stream().filter(network -> network.getDeviceId()
                     == mChosenEntry.getHotspotNetworkEntryKey().getDeviceId()).findFirst().orElse(
                     null);
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java
index 0495fef..67aca3d 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java
@@ -16,10 +16,13 @@
 
 package com.android.wifitrackerlib;
 
+import static android.net.wifi.WifiInfo.DEFAULT_MAC_ADDRESS;
 import static android.os.Build.VERSION_CODES;
 
+import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
 import android.content.Context;
+import android.icu.text.MessageFormat;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.net.wifi.sharedconnectivity.app.HotspotNetwork;
@@ -28,6 +31,7 @@
 import android.net.wifi.sharedconnectivity.app.SharedConnectivityManager;
 import android.os.Handler;
 import android.text.BidiFormatter;
+import android.text.TextUtils;
 import android.util.Log;
 
 import androidx.annotation.IntDef;
@@ -35,6 +39,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
+import androidx.core.os.BuildCompat;
 
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -42,6 +47,9 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -51,6 +59,10 @@
 public class HotspotNetworkEntry extends WifiEntry {
     static final String TAG = "HotspotNetworkEntry";
     public static final String KEY_PREFIX = "HotspotNetworkEntry:";
+    public static final String EXTRA_KEY_IS_BATTERY_CHARGING = "is_battery_charging";
+
+    private static final String DEVICE_TYPE_KEY = "DEVICE_TYPE";
+    private static final String NETWORK_NAME_KEY = "NETWORK_NAME";
 
     @NonNull private final WifiTrackerInjector mInjector;
     @NonNull private final Context mContext;
@@ -58,8 +70,9 @@
 
     @Nullable private HotspotNetwork mHotspotNetworkData;
     @NonNull private HotspotNetworkEntryKey mKey;
-
-    private boolean mServerInitiatedConnection = false;
+    @ConnectionStatus
+    private int mLastStatus = HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN;
+    private boolean mConnectionError = false;
 
     /**
      * If editing this IntDef also edit the definition in:
@@ -93,6 +106,8 @@
     })
     public @interface DeviceType {} // TODO(b/271868642): Add IfThisThanThat lint
 
+    public static final int CONNECTION_STATUS_CONNECTED = 10;
+
     /**
      * If editing this IntDef also edit the definition in:
      * {@link android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus}
@@ -111,6 +126,7 @@
             HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_FAILED,
             HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_TIMEOUT,
             HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED,
+            CONNECTION_STATUS_CONNECTED,
     })
     public @interface ConnectionStatus {} // TODO(b/271868642): Add IfThisThanThat lint
 
@@ -123,7 +139,7 @@
             @NonNull WifiManager wifiManager,
             @Nullable SharedConnectivityManager sharedConnectivityManager,
             @NonNull HotspotNetwork hotspotNetworkData) {
-        super(callbackHandler, wifiManager, false /*forSavedNetworksPage*/);
+        super(injector, callbackHandler, wifiManager, false /*forSavedNetworksPage*/);
         mInjector = injector;
         mContext = context;
         mSharedConnectivityManager = sharedConnectivityManager;
@@ -140,7 +156,7 @@
             @NonNull WifiManager wifiManager,
             @Nullable SharedConnectivityManager sharedConnectivityManager,
             @NonNull HotspotNetworkEntryKey key) {
-        super(callbackHandler, wifiManager, false /*forSavedNetworksPage*/);
+        super(injector, callbackHandler, wifiManager, false /*forSavedNetworksPage*/);
         mInjector = injector;
         mContext = context;
         mSharedConnectivityManager = sharedConnectivityManager;
@@ -175,11 +191,21 @@
         if (mKey.isVirtualEntry()) {
             return false;
         }
-        return Objects.equals(mKey.getBssid(), wifiInfo.getBSSID());
+        return Objects.equals(mKey.getScanResultKey(),
+                new StandardWifiEntry.ScanResultKey(WifiInfo.sanitizeSsid(wifiInfo.getSSID()),
+                        Collections.singletonList(wifiInfo.getCurrentSecurityType())));
     }
 
     @Override
-    public String getTitle() {
+    public int getLevel() {
+        if (getConnectedState() == CONNECTED_STATE_DISCONNECTED) {
+            return WIFI_LEVEL_MAX;
+        }
+        return super.getLevel();
+    }
+
+    @Override
+    public synchronized String getTitle() {
         if (mHotspotNetworkData == null) {
             return "";
         }
@@ -187,17 +213,49 @@
     }
 
     @Override
-    public String getSummary(boolean concise) {
+    public synchronized String getSummary(boolean concise) {
         if (mHotspotNetworkData == null) {
             return "";
         }
-        if (getConnectedState() != CONNECTED_STATE_CONNECTED && mServerInitiatedConnection) {
+        if (mCalledConnect) {
             return mContext.getString(R.string.wifitrackerlib_hotspot_network_connecting);
         }
-        return mContext.getString(R.string.wifitrackerlib_hotspot_network_summary,
-                BidiFormatter.getInstance().unicodeWrap(mHotspotNetworkData.getNetworkName()),
-                BidiFormatter.getInstance().unicodeWrap(
-                        mHotspotNetworkData.getNetworkProviderInfo().getModelName()));
+        if (mConnectionError) {
+            switch (mLastStatus) {
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_PROVISIONING_FAILED:
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT:
+                    return mContext.getString(
+                        R.string.wifitrackerlib_hotspot_network_summary_error_carrier_incomplete,
+                        BidiFormatter.getInstance().unicodeWrap(
+                               mHotspotNetworkData.getNetworkName()));
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_UNSUPPORTED:
+                    return mContext.getString(
+                            R.string.wifitrackerlib_hotspot_network_summary_error_carrier_block,
+                            BidiFormatter.getInstance().unicodeWrap(
+                                    mHotspotNetworkData.getNetworkName()));
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_NO_CELL_DATA:
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_FAILED:
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_TIMEOUT:
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED:
+                    MessageFormat msg = new MessageFormat(mContext.getString(
+                            R.string.wifitrackerlib_hotspot_network_summary_error_settings));
+                    Map<String, Object> args = new HashMap<>();
+                    args.put(DEVICE_TYPE_KEY, getDeviceTypeId(
+                            mHotspotNetworkData.getNetworkProviderInfo().getDeviceType()));
+                    return msg.format(args);
+                case HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR:
+                default:
+                    return mContext.getString(
+                            R.string.wifitrackerlib_hotspot_network_summary_error_generic);
+            }
+        }
+        MessageFormat msg = new MessageFormat(
+                mContext.getString(R.string.wifitrackerlib_hotspot_network_summary_new));
+        Map<String, Object> args = new HashMap<>();
+        args.put(DEVICE_TYPE_KEY,
+                getDeviceTypeId(mHotspotNetworkData.getNetworkProviderInfo().getDeviceType()));
+        args.put(NETWORK_NAME_KEY, mHotspotNetworkData.getNetworkName());
+        return msg.format(args);
     }
 
     /**
@@ -205,7 +263,7 @@
      *
      * @return Display string.
      */
-    public String getAlternateSummary() {
+    public synchronized String getAlternateSummary() {
         if (mHotspotNetworkData == null) {
             return "";
         }
@@ -215,13 +273,74 @@
                         mHotspotNetworkData.getNetworkProviderInfo().getDeviceName()));
     }
 
+    @Override
+    public synchronized String getSsid() {
+        StandardWifiEntry.ScanResultKey scanResultKey = mKey.getScanResultKey();
+        if (scanResultKey == null) {
+            return null;
+        }
+        return scanResultKey.getSsid();
+    }
+
+    @Override
+    @Nullable
+    @SuppressLint("HardwareIds")
+    public synchronized String getMacAddress() {
+        if (mWifiInfo == null) {
+            return null;
+        }
+        final String wifiInfoMac = mWifiInfo.getMacAddress();
+        if (!TextUtils.isEmpty(wifiInfoMac)
+                && !TextUtils.equals(wifiInfoMac, DEFAULT_MAC_ADDRESS)) {
+            return wifiInfoMac;
+        }
+        if (getPrivacy() != PRIVACY_RANDOMIZED_MAC) {
+            final String[] factoryMacs = mWifiManager.getFactoryMacAddresses();
+            if (factoryMacs.length > 0) {
+                return factoryMacs[0];
+            }
+        }
+        return null;
+    }
+
+    @Override
+    @Privacy
+    public int getPrivacy() {
+        return PRIVACY_RANDOMIZED_MAC;
+    }
+
+    @Override
+    public synchronized String getSecurityString(boolean concise) {
+        if (mHotspotNetworkData == null) {
+            return "";
+        }
+        return Utils.getSecurityString(mContext,
+                new ArrayList<>(mHotspotNetworkData.getHotspotSecurityTypes()), concise);
+    }
+
+    @Override
+    public synchronized String getStandardString() {
+        if (mWifiInfo == null) {
+            return "";
+        }
+        return Utils.getStandardString(mContext, mWifiInfo.getWifiStandard());
+    }
+
+    @Override
+    public synchronized String getBandString() {
+        if (mWifiInfo == null) {
+            return "";
+        }
+        return Utils.wifiInfoToBandString(mContext, mWifiInfo);
+    }
+
     /**
      * Connection strength between the host device and the internet.
      *
      * @return Displayed connection strength in the range 0 to 4.
      */
     @IntRange(from = 0, to = 4)
-    public int getUpstreamConnectionStrength() {
+    public synchronized int getUpstreamConnectionStrength() {
         if (mHotspotNetworkData == null) {
             return 0;
         }
@@ -234,7 +353,7 @@
      * @return NetworkType enum.
      */
     @NetworkType
-    public int getNetworkType() {
+    public synchronized int getNetworkType() {
         if (mHotspotNetworkData == null) {
             return HotspotNetwork.NETWORK_TYPE_UNKNOWN;
         }
@@ -247,7 +366,7 @@
      * @return DeviceType enum.
      */
     @DeviceType
-    public int getDeviceType() {
+    public synchronized int getDeviceType() {
         if (mHotspotNetworkData == null) {
             return NetworkProviderInfo.DEVICE_TYPE_UNKNOWN;
         }
@@ -258,7 +377,7 @@
      * The battery percentage of the host device.
      */
     @IntRange(from = 0, to = 100)
-    public int getBatteryPercentage() {
+    public synchronized int getBatteryPercentage() {
         if (mHotspotNetworkData == null) {
             return 0;
         }
@@ -268,20 +387,27 @@
     /**
      * If the host device is currently charging its battery.
      */
-    public boolean isBatteryCharging() {
+    public synchronized boolean isBatteryCharging() {
         if (mHotspotNetworkData == null) {
             return false;
         }
-        return mHotspotNetworkData.getExtras().getBoolean("is_battery_charging", false);
+        if (BuildCompat.isAtLeastV()
+                && NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled()
+                && mHotspotNetworkData.getNetworkProviderInfo().isBatteryCharging()) {
+            return true;
+        }
+        // With API flag on we still support either the API or the bundle for compatibility.
+        return mHotspotNetworkData.getNetworkProviderInfo().getExtras().getBoolean(
+                EXTRA_KEY_IS_BATTERY_CHARGING, false);
     }
 
     @Override
-    public boolean canConnect() {
+    public synchronized boolean canConnect() {
         return getConnectedState() == CONNECTED_STATE_DISCONNECTED;
     }
 
     @Override
-    public void connect(@Nullable ConnectCallback callback) {
+    public synchronized void connect(@Nullable ConnectCallback callback) {
         mConnectCallback = callback;
         if (mSharedConnectivityManager == null) {
             if (callback != null) {
@@ -294,12 +420,13 @@
     }
 
     @Override
-    public boolean canDisconnect() {
+    public synchronized boolean canDisconnect() {
         return getConnectedState() != CONNECTED_STATE_DISCONNECTED;
     }
 
     @Override
-    public void disconnect(@Nullable DisconnectCallback callback) {
+    public synchronized void disconnect(@Nullable DisconnectCallback callback) {
+        mCalledDisconnect = true;
         mDisconnectCallback = callback;
         if (mSharedConnectivityManager == null) {
             if (callback != null) {
@@ -321,10 +448,11 @@
      * @param status HotspotNetworkConnectionStatus#ConnectionStatus enum.
      */
     public void onConnectionStatusChanged(@ConnectionStatus int status) {
-        if (mConnectCallback == null) return;
+        mLastStatus = status;
         switch (status) {
             case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT:
-                mServerInitiatedConnection = true;
+                mCalledConnect = true;
+                mConnectionError = false;
                 notifyOnUpdated();
                 break;
             case HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR:
@@ -335,9 +463,27 @@
             case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_FAILED:
             case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT_TIMEOUT:
             case HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED:
-                mCallbackHandler.post(() -> mConnectCallback.onConnectResult(
-                        ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN));
-                mServerInitiatedConnection = false;
+                mCallbackHandler.post(() -> {
+                    final ConnectCallback connectCallback = mConnectCallback;
+                    if (connectCallback != null) {
+                        connectCallback.onConnectResult(
+                                ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN);
+                    }
+                });
+                mCalledConnect = false;
+                mConnectionError = true;
+                notifyOnUpdated();
+                break;
+            case CONNECTION_STATUS_CONNECTED:
+                mCallbackHandler.post(() -> {
+                    final ConnectCallback connectCallback = mConnectCallback;
+                    if (connectCallback != null) {
+                        connectCallback.onConnectResult(
+                                ConnectCallback.CONNECT_STATUS_SUCCESS);
+                    }
+                });
+                mCalledConnect = false;
+                mConnectionError = false;
                 notifyOnUpdated();
                 break;
             default:
@@ -348,14 +494,11 @@
     static class HotspotNetworkEntryKey {
         private static final String KEY_IS_VIRTUAL_ENTRY_KEY = "IS_VIRTUAL_ENTRY_KEY";
         private static final String KEY_DEVICE_ID_KEY = "DEVICE_ID_KEY";
-        private static final String KEY_BSSID_KEY = "BSSID_KEY";
         private static final String KEY_SCAN_RESULT_KEY = "SCAN_RESULT_KEY";
 
         private boolean mIsVirtualEntry;
         private long mDeviceId;
         @Nullable
-        private String mBssid;
-        @Nullable
         private StandardWifiEntry.ScanResultKey mScanResultKey;
 
         /**
@@ -365,15 +508,12 @@
          */
         HotspotNetworkEntryKey(@NonNull HotspotNetwork hotspotNetworkData) {
             mDeviceId = hotspotNetworkData.getDeviceId();
-            if (hotspotNetworkData.getHotspotSsid() == null
-                    || (hotspotNetworkData.getHotspotBssid() == null)
-                    || (hotspotNetworkData.getHotspotSecurityTypes() == null)) {
+            if (hotspotNetworkData.getHotspotSsid() == null || (
+                    hotspotNetworkData.getHotspotSecurityTypes() == null)) {
                 mIsVirtualEntry = true;
-                mBssid = null;
                 mScanResultKey = null;
             } else {
                 mIsVirtualEntry = false;
-                mBssid = hotspotNetworkData.getHotspotBssid();
                 mScanResultKey = new StandardWifiEntry.ScanResultKey(
                         hotspotNetworkData.getHotspotSsid(),
                         new ArrayList<>(hotspotNetworkData.getHotspotSecurityTypes()));
@@ -398,9 +538,6 @@
                 if (keyJson.has(KEY_DEVICE_ID_KEY)) {
                     mDeviceId = keyJson.getLong(KEY_DEVICE_ID_KEY);
                 }
-                if (keyJson.has(KEY_BSSID_KEY)) {
-                    mBssid = keyJson.getString(KEY_BSSID_KEY);
-                }
                 if (keyJson.has(KEY_SCAN_RESULT_KEY)) {
                     mScanResultKey = new StandardWifiEntry.ScanResultKey(keyJson.getString(
                             KEY_SCAN_RESULT_KEY));
@@ -419,9 +556,6 @@
             try {
                 keyJson.put(KEY_IS_VIRTUAL_ENTRY_KEY, mIsVirtualEntry);
                 keyJson.put(KEY_DEVICE_ID_KEY, mDeviceId);
-                if (mBssid != null) {
-                    keyJson.put(KEY_BSSID_KEY, mBssid);
-                }
                 if (mScanResultKey != null) {
                     keyJson.put(KEY_SCAN_RESULT_KEY, mScanResultKey.toString());
                 }
@@ -441,14 +575,6 @@
         }
 
         /**
-         * Returns the BSSID of this HotspotNetworkEntryKey to match against wifiInfo
-         */
-        @Nullable
-        String getBssid() {
-            return mBssid;
-        }
-
-        /**
          * Returns the ScanResultKey of this HotspotNetworkEntryKey to match against ScanResults
          */
         @Nullable
@@ -456,4 +582,21 @@
             return mScanResultKey;
         }
     }
+
+    private static String getDeviceTypeId(@DeviceType int deviceType) {
+        switch (deviceType) {
+            case NetworkProviderInfo.DEVICE_TYPE_PHONE:
+                return "PHONE";
+            case NetworkProviderInfo.DEVICE_TYPE_TABLET:
+                return "TABLET";
+            case NetworkProviderInfo.DEVICE_TYPE_LAPTOP:
+                return "COMPUTER";
+            case NetworkProviderInfo.DEVICE_TYPE_WATCH:
+                return "WATCH";
+            case NetworkProviderInfo.DEVICE_TYPE_AUTO:
+                return "VEHICLE";
+            default:
+                return "UNKNOWN";
+        }
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java
index f163ee3..c5632c1 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java
@@ -19,7 +19,6 @@
 import static android.os.Build.VERSION_CODES;
 
 import android.annotation.TargetApi;
-import android.content.Context;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
@@ -65,25 +64,25 @@
     public @interface ConnectionStatus {} // TODO(b/271868642): Add IfThisThanThat lint
 
     KnownNetworkEntry(
-            @NonNull WifiTrackerInjector injector, @NonNull Context context,
+            @NonNull WifiTrackerInjector injector,
             @NonNull Handler callbackHandler, @NonNull StandardWifiEntryKey key,
             @NonNull WifiManager wifiManager,
             @Nullable SharedConnectivityManager sharedConnectivityManager,
             @NonNull KnownNetwork knownNetworkData) {
-        super(injector, context, callbackHandler, key, wifiManager,
+        super(injector, callbackHandler, key, wifiManager,
                 false /* forSavedNetworksPage */);
         mSharedConnectivityManager = sharedConnectivityManager;
         mKnownNetworkData = knownNetworkData;
     }
 
     KnownNetworkEntry(
-            @NonNull WifiTrackerInjector injector, @NonNull Context context,
+            @NonNull WifiTrackerInjector injector,
             @NonNull Handler callbackHandler, @NonNull StandardWifiEntryKey key,
             @Nullable List<WifiConfiguration> configs, @Nullable List<ScanResult> scanResults,
             @NonNull WifiManager wifiManager,
             @Nullable SharedConnectivityManager sharedConnectivityManager,
             @NonNull KnownNetwork knownNetworkData) throws IllegalArgumentException {
-        super(injector, context, callbackHandler, key, configs, scanResults, wifiManager,
+        super(injector, callbackHandler, key, configs, scanResults, wifiManager,
                 false /* forSavedNetworksPage */);
         mSharedConnectivityManager = sharedConnectivityManager;
         mKnownNetworkData = knownNetworkData;
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java
index 413a1ee..78dd65b 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java
@@ -19,9 +19,9 @@
 import static android.net.wifi.WifiInfo.DEFAULT_MAC_ADDRESS;
 import static android.net.wifi.WifiInfo.sanitizeSsid;
 
-import static com.android.wifitrackerlib.Utils.getVerboseLoggingDescription;
+import static com.android.wifitrackerlib.Utils.getVerboseSummary;
 
-import android.content.Context;
+import android.annotation.SuppressLint;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.Handler;
@@ -42,16 +42,14 @@
 
     private final int mSubscriptionId;
     @NonNull private final String mKey;
-    @NonNull private final Context mContext;
     boolean mIsCellDefaultRoute;
 
-    MergedCarrierEntry(@NonNull Handler callbackHandler,
+    MergedCarrierEntry(@NonNull WifiTrackerInjector injector,
+            @NonNull Handler callbackHandler,
             @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage,
-            @NonNull Context context,
             int subscriptionId) throws IllegalArgumentException {
-        super(callbackHandler, wifiManager, forSavedNetworksPage);
-        mContext = context;
+        super(injector, callbackHandler, wifiManager, forSavedNetworksPage);
         mSubscriptionId = subscriptionId;
         mKey = KEY_PREFIX + subscriptionId;
     }
@@ -65,10 +63,10 @@
     public String getSummary(boolean concise) {
         StringJoiner sj = new StringJoiner(mContext.getString(
                 R.string.wifitrackerlib_summary_separator));
-        if (!concise) {
-            final String verboseLoggingDescription = getVerboseLoggingDescription(this);
-            if (!TextUtils.isEmpty(verboseLoggingDescription)) {
-                sj.add(verboseLoggingDescription);
+        if (!concise && isVerboseSummaryEnabled()) {
+            final String verboseSummary = getVerboseSummary(this);
+            if (!TextUtils.isEmpty(verboseSummary)) {
+                sj.add(verboseSummary);
             }
         }
         return sj.toString();
@@ -83,6 +81,7 @@
     }
 
     @Override
+    @SuppressLint("HardwareIds")
     public synchronized String getMacAddress() {
         if (mWifiInfo != null) {
             final String wifiInfoMac = mWifiInfo.getMacAddress();
@@ -170,7 +169,10 @@
         }
     }
 
-    /* package */ int getSubscriptionId() {
+    /**
+     * Returns the current subscription ID this merged carrier network is for.
+     */
+    public int getSubscriptionId() {
         return mSubscriptionId;
     }
 
@@ -178,4 +180,11 @@
         mIsCellDefaultRoute = isCellDefaultRoute;
         notifyOnUpdated();
     }
+
+    @Override
+    public String toString() {
+        StringJoiner sj = new StringJoiner("][", "[", "]");
+        sj.add("SubId:" + mSubscriptionId);
+        return super.toString() + sj;
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NetworkRequestEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NetworkRequestEntry.java
index efeb19a..a0261a8 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NetworkRequestEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NetworkRequestEntry.java
@@ -16,7 +16,6 @@
 
 package com.android.wifitrackerlib;
 
-import android.content.Context;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.os.Handler;
@@ -38,10 +37,10 @@
 
     NetworkRequestEntry(
             @NonNull WifiTrackerInjector injector,
-            @NonNull Context context, @NonNull Handler callbackHandler,
+            @NonNull Handler callbackHandler,
             @NonNull StandardWifiEntryKey key, @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage) throws IllegalArgumentException {
-        super(injector, context, callbackHandler, key, wifiManager, forSavedNetworksPage);
+        super(injector, callbackHandler, key, wifiManager, forSavedNetworksPage);
     }
 
     @Override
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java
index 0a71bcb..9b61c66 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java
@@ -16,6 +16,8 @@
 
 package com.android.wifitrackerlib;
 
+import static com.android.wifi.flags.Flags.networkProviderBatteryChargingStatus;
+
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.WifiSsidPolicy;
 import android.content.Context;
@@ -134,4 +136,11 @@
         }
         return null;
     }
+
+    /**
+     * Whether the hotspot network provider battery charging status flag is enabled.
+     */
+    static boolean isNetworkProviderBatteryChargingStatusEnabled() {
+        return networkProviderBatteryChargingStatus();
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
index 7d8ad4e..ffb9330 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
@@ -21,7 +21,6 @@
 import static com.android.wifitrackerlib.Utils.getBestScanResultByLevel;
 import static com.android.wifitrackerlib.WifiEntry.ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN;
 
-import android.content.Context;
 import android.net.Uri;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
@@ -45,6 +44,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.StringJoiner;
 
 /**
  * WifiEntry representation of an Online Sign-up entry, uniquely identified by FQDN.
@@ -56,7 +56,6 @@
     @NonNull private final List<ScanResult> mCurrentScanResults = new ArrayList<>();
 
     @NonNull private final String mKey;
-    @NonNull private final Context mContext;
     @NonNull private final OsuProvider mOsuProvider;
     private String mSsid;
     private String mOsuStatusString;
@@ -69,15 +68,14 @@
      */
     OsuWifiEntry(
             @NonNull WifiTrackerInjector injector,
-            @NonNull Context context, @NonNull Handler callbackHandler,
+            @NonNull Handler callbackHandler,
             @NonNull OsuProvider osuProvider,
             @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage) throws IllegalArgumentException {
-        super(callbackHandler, wifiManager, forSavedNetworksPage);
+        super(injector, callbackHandler, wifiManager, forSavedNetworksPage);
 
         checkNotNull(osuProvider, "Cannot construct with null osuProvider!");
 
-        mContext = context;
         mOsuProvider = osuProvider;
         mKey = osuProviderToOsuWifiEntryKey(osuProvider);
         mUserManager = injector.getUserManager();
@@ -207,7 +205,8 @@
         mIsAlreadyProvisioned = isAlreadyProvisioned;
     }
 
-    private boolean hasAdminRestrictions() {
+    @Override
+    public synchronized boolean hasAdminRestrictions() {
         if (mHasAddConfigUserRestriction && !mIsAlreadyProvisioned) {
             return true;
         }
@@ -314,4 +313,13 @@
             }
         }
     }
+
+    @Override
+    public String toString() {
+        StringJoiner sj = new StringJoiner("][", "[", "]");
+        sj.add("FriendlyName:" + mOsuProvider.getFriendlyName());
+        sj.add("ServerUri:" + mOsuProvider.getServerUri());
+        sj.add("SSID:" + mSsid);
+        return super.toString() + sj;
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java
index b6be43f..63db005 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java
@@ -94,7 +94,7 @@
                                 uniqueIdToPasspointWifiEntryKey(passpointConfig.getUniqueId())))
                         .findAny();
         if (optionalPasspointConfig.isPresent()) {
-            mChosenEntry = new PasspointWifiEntry(mInjector, mContext, mMainHandler,
+            mChosenEntry = new PasspointWifiEntry(mInjector, mMainHandler,
                     optionalPasspointConfig.get(), mWifiManager,
                     false /* forSavedNetworksPage */);
         } else {
@@ -156,6 +156,10 @@
 
     @WorkerThread
     private void updateStartInfo() {
+        // Clear any stale connection info in case we missed any NetworkCallback.onLost() while in
+        // the stopped state.
+        mChosenEntry.clearConnectionInfo();
+
         conditionallyUpdateScanResults(true /* lastScanSucceeded */);
         conditionallyUpdateConfig();
         Network currentNetwork = mWifiManager.getCurrentNetwork();
@@ -222,7 +226,7 @@
                         osuProviderToPasspointConfig.get(provider);
                 if (provisionedConfig != null && TextUtils.equals(mChosenEntry.getKey(),
                         uniqueIdToPasspointWifiEntryKey(provisionedConfig.getUniqueId()))) {
-                    mOsuWifiEntry = new OsuWifiEntry(mInjector, mContext, mMainHandler, provider,
+                    mOsuWifiEntry = new OsuWifiEntry(mInjector, mMainHandler, provider,
                             mWifiManager, false /* forSavedNetworksPage */);
                     mOsuWifiEntry.updateScanResultInfo(osuProviderToScans.get(provider));
                     mOsuWifiEntry.setAlreadyProvisioned(true);
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
index c475700..22a546b 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
@@ -30,8 +30,9 @@
 import static com.android.wifitrackerlib.Utils.getConnectingDescription;
 import static com.android.wifitrackerlib.Utils.getDisconnectedDescription;
 import static com.android.wifitrackerlib.Utils.getMeteredDescription;
-import static com.android.wifitrackerlib.Utils.getVerboseLoggingDescription;
+import static com.android.wifitrackerlib.Utils.getVerboseSummary;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.Network;
@@ -70,8 +71,6 @@
     @NonNull private final String mKey;
     @NonNull private final String mFqdn;
     @NonNull private final String mFriendlyName;
-    @NonNull private final WifiTrackerInjector mInjector;
-    @NonNull private final Context mContext;
     @Nullable
     private PasspointConfiguration mPasspointConfig;
     @Nullable private WifiConfiguration mWifiConfig;
@@ -95,15 +94,13 @@
      */
     PasspointWifiEntry(
             @NonNull WifiTrackerInjector injector,
-            @NonNull Context context, @NonNull Handler callbackHandler,
+            @NonNull Handler callbackHandler,
             @NonNull PasspointConfiguration passpointConfig,
             @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage) throws IllegalArgumentException {
-        super(callbackHandler, wifiManager, forSavedNetworksPage);
+        super(injector, callbackHandler, wifiManager, forSavedNetworksPage);
 
         checkNotNull(passpointConfig, "Cannot construct with null PasspointConfiguration!");
-        mInjector = injector;
-        mContext = context;
         mPasspointConfig = passpointConfig;
         mKey = uniqueIdToPasspointWifiEntryKey(passpointConfig.getUniqueId());
         mFqdn = passpointConfig.getHomeSp().getFqdn();
@@ -125,14 +122,12 @@
             @NonNull WifiConfiguration wifiConfig,
             @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage) throws IllegalArgumentException {
-        super(callbackHandler, wifiManager, forSavedNetworksPage);
+        super(injector, callbackHandler, wifiManager, forSavedNetworksPage);
 
         checkNotNull(wifiConfig, "Cannot construct with null WifiConfiguration!");
         if (!wifiConfig.isPasspoint()) {
             throw new IllegalArgumentException("Given WifiConfiguration is not for Passpoint!");
         }
-        mInjector = injector;
-        mContext = context;
         mWifiConfig = wifiConfig;
         mKey = uniqueIdToPasspointWifiEntryKey(wifiConfig.getKey());
         mFqdn = wifiConfig.FQDN;
@@ -187,10 +182,16 @@
                     connectedStateDescription = getConnectingDescription(mContext, mNetworkInfo);
                     break;
                 case CONNECTED_STATE_CONNECTED:
+                    if (mNetworkCapabilities == null) {
+                        Log.e(TAG, "Tried to get CONNECTED description, but mNetworkCapabilities"
+                                + " was unexpectedly null!");
+                        connectedStateDescription = null;
+                        break;
+                    }
                     connectedStateDescription = getConnectedDescription(mContext,
                             mWifiConfig,
                             mNetworkCapabilities,
-                            mIsDefaultNetwork,
+                            isDefaultNetwork(),
                             isLowQuality(),
                             mConnectivityReport);
                     break;
@@ -213,10 +214,10 @@
             sj.add(meteredDescription);
         }
 
-        if (!concise) {
-            String verboseLoggingDescription = getVerboseLoggingDescription(this);
-            if (!TextUtils.isEmpty(verboseLoggingDescription)) {
-                sj.add(verboseLoggingDescription);
+        if (!concise && isVerboseSummaryEnabled()) {
+            String verboseSummary = getVerboseSummary(this);
+            if (!TextUtils.isEmpty(verboseSummary)) {
+                sj.add(verboseSummary);
             }
         }
 
@@ -224,6 +225,11 @@
     }
 
     @Override
+    public boolean shouldShowSsid() {
+        return true;
+    }
+
+    @Override
     public synchronized String getSsid() {
         if (mWifiInfo != null) {
             return sanitizeSsid(mWifiInfo.getSSID());
@@ -249,6 +255,7 @@
     }
 
     @Override
+    @SuppressLint("HardwareIds")
     public synchronized String getMacAddress() {
         if (mWifiInfo != null) {
             final String wifiInfoMac = mWifiInfo.getMacAddress();
@@ -468,13 +475,14 @@
     @Override
     public synchronized String getBandString() {
         if (mWifiInfo != null) {
-            return Utils.getBandString(mContext, mWifiInfo);
+            return Utils.wifiInfoToBandString(mContext, mWifiInfo);
         }
         if (!mCurrentHomeScanResults.isEmpty()) {
-            return Utils.getBandString(mContext, mCurrentHomeScanResults.get(0).frequency);
+            return Utils.frequencyToBandString(mContext, mCurrentHomeScanResults.get(0).frequency);
         }
         if (!mCurrentRoamingScanResults.isEmpty()) {
-            return Utils.getBandString(mContext, mCurrentRoamingScanResults.get(0).frequency);
+            return Utils.frequencyToBandString(
+                    mContext, mCurrentRoamingScanResults.get(0).frequency);
         }
         return "";
     }
@@ -622,4 +630,17 @@
     public PasspointConfiguration getPasspointConfig() {
         return mPasspointConfig;
     }
+
+    @Override
+    public String toString() {
+        StringJoiner sj = new StringJoiner("][", "[", "]");
+        sj.add("FQDN:" + mFqdn);
+        sj.add("FriendlyName:" + mFriendlyName);
+        if (mPasspointConfig != null) {
+            sj.add("UniqueId:" + mPasspointConfig.getUniqueId());
+        } else if (mWifiConfig != null) {
+            sj.add("UniqueId:" + mWifiConfig.getKey());
+        }
+        return super.toString() + sj;
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/SavedNetworkTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/SavedNetworkTracker.java
index cf6288a..63b13aa 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/SavedNetworkTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/SavedNetworkTracker.java
@@ -229,16 +229,14 @@
         return allEntries;
     }
 
-    private void clearAllWifiEntries() {
-        mStandardWifiEntryCache.clear();
-        mPasspointWifiEntryCache.clear();
-    }
-
     @WorkerThread
     @Override
     protected void handleOnStart() {
-        // Remove stale WifiEntries remaining from the last onStop().
-        clearAllWifiEntries();
+        // Clear any stale connection info in case we missed any NetworkCallback.onLost() while in
+        // the stopped state.
+        for (WifiEntry wifiEntry : getAllWifiEntries()) {
+            wifiEntry.clearConnectionInfo();
+        }
 
         // Update configs and scans
         updateStandardWifiEntryConfigs(mWifiManager.getConfiguredNetworks());
@@ -468,7 +466,7 @@
 
         // Create new entry for each unmatched config
         for (StandardWifiEntryKey key : wifiConfigsByKey.keySet()) {
-            mStandardWifiEntryCache.add(new StandardWifiEntry(mInjector, mContext, mMainHandler,
+            mStandardWifiEntryCache.add(new StandardWifiEntry(mInjector, mMainHandler,
                     key, wifiConfigsByKey.get(key), null, mWifiManager,
                     true /* forSavedNetworksPage */));
         }
@@ -500,7 +498,7 @@
         // Create new entry for each unmatched config
         for (String key : passpointConfigsByKey.keySet()) {
             mPasspointWifiEntryCache.put(key,
-                    new PasspointWifiEntry(mInjector, mContext, mMainHandler,
+                    new PasspointWifiEntry(mInjector, mMainHandler,
                             passpointConfigsByKey.get(key), mWifiManager,
                             true /* forSavedNetworksPage */));
         }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java
index b1a8f83..e21efc4 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java
@@ -83,10 +83,10 @@
                 mainHandler, workerHandler, clock, maxScanAgeMillis, scanIntervalMillis, TAG);
         mKey = new StandardWifiEntryKey(key);
         if (mKey.isNetworkRequest()) {
-            mChosenEntry = new NetworkRequestEntry(mInjector, mContext, mMainHandler, mKey,
+            mChosenEntry = new NetworkRequestEntry(mInjector, mMainHandler, mKey,
                     mWifiManager, false /* forSavedNetworksPage */);
         } else {
-            mChosenEntry = new StandardWifiEntry(mInjector, mContext, mMainHandler, mKey,
+            mChosenEntry = new StandardWifiEntry(mInjector, mMainHandler, mKey,
                     mWifiManager, false /* forSavedNetworksPage */);
         }
         // It is safe to call updateStartInfo() in the main thread here since onStart() won't have
@@ -131,6 +131,10 @@
 
     @WorkerThread
     private void updateStartInfo() {
+        // Clear any stale connection info in case we missed any NetworkCallback.onLost() while in
+        // the stopped state.
+        mChosenEntry.clearConnectionInfo();
+
         conditionallyUpdateScanResults(true /* lastScanSucceeded */);
         conditionallyUpdateConfig();
         handleDefaultSubscriptionChanged(SubscriptionManager.getDefaultDataSubscriptionId());
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java
index 95ab259..246c7b3 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java
@@ -43,12 +43,11 @@
 import static com.android.wifitrackerlib.Utils.getSecurityTypesFromScanResult;
 import static com.android.wifitrackerlib.Utils.getSecurityTypesFromWifiConfiguration;
 import static com.android.wifitrackerlib.Utils.getSingleSecurityTypeFromMultipleSecurityTypes;
-import static com.android.wifitrackerlib.Utils.getVerboseLoggingDescription;
+import static com.android.wifitrackerlib.Utils.getVerboseSummary;
 
 import android.annotation.SuppressLint;
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.WifiSsidPolicy;
-import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.Network;
 import android.net.NetworkCapabilities;
@@ -103,9 +102,6 @@
 
     @NonNull private final StandardWifiEntryKey mKey;
 
-    @NonNull private final WifiTrackerInjector mInjector;
-    @NonNull protected final Context mContext;
-
     // Map of security type to matching scan results
     @NonNull private final Map<Integer, List<ScanResult>> mMatchingScanResults = new ArrayMap<>();
     // Map of security type to matching WifiConfiguration
@@ -137,12 +133,11 @@
 
     StandardWifiEntry(
             @NonNull WifiTrackerInjector injector,
-            @NonNull Context context, @NonNull Handler callbackHandler,
-            @NonNull StandardWifiEntryKey key, @NonNull WifiManager wifiManager,
+            @NonNull Handler callbackHandler,
+            @NonNull StandardWifiEntryKey key,
+            @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage) {
-        super(callbackHandler, wifiManager, forSavedNetworksPage);
-        mInjector = injector;
-        mContext = context;
+        super(injector, callbackHandler, wifiManager, forSavedNetworksPage);
         mKey = key;
         mIsWpa3SaeSupported = wifiManager.isWpa3SaeSupported();
         mIsWpa3SuiteBSupported = wifiManager.isWpa3SuiteBSupported();
@@ -155,13 +150,13 @@
 
     StandardWifiEntry(
             @NonNull WifiTrackerInjector injector,
-            @NonNull Context context, @NonNull Handler callbackHandler,
+            @NonNull Handler callbackHandler,
             @NonNull StandardWifiEntryKey key,
             @Nullable List<WifiConfiguration> configs,
             @Nullable List<ScanResult> scanResults,
             @NonNull WifiManager wifiManager,
             boolean forSavedNetworksPage) throws IllegalArgumentException {
-        this(injector, context, callbackHandler, key, wifiManager,
+        this(injector, callbackHandler, key, wifiManager,
                 forSavedNetworksPage);
         if (configs != null && !configs.isEmpty()) {
             updateConfig(configs);
@@ -203,10 +198,16 @@
                 connectedStateDescription = getConnectingDescription(mContext, mNetworkInfo);
                 break;
             case CONNECTED_STATE_CONNECTED:
+                if (mNetworkCapabilities == null) {
+                    Log.e(TAG, "Tried to get CONNECTED description, but mNetworkCapabilities was"
+                            + " unexpectedly null!");
+                    connectedStateDescription = null;
+                    break;
+                }
                 connectedStateDescription = getConnectedDescription(mContext,
                         mTargetWifiConfig,
                         mNetworkCapabilities,
-                        mIsDefaultNetwork,
+                        isDefaultNetwork(),
                         isLowQuality(),
                         mConnectivityReport);
                 break;
@@ -228,10 +229,10 @@
             sj.add(meteredDescription);
         }
 
-        if (!concise) {
-            final String verboseLoggingDescription = getVerboseLoggingDescription(this);
-            if (!TextUtils.isEmpty(verboseLoggingDescription)) {
-                sj.add(verboseLoggingDescription);
+        if (!concise && isVerboseSummaryEnabled()) {
+            final String verboseSummary = getVerboseSummary(this);
+            if (!TextUtils.isEmpty(verboseSummary)) {
+                sj.add(verboseSummary);
             }
         }
 
@@ -250,6 +251,7 @@
 
     @Override
     @Nullable
+    @SuppressLint("HardwareIds")
     public synchronized String getMacAddress() {
         if (mWifiInfo != null) {
             final String wifiInfoMac = mWifiInfo.getMacAddress();
@@ -286,6 +288,14 @@
     }
 
     @Override
+    public boolean needsWifiConfiguration() {
+        List<Integer> securityTypes = getSecurityTypes();
+        return !isSaved() && !isSuggestion()
+                && !securityTypes.contains(SECURITY_TYPE_OPEN)
+                && !securityTypes.contains(SECURITY_TYPE_OWE);
+    }
+
+    @Override
     @Nullable
     public synchronized WifiConfiguration getWifiConfiguration() {
         if (!isSaved()) {
@@ -590,74 +600,7 @@
 
     @Override
     public synchronized String getSecurityString(boolean concise) {
-        if (mTargetSecurityTypes.size() == 0) {
-            return concise ? "" : mContext.getString(R.string.wifitrackerlib_wifi_security_none);
-        }
-        if (mTargetSecurityTypes.size() == 1) {
-            final int security = mTargetSecurityTypes.get(0);
-            switch(security) {
-                case SECURITY_TYPE_EAP:
-                    return concise ? mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_short_eap_wpa_wpa2) :
-                            mContext.getString(
-                                    R.string.wifitrackerlib_wifi_security_eap_wpa_wpa2);
-                case SECURITY_TYPE_EAP_WPA3_ENTERPRISE:
-                    return concise ? mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_short_eap_wpa3) :
-                            mContext.getString(
-                                    R.string.wifitrackerlib_wifi_security_eap_wpa3);
-                case SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT:
-                    return concise ? mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_short_eap_suiteb) :
-                            mContext.getString(R.string.wifitrackerlib_wifi_security_eap_suiteb);
-                case SECURITY_TYPE_PSK:
-                    return concise ? mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_short_wpa_wpa2) :
-                            mContext.getString(
-                                    R.string.wifitrackerlib_wifi_security_wpa_wpa2);
-                case SECURITY_TYPE_WEP:
-                    return mContext.getString(R.string.wifitrackerlib_wifi_security_wep);
-                case SECURITY_TYPE_SAE:
-                    return concise ? mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_short_sae) :
-                            mContext.getString(R.string.wifitrackerlib_wifi_security_sae);
-                case SECURITY_TYPE_OWE:
-                    return concise ? mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_short_owe) :
-                            mContext.getString(R.string.wifitrackerlib_wifi_security_owe);
-                case SECURITY_TYPE_OPEN:
-                    return concise ? "" : mContext.getString(
-                            R.string.wifitrackerlib_wifi_security_none);
-            }
-        }
-        if (mTargetSecurityTypes.size() == 2) {
-            if (mTargetSecurityTypes.contains(SECURITY_TYPE_OPEN)
-                    && mTargetSecurityTypes.contains(SECURITY_TYPE_OWE)) {
-                StringJoiner sj = new StringJoiner("/");
-                sj.add(mContext.getString(R.string.wifitrackerlib_wifi_security_none));
-                sj.add(concise ? mContext.getString(
-                        R.string.wifitrackerlib_wifi_security_short_owe) :
-                        mContext.getString(R.string.wifitrackerlib_wifi_security_owe));
-                return sj.toString();
-            }
-            if (mTargetSecurityTypes.contains(SECURITY_TYPE_PSK)
-                    && mTargetSecurityTypes.contains(SECURITY_TYPE_SAE)) {
-                return concise ? mContext.getString(
-                        R.string.wifitrackerlib_wifi_security_short_wpa_wpa2_wpa3) :
-                        mContext.getString(
-                                R.string.wifitrackerlib_wifi_security_wpa_wpa2_wpa3);
-            }
-            if (mTargetSecurityTypes.contains(SECURITY_TYPE_EAP)
-                    && mTargetSecurityTypes.contains(SECURITY_TYPE_EAP_WPA3_ENTERPRISE)) {
-                return concise ? mContext.getString(
-                        R.string.wifitrackerlib_wifi_security_short_eap_wpa_wpa2_wpa3) :
-                        mContext.getString(
-                                R.string.wifitrackerlib_wifi_security_eap_wpa_wpa2_wpa3);
-            }
-        }
-        // Unknown security types
-        Log.e(TAG, "Couldn't get string for security types: " + mTargetSecurityTypes);
-        return concise ? "" : mContext.getString(R.string.wifitrackerlib_wifi_security_none);
+        return Utils.getSecurityString(mContext, mTargetSecurityTypes, concise);
     }
 
     @Override
@@ -674,10 +617,10 @@
     @Override
     public synchronized String getBandString() {
         if (mWifiInfo != null) {
-            return Utils.getBandString(mContext, mWifiInfo);
+            return Utils.wifiInfoToBandString(mContext, mWifiInfo);
         }
         if (!mTargetScanResults.isEmpty()) {
-            return Utils.getBandString(mContext, mTargetScanResults.get(0).frequency);
+            return Utils.frequencyToBandString(mContext, mTargetScanResults.get(0).frequency);
         }
         return "";
     }
@@ -1075,7 +1018,8 @@
         mIsAdminRestricted = false;
     }
 
-    private boolean hasAdminRestrictions() {
+    @Override
+    public synchronized boolean hasAdminRestrictions() {
         if ((mHasAddConfigUserRestriction && !(isSaved() || isSuggestion()))
                 || mIsAdminRestricted) {
             return true;
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
index 3392ac2..af64a58 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
@@ -19,8 +19,17 @@
 import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE;
 import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
 import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_OPEN;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_OWE;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_SAE;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP;
 
 import static java.util.Comparator.comparingInt;
+import static java.util.stream.Collectors.toList;
 
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -238,84 +247,87 @@
 
     static String getConnectedDescription(@NonNull Context context,
             @Nullable WifiConfiguration wifiConfiguration,
-            @Nullable NetworkCapabilities networkCapabilities,
+            @NonNull NetworkCapabilities networkCapabilities,
             boolean isDefaultNetwork,
             boolean isLowQuality,
             @Nullable ConnectivityDiagnosticsManager.ConnectivityReport connectivityReport) {
         final StringJoiner sj = new StringJoiner(context.getString(
                 R.string.wifitrackerlib_summary_separator));
 
-        boolean shouldShowConnected = isDefaultNetwork;
+        boolean isValidated = networkCapabilities.hasCapability(
+                NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        boolean isCaptivePortal = networkCapabilities.hasCapability(
+                NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+        boolean isPartialConnectivity = networkCapabilities.hasCapability(
+                NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY);
+        boolean isNoInternetExpected = wifiConfiguration != null
+                && wifiConfiguration.isNoInternetAccessExpected();
+        boolean isPrivateDnsBroken = !isValidated && networkCapabilities.isPrivateDnsBroken();
+        boolean isCheckingForInternetAccess = !isValidated && !isPartialConnectivity
+                && connectivityReport == null && !isNoInternetExpected;
+        boolean isOemNetwork = NonSdkApiWrapper.isOemCapabilities(networkCapabilities);
+        String suggestionOrSpecifierLabel = null;
         if (wifiConfiguration != null
                 && (wifiConfiguration.fromWifiNetworkSuggestion
                 || wifiConfiguration.fromWifiNetworkSpecifier)) {
-            // For suggestion or specifier networks to show "Connected via ..."
-            final String suggestionOrSpecifierLabel =
-                    getSuggestionOrSpecifierLabel(context, wifiConfiguration);
-            if (!TextUtils.isEmpty(suggestionOrSpecifierLabel)) {
-                if (isDefaultNetwork || (networkCapabilities != null
-                        && NonSdkApiWrapper.isOemCapabilities(networkCapabilities))) {
-                    sj.add(context.getString(R.string.wifitrackerlib_connected_via_app,
-                            suggestionOrSpecifierLabel));
-                } else {
-                    // Pretend that non-default, non-OEM networks are unconnected.
-                    sj.add(context.getString(R.string.wifitrackerlib_available_via_app,
-                            suggestionOrSpecifierLabel));
-                }
-                shouldShowConnected = false;
+            suggestionOrSpecifierLabel = getSuggestionOrSpecifierLabel(context, wifiConfiguration);
+        }
+        final boolean shouldShowConnected;
+        if (isValidated) {
+            shouldShowConnected = isDefaultNetwork;
+        } else {
+            // Show "Connected" even if we aren't validated specifically for the
+            // "Connected / No internet access" case, and for OEM-specified networks which aren't
+            // expected to be fully validated.
+            shouldShowConnected = !isCheckingForInternetAccess && !isCaptivePortal
+                    && !isPrivateDnsBroken && !isNoInternetExpected || isOemNetwork;
+        }
+
+        if (!TextUtils.isEmpty(suggestionOrSpecifierLabel)) {
+            if (shouldShowConnected || (isDefaultNetwork && isPartialConnectivity)) {
+                // "Connected via app"
+                sj.add(context.getString(R.string.wifitrackerlib_connected_via_app,
+                        suggestionOrSpecifierLabel));
+            } else {
+                // "Available via app"
+                sj.add(context.getString(R.string.wifitrackerlib_available_via_app,
+                        suggestionOrSpecifierLabel));
             }
+        } else if (shouldShowConnected) {
+            // "Connected"
+            sj.add(context.getResources().getStringArray(
+                    R.array.wifitrackerlib_wifi_status)[DetailedState.CONNECTED.ordinal()]);
         }
 
         if (isLowQuality) {
+            // "Low quality"
             sj.add(context.getString(R.string.wifi_connected_low_quality));
-            shouldShowConnected = false;
         }
 
-        // For displaying network capability info, such as captive portal or no internet
-        if (networkCapabilities != null) {
-            if (networkCapabilities.hasCapability(
-                    NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)) {
-                // "Sign in to network"
-                sj.add(context.getString(context.getResources()
-                        .getIdentifier("network_available_sign_in", "string", "android")));
-                shouldShowConnected = false;
-            } else if (networkCapabilities.hasCapability(
-                    NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
-                // "Limited connection..."
+        if (isCaptivePortal) {
+            // "Sign in to network"
+            sj.add(context.getString(context.getResources().getIdentifier(
+                    "network_available_sign_in", "string", "android")));
+        } else if (isPartialConnectivity) {
+            // "Limited connection..."
+            sj.add(context.getString(R.string.wifitrackerlib_wifi_limited_connection));
+        } else if (isCheckingForInternetAccess) {
+            // "Checking for internet access..."
+            sj.add(context.getString(R.string.wifitrackerlib_checking_for_internet_access));
+        } else if (isPrivateDnsBroken) {
+            // "Private DNS server cannot be accessed"
+            sj.add(context.getString(R.string.wifitrackerlib_private_dns_broken));
+        } else if (!isValidated) {
+            if (isNoInternetExpected) {
+                // "Connected to device. Can't provide internet."
                 sj.add(context.getString(
-                        R.string.wifitrackerlib_wifi_limited_connection));
-                shouldShowConnected = false;
-            } else if (!networkCapabilities.hasCapability(
-                    NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
-                boolean noInternetExpected = wifiConfiguration != null
-                        && wifiConfiguration.isNoInternetAccessExpected();
-                if (connectivityReport == null && !noInternetExpected) {
-                    // "Checking for internet access..."
-                    sj.add(context.getString(R.string.wifitrackerlib_checking_for_internet_access));
-                    shouldShowConnected = false;
-                } else if (networkCapabilities.isPrivateDnsBroken()) {
-                    // "Private DNS server cannot be accessed"
-                    sj.add(context.getString(R.string.wifitrackerlib_private_dns_broken));
-                    shouldShowConnected = false;
-                } else if (noInternetExpected) {
-                    // "Connected to device. Can't provide internet."
-                    sj.add(context.getString(
-                            R.string.wifitrackerlib_wifi_connected_cannot_provide_internet));
-                    shouldShowConnected = false;
-                } else {
-                    // "No internet access"
-                    sj.add(context.getString(R.string.wifitrackerlib_wifi_no_internet));
-                }
+                        R.string.wifitrackerlib_wifi_connected_cannot_provide_internet));
+            } else {
+                // "No internet access"
+                sj.add(context.getString(R.string.wifitrackerlib_wifi_no_internet));
             }
         }
 
-        // Show "Connected" first if we haven't hidden it due to other strings.
-        if (shouldShowConnected) {
-            return new StringJoiner(context.getString(R.string.wifitrackerlib_summary_separator))
-                    .add(context.getResources().getStringArray(R.array.wifitrackerlib_wifi_status)
-                            [DetailedState.CONNECTED.ordinal()]).merge(sj).toString();
-        }
-
         return sj.toString();
     }
 
@@ -514,8 +526,8 @@
         }
     }
 
-    static String getVerboseLoggingDescription(@NonNull WifiEntry wifiEntry) {
-        if (!BaseWifiTracker.isVerboseLoggingEnabled() || wifiEntry == null) {
+    static String getVerboseSummary(@NonNull WifiEntry wifiEntry) {
+        if (wifiEntry == null) {
             return "";
         }
 
@@ -1080,26 +1092,59 @@
     }
 
     /**
+     * Converts a frequency to one of
+     *      {@link WifiScanner#WIFI_BAND_UNSPECIFIED},
+     *      {@link WifiScanner#WIFI_BAND_24_GHZ},
+     *      {@link WifiScanner#WIFI_BAND_5_GHZ},
+     *      {@link WifiScanner#WIFI_BAND_6_GHZ}
+     */
+    public static int getBand(int freqMhz) {
+        if (freqMhz >= WifiEntry.MIN_FREQ_24GHZ && freqMhz < WifiEntry.MAX_FREQ_24GHZ) {
+            return WifiScanner.WIFI_BAND_24_GHZ;
+        } else if (freqMhz >= WifiEntry.MIN_FREQ_5GHZ && freqMhz < WifiEntry.MAX_FREQ_5GHZ) {
+            return WifiScanner.WIFI_BAND_5_GHZ;
+        } else if (freqMhz >= WifiEntry.MIN_FREQ_6GHZ && freqMhz < WifiEntry.MAX_FREQ_6GHZ) {
+            return WifiScanner.WIFI_BAND_6_GHZ;
+        } else {
+            return WifiScanner.WIFI_BAND_UNSPECIFIED;
+        }
+    }
+
+    /**
+     * Converts one of
+     *      {@link WifiScanner#WIFI_BAND_UNSPECIFIED},
+     *      {@link WifiScanner#WIFI_BAND_24_GHZ},
+     *      {@link WifiScanner#WIFI_BAND_5_GHZ},
+     *      {@link WifiScanner#WIFI_BAND_6_GHZ}
+     * to the display string of the corresponding Wi-Fi band.
+     */
+    public static String bandToBandString(@NonNull Context context, int scannerBand) {
+        switch (scannerBand) {
+            case WifiScanner.WIFI_BAND_24_GHZ:
+                return context.getResources().getString(R.string.wifitrackerlib_wifi_band_24_ghz);
+            case WifiScanner.WIFI_BAND_5_GHZ:
+                return context.getResources().getString(R.string.wifitrackerlib_wifi_band_5_ghz);
+            case WifiScanner.WIFI_BAND_6_GHZ:
+                return context.getResources().getString(R.string.wifitrackerlib_wifi_band_6_ghz);
+            default:
+                return context.getResources().getString(R.string.wifitrackerlib_wifi_band_unknown);
+        }
+    }
+
+    /**
      * Converts a frequency in MHz to the display string of the corresponding Wi-Fi band.
      */
-    public static String getBandString(@NonNull Context context, int freqMhz) {
-        if (freqMhz >= WifiEntry.MIN_FREQ_24GHZ && freqMhz < WifiEntry.MAX_FREQ_24GHZ) {
-            return context.getResources().getString(R.string.wifitrackerlib_wifi_band_24_ghz);
-        } else if (freqMhz >= WifiEntry.MIN_FREQ_5GHZ && freqMhz < WifiEntry.MAX_FREQ_5GHZ) {
-            return context.getResources().getString(R.string.wifitrackerlib_wifi_band_5_ghz);
-        } else if (freqMhz >= WifiEntry.MIN_FREQ_6GHZ && freqMhz < WifiEntry.MAX_FREQ_6GHZ) {
-            return context.getResources().getString(R.string.wifitrackerlib_wifi_band_6_ghz);
-        } else {
-            return context.getResources().getString(R.string.wifitrackerlib_wifi_band_unknown);
-        }
+    public static String frequencyToBandString(@NonNull Context context, int freqMhz) {
+        return bandToBandString(context, getBand(freqMhz));
     }
 
     /**
      * Converts the band info in WifiInfo to the display string of the corresponding Wi-Fi band(s).
      */
-    public static String getBandString(@NonNull Context context, @NonNull WifiInfo wifiInfo) {
+    public static String wifiInfoToBandString(
+            @NonNull Context context, @NonNull WifiInfo wifiInfo) {
         if (!BuildCompat.isAtLeastU()) {
-            return getBandString(context, wifiInfo.getFrequency());
+            return frequencyToBandString(context, wifiInfo.getFrequency());
         }
 
         StringJoiner sj = new StringJoiner(
@@ -1109,27 +1154,49 @@
                 .map(MloLink::getBand)
                 .distinct()
                 .sorted()
-                .forEach((band) -> {
-                    switch (band) {
-                        case WifiScanner.WIFI_BAND_24_GHZ:
-                            sj.add(context.getResources()
-                                    .getString(R.string.wifitrackerlib_wifi_band_24_ghz));
-                            break;
-                        case WifiScanner.WIFI_BAND_5_GHZ:
-                            sj.add(context.getResources()
-                                    .getString(R.string.wifitrackerlib_wifi_band_5_ghz));
-                            break;
-                        case WifiScanner.WIFI_BAND_6_GHZ:
-                            sj.add(context.getResources()
-                                    .getString(R.string.wifitrackerlib_wifi_band_6_ghz));
-                            break;
-                        default:
-                            sj.add(context.getResources()
-                                    .getString(R.string.wifitrackerlib_wifi_band_unknown));
-                    }
-                });
+                .forEach((band) -> sj.add(bandToBandString(context, band)));
         if (sj.length() == 0) {
-            return getBandString(context, wifiInfo.getFrequency());
+            return frequencyToBandString(context, wifiInfo.getFrequency());
+        }
+        return sj.toString();
+    }
+
+    /**
+     * Returns the link speed string of the WifiInfo for Tx if isTx is {@code true}, else
+     * return the Rx link speed.
+     */
+    public static String getSpeedString(
+            @NonNull Context context, @Nullable WifiInfo wifiInfo, boolean isTx) {
+        if (wifiInfo == null) {
+            return "";
+        }
+        int wifiInfoSpeedMbps =
+                isTx ? wifiInfo.getTxLinkSpeedMbps() : wifiInfo.getRxLinkSpeedMbps();
+        if (wifiInfoSpeedMbps <= 0) {
+            return "";
+        }
+        if (!BuildCompat.isAtLeastU()) {
+            return context.getString(R.string.wifitrackerlib_link_speed_mbps,
+                    wifiInfoSpeedMbps);
+        }
+        List<MloLink> activeMloLinks = wifiInfo.getAssociatedMloLinks().stream()
+                .filter((link) -> link.getState() == MloLink.MLO_LINK_STATE_ACTIVE)
+                .collect(toList());
+        if (activeMloLinks.size() <= 1) {
+            return context.getString(R.string.wifitrackerlib_link_speed_mbps,
+                    wifiInfoSpeedMbps);
+        }
+        StringJoiner sj = new StringJoiner(
+                context.getString(R.string.wifitrackerlib_multiband_separator));
+        for (MloLink link : activeMloLinks) {
+            int linkSpeedMbps = isTx ? link.getTxLinkSpeedMbps() : link.getRxLinkSpeedMbps();
+            if (linkSpeedMbps <= 0) {
+                continue;
+            }
+            sj.add(context.getString(
+                    R.string.wifitrackerlib_link_speed_on_band,
+                    context.getString(R.string.wifitrackerlib_link_speed_mbps, linkSpeedMbps),
+                    bandToBandString(context, link.getBand())));
         }
         return sj.toString();
     }
@@ -1144,4 +1211,78 @@
         }
         return NonSdkApiWrapper.getVcnWifiInfo(capabilities);
     }
+
+    /**
+     * Converts security types to a display string.
+     */
+    public static String getSecurityString(@NonNull Context context,
+            @NonNull List<Integer> securityTypes, boolean concise) {
+        if (securityTypes.size() == 0) {
+            return concise ? "" : context.getString(R.string.wifitrackerlib_wifi_security_none);
+        }
+        if (securityTypes.size() == 1) {
+            final int security = securityTypes.get(0);
+            switch(security) {
+                case SECURITY_TYPE_EAP:
+                    return concise ? context.getString(
+                            R.string.wifitrackerlib_wifi_security_short_eap_wpa_wpa2) :
+                            context.getString(
+                                    R.string.wifitrackerlib_wifi_security_eap_wpa_wpa2);
+                case SECURITY_TYPE_EAP_WPA3_ENTERPRISE:
+                    return concise ? context.getString(
+                            R.string.wifitrackerlib_wifi_security_short_eap_wpa3) :
+                            context.getString(
+                                    R.string.wifitrackerlib_wifi_security_eap_wpa3);
+                case SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT:
+                    return concise ? context.getString(
+                            R.string.wifitrackerlib_wifi_security_short_eap_suiteb) :
+                            context.getString(R.string.wifitrackerlib_wifi_security_eap_suiteb);
+                case SECURITY_TYPE_PSK:
+                    return concise ? context.getString(
+                            R.string.wifitrackerlib_wifi_security_short_wpa_wpa2) :
+                            context.getString(
+                                    R.string.wifitrackerlib_wifi_security_wpa_wpa2);
+                case SECURITY_TYPE_WEP:
+                    return context.getString(R.string.wifitrackerlib_wifi_security_wep);
+                case SECURITY_TYPE_SAE:
+                    return concise ? context.getString(
+                            R.string.wifitrackerlib_wifi_security_short_sae) :
+                            context.getString(R.string.wifitrackerlib_wifi_security_sae);
+                case SECURITY_TYPE_OWE:
+                    return concise ? context.getString(
+                            R.string.wifitrackerlib_wifi_security_short_owe) :
+                            context.getString(R.string.wifitrackerlib_wifi_security_owe);
+                case SECURITY_TYPE_OPEN:
+                    return concise ? "" : context.getString(
+                            R.string.wifitrackerlib_wifi_security_none);
+            }
+        }
+        if (securityTypes.size() == 2) {
+            if (securityTypes.contains(SECURITY_TYPE_OPEN)
+                    && securityTypes.contains(SECURITY_TYPE_OWE)) {
+                StringJoiner sj = new StringJoiner("/");
+                sj.add(context.getString(R.string.wifitrackerlib_wifi_security_none));
+                sj.add(concise ? context.getString(
+                        R.string.wifitrackerlib_wifi_security_short_owe) :
+                        context.getString(R.string.wifitrackerlib_wifi_security_owe));
+                return sj.toString();
+            }
+            if (securityTypes.contains(SECURITY_TYPE_PSK)
+                    && securityTypes.contains(SECURITY_TYPE_SAE)) {
+                return concise ? context.getString(
+                        R.string.wifitrackerlib_wifi_security_short_wpa_wpa2_wpa3) :
+                        context.getString(
+                                R.string.wifitrackerlib_wifi_security_wpa_wpa2_wpa3);
+            }
+            if (securityTypes.contains(SECURITY_TYPE_EAP)
+                    && securityTypes.contains(SECURITY_TYPE_EAP_WPA3_ENTERPRISE)) {
+                return concise ? context.getString(
+                        R.string.wifitrackerlib_wifi_security_short_eap_wpa_wpa2_wpa3) :
+                        context.getString(
+                                R.string.wifitrackerlib_wifi_security_eap_wpa_wpa2_wpa3);
+            }
+        }
+        // Unknown security types
+        return concise ? "" : context.getString(R.string.wifitrackerlib_wifi_security_none);
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
index 0c575f7..09dfd89 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
@@ -23,6 +23,7 @@
 import static com.android.wifitrackerlib.Utils.getNetworkPart;
 import static com.android.wifitrackerlib.Utils.getSingleSecurityTypeFromMultipleSecurityTypes;
 
+import android.content.Context;
 import android.net.ConnectivityDiagnosticsManager;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
@@ -35,6 +36,7 @@
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.Handler;
+import android.text.TextUtils;
 
 import androidx.annotation.AnyThread;
 import androidx.annotation.IntDef;
@@ -212,6 +214,8 @@
                             entry.getConnectedState() != CONNECTED_STATE_CONNECTED)
                     .thenComparing((WifiEntry entry) -> !(entry instanceof KnownNetworkEntry))
                     .thenComparing((WifiEntry entry) -> !(entry instanceof HotspotNetworkEntry))
+                    .thenComparing((WifiEntry entry) -> (entry instanceof HotspotNetworkEntry)
+                            ? -((HotspotNetworkEntry) entry).getUpstreamConnectionStrength() : 0)
                     .thenComparing((WifiEntry entry) -> !entry.canConnect())
                     .thenComparing((WifiEntry entry) -> !entry.isSubscription())
                     .thenComparing((WifiEntry entry) -> !entry.isSaved())
@@ -227,6 +231,8 @@
 
     protected final boolean mForSavedNetworksPage;
 
+    @NonNull protected final WifiTrackerInjector mInjector;
+    @NonNull protected final Context mContext;
     protected final WifiManager mWifiManager;
 
     // Callback associated with this WifiEntry. Subclasses should call its methods appropriately.
@@ -238,6 +244,7 @@
     protected NetworkInfo mNetworkInfo;
     protected Network mNetwork;
     protected NetworkCapabilities mNetworkCapabilities;
+    protected Network mDefaultNetwork;
     protected NetworkCapabilities mDefaultNetworkCapabilities;
     protected ConnectivityDiagnosticsManager.ConnectivityReport mConnectivityReport;
     protected ConnectedInfo mConnectedInfo;
@@ -249,14 +256,17 @@
     protected boolean mCalledConnect = false;
     protected boolean mCalledDisconnect = false;
 
-    protected boolean mIsDefaultNetwork;
 
     private Optional<ManageSubscriptionAction> mManageSubscriptionAction = Optional.empty();
 
-    public WifiEntry(@NonNull Handler callbackHandler, @NonNull WifiManager wifiManager,
-            boolean forSavedNetworksPage) throws IllegalArgumentException {
+    public WifiEntry(@NonNull WifiTrackerInjector injector, @NonNull Handler callbackHandler,
+            @NonNull WifiManager wifiManager, boolean forSavedNetworksPage)
+            throws IllegalArgumentException {
+        checkNotNull(injector, "Cannot construct with null injector!");
         checkNotNull(callbackHandler, "Cannot construct with null handler!");
         checkNotNull(wifiManager, "Cannot construct with null WifiManager!");
+        mInjector = injector;
+        mContext = mInjector.getContext();
         mCallbackHandler = callbackHandler;
         mForSavedNetworksPage = forSavedNetworksPage;
         mWifiManager = wifiManager;
@@ -348,7 +358,7 @@
      * Returns whether this network has validated internet access or not.
      * Note: This does not necessarily mean the network is the default route.
      */
-    public boolean hasInternetAccess() {
+    public synchronized boolean hasInternetAccess() {
         return mNetworkCapabilities != null
                 && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
     }
@@ -358,13 +368,13 @@
      * currently being used to provide internet connection).
      */
     public boolean isDefaultNetwork() {
-        return mIsDefaultNetwork;
+        return mNetwork != null && mNetwork.equals(mDefaultNetwork);
     }
 
     /**
      * Returns whether this network is the primary Wi-Fi network or not.
      */
-    public boolean isPrimaryNetwork() {
+    public synchronized boolean isPrimaryNetwork() {
         if (getConnectedState() == CONNECTED_STATE_DISCONNECTED) {
             // In case we have mNetworkInfo but the state is disconnected.
             return false;
@@ -376,7 +386,7 @@
     /**
      * Returns whether this network is considered low quality.
      */
-    public boolean isLowQuality() {
+    public synchronized boolean isLowQuality() {
         if (!isPrimaryNetwork()) {
             return false;
         }
@@ -392,6 +402,14 @@
     }
 
     /**
+     * Returns whether this network should display its SSID separately from the title
+     * (e.g. the Network Details page), for networks whose display titles differ from the SSID.
+     */
+    public boolean shouldShowSsid() {
+        return false;
+    }
+
+    /**
      * Returns the SSID of the entry, if applicable. Null otherwise.
      */
     @Nullable
@@ -476,6 +494,14 @@
     }
 
     /**
+     * Returns whether this entry needs to be configured with a new WifiConfiguration before
+     * connection.
+     */
+    public boolean needsWifiConfiguration() {
+        return false;
+    }
+
+    /**
      * Returns the WifiConfiguration of an entry or null if unavailable. This should be used when
      * information on the WifiConfiguration needs to be modified and saved via
      * {@link WifiManager#save(WifiConfiguration, WifiManager.ActionListener)}.
@@ -658,6 +684,20 @@
         return "";
     }
 
+    /**
+     * Returns the string displayed for Tx link speed.
+     */
+    public String getTxSpeedString() {
+        return Utils.getSpeedString(mContext, mWifiInfo, /* isTx */ true);
+    }
+
+    /**
+     * Returns the string displayed for Rx link speed.
+     */
+    public String getRxSpeedString() {
+        return Utils.getSpeedString(mContext, mWifiInfo, /* isTx */ false);
+    }
+
     /** Returns whether subscription of the entry is expired */
     public boolean isExpired() {
         return false;
@@ -716,7 +756,7 @@
             sb.append("hasInternet:")
                     .append(hasInternetAccess())
                     .append(", isDefaultNetwork:")
-                    .append(mIsDefaultNetwork)
+                    .append(isDefaultNetwork())
                     .append(", isLowQuality:")
                     .append(isLowQuality());
         }
@@ -733,6 +773,13 @@
     }
 
     /**
+     * Whether there are admin restrictions preventing connection to this network.
+     */
+    public boolean hasAdminRestrictions() {
+        return false;
+    }
+
+    /**
      * Sets the callback listener for WifiEntryCallback methods.
      * Subsequent calls will overwrite the previous listener.
      */
@@ -870,18 +917,21 @@
     /**
      * Updates this WifiEntry with the given primary WifiInfo/NetworkInfo if they match.
      * @param primaryWifiInfo Primary WifiInfo that has changed
-     * @param networkInfo NetworkInfo of the primary network
+     * @param networkInfo NetworkInfo of the primary network if available
      */
     synchronized void onPrimaryWifiInfoChanged(
-            @NonNull WifiInfo primaryWifiInfo, @NonNull NetworkInfo networkInfo) {
-        if (!connectionInfoMatches(primaryWifiInfo)) {
+            @Nullable WifiInfo primaryWifiInfo, @Nullable NetworkInfo networkInfo) {
+        if (primaryWifiInfo == null || !connectionInfoMatches(primaryWifiInfo)) {
             if (mNetworkInfo != null) {
                 mNetworkInfo = null;
                 notifyOnUpdated();
             }
             return;
         }
-        mNetworkInfo = networkInfo;
+        if (networkInfo != null) {
+            mNetworkInfo = networkInfo;
+        }
+        updateWifiInfo(primaryWifiInfo);
         notifyOnUpdated();
     }
 
@@ -915,9 +965,20 @@
 
         // Connection info matches, so the Network/NetworkCapabilities represent this network
         // and the network is currently connecting or connected.
-        mWifiInfo = wifiInfo;
         mNetwork = network;
         mNetworkCapabilities = capabilities;
+        updateWifiInfo(wifiInfo);
+        notifyOnUpdated();
+    }
+
+    private synchronized void updateWifiInfo(WifiInfo wifiInfo) {
+        if (wifiInfo == null) {
+            mWifiInfo = null;
+            mConnectedInfo = null;
+            updateSecurityTypes();
+            return;
+        }
+        mWifiInfo = wifiInfo;
         final int wifiInfoRssi = mWifiInfo.getRssi();
         if (wifiInfoRssi != INVALID_RSSI) {
             mLevel = mWifiManager.calculateSignalLevel(wifiInfoRssi);
@@ -942,7 +1003,6 @@
             mConnectedInfo.wifiStandard = mWifiInfo.getWifiStandard();
         }
         updateSecurityTypes();
-        notifyOnUpdated();
     }
 
     /**
@@ -953,14 +1013,18 @@
         if (!network.equals(mNetwork)) {
             return;
         }
-
         // Network matches, so this network is disconnected.
-        mWifiInfo = null;
+        clearConnectionInfo();
+    }
+
+    /**
+     * Clears any connection info from this entry.
+     */
+    synchronized void clearConnectionInfo() {
+        updateWifiInfo(null);
         mNetworkInfo = null;
         mNetworkCapabilities = null;
-        mConnectedInfo = null;
         mConnectivityReport = null;
-        mIsDefaultNetwork = false;
         if (mCalledDisconnect) {
             mCalledDisconnect = false;
             mCallbackHandler.post(() -> {
@@ -971,7 +1035,6 @@
                 }
             });
         }
-        updateSecurityTypes();
         notifyOnUpdated();
     }
 
@@ -982,9 +1045,8 @@
     synchronized void onDefaultNetworkCapabilitiesChanged(
             @NonNull Network network,
             @NonNull NetworkCapabilities capabilities) {
-        onNetworkCapabilitiesChanged(network, capabilities);
+        mDefaultNetwork = network;
         mDefaultNetworkCapabilities = capabilities;
-        mIsDefaultNetwork = network.equals(mNetwork);
         notifyOnUpdated();
     }
 
@@ -992,8 +1054,8 @@
      * Notifies this WifiEntry that the default network was lost.
      */
     synchronized void onDefaultNetworkLost() {
+        mDefaultNetwork = null;
         mDefaultNetworkCapabilities = null;
-        mIsDefaultNetwork = false;
         notifyOnUpdated();
     }
 
@@ -1088,18 +1150,9 @@
         @Override
         public void onSuccess() {
             synchronized (WifiEntry.this) {
+                // Wait for L3 connection before returning the success result.
                 mCalledConnect = true;
             }
-            // If we aren't connected to the network after 10 seconds, trigger the failure callback
-            mCallbackHandler.postDelayed(() -> {
-                final ConnectCallback connectCallback = mConnectCallback;
-                if (connectCallback != null && mCalledConnect
-                        && getConnectedState() == CONNECTED_STATE_DISCONNECTED) {
-                    connectCallback.onConnectResult(
-                            ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN);
-                    mCalledConnect = false;
-                }
-            }, 10_000 /* delayMillis */);
         }
 
         @Override
@@ -1107,8 +1160,7 @@
             mCallbackHandler.post(() -> {
                 final ConnectCallback connectCallback = mConnectCallback;
                 if (connectCallback != null) {
-                    connectCallback.onConnectResult(
-                            ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN);
+                    connectCallback.onConnectResult(ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN);
                 }
             });
         }
@@ -1149,34 +1201,61 @@
 
     @Override
     public String toString() {
-        return new StringBuilder()
-                .append(getKey())
-                .append(",title:")
-                .append(getTitle())
-                .append(",summary:")
-                .append(getSummary())
-                .append(",isSaved:")
-                .append(isSaved())
-                .append(",isSubscription:")
-                .append(isSubscription())
-                .append(",isSuggestion:")
-                .append(isSuggestion())
-                .append(",level:")
-                .append(getLevel())
-                .append(shouldShowXLevelIcon() ? "X" : "")
-                .append(",security:")
-                .append(getSecurityTypes())
-                .append(",connected:")
-                .append(getConnectedState() == CONNECTED_STATE_CONNECTED ? "true" : "false")
-                .append(",connectedInfo:")
-                .append(getConnectedInfo())
-                .append(",hasInternet:")
-                .append(hasInternetAccess())
-                .append(",isDefault:")
-                .append(mIsDefaultNetwork)
-                .append(",isPrimary:")
-                .append(isPrimaryNetwork())
-                .toString();
+        StringJoiner sj = new StringJoiner("][", "[", "]");
+        sj.add(this.getClass().getSimpleName());
+        sj.add(getTitle());
+        sj.add(getSummary());
+        sj.add("Level:" + getLevel() + (shouldShowXLevelIcon() ? "!" : ""));
+        String security = getSecurityString(true);
+        if (!TextUtils.isEmpty(security)) {
+            sj.add(security);
+        }
+        int connectedState = getConnectedState();
+        if (connectedState == CONNECTED_STATE_CONNECTED) {
+            sj.add("Connected");
+        } else if (connectedState == CONNECTED_STATE_CONNECTING) {
+            sj.add("Connecting...");
+        }
+        if (hasInternetAccess()) {
+            sj.add("Internet");
+        }
+        if (isDefaultNetwork()) {
+            sj.add("Default");
+        }
+        if (isPrimaryNetwork()) {
+            sj.add("Primary");
+        }
+        if (isLowQuality()) {
+            sj.add("LowQuality");
+        }
+        if (isSaved()) {
+            sj.add("Saved");
+        }
+        if (isSubscription()) {
+            sj.add("Subscription");
+        }
+        if (isSuggestion()) {
+            sj.add("Suggestion");
+        }
+        if (isMetered()) {
+            sj.add("Metered");
+        }
+        if ((isSaved() || isSuggestion() || isSubscription()) && !isAutoJoinEnabled()) {
+            sj.add("AutoJoinDisabled");
+        }
+        if (isExpired()) {
+            sj.add("Expired");
+        }
+        if (canSignIn()) {
+            sj.add("SignIn");
+        }
+        if (shouldEditBeforeConnect()) {
+            sj.add("EditBeforeConnect");
+        }
+        if (hasAdminRestrictions()) {
+            sj.add("AdminRestricted");
+        }
+        return sj.toString();
     }
 
     /**
@@ -1188,4 +1267,11 @@
          */
         void onExecute();
     }
+
+    /**
+     * Whether this WifiEntry is using a verbose summary.
+     */
+    public boolean isVerboseSummaryEnabled() {
+        return mInjector.isVerboseSummaryEnabled();
+    }
 }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
index dc2a7b4..3ee9a4d 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
@@ -60,6 +60,7 @@
 
 import androidx.annotation.AnyThread;
 import androidx.annotation.GuardedBy;
+import androidx.annotation.IntDef;
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -68,13 +69,15 @@
 import androidx.core.os.BuildCompat;
 import androidx.lifecycle.Lifecycle;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.time.Clock;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.StringJoiner;
 import java.util.TreeSet;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -92,6 +95,9 @@
 
     private static final String TAG = "WifiPickerTracker";
 
+    private static final String EXTRA_KEY_CONNECTION_STATUS_CONNECTED =
+            "connection_status_connected";
+
     private final WifiPickerTrackerCallback mListener;
 
     // Lock object for data returned by the public API
@@ -236,8 +242,8 @@
             // we aren't initialized yet.
             int subId = SubscriptionManager.getDefaultDataSubscriptionId();
             if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-                mMergedCarrierEntry = new MergedCarrierEntry(mWorkerHandler, mWifiManager,
-                        /* forSavedNetworksPage */ false, mContext, subId);
+                mMergedCarrierEntry = new MergedCarrierEntry(mInjector, mWorkerHandler,
+                        mWifiManager, /* forSavedNetworksPage */ false, subId);
             }
         }
         return mMergedCarrierEntry;
@@ -265,7 +271,7 @@
         allEntries.addAll(mSuggestedWifiEntryCache);
         allEntries.addAll(mPasspointWifiEntryCache.values());
         allEntries.addAll(mOsuWifiEntryCache.values());
-        if (mEnableSharedConnectivityFeature) {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
             allEntries.addAll(mKnownNetworkEntryCache);
             allEntries.addAll(mHotspotNetworkEntryCache);
         }
@@ -283,19 +289,21 @@
         mSuggestedWifiEntryCache.clear();
         mPasspointWifiEntryCache.clear();
         mOsuWifiEntryCache.clear();
-        if (mEnableSharedConnectivityFeature) {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
             mKnownNetworkEntryCache.clear();
             mHotspotNetworkEntryCache.clear();
         }
         mNetworkRequestEntry = null;
-        mMergedCarrierEntry = null;
     }
 
     @WorkerThread
     @Override
     protected void handleOnStart() {
-        // Remove stale WifiEntries remaining from the last onStop().
-        clearAllWifiEntries();
+        // Clear any stale connection info in case we missed any NetworkCallback.onLost() while in
+        // the stopped state.
+        for (WifiEntry wifiEntry : getAllWifiEntries()) {
+            wifiEntry.clearConnectionInfo();
+        }
 
         // Update configs and scans
         updateWifiConfigurations(mWifiManager.getPrivilegedConfiguredNetworks());
@@ -342,7 +350,7 @@
         checkNotNull(intent, "Intent cannot be null!");
         conditionallyUpdateScanResults(
                 intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true));
-        updateWifiEntries();
+        updateWifiEntries(WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS);
     }
 
     @WorkerThread
@@ -359,17 +367,7 @@
         updateWifiConfigurations(mWifiManager.getPrivilegedConfiguredNetworks());
         updatePasspointConfigurations(mWifiManager.getPasspointConfigurations());
         // Update scans since config changes may result in different entries being shown.
-        final List<ScanResult> scanResults = mScanResultUpdater.getScanResults();
-        updateStandardWifiEntryScans(scanResults);
-        updateNetworkRequestEntryScans(scanResults);
-        updatePasspointWifiEntryScans(scanResults);
-        updateOsuWifiEntryScans(scanResults);
-        if (mEnableSharedConnectivityFeature && BuildCompat.isAtLeastU()) {
-            updateKnownNetworkEntryScans(scanResults);
-            // Updating the hotspot entries here makes the UI more reliable when switching pages or
-            // when toggling settings while the internet picker is shown.
-            updateHotspotNetworkEntries();
-        }
+        conditionallyUpdateScanResults(false /* lastScanSucceeded */);
         notifyOnNumSavedNetworksChanged();
         notifyOnNumSavedSubscriptionsChanged();
         updateWifiEntries();
@@ -380,8 +378,8 @@
     protected void handleNetworkStateChangedAction(@NonNull Intent intent) {
         WifiInfo primaryWifiInfo = mWifiManager.getConnectionInfo();
         NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
-        if (primaryWifiInfo == null || networkInfo == null) {
-            return;
+        if (primaryWifiInfo != null) {
+            conditionallyCreateConnectedWifiEntry(primaryWifiInfo);
         }
         for (WifiEntry entry : getAllWifiEntries()) {
             entry.onPrimaryWifiInfoChanged(primaryWifiInfo, networkInfo);
@@ -391,6 +389,17 @@
 
     @WorkerThread
     @Override
+    protected void handleRssiChangedAction(@NonNull Intent intent) {
+        // RSSI is available via the new WifiInfo object, which is used to populate the RSSI in the
+        // verbose summary.
+        WifiInfo primaryWifiInfo = mWifiManager.getConnectionInfo();
+        for (WifiEntry entry : getAllWifiEntries()) {
+            entry.onPrimaryWifiInfoChanged(primaryWifiInfo, null);
+        }
+    }
+
+    @WorkerThread
+    @Override
     protected void handleLinkPropertiesChanged(
             @NonNull Network network, @Nullable LinkProperties linkProperties) {
         for (WifiEntry entry : getAllWifiEntries()) {
@@ -454,7 +463,7 @@
     @WorkerThread
     @Override
     protected void handleKnownNetworksUpdated(List<KnownNetwork> networks) {
-        if (mEnableSharedConnectivityFeature) {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
             mKnownNetworkDataCache.clear();
             mKnownNetworkDataCache.addAll(networks);
             updateKnownNetworkEntryScans(mScanResultUpdater.getScanResults());
@@ -466,22 +475,32 @@
     @WorkerThread
     @Override
     protected void handleHotspotNetworksUpdated(List<HotspotNetwork> networks) {
-        if (mEnableSharedConnectivityFeature) {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
             mHotspotNetworkDataCache.clear();
             mHotspotNetworkDataCache.addAll(networks);
             updateHotspotNetworkEntries();
             updateWifiEntries();
         }
     }
-    @TargetApi(VERSION_CODES.UPSIDE_DOWN_CAKE)
-    @WorkerThread
-    protected void handleHotspotNetworkConnectionStatusChanged(
-            @NonNull HotspotNetworkConnectionStatus status) {
-        mHotspotNetworkEntryCache.stream().filter(
-                entry -> entry.getHotspotNetworkEntryKey().getDeviceId()
-                        == status.getHotspotNetwork().getDeviceId()).forEach(
-                                entry -> entry.onConnectionStatusChanged(status.getStatus()));
-    }
+
+  @TargetApi(VERSION_CODES.UPSIDE_DOWN_CAKE)
+  @WorkerThread
+  protected void handleHotspotNetworkConnectionStatusChanged(
+      @NonNull HotspotNetworkConnectionStatus status) {
+    mHotspotNetworkEntryCache.stream()
+        .filter(
+            entry ->
+                entry.getHotspotNetworkEntryKey().getDeviceId()
+                    == status.getHotspotNetwork().getDeviceId())
+        .forEach(
+            entry -> {
+              if (status.getExtras().getBoolean(EXTRA_KEY_CONNECTION_STATUS_CONNECTED, false)) {
+                entry.onConnectionStatusChanged(HotspotNetworkEntry.CONNECTION_STATUS_CONNECTED);
+              } else {
+                entry.onConnectionStatusChanged(status.getStatus());
+              }
+            });
+  }
 
     @TargetApi(VERSION_CODES.UPSIDE_DOWN_CAKE)
     @WorkerThread
@@ -489,7 +508,7 @@
     protected void handleKnownNetworkConnectionStatusChanged(
             @NonNull KnownNetworkConnectionStatus status) {
         final ScanResultKey key = new ScanResultKey(status.getKnownNetwork().getSsid(),
-                status.getKnownNetwork().getSecurityTypes().stream().toList());
+                new ArrayList<>(status.getKnownNetwork().getSecurityTypes()));
         mKnownNetworkEntryCache.stream().filter(
                 entry -> entry.getStandardWifiEntryKey().getScanResultKey().equals(key)).forEach(
                         entry -> entry.onConnectionStatusChanged(status.getStatus()));
@@ -499,28 +518,48 @@
     @WorkerThread
     @Override
     protected void handleServiceConnected() {
-        if (mEnableSharedConnectivityFeature) {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
             mKnownNetworkDataCache.clear();
-            mKnownNetworkDataCache.addAll(mSharedConnectivityManager.getKnownNetworks());
+            List<KnownNetwork> knownNetworks = mSharedConnectivityManager.getKnownNetworks();
+            if (knownNetworks != null) {
+                mKnownNetworkDataCache.addAll(knownNetworks);
+            }
             mHotspotNetworkDataCache.clear();
-            mHotspotNetworkDataCache.addAll(mSharedConnectivityManager.getHotspotNetworks());
+            List<HotspotNetwork> hotspotNetworks = mSharedConnectivityManager.getHotspotNetworks();
+            if (hotspotNetworks != null) {
+                mHotspotNetworkDataCache.addAll(hotspotNetworks);
+            }
             updateKnownNetworkEntryScans(mScanResultUpdater.getScanResults());
             updateHotspotNetworkEntries();
+            HotspotNetworkConnectionStatus status =
+                    mSharedConnectivityManager.getHotspotNetworkConnectionStatus();
+            if (status != null) {
+                handleHotspotNetworkConnectionStatusChanged(status);
+            }
             updateWifiEntries();
         }
     }
 
-    /**
-     * Update the list returned by getWifiEntries() with the current states of the entry caches.
-     */
+    @TargetApi(VERSION_CODES.UPSIDE_DOWN_CAKE)
     @WorkerThread
-    protected void updateWifiEntries() {
+    @Override
+    protected void handleServiceDisconnected() {
+        if (mInjector.isSharedConnectivityFeatureEnabled()) {
+            mKnownNetworkDataCache.clear();
+            mHotspotNetworkDataCache.clear();
+            mKnownNetworkEntryCache.clear();
+            mHotspotNetworkEntryCache.clear();
+            updateWifiEntries();
+        }
+    }
+
+    protected void updateWifiEntries(@WifiEntriesChangedReason int reason) {
         synchronized (mLock) {
             mActiveWifiEntries.clear();
             mActiveWifiEntries.addAll(mStandardWifiEntryCache);
             mActiveWifiEntries.addAll(mSuggestedWifiEntryCache);
             mActiveWifiEntries.addAll(mPasspointWifiEntryCache.values());
-            if (mEnableSharedConnectivityFeature) {
+            if (mInjector.isSharedConnectivityFeatureEnabled()) {
                 mActiveWifiEntries.addAll(mHotspotNetworkEntryCache);
             }
             if (mNetworkRequestEntry != null) {
@@ -566,6 +605,7 @@
                             hotspotNetworkEntry.getHotspotNetworkEntryKey().getScanResultKey());
                 }
             }
+            Set<ScanResultKey> savedEntryKeys = new ArraySet<>();
             for (StandardWifiEntry entry : mStandardWifiEntryCache) {
                 entry.updateAdminRestrictions();
                 if (mActiveWifiEntries.contains(entry)) {
@@ -580,14 +620,19 @@
                     if (passpointUtf8Ssids.contains(entry.getSsid())) {
                         continue;
                     }
-                }
-                if (mEnableSharedConnectivityFeature) {
-                    // Filter out any StandardWifiEntry that is matched with a KnownNetworkEntry
-                    if (knownNetworkKeys
-                            .contains(entry.getStandardWifiEntryKey().getScanResultKey())) {
-                        continue;
+                    if (mInjector.isSharedConnectivityFeatureEnabled()) {
+                        // Filter out any unsaved entries that are matched with a KnownNetworkEntry
+                        if (knownNetworkKeys
+                                .contains(entry.getStandardWifiEntryKey().getScanResultKey())) {
+                            continue;
+                        }
                     }
-                    // Filter out any StandardWifiEntry that is matched with a HotspotNetworkEntry
+                } else {
+                    // Create a set of saved entry keys
+                    savedEntryKeys.add(entry.getStandardWifiEntryKey().getScanResultKey());
+                }
+                if (mInjector.isSharedConnectivityFeatureEnabled()) {
+                    // Filter out any entries that are matched with a HotspotNetworkEntry
                     if (hotspotNetworkKeys
                             .contains(entry.getStandardWifiEntryKey().getScanResultKey())) {
                         continue;
@@ -605,9 +650,11 @@
                             && !entry.isAlreadyProvisioned()).collect(toList()));
             mWifiEntries.addAll(getContextualWifiEntries().stream().filter(entry ->
                     entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList()));
-            if (mEnableSharedConnectivityFeature) {
+            if (mInjector.isSharedConnectivityFeatureEnabled()) {
                 mWifiEntries.addAll(mKnownNetworkEntryCache.stream().filter(entry ->
-                        entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(
+                        (entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED)
+                                && !(savedEntryKeys.contains(
+                                entry.getStandardWifiEntryKey().getScanResultKey()))).collect(
                         toList()));
                 mWifiEntries.addAll(mHotspotNetworkEntryCache.stream().filter(entry ->
                         entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(
@@ -615,12 +662,32 @@
             }
             Collections.sort(mWifiEntries, WifiEntry.WIFI_PICKER_COMPARATOR);
             if (isVerboseLoggingEnabled()) {
-                Log.v(TAG, "Connected WifiEntries: "
-                        + Arrays.toString(mActiveWifiEntries.toArray()));
-                Log.v(TAG, "Updated WifiEntries: " + Arrays.toString(mWifiEntries.toArray()));
+                Log.v(TAG, "onWifiEntriesChanged: reason=" + reason);
+                StringJoiner entryLog = new StringJoiner("\n");
+                int numEntries = mActiveWifiEntries.size() + mWifiEntries.size();
+                int index = 1;
+                for (WifiEntry entry : mActiveWifiEntries) {
+                    entryLog.add("Entry " + index + "/" + numEntries + ": " + entry);
+                    index++;
+                }
+                for (WifiEntry entry : mWifiEntries) {
+                    entryLog.add("Entry " + index + "/" + numEntries + ": " + entry);
+                    index++;
+                }
+                Log.v(TAG, entryLog.toString());
+                Log.v(TAG, "MergedCarrierEntry: " + mMergedCarrierEntry);
             }
         }
-        notifyOnWifiEntriesChanged();
+        notifyOnWifiEntriesChanged(reason);
+    }
+
+
+    /**
+     * Update the list returned by getWifiEntries() with the current states of the entry caches.
+     */
+    @WorkerThread
+    protected void updateWifiEntries() {
+        updateWifiEntries(WIFI_ENTRIES_CHANGED_REASON_GENERAL);
     }
 
     /**
@@ -638,8 +705,8 @@
             if (mMergedCarrierEntry != null && subId == mMergedCarrierEntry.getSubscriptionId()) {
                 return;
             }
-            mMergedCarrierEntry = new MergedCarrierEntry(mWorkerHandler, mWifiManager,
-                    /* forSavedNetworksPage */ false, mContext, subId);
+            mMergedCarrierEntry = new MergedCarrierEntry(mInjector, mWorkerHandler, mWifiManager,
+                    /* forSavedNetworksPage */ false, subId);
             Network currentNetwork = mWifiManager.getCurrentNetwork();
             if (currentNetwork != null) {
                 NetworkCapabilities networkCapabilities =
@@ -659,7 +726,7 @@
                 }
             }
         }
-        notifyOnWifiEntriesChanged();
+        notifyOnWifiEntriesChanged(WIFI_ENTRIES_CHANGED_REASON_GENERAL);
     }
 
     /**
@@ -704,7 +771,7 @@
         for (ScanResultKey scanKey: newScanKeys) {
             final StandardWifiEntryKey entryKey =
                     new StandardWifiEntryKey(scanKey, true /* isTargetingNewNetworks */);
-            final StandardWifiEntry newEntry = new StandardWifiEntry(mInjector, mContext,
+            final StandardWifiEntry newEntry = new StandardWifiEntry(mInjector,
                     mMainHandler, entryKey, mStandardWifiConfigCache.get(entryKey),
                     scanResultsByKey.get(scanKey), mWifiManager,
                     false /* forSavedNetworksPage */);
@@ -756,7 +823,7 @@
                     || !scanResultsByKey.containsKey(scanKey)) {
                 continue;
             }
-            final StandardWifiEntry newEntry = new StandardWifiEntry(mInjector, mContext,
+            final StandardWifiEntry newEntry = new StandardWifiEntry(mInjector,
                     mMainHandler, entryKey, mSuggestedConfigCache.get(entryKey),
                     scanResultsByKey.get(scanKey), mWifiManager,
                     false /* forSavedNetworksPage */);
@@ -793,7 +860,7 @@
                             mMainHandler, wifiConfig, mWifiManager,
                             false /* forSavedNetworksPage */));
                 } else if (mPasspointConfigCache.containsKey(key)) {
-                    mPasspointWifiEntryCache.put(key, new PasspointWifiEntry(mInjector, mContext,
+                    mPasspointWifiEntryCache.put(key, new PasspointWifiEntry(mInjector,
                             mMainHandler, mPasspointConfigCache.get(key), mWifiManager,
                             false /* forSavedNetworksPage */));
                 } else {
@@ -828,7 +895,7 @@
 
         // Create a new entry for each OsuProvider not already matched to an OsuWifiEntry
         for (OsuProvider provider : osuProviderToScans.keySet()) {
-            OsuWifiEntry newEntry = new OsuWifiEntry(mInjector, mContext, mMainHandler, provider,
+            OsuWifiEntry newEntry = new OsuWifiEntry(mInjector, mMainHandler, provider,
                     mWifiManager, false /* forSavedNetworksPage */);
             newEntry.updateScanResultInfo(osuProviderToScans.get(provider));
             mOsuWifiEntryCache.put(osuProviderToOsuWifiEntryKey(provider), newEntry);
@@ -880,6 +947,10 @@
                             return data1; // When duplicate data is encountered, use first one.
                         }));
 
+        // Remove entries not in latest data set from service
+        mKnownNetworkEntryCache.removeIf(entry -> !knownNetworkDataByKey.keySet().contains(
+                entry.getStandardWifiEntryKey().getScanResultKey()));
+
         // Create set of ScanResultKeys for known networks from service that are included in scan
         final Set<ScanResultKey> newScanKeys = knownNetworkDataByKey.keySet().stream().filter(
                 scanResultsByKey::containsKey).collect(Collectors.toSet());
@@ -912,7 +983,7 @@
         for (ScanResultKey scanKey : newScanKeys) {
             final StandardWifiEntryKey entryKey =
                     new StandardWifiEntryKey(scanKey, true /* isTargetingNewNetworks */);
-            final KnownNetworkEntry newEntry = new KnownNetworkEntry(mInjector, mContext,
+            final KnownNetworkEntry newEntry = new KnownNetworkEntry(mInjector,
                     mMainHandler, entryKey, null /* configs */,
                     scanResultsByKey.get(scanKey), mWifiManager,
                     mSharedConnectivityManager, knownNetworkDataByKey.get(scanKey));
@@ -1009,7 +1080,7 @@
             updateSuggestedWifiEntryScans(Collections.emptyList());
             updatePasspointWifiEntryScans(Collections.emptyList());
             updateOsuWifiEntryScans(Collections.emptyList());
-            if (mEnableSharedConnectivityFeature && BuildCompat.isAtLeastU()) {
+            if (mInjector.isSharedConnectivityFeatureEnabled() && BuildCompat.isAtLeastU()) {
                 mKnownNetworkEntryCache.clear();
                 mHotspotNetworkEntryCache.clear();
             }
@@ -1033,7 +1104,7 @@
         updateSuggestedWifiEntryScans(scanResults);
         updatePasspointWifiEntryScans(scanResults);
         updateOsuWifiEntryScans(scanResults);
-        if (mEnableSharedConnectivityFeature && BuildCompat.isAtLeastU()) {
+        if (mInjector.isSharedConnectivityFeatureEnabled() && BuildCompat.isAtLeastU()) {
             updateKnownNetworkEntryScans(scanResults);
             // Updating the hotspot entries here makes the UI more reliable when switching pages or
             // when toggling settings while the internet picker is shown.
@@ -1141,14 +1212,18 @@
             // thread times out waiting for driver restart and returns an empty list of networks.
             updateWifiConfigurations(mWifiManager.getPrivilegedConfiguredNetworks());
         }
+        // Create a WifiEntry for the current connection if there are no scan results yet.
+        conditionallyCreateConnectedWifiEntry(Utils.getWifiInfo(capabilities));
         for (WifiEntry entry : getAllWifiEntries()) {
             entry.onNetworkCapabilitiesChanged(network, capabilities);
         }
-        // Create a WifiEntry for the current connection if there are no scan results yet.
-        conditionallyCreateConnectedStandardWifiEntry(network, capabilities);
-        conditionallyCreateConnectedSuggestedWifiEntry(network, capabilities);
-        conditionallyCreateConnectedPasspointWifiEntry(network, capabilities);
-        conditionallyCreateConnectedNetworkRequestEntry(network, capabilities);
+    }
+
+    private void conditionallyCreateConnectedWifiEntry(@NonNull WifiInfo wifiInfo) {
+        conditionallyCreateConnectedStandardWifiEntry(wifiInfo);
+        conditionallyCreateConnectedSuggestedWifiEntry(wifiInfo);
+        conditionallyCreateConnectedPasspointWifiEntry(wifiInfo);
+        conditionallyCreateConnectedNetworkRequestEntry(wifiInfo);
     }
 
     /**
@@ -1156,11 +1231,9 @@
      * created if there is no existing entry, or the existing entry doesn't match WifiInfo.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedNetworkRequestEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
+    private void conditionallyCreateConnectedNetworkRequestEntry(@NonNull WifiInfo wifiInfo) {
         final List<WifiConfiguration> matchingConfigs = new ArrayList<>();
 
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
         if (wifiInfo != null) {
             for (int i = 0; i < mNetworkRequestConfigCache.size(); i++) {
                 final List<WifiConfiguration> configs = mNetworkRequestConfigCache.valueAt(i);
@@ -1178,12 +1251,11 @@
         final StandardWifiEntryKey entryKey = new StandardWifiEntryKey(matchingConfigs.get(0));
         if (mNetworkRequestEntry == null
                 || !mNetworkRequestEntry.getStandardWifiEntryKey().equals(entryKey)) {
-            mNetworkRequestEntry = new NetworkRequestEntry(mInjector, mContext, mMainHandler,
+            mNetworkRequestEntry = new NetworkRequestEntry(mInjector, mMainHandler,
                     entryKey, mWifiManager, false /* forSavedNetworksPage */);
             mNetworkRequestEntry.updateConfig(matchingConfigs);
             updateNetworkRequestEntryScans(mScanResultUpdater.getScanResults());
         }
-        mNetworkRequestEntry.onNetworkCapabilitiesChanged(network, capabilities);
     }
 
     /**
@@ -1191,9 +1263,7 @@
      * network yet, create and cache a new StandardWifiEntry for it.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedStandardWifiEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
+    private void conditionallyCreateConnectedStandardWifiEntry(@NonNull WifiInfo wifiInfo) {
         if (wifiInfo == null || wifiInfo.isPasspointAp() || wifiInfo.isOsuAp()) {
             return;
         }
@@ -1215,9 +1285,8 @@
                 }
             }
             final StandardWifiEntry connectedEntry =
-                    new StandardWifiEntry(mInjector, mContext, mMainHandler, entryKey, configs,
+                    new StandardWifiEntry(mInjector, mMainHandler, entryKey, configs,
                             null, mWifiManager, false /* forSavedNetworksPage */);
-            connectedEntry.onNetworkCapabilitiesChanged(network, capabilities);
             mStandardWifiEntryCache.add(connectedEntry);
             return;
         }
@@ -1228,9 +1297,7 @@
      * yet, create and cache a new StandardWifiEntry for it.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedSuggestedWifiEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
+    private void conditionallyCreateConnectedSuggestedWifiEntry(@NonNull WifiInfo wifiInfo) {
         if (wifiInfo == null || wifiInfo.isPasspointAp() || wifiInfo.isOsuAp()) {
             return;
         }
@@ -1247,9 +1314,8 @@
                 }
             }
             final StandardWifiEntry connectedEntry =
-                    new StandardWifiEntry(mInjector, mContext, mMainHandler, entryKey, configs,
+                    new StandardWifiEntry(mInjector, mMainHandler, entryKey, configs,
                             null, mWifiManager, false /* forSavedNetworksPage */);
-            connectedEntry.onNetworkCapabilitiesChanged(network, capabilities);
             mSuggestedWifiEntryCache.add(connectedEntry);
             return;
         }
@@ -1260,9 +1326,7 @@
      * yet, create and cache a new StandardWifiEntry for it.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedPasspointWifiEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
+    private void conditionallyCreateConnectedPasspointWifiEntry(@NonNull WifiInfo wifiInfo) {
         if (wifiInfo == null || !wifiInfo.isPasspointAp()) {
             return;
         }
@@ -1280,7 +1344,7 @@
                 uniqueIdToPasspointWifiEntryKey(cachedWifiConfig.getKey()));
         PasspointWifiEntry connectedEntry;
         if (passpointConfig != null) {
-            connectedEntry = new PasspointWifiEntry(mInjector, mContext, mMainHandler,
+            connectedEntry = new PasspointWifiEntry(mInjector, mMainHandler,
                     passpointConfig, mWifiManager,
                     false /* forSavedNetworksPage */);
         } else {
@@ -1289,7 +1353,6 @@
                     cachedWifiConfig, mWifiManager,
                     false /* forSavedNetworksPage */);
         }
-        connectedEntry.onNetworkCapabilitiesChanged(network, capabilities);
         mPasspointWifiEntryCache.put(connectedEntry.getKey(), connectedEntry);
     }
 
@@ -1297,9 +1360,9 @@
      * Posts onWifiEntryChanged callback on the main thread.
      */
     @WorkerThread
-    private void notifyOnWifiEntriesChanged() {
+    private void notifyOnWifiEntriesChanged(@WifiEntriesChangedReason int reason) {
         if (mListener != null) {
-            mMainHandler.post(mListener::onWifiEntriesChanged);
+            mMainHandler.post(() -> mListener.onWifiEntriesChanged(reason));
         }
     }
 
@@ -1323,6 +1386,17 @@
         }
     }
 
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(value = {
+            WIFI_ENTRIES_CHANGED_REASON_GENERAL,
+            WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS,
+    })
+
+    public @interface WifiEntriesChangedReason {}
+
+    public static final int WIFI_ENTRIES_CHANGED_REASON_GENERAL = 0;
+    public static final int WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS = 1;
+
     /**
      * Listener for changes to the list of visible WifiEntries as well as the number of saved
      * networks and subscriptions.
@@ -1337,7 +1411,20 @@
          *      {@link #getMergedCarrierEntry()}
          */
         @MainThread
-        void onWifiEntriesChanged();
+        default void onWifiEntriesChanged() {
+            // Do nothing
+        }
+
+        /**
+         * Called when there are changes to
+         *      {@link #getConnectedWifiEntry()}
+         *      {@link #getWifiEntries()}
+         *      {@link #getMergedCarrierEntry()}
+         */
+        @MainThread
+        default void onWifiEntriesChanged(@WifiEntriesChangedReason int reason) {
+            onWifiEntriesChanged();
+        }
 
         /**
          * Called when there are changes to
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java
index c61f131..c70a88a 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java
@@ -18,7 +18,10 @@
 
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.net.wifi.WifiManager;
+import android.os.Build;
 import android.os.UserManager;
+import android.provider.DeviceConfig;
 import android.util.ArraySet;
 
 import androidx.annotation.NonNull;
@@ -28,14 +31,22 @@
 /**
  * Wrapper class for commonly referenced objects and static data.
  */
-class WifiTrackerInjector {
+public class WifiTrackerInjector {
+    private static final String DEVICE_CONFIG_NAMESPACE = "wifi";
+
+    @NonNull private final Context mContext;
     private final boolean mIsDemoMode;
+    private final WifiManager mWifiManager;
     private final UserManager mUserManager;
     private final DevicePolicyManager mDevicePolicyManager;
     @NonNull private final Set<String> mNoAttributionAnnotationPackages;
+    private boolean mIsUserDebugVerboseLoggingEnabled;
+    private boolean mVerboseLoggingDisabledOverride = false;
 
     // TODO(b/201571677): Migrate the rest of the common objects to WifiTrackerInjector.
     WifiTrackerInjector(@NonNull Context context) {
+        mContext = context;
+        mWifiManager = context.getSystemService(WifiManager.class);
         mIsDemoMode = NonSdkApiWrapper.isDemoMode(context);
         mUserManager = context.getSystemService(UserManager.class);
         mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
@@ -45,6 +56,13 @@
         for (int i = 0; i < noAttributionAnnotationPackages.length; i++) {
             mNoAttributionAnnotationPackages.add(noAttributionAnnotationPackages[i]);
         }
+        mIsUserDebugVerboseLoggingEnabled = context.getResources().getBoolean(
+                R.bool.wifitrackerlib_enable_verbose_logging_for_userdebug)
+                && Build.TYPE.equals("userdebug");
+    }
+
+    @NonNull Context getContext() {
+        return mContext;
     }
 
     boolean isDemoMode() {
@@ -65,4 +83,31 @@
     @NonNull Set<String> getNoAttributionAnnotationPackages() {
         return mNoAttributionAnnotationPackages;
     }
+
+    public boolean isSharedConnectivityFeatureEnabled() {
+        return DeviceConfig.getBoolean(DEVICE_CONFIG_NAMESPACE,
+                "shared_connectivity_enabled", false);
+    }
+
+    /**
+     * Whether verbose logging is enabled.
+     */
+    public boolean isVerboseLoggingEnabled() {
+        return !mVerboseLoggingDisabledOverride
+                && (mWifiManager.isVerboseLoggingEnabled() || mIsUserDebugVerboseLoggingEnabled);
+    }
+
+    /**
+     * Whether verbose summaries should be shown in WifiEntry.
+     */
+    public boolean isVerboseSummaryEnabled() {
+        return !mVerboseLoggingDisabledOverride && mWifiManager.isVerboseLoggingEnabled();
+    }
+
+    /**
+     * Permanently disables verbose logging.
+     */
+    public void disableVerboseLogging() {
+        mVerboseLoggingDisabledOverride = true;
+    }
 }
diff --git a/libs/WifiTrackerLib/tests/Android.bp b/libs/WifiTrackerLib/tests/Android.bp
index 1a6b57a..310ff0c 100644
--- a/libs/WifiTrackerLib/tests/Android.bp
+++ b/libs/WifiTrackerLib/tests/Android.bp
@@ -23,8 +23,9 @@
     static_libs: [
         "androidx.test.rules",
         "frameworks-base-testutils",
+        "flag-junit",
         "mockito-target-extended-minus-junit4",
-        "truth-prebuilt",
+        "truth",
         "Robolectric_all-target",
     ],
 
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java
index 9bbbd4c..dedf4af 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java
@@ -16,10 +16,16 @@
 
 package com.android.wifitrackerlib;
 
+import static android.net.wifi.ScanResult.WIFI_STANDARD_11N;
 import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_SAE;
 
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
 import static com.android.wifitrackerlib.WifiEntry.CONNECTED_STATE_CONNECTED;
 import static com.android.wifitrackerlib.WifiEntry.CONNECTED_STATE_DISCONNECTED;
+import static com.android.wifitrackerlib.WifiEntry.MIN_FREQ_24GHZ;
+import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MAX;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -33,6 +39,7 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.wifi.WifiInfo;
@@ -41,20 +48,30 @@
 import android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus;
 import android.net.wifi.sharedconnectivity.app.NetworkProviderInfo;
 import android.net.wifi.sharedconnectivity.app.SharedConnectivityManager;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.test.TestLooper;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
 
 public class HotspotNetworkEntryTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule =
+            DeviceFlagsValueProvider.createCheckFlagsRule();
+
     @Mock private WifiEntry.WifiEntryCallback mMockListener;
     @Mock private WifiEntry.ConnectCallback mMockConnectCallback;
     @Mock private WifiEntry.DisconnectCallback mMockDisconnectCallback;
     @Mock private WifiTrackerInjector mMockInjector;
     @Mock private Context mMockContext;
+    @Mock private Resources mMockResources;
     @Mock private WifiManager mMockWifiManager;
     @Mock private SharedConnectivityManager mMockSharedConnectivityManager;
     @Mock private WifiInfo mMockWifiInfo;
@@ -67,7 +84,7 @@
     private static final HotspotNetwork TEST_HOTSPOT_NETWORK_DATA = new HotspotNetwork.Builder()
             .setDeviceId(1)
             .setNetworkProviderInfo(new NetworkProviderInfo
-                    .Builder("My Phone", "Pixel 7")
+                    .Builder("My Pixel", "Pixel 7")
                     .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
                     .setBatteryPercentage(100)
                     .setConnectionStrength(3)
@@ -75,7 +92,6 @@
             .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
             .setNetworkName("Google Fi")
             .setHotspotSsid("Instant Hotspot abcde")
-            .setHotspotBssid("0a:0b:0c:0d:0e:0f")
             .addHotspotSecurityType(SECURITY_TYPE_PSK)
             .build();
 
@@ -88,7 +104,12 @@
 
         when(mMockNetworkCapabilities.getTransportInfo()).thenReturn(mMockWifiInfo);
         when(mMockWifiInfo.isPrimary()).thenReturn(true);
-        when(mMockWifiInfo.getRssi()).thenReturn(WifiInfo.INVALID_RSSI);
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot abcde");
+        when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_PSK);
+        when(mMockWifiInfo.getRssi()).thenReturn(TestUtils.GOOD_RSSI);
+        when(mMockWifiInfo.getMacAddress()).thenReturn("01:02:03:04:05:06");
+        when(mMockWifiInfo.getWifiStandard()).thenReturn(WIFI_STANDARD_11N);
+        when(mMockWifiInfo.getFrequency()).thenReturn(MIN_FREQ_24GHZ);
 
         when(mMockContext.getString(R.string.wifitrackerlib_hotspot_network_connecting))
                 .thenReturn("Connecting…");
@@ -98,44 +119,85 @@
                     Object[] args = invocation.getArguments();
                     return args[1] + " from " + args[2];
                 });
+        when(mMockContext.getString(R.string.wifitrackerlib_hotspot_network_summary_new))
+                .thenReturn(
+                        "{DEVICE_TYPE, select, PHONE {{NETWORK_NAME} from your phone} TABLET "
+                                + "{{NETWORK_NAME} from your tablet} COMPUTER {{NETWORK_NAME} "
+                                + "from your computer} WATCH {{NETWORK_NAME} from your watch} "
+                                + "VEHICLE {{NETWORK_NAME} from your vehicle} other "
+                                + "{{NETWORK_NAME} from your device}}");
+        when(mMockContext.getString(R.string.wifitrackerlib_hotspot_network_summary_error_generic))
+                .thenReturn("Can't connect. Try connecting again.");
+        when(mMockContext.getString(R.string.wifitrackerlib_hotspot_network_summary_error_settings))
+                .thenReturn(
+                        "{DEVICE_TYPE, select, PHONE {Can't connect. Check phone settings and try"
+                                + " again.} TABLET {Can't connect. Check tablet settings and try "
+                                + "again.} COMPUTER {Can't connect. Check computer settings and "
+                                + "try again.} WATCH {Can't connect. Check watch settings and try"
+                                + " again.} VEHICLE {Can't connect. Check vehicle settings and "
+                                + "try again.} other {Can't connect. Check device settings and "
+                                + "try again.}}");
+        when(mMockContext.getString(
+                eq(R.string.wifitrackerlib_hotspot_network_summary_error_carrier_block),
+                anyString())).thenAnswer(invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return args[1] + " doesn't allow this connection";
+                });
+        when(mMockContext.getString(
+                eq(R.string.wifitrackerlib_hotspot_network_summary_error_carrier_incomplete),
+                anyString())).thenAnswer(invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return "Can't connect. Contact " + args[1] + " for help.";
+                });
         when(mMockContext.getString(eq(R.string.wifitrackerlib_hotspot_network_alternate),
-                anyString(), anyString()))
-                .thenAnswer(invocation -> {
+                anyString(), anyString())).thenAnswer(invocation -> {
                     Object[] args = invocation.getArguments();
                     return args[1] + " from " + args[2];
                 });
+        when(mMockContext.getString(R.string.wifitrackerlib_wifi_security_wpa_wpa2))
+                .thenReturn("WPA/WPA2-Personal");
+        when(mMockContext.getString(R.string.wifitrackerlib_wifi_standard_11n))
+                .thenReturn("Wi‑Fi 4");
+        when(mMockContext.getResources()).thenReturn(mMockResources);
+        when(mMockResources.getString(R.string.wifitrackerlib_wifi_band_24_ghz)).thenReturn(
+                "2.4 GHz");
+        when(mMockResources.getString(R.string.wifitrackerlib_multiband_separator)).thenReturn(
+                ", ");
     }
 
     @Test
-    public void testConnectionInfoMatches_matchesBssid() {
+    public void testConnectionInfoMatches_matchesSsidAndSecurity() {
         final HotspotNetworkEntry entry = new HotspotNetworkEntry(
                 mMockInjector, mMockContext, mTestHandler,
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
-        when(mMockWifiInfo.getBSSID()).thenReturn("00:00:00:00:00:00");
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot fghij");
+        when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_SAE);
 
         assertThat(entry.connectionInfoMatches(mMockWifiInfo)).isFalse();
 
-        when(mMockWifiInfo.getBSSID()).thenReturn("0a:0b:0c:0d:0e:0f");
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot abcde");
+        when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_PSK);
 
         assertThat(entry.connectionInfoMatches(mMockWifiInfo)).isTrue();
     }
 
     @Test
-    public void testOnNetworkCapabilitiesChanged_matchingBSSID_becomesConnected() {
+    public void testOnNetworkCapabilitiesChanged_matchingSsidAndSecurity_becomesConnected() {
         final HotspotNetworkEntry entry = new HotspotNetworkEntry(
                 mMockInjector, mMockContext, mTestHandler,
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
-        when(mMockWifiInfo.getRssi()).thenReturn(TestUtils.GOOD_RSSI);
 
-        // Ignore non-matching BSSID
-        when(mMockWifiInfo.getBSSID()).thenReturn("00:00:00:00:00:00");
+        // Ignore non-matching SSID and security type
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot fghij");
+        when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_SAE);
         entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
         assertThat(entry.getConnectedState()).isEqualTo(CONNECTED_STATE_DISCONNECTED);
         assertThat(entry.canConnect()).isTrue();
         assertThat(entry.canDisconnect()).isFalse();
 
-        // Matching BSSID should result in connected
-        when(mMockWifiInfo.getBSSID()).thenReturn("0a:0b:0c:0d:0e:0f");
+        // Matching SSID and security type should result in connected
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot abcde");
+        when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_PSK);
         entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
         assertThat(entry.getConnectedState()).isEqualTo(CONNECTED_STATE_CONNECTED);
         assertThat(entry.canConnect()).isFalse();
@@ -147,8 +209,6 @@
         final HotspotNetworkEntry entry = new HotspotNetworkEntry(
                 mMockInjector, mMockContext, mTestHandler,
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
-        when(mMockWifiInfo.getBSSID()).thenReturn("0a:0b:0c:0d:0e:0f");
-        when(mMockWifiInfo.getRssi()).thenReturn(TestUtils.GOOD_RSSI);
         entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
 
         // Non-matching network loss should be ignored
@@ -170,16 +230,126 @@
                 mMockInjector, mMockContext, mTestHandler,
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
 
-        assertThat(entry.getTitle()).isEqualTo("My Phone");
+        assertThat(entry.getTitle()).isEqualTo("My Pixel");
     }
 
     @Test
-    public void testGetSummary_usesHotspotNetworkData() {
+    public void testGetSummary_phone_usesHotspotNetworkData() {
         final HotspotNetworkEntry entry = new HotspotNetworkEntry(
                 mMockInjector, mMockContext, mTestHandler,
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
 
-        assertThat(entry.getSummary()).isEqualTo("Google Fi from Pixel 7");
+        assertThat(entry.getSummary()).isEqualTo("Google Fi from your phone");
+    }
+
+    @Test
+    public void testGetSummary_tablet_usesHotspotNetworkData() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_TABLET)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler, mMockWifiManager,
+                mMockSharedConnectivityManager, testNetwork);
+
+        assertThat(entry.getSummary()).isEqualTo("Google Fi from your tablet");
+    }
+
+    @Test
+    public void testGetSummary_computer_usesHotspotNetworkData() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_LAPTOP)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler, mMockWifiManager,
+                mMockSharedConnectivityManager, testNetwork);
+
+        assertThat(entry.getSummary()).isEqualTo("Google Fi from your computer");
+    }
+
+    @Test
+    public void testGetSummary_watch_usesHotspotNetworkData() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_WATCH)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler, mMockWifiManager,
+                mMockSharedConnectivityManager, testNetwork);
+
+        assertThat(entry.getSummary()).isEqualTo("Google Fi from your watch");
+    }
+
+    @Test
+    public void testGetSummary_vehicle_usesHotspotNetworkData() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_AUTO)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler, mMockWifiManager,
+                mMockSharedConnectivityManager, testNetwork);
+
+        assertThat(entry.getSummary()).isEqualTo("Google Fi from your vehicle");
+    }
+
+    @Test
+    public void testGetSummary_unknown_usesHotspotNetworkData() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_UNKNOWN)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler, mMockWifiManager,
+                mMockSharedConnectivityManager, testNetwork);
+
+        assertThat(entry.getSummary()).isEqualTo("Google Fi from your device");
     }
 
     @Test
@@ -188,7 +358,7 @@
                 mMockInjector, mMockContext, mTestHandler,
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
 
-        assertThat(entry.getAlternateSummary()).isEqualTo("Google Fi from My Phone");
+        assertThat(entry.getAlternateSummary()).isEqualTo("Google Fi from My Pixel");
     }
 
     @Test
@@ -228,6 +398,80 @@
     }
 
     @Test
+    public void testGetSummary_connectionSuccess_resetsConnectingString() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+        entry.connect(mMockConnectCallback);
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT);
+        mTestLooper.dispatchAll();
+
+        entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
+        entry.onNetworkLost(mMockNetwork);
+
+        assertThat(entry.getSummary()).isNotEqualTo("Connecting…");
+    }
+
+    @Test
+    public void testGetSsid_usesHotspotNetworkData() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+
+        assertThat(entry.getSsid()).isEqualTo("Instant Hotspot abcde");
+    }
+
+    @Test
+    public void testGetMacAddress_usesWifiInfo() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
+
+        assertThat(entry.getMacAddress()).isEqualTo("01:02:03:04:05:06");
+    }
+
+    @Test
+    public void testGetPrivacy_returnsRandomized() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+
+        assertThat(entry.getPrivacy()).isEqualTo(HotspotNetworkEntry.PRIVACY_RANDOMIZED_MAC);
+    }
+
+    @Test
+    public void testGetSecurityString_usesHotspotNetworkData() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+
+        assertThat(entry.getSecurityString(false)).isEqualTo("WPA/WPA2-Personal");
+    }
+
+    @Test
+    public void testGetStandardString_usesWifiInfo() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
+
+        assertThat(entry.getStandardString()).isEqualTo("Wi‑Fi 4");
+    }
+
+    @Test
+    public void testGetBandString_usesWifiInfo() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
+
+        assertThat(entry.getBandString()).isEqualTo("2.4 GHz");
+    }
+
+    @Test
     public void testGetUpstreamConnectionStrength_usesHotspotNetworkData() {
         final HotspotNetworkEntry entry = new HotspotNetworkEntry(
                 mMockInjector, mMockContext, mTestHandler,
@@ -264,6 +508,205 @@
     }
 
     @Test
+    public void testIsBatteryCharging_apiFlagOn_usesHotspotNetworkDataApi() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager,
+                new HotspotNetwork.Builder()
+                        .setDeviceId(1)
+                        .setNetworkProviderInfo(new NetworkProviderInfo
+                                .Builder("My Phone", "Pixel 7")
+                                .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                                .setBatteryPercentage(100)
+                                .setConnectionStrength(3)
+                                .setBatteryCharging(true)
+                                .build())
+                        .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                        .setNetworkName("Google Fi")
+                        .setHotspotSsid("Instant Hotspot abcde")
+                        .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                        .build());
+
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            doReturn(true).when(() ->
+                    NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled());
+            assertThat(entry.isBatteryCharging()).isTrue();
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    @Test
+    public void testIsBatteryCharging_apiFlagOn_usesHotspotNetworkDataExtras() {
+        final Bundle extras = new Bundle();
+        extras.putBoolean(HotspotNetworkEntry.EXTRA_KEY_IS_BATTERY_CHARGING, true);
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager,
+                new HotspotNetwork.Builder()
+                        .setDeviceId(1)
+                        .setNetworkProviderInfo(new NetworkProviderInfo
+                                .Builder("My Phone", "Pixel 7")
+                                .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                                .setBatteryPercentage(100)
+                                .setConnectionStrength(3)
+                                .setBatteryCharging(false)
+                                .setExtras(extras)
+                                .build())
+                        .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                        .setNetworkName("Google Fi")
+                        .setHotspotSsid("Instant Hotspot abcde")
+                        .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                        .build());
+
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            doReturn(true).when(() ->
+                    NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled());
+            assertThat(entry.isBatteryCharging()).isTrue();
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    @Test
+    public void testIsBatteryCharging_apiFlagOff_usesHotspotNetworkDataExtras() {
+        final Bundle extras = new Bundle();
+        extras.putBoolean(HotspotNetworkEntry.EXTRA_KEY_IS_BATTERY_CHARGING, true);
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager,
+                new HotspotNetwork.Builder()
+                        .setDeviceId(1)
+                        .setNetworkProviderInfo(new NetworkProviderInfo
+                                .Builder("My Phone", "Pixel 7")
+                                .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                                .setBatteryPercentage(100)
+                                .setConnectionStrength(3)
+                                .setExtras(extras)
+                                .build())
+                        .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                        .setNetworkName("Google Fi")
+                        .setHotspotSsid("Instant Hotspot abcde")
+                        .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                        .build());
+
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            doReturn(false).when(() ->
+                    NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled());
+            assertThat(entry.isBatteryCharging()).isTrue();
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    @Test
+    public void testIsBatteryCharging_apiFlagOn_extraFalse() {
+        final Bundle extras = new Bundle();
+        extras.putBoolean(HotspotNetworkEntry.EXTRA_KEY_IS_BATTERY_CHARGING, false);
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager,
+                new HotspotNetwork.Builder()
+                        .setDeviceId(1)
+                        .setNetworkProviderInfo(new NetworkProviderInfo
+                                .Builder("My Phone", "Pixel 7")
+                                .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                                .setBatteryPercentage(100)
+                                .setConnectionStrength(3)
+                                .setExtras(extras)
+                                .build())
+                        .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                        .setNetworkName("Google Fi")
+                        .setHotspotSsid("Instant Hotspot abcde")
+                        .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                        .build());
+
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            doReturn(true).when(() ->
+                    NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled());
+            assertThat(entry.isBatteryCharging()).isFalse();
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    @Test
+    public void testIsBatteryCharging_apiFlagOn_apiFalse() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager,
+                new HotspotNetwork.Builder()
+                        .setDeviceId(1)
+                        .setNetworkProviderInfo(new NetworkProviderInfo
+                                .Builder("My Phone", "Pixel 7")
+                                .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                                .setBatteryPercentage(100)
+                                .setConnectionStrength(3)
+                                .setBatteryCharging(false)
+                                .build())
+                        .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                        .setNetworkName("Google Fi")
+                        .setHotspotSsid("Instant Hotspot abcde")
+                        .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                        .build());
+
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            doReturn(true).when(() ->
+                    NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled());
+            assertThat(entry.isBatteryCharging()).isFalse();
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    @Test
+    public void testIsBatteryCharging_apiFlagOn_noneSet() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager,
+                new HotspotNetwork.Builder()
+                        .setDeviceId(1)
+                        .setNetworkProviderInfo(new NetworkProviderInfo
+                                .Builder("My Phone", "Pixel 7")
+                                .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                                .setBatteryPercentage(100)
+                                .setConnectionStrength(3)
+                                .build())
+                        .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                        .setNetworkName("Google Fi")
+                        .setHotspotSsid("Instant Hotspot abcde")
+                        .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                        .build());
+
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            doReturn(true).when(() ->
+                    NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled());
+            assertThat(entry.isBatteryCharging()).isFalse();
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    @Test
+    public void testGetLevel_statusNotConnected_returnsMaxValue() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot fghij");
+        when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_SAE);
+        entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
+
+        assertThat(entry.getLevel()).isEqualTo(WIFI_LEVEL_MAX);
+    }
+
+    @Test
     public void testConnect_serviceCalled() {
         final HotspotNetworkEntry entry = new HotspotNetworkEntry(
                 mMockInjector, mMockContext, mTestHandler,
@@ -368,4 +811,294 @@
         verify(mMockDisconnectCallback)
                 .onDisconnectResult(WifiEntry.DisconnectCallback.DISCONNECT_STATUS_FAILURE_UNKNOWN);
     }
+
+    @Test
+    public void testOnConnectionStatusChanged_withoutConnect_updatesString() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+
+        entry.setListener(mMockListener);
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo("Connecting…");
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isNotEqualTo("Connecting…");
+    }
+
+    @Test
+    public void testOnConnectionStatusChanged_connectedStatus_updatesString() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT);
+        mTestLooper.dispatchAll();
+        assertThat(entry.getSummary()).isEqualTo("Connecting…");
+
+        entry.onConnectionStatusChanged(HotspotNetworkEntry.CONNECTION_STATUS_CONNECTED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isNotEqualTo("Connecting…");
+    }
+
+    @Test
+    public void testOnConnectionStatusChanged_connectedStatus_callsCallback() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+        entry.connect(mMockConnectCallback);
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT);
+        mTestLooper.dispatchAll();
+        verify(mMockConnectCallback, never()).onConnectResult(anyInt());
+
+        entry.onConnectionStatusChanged(HotspotNetworkEntry.CONNECTION_STATUS_CONNECTED);
+        mTestLooper.dispatchAll();
+
+        verify(mMockConnectCallback)
+                .onConnectResult(WifiEntry.ConnectCallback.CONNECT_STATUS_SUCCESS);
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureGeneric_displaysErrorInSummary() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo("Can't connect. Try connecting again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureSettings_phone_displaysErrorInSummary() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo(
+                "Can't connect. Check phone settings and try again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureSettings_tablet_displaysErrorInSummary() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_TABLET)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, testNetwork);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo(
+                "Can't connect. Check tablet settings and try again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureSettings_computer_displaysErrorInSummary() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_LAPTOP)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, testNetwork);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo(
+                "Can't connect. Check computer settings and try again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureSettings_watch_displaysErrorInSummary() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_WATCH)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, testNetwork);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo(
+                "Can't connect. Check watch settings and try again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureSettings_vehicle_displaysErrorInSummary() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_AUTO)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, testNetwork);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo(
+                "Can't connect. Check vehicle settings and try again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureSettings_unknown_displaysErrorInSummary() {
+        HotspotNetwork testNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Pixel", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_UNKNOWN)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .setHotspotSsid("Instant Hotspot abcde")
+                .addHotspotSecurityType(SECURITY_TYPE_PSK)
+                .build();
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, testNetwork);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo(
+                "Can't connect. Check device settings and try again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureCarrierBlock_displaysErrorInSummary() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_UNSUPPORTED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo("Google Fi doesn't allow this connection");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusFailureCarrierIncomplete_displaysErrorInSummary() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isEqualTo("Can't connect. Contact Google Fi for help.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusConnecting_resetsErrorString() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+        entry.connect(mMockConnectCallback);
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR);
+        mTestLooper.dispatchAll();
+        assertThat(entry.getSummary()).isEqualTo("Can't connect. Try connecting again.");
+
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isNotEqualTo("Can't connect. Try connecting again.");
+    }
+
+    @Test
+    public void testGetSummary_connectionStatusConnected_resetsErrorString() {
+        final HotspotNetworkEntry entry = new HotspotNetworkEntry(
+                mMockInjector, mMockContext, mTestHandler,
+                mMockWifiManager, mMockSharedConnectivityManager, TEST_HOTSPOT_NETWORK_DATA);
+        entry.setListener(mMockListener);
+        entry.connect(mMockConnectCallback);
+        entry.onConnectionStatusChanged(
+                HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR);
+        mTestLooper.dispatchAll();
+        assertThat(entry.getSummary()).isEqualTo("Can't connect. Try connecting again.");
+
+        entry.onConnectionStatusChanged(HotspotNetworkEntry.CONNECTION_STATUS_CONNECTED);
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getSummary()).isNotEqualTo("Can't connect. Try connecting again.");
+    }
 }
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/KnownNetworkEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/KnownNetworkEntryTest.java
index 8e33fb8..0ac498b 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/KnownNetworkEntryTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/KnownNetworkEntryTest.java
@@ -73,6 +73,7 @@
         mTestLooper = new TestLooper();
         mTestHandler = new Handler(mTestLooper.getLooper());
 
+        when(mMockInjector.getContext()).thenReturn(mMockContext);
         when(mMockContext.getString(eq(R.string.wifitrackerlib_known_network_summary), anyString()))
                 .thenAnswer(invocation -> {
                     Object[] args = invocation.getArguments();
@@ -83,7 +84,7 @@
     @Test
     public void testGetSummary_usesKnownNetworkData() {
         final KnownNetworkEntry entry = new KnownNetworkEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_KNOWN_NETWORK_DATA);
 
@@ -93,7 +94,7 @@
     @Test
     public void testConnect_serviceCalled() {
         final KnownNetworkEntry entry = new KnownNetworkEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_KNOWN_NETWORK_DATA);
 
@@ -104,7 +105,7 @@
     @Test
     public void testConnect_nullManager_failureCallback() {
         final KnownNetworkEntry entry = new KnownNetworkEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 mMockWifiManager, /* sharedConnectivityManager= */ null, TEST_KNOWN_NETWORK_DATA);
 
@@ -118,7 +119,7 @@
     @Test
     public void testConnect_onConnectionStatusChanged_failureCallback() {
         final KnownNetworkEntry entry = new KnownNetworkEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 mMockWifiManager, mMockSharedConnectivityManager, TEST_KNOWN_NETWORK_DATA);
 
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/MergedCarrierEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/MergedCarrierEntryTest.java
index d8c2578..7bf21d5 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/MergedCarrierEntryTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/MergedCarrierEntryTest.java
@@ -38,6 +38,7 @@
 import org.mockito.MockitoAnnotations;
 
 public class MergedCarrierEntryTest {
+    @Mock private WifiTrackerInjector mMockInjector;
     @Mock private WifiEntry.ConnectCallback mMockConnectCallback;
     @Mock private WifiManager mMockWifiManager;
     @Mock private WifiInfo mMockWifiInfo;
@@ -58,6 +59,7 @@
         when(mMockNetworkCapabilities.getTransportInfo()).thenReturn(mMockWifiInfo);
         mTestLooper = new TestLooper();
         mTestHandler = new Handler(mTestLooper.getLooper());
+        when(mMockInjector.getContext()).thenReturn(mMockContext);
         when(mMockContext.getMainLooper()).thenReturn(Looper.getMainLooper());
         when(mMockContext.getResources()).thenReturn(mMockResources);
         when(mMockContext.getString(R.string.wifitrackerlib_summary_separator)).thenReturn("/");
@@ -68,8 +70,8 @@
     @Test
     public void testGetConnectedState_wifiInfoMatches_returnsConnected() {
         final int subId = 1;
-        final MergedCarrierEntry entry = new MergedCarrierEntry(mTestHandler, mMockWifiManager,
-                false, mMockContext, subId);
+        final MergedCarrierEntry entry = new MergedCarrierEntry(mMockInjector, mTestHandler,
+                mMockWifiManager, false, subId);
         when(mMockWifiInfo.isCarrierMerged()).thenReturn(true);
         when(mMockWifiInfo.getSubscriptionId()).thenReturn(subId);
 
@@ -82,8 +84,8 @@
     public void testConnect_disablesNonCarrierMergedWifi() {
         Looper.prepare();
         final int subId = 1;
-        final MergedCarrierEntry entry = new MergedCarrierEntry(mTestHandler, mMockWifiManager,
-                false, mMockContext, subId);
+        final MergedCarrierEntry entry = new MergedCarrierEntry(mMockInjector, mTestHandler,
+                mMockWifiManager, false, subId);
 
         entry.connect(mMockConnectCallback);
         mTestLooper.dispatchAll();
@@ -96,8 +98,8 @@
     @Test
     public void testDisconnect_enablesNonCarrierMergedWifiAndTriggersScan() {
         final int subId = 1;
-        final MergedCarrierEntry entry = new MergedCarrierEntry(mTestHandler, mMockWifiManager,
-                false, mMockContext, subId);
+        final MergedCarrierEntry entry = new MergedCarrierEntry(mMockInjector, mTestHandler,
+                mMockWifiManager, false, subId);
 
         entry.disconnect(null);
         mTestLooper.dispatchAll();
@@ -108,8 +110,8 @@
     @Test
     public void testCanConnect_cellIsDefaultRoute_returnsFalse() {
         final int subId = 1;
-        final MergedCarrierEntry entry = new MergedCarrierEntry(mTestHandler, mMockWifiManager,
-                false, mMockContext, subId);
+        final MergedCarrierEntry entry = new MergedCarrierEntry(mMockInjector, mTestHandler,
+                mMockWifiManager, false, subId);
         entry.updateIsCellDefaultRoute(false);
 
         assertThat(entry.canConnect()).isTrue();
@@ -122,8 +124,8 @@
     @Test
     public void testGetSsid_connected_returnsSanitizedWifiInfoSsid() {
         final int subId = 1;
-        final MergedCarrierEntry entry = new MergedCarrierEntry(mTestHandler, mMockWifiManager,
-                false, mMockContext, subId);
+        final MergedCarrierEntry entry = new MergedCarrierEntry(mMockInjector, mTestHandler,
+                mMockWifiManager, false, subId);
         when(mMockWifiInfo.isCarrierMerged()).thenReturn(true);
         when(mMockWifiInfo.getSubscriptionId()).thenReturn(subId);
         final String ssid = "ssid";
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/NetworkDetailsTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/NetworkDetailsTrackerTest.java
index ff4cec1..bc7667f 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/NetworkDetailsTrackerTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/NetworkDetailsTrackerTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
@@ -55,6 +56,7 @@
     @Mock private WifiTrackerInjector mInjector;
     @Mock private Lifecycle mMockLifecycle;
     @Mock private Context mMockContext;
+    @Mock private Resources mResources;
     @Mock private WifiManager mMockWifiManager;
     @Mock private ConnectivityManager mMockConnectivityManager;
     @Mock private Clock mMockClock;
@@ -87,6 +89,7 @@
         when(mMockWifiManager.getScanResults()).thenReturn(new ArrayList<>());
         when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED);
         when(mMockClock.millis()).thenReturn(START_MILLIS);
+        when(mMockContext.getResources()).thenReturn(mResources);
     }
 
     /**
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/PasspointWifiEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/PasspointWifiEntryTest.java
index ebd86cb..481e978 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/PasspointWifiEntryTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/PasspointWifiEntryTest.java
@@ -77,6 +77,7 @@
         when(mMockWifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
         when(mMockWifiInfo.getRssi()).thenReturn(WifiInfo.INVALID_RSSI);
         when(mMockNetworkCapabilities.getTransportInfo()).thenReturn(mMockWifiInfo);
+        when(mMockInjector.getContext()).thenReturn(mMockContext);
         when(mMockContext.getResources()).thenReturn(mMockResources);
         when(mMockContext.getString(R.string.wifitrackerlib_summary_separator)).thenReturn("/");
 
@@ -92,7 +93,7 @@
         when(mMockContext.getString(R.string.wifitrackerlib_wifi_passpoint_expired))
                 .thenReturn(expired);
 
-        PasspointWifiEntry passpointWifiEntry = new PasspointWifiEntry(mMockInjector, mMockContext,
+        PasspointWifiEntry passpointWifiEntry = new PasspointWifiEntry(mMockInjector,
                 mTestHandler, passpointConfiguration, mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -105,7 +106,7 @@
         String expired = "Expired";
         when(mMockContext.getString(R.string.wifitrackerlib_wifi_passpoint_expired))
                 .thenReturn(expired);
-        PasspointWifiEntry passpointWifiEntry = new PasspointWifiEntry(mMockInjector, mMockContext,
+        PasspointWifiEntry passpointWifiEntry = new PasspointWifiEntry(mMockInjector,
                 mTestHandler, passpointConfiguration, mMockWifiManager,
                 false /* forSavedNetworksPage */);
         PasspointWifiEntry spyEntry = spy(passpointWifiEntry);
@@ -125,7 +126,7 @@
 
     @Test
     public void testGetMeteredChoice_afterSetMeteredChoice_getCorrectValue() {
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -149,7 +150,7 @@
         when(mMockNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
                 .thenReturn(true);
 
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
         entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
@@ -173,7 +174,7 @@
         when(mMockNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
                 .thenReturn(true);
 
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
         entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
@@ -188,7 +189,7 @@
         when(mMockWifiInfo.getCurrentSecurityType())
                 .thenReturn(WifiInfo.SECURITY_TYPE_PASSPOINT_R1_R2);
 
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -215,7 +216,7 @@
         when(mMockContext.getString(R.string.wifitrackerlib_wifi_security_passpoint))
                 .thenReturn(passpointSecurity);
 
-        PasspointWifiEntry passpointWifiEntry = new PasspointWifiEntry(mMockInjector, mMockContext,
+        PasspointWifiEntry passpointWifiEntry = new PasspointWifiEntry(mMockInjector,
                 mTestHandler, passpointConfiguration, mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -227,7 +228,7 @@
         when(mMockWifiInfo.isPasspointAp()).thenReturn(true);
         when(mMockWifiInfo.getPasspointFqdn()).thenReturn(FQDN);
 
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -270,7 +271,7 @@
         when(mMockWifiInfo.isPasspointAp()).thenReturn(true);
         when(mMockWifiInfo.getPasspointFqdn()).thenReturn(FQDN);
         when(mMockWifiInfo.getMacAddress()).thenReturn(wifiInfoMac);
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -281,7 +282,7 @@
 
     @Test
     public void testIsAutoJoinEnabled_nullConfigs_returnsFalse() {
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -292,7 +293,7 @@
 
     @Test
     public void testCanSignIn_captivePortalCapability_returnsTrue() {
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -307,7 +308,7 @@
 
     @Test
     public void testUpdateNetworkCapabilities_userConnect_autoOpenCaptivePortalOnce() {
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
 
@@ -348,7 +349,7 @@
         when(mMockWifiInfo.getPasspointFqdn()).thenReturn(FQDN);
         when(mMockNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
                 .thenReturn(true);
-        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        PasspointWifiEntry entry = new PasspointWifiEntry(mMockInjector, mTestHandler,
                 getPasspointConfiguration(), mMockWifiManager,
                 false /* forSavedNetworksPage */);
         entry.onNetworkCapabilitiesChanged(mMockNetwork, mMockNetworkCapabilities);
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java
index c3880a4..d5a2976 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java
@@ -38,6 +38,7 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Resources;
 import android.net.ConnectivityDiagnosticsManager;
 import android.net.ConnectivityManager;
 import android.net.LinkProperties;
@@ -83,6 +84,7 @@
     @Mock private WifiTrackerInjector mInjector;
     @Mock private Lifecycle mMockLifecycle;
     @Mock private Context mMockContext;
+    @Mock private Resources mResources;
     @Mock private WifiManager mMockWifiManager;
     @Mock private ConnectivityManager mMockConnectivityManager;
     @Mock private ConnectivityDiagnosticsManager mMockConnectivityDiagnosticsManager;
@@ -148,6 +150,8 @@
                         .build());
         when(mMockConnectivityManager.getLinkProperties(mMockNetwork))
                 .thenReturn(mMockLinkProperties);
+        when(mInjector.getContext()).thenReturn(mMockContext);
+        when(mMockContext.getResources()).thenReturn(mResources);
         when(mMockContext.getSystemService(ConnectivityDiagnosticsManager.class))
                 .thenReturn(mMockConnectivityDiagnosticsManager);
         when(mMockClock.millis()).thenReturn(START_MILLIS);
@@ -544,6 +548,40 @@
     }
 
     /**
+     * Tests that disconnecting from a network during the stopped state will result in the network
+     * being disconnected once we've started again.
+     */
+    @Test
+    public void testGetConnectedEntry_disconnectFromNetworkWhileStopped_becomesDisconnected() {
+        final SavedNetworkTracker savedNetworkTracker = createTestSavedNetworkTracker();
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        when(mMockWifiManager.getConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        when(mMockWifiManager.getScanResults()).thenReturn(Arrays.asList(
+                buildScanResult("ssid", "bssid", START_MILLIS)));
+        when(mMockWifiInfo.getNetworkId()).thenReturn(1);
+        when(mMockWifiInfo.getRssi()).thenReturn(-50);
+        savedNetworkTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockConnectivityManager).registerNetworkCallback(
+                any(), mNetworkCallbackCaptor.capture(), any());
+
+        final WifiEntry entry = savedNetworkTracker.getSavedWifiEntries().get(0);
+        assertThat(entry.getConnectedState()).isEqualTo(CONNECTED_STATE_CONNECTED);
+
+        // Simulate network disconnecting while in stopped state
+        savedNetworkTracker.onStop();
+        mTestLooper.dispatchAll();
+        when(mMockWifiManager.getCurrentNetwork()).thenReturn(null);
+        savedNetworkTracker.onStart();
+        mTestLooper.dispatchAll();
+
+        assertThat(entry.getConnectedState()).isEqualTo(WifiEntry.CONNECTED_STATE_DISCONNECTED);
+    }
+
+    /**
      * Tests that getConnectedEntry() will return the correct primary network after an MBB sequence.
      */
     @Test
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardNetworkDetailsTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardNetworkDetailsTrackerTest.java
index 8bac4f8..e00688c 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardNetworkDetailsTrackerTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardNetworkDetailsTrackerTest.java
@@ -38,6 +38,7 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Resources;
 import android.net.ConnectivityDiagnosticsManager;
 import android.net.ConnectivityManager;
 import android.net.wifi.ScanResult;
@@ -70,6 +71,7 @@
     @Mock private WifiTrackerInjector mInjector;
     @Mock private Lifecycle mMockLifecycle;
     @Mock private Context mMockContext;
+    @Mock private Resources mResources;
     @Mock private WifiManager mMockWifiManager;
     @Mock private WifiScanner mWifiScanner;
     @Mock private ConnectivityManager mMockConnectivityManager;
@@ -116,6 +118,7 @@
                 .thenReturn(TestUtils.OKAY_LEVEL);
         when(mMockWifiManager.calculateSignalLevel(TestUtils.BAD_RSSI))
                 .thenReturn(TestUtils.BAD_LEVEL);
+        when(mMockContext.getResources()).thenReturn(mResources);
         when(mMockContext.getSystemService(ConnectivityDiagnosticsManager.class))
                 .thenReturn(mMockConnectivityDiagnosticsManager);
         when(mMockContext.getSystemService(WifiScanner.class)).thenReturn(mWifiScanner);
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java
index 609b00c..6cfde19 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java
@@ -133,6 +133,7 @@
                 .thenReturn(TestUtils.OKAY_LEVEL);
         when(mMockWifiManager.calculateSignalLevel(TestUtils.BAD_RSSI))
                 .thenReturn(TestUtils.BAD_LEVEL);
+        when(mMockInjector.getContext()).thenReturn(mMockContext);
         when(mMockContext.getResources()).thenReturn(mMockResources);
 
         when(mMockContext.getSystemService(ConnectivityManager.class))
@@ -152,7 +153,7 @@
     public void testConstructor_mismatchedSsids_throwsException() {
         try {
             new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                     ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                     null, Arrays.asList(
                             buildScanResult("ssid0", "bssid0", 0, TestUtils.GOOD_RSSI),
@@ -170,7 +171,7 @@
     @Test
     public void testConstructor_scanResults_setsBestLevel() {
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 null, Arrays.asList(
                         buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI),
@@ -192,13 +193,13 @@
         secureScan.capabilities = "EAP/SHA1";
 
         final StandardWifiEntry unsecureEntry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN,
                         true /* isTargetingNewNetworks */),
                 null, Arrays.asList(unsecureScan), mMockWifiManager,
                 false /* forSavedNetworksPage */);
         final StandardWifiEntry secureEntry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP,
                         true /* isTargetingNewNetworks */),
                 null, Arrays.asList(secureScan), mMockWifiManager,
@@ -214,7 +215,7 @@
     @Test
     public void testUpdateScanResultInfo_mismatchedSsids_throwsException() {
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid0", SECURITY_TYPE_EAP),
                 null, Arrays.asList(buildScanResult("ssid0", "bssid0", 0, TestUtils.GOOD_RSSI)),
                 mMockWifiManager, false /* forSavedNetworksPage */);
@@ -234,7 +235,7 @@
     @Test
     public void testUpdateScanResultInfo_notifiesListener() {
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 null, Arrays.asList(buildScanResult("ssid", "bssid", 0)),
                 mMockWifiManager, false /* forSavedNetworksPage */);
@@ -252,7 +253,7 @@
     @Test
     public void testUpdateScanResultInfo_updatesLevel() {
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 null, Arrays.asList(buildScanResult("ssid", "bssid", 0, TestUtils.BAD_RSSI)),
                 mMockWifiManager, false /* forSavedNetworksPage */);
@@ -271,7 +272,7 @@
         config.SSID = "\"ssid\"";
         config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -285,7 +286,7 @@
         config.SSID = "\"ssid\"";
         config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -299,7 +300,7 @@
         config.SSID = "\"ssid\"";
         config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -320,7 +321,7 @@
         config.SSID = "\"ssid\"";
         config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -340,11 +341,11 @@
         final ScanResult scan = buildScanResult("ssid", "bssid", 0, TestUtils.GOOD_RSSI);
         scan.capabilities = "EAP/SHA1";
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 null, Arrays.asList(scan), mMockWifiManager,
                 false /* forSavedNetworksPage */);
-
+        assertThat(entry.needsWifiConfiguration()).isTrue();
         assertThat(entry.isSaved()).isFalse();
 
         final WifiConfiguration config = new WifiConfiguration();
@@ -353,6 +354,7 @@
         config.networkId = 1;
         entry.updateConfig(Collections.singletonList(config));
 
+        assertThat(entry.needsWifiConfiguration()).isFalse();
         assertThat(entry.isSaved()).isTrue();
     }
 
@@ -363,15 +365,16 @@
         config.SSID = "\"ssid\"";
         config.networkId = 1;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
-
+        assertThat(entry.needsWifiConfiguration()).isFalse();
         assertThat(entry.isSaved()).isTrue();
 
         entry.updateConfig(null);
 
+        assertThat(entry.needsWifiConfiguration()).isTrue();
         assertThat(entry.isSaved()).isFalse();
     }
 
@@ -382,7 +385,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = 1;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -406,7 +409,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = 1;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -430,7 +433,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = 1;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -456,7 +459,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = 1;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -487,7 +490,7 @@
     public void testConnect_savedNetwork_usesSavedConfig() {
         final ScanResult scan = buildScanResult("ssid", "bssid", 0, TestUtils.GOOD_RSSI);
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 null, Arrays.asList(scan), mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -505,7 +508,7 @@
     public void testConnect_savedNetwork_usesSavedConfig_withOutSim() {
         final ScanResult scan = buildScanResult("ssid", "bssid", 0, TestUtils.GOOD_RSSI);
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 null, Arrays.asList(scan), mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -528,10 +531,12 @@
     @Test
     public void testConnect_openNetwork_callsConnect() {
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 null, Arrays.asList(buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI)),
                 mMockWifiManager, false /* forSavedNetworksPage */);
+        assertThat(entry.needsWifiConfiguration()).isFalse();
+        assertThat(entry.isSaved()).isFalse();
 
         entry.connect(null /* ConnectCallback */);
 
@@ -543,7 +548,7 @@
         final ScanResult secureScan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         secureScan.capabilities = "PSK";
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 null, Arrays.asList(secureScan), mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -569,7 +574,7 @@
                 .thenReturn(MacAddress.fromString(randomizedMac));
 
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(spyConfig), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -589,7 +594,7 @@
         config.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
         when(mMockWifiManager.getFactoryMacAddresses()).thenReturn(new String[]{factoryMac});
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -613,7 +618,7 @@
         config.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
         when(mMockWifiManager.getFactoryMacAddresses()).thenReturn(new String[]{factoryMac});
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -662,7 +667,7 @@
         pskScanResult.capabilities = "PSK";
 
         final StandardWifiEntry pskWifiEntry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey(pskScanResult.SSID, SECURITY_TYPE_PSK),
                 null, Arrays.asList(pskScanResult), mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -711,7 +716,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = 1;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -730,7 +735,7 @@
         config.SSID = "\"ssid\"";
         config.setSecurityParams(wifiConfigurationSecureType);
         return new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 new StandardWifiEntryKey(config), Collections.singletonList(config), null,
                 mMockWifiManager, false /* forSavedNetworksPage */);
     }
@@ -742,7 +747,7 @@
         config.creatorUid = MANAGED_PROFILE_UID;
         config.creatorName = TEST_PACKAGE_NAME;
         return new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 new StandardWifiEntryKey(config), Collections.singletonList(config), null,
                 mMockWifiManager, false /* forSavedNetworksPage */);
     }
@@ -765,7 +770,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = networkId;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -795,7 +800,7 @@
         config.SSID = "\"ssid\"";
         config.networkId = networkId;
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -819,7 +824,7 @@
         config.networkId = networkId;
 
         final StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(config), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -872,7 +877,7 @@
         saeScan.capabilities = "SAE";
 
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Arrays.asList(pskConfig, saeConfig), Arrays.asList(pskScan, saeScan),
                 mMockWifiManager, false /* forSavedNetworksPage */);
@@ -908,7 +913,7 @@
         when(mMockWifiInfo.getRssi()).thenReturn(TestUtils.GOOD_RSSI);
 
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Arrays.asList(pskConfig, saeConfig), Arrays.asList(pskScan, saeScan),
                 mMockWifiManager, false /* forSavedNetworksPage */);
@@ -947,7 +952,7 @@
         eapWpa3Scan.capabilities = "[RSN-EAP/SHA256][MFPR][MFPC]";
 
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Arrays.asList(eapConfig, eapWpa3Config), Arrays.asList(eapScan, eapWpa3Scan),
                 mMockWifiManager, false /* forSavedNetworksPage */);
@@ -1024,7 +1029,7 @@
         when(mMockNetworkCapabilities.hasCapability(
                 NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)).thenReturn(true);
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(wifiConfig), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -1044,7 +1049,7 @@
         when(mMockNetworkCapabilities.hasCapability(
                 NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)).thenReturn(true);
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(wifiConfig), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -1070,7 +1075,7 @@
     @Test
     public void testShouldEditBeforeConnect_nullWifiConfig_returnFalse() {
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 mMockWifiManager, false /* forSavedNetworksPage */);
 
@@ -1084,7 +1089,7 @@
         wifiConfig.SSID = "\"ssid\"";
         wifiConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 Collections.singletonList(wifiConfig), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -1094,7 +1099,7 @@
         // Test enhanced open networks.
         wifiConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
         entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OWE),
                 Collections.singletonList(wifiConfig), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -1108,7 +1113,7 @@
         wifiConfig.SSID = "\"ssid\"";
         wifiConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(wifiConfig), null, mMockWifiManager,
                 false /* forSavedNetworksPage */);
@@ -1180,7 +1185,7 @@
     public void testCanConnect_nonEapMethod_returnTrueIfReachable() {
         ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN),
                 null, Arrays.asList(buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI)),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1190,7 +1195,7 @@
 
         scan.capabilities = "OWE";
         spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OWE),
                 null, Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1200,7 +1205,7 @@
 
         scan.capabilities = "WEP";
         spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_WEP),
                 null, Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1210,7 +1215,7 @@
 
         scan.capabilities = "PSK";
         spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 null, Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1220,7 +1225,7 @@
 
         scan.capabilities = "SAE";
         spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_SAE),
                 null, Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1240,7 +1245,7 @@
         ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         scan.capabilities = "EAP/SHA1";
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1261,7 +1266,7 @@
         ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         scan.capabilities = "EAP/SHA1";
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1285,7 +1290,7 @@
         ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         scan.capabilities = "EAP/SHA1";
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1312,7 +1317,7 @@
         ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         scan.capabilities = "EAP/SHA1";
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1341,7 +1346,7 @@
         try {
             when(NonSdkApiWrapper.getWifiSsidPolicy(mDevicePolicyManager)).thenReturn(policy);
             StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                    mMockInjector, mMockContext, mTestHandler,
+                    mMockInjector, mTestHandler,
                     ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                     Collections.singletonList(config), Collections.singletonList(scan),
                     mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1368,7 +1373,7 @@
         try {
             when(NonSdkApiWrapper.getWifiSsidPolicy(mDevicePolicyManager)).thenReturn(policy);
             StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                    mMockInjector, mMockContext, mTestHandler,
+                    mMockInjector, mTestHandler,
                     ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                     Collections.singletonList(config), Collections.singletonList(scan),
                     mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1395,7 +1400,7 @@
         try {
             when(NonSdkApiWrapper.getWifiSsidPolicy(mDevicePolicyManager)).thenReturn(policy);
             StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                    mMockInjector, mMockContext, mTestHandler,
+                    mMockInjector, mTestHandler,
                     ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                     Collections.singletonList(config), Collections.singletonList(scan),
                     mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1422,7 +1427,7 @@
         try {
             when(NonSdkApiWrapper.getWifiSsidPolicy(mDevicePolicyManager)).thenReturn(policy);
             StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                    mMockInjector, mMockContext, mTestHandler,
+                    mMockInjector, mTestHandler,
                     ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                     Collections.singletonList(config), Collections.singletonList(scan),
                     mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1444,7 +1449,7 @@
         when(mUserManager.hasUserRestriction(
                 UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true);
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1465,7 +1470,7 @@
         when(mUserManager.hasUserRestriction(
                 UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true);
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1486,7 +1491,7 @@
         when(mUserManager.hasUserRestriction(
                 UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true);
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1508,7 +1513,7 @@
         when(mDevicePolicyManager.getMinimumRequiredWifiSecurityLevel()).thenReturn(
                 DevicePolicyManager.WIFI_SECURITY_PERSONAL);
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1528,7 +1533,7 @@
         when(mDevicePolicyManager.getMinimumRequiredWifiSecurityLevel()).thenReturn(
                 DevicePolicyManager.WIFI_SECURITY_ENTERPRISE_EAP);
         StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
                 Collections.singletonList(config), Collections.singletonList(scan),
                 mMockWifiManager, false /* forSavedNetworksPage */));
@@ -1573,7 +1578,7 @@
         ScanResult saeScan = buildScanResult("ssid", "bssid0", 0, TestUtils.BAD_RSSI);
         saeScan.capabilities = "SAE";
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK,
                         true /* isTargetingNewNetwork */),
                 Collections.singletonList(pskConfig), Arrays.asList(pskScan, saeScan),
@@ -1601,7 +1606,7 @@
         ScanResult openScan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
         openScan.capabilities = "";
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN,
                         true /* isTargetingNewNetworks */),
                 null, Collections.singletonList(openScan),
@@ -1621,7 +1626,7 @@
         ScanResult oweScan = buildScanResult("ssid", "bssid0", 0, TestUtils.BAD_RSSI);
         oweScan.capabilities = "OWE";
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OWE,
                         true /* isTargetingNewNetworks */),
                 null, Collections.singletonList(oweScan),
@@ -1641,7 +1646,7 @@
         ScanResult oweTransitionScan = buildScanResult("ssid", "bssid0", 0, TestUtils.BAD_RSSI);
         oweTransitionScan.capabilities = "OWE_TRANSITION";
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN,
                         true /* isTargetingNewNetworks */),
                 null, Collections.singletonList(oweTransitionScan),
@@ -1671,7 +1676,7 @@
         oweConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
 
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_OPEN,
                         true /* isTargetingNewNetwork */),
                 Arrays.asList(openConfig, oweConfig), null,
@@ -1691,7 +1696,7 @@
         saeConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
 
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK,
                         true /* isTargetingNewNetwork */),
                 Arrays.asList(pskConfig, saeConfig), null,
@@ -1711,7 +1716,7 @@
         eapWpa3Config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE);
 
         StandardWifiEntry entry = new StandardWifiEntry(
-                mMockInjector, mMockContext, mTestHandler,
+                mMockInjector, mTestHandler,
                 ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_EAP,
                         true /* isTargetingNewNetwork */),
                 Arrays.asList(eapConfig, eapWpa3Config), null,
@@ -1774,4 +1779,48 @@
 
         assertThat(pskWifiEntry.canEasyConnect()).isFalse();
     }
+
+    @Test
+    public void testHasAdminRestrictions_noUserRestrictionSet_returnsFalse() {
+        assumeTrue(BuildCompat.isAtLeastT());
+        WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
+        ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
+        scan.capabilities = "PSK";
+        when(mUserManager.hasUserRestriction(
+                UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(false);
+        StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
+                mMockInjector, mTestHandler,
+                ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
+                Collections.singletonList(config), Collections.singletonList(scan),
+                mMockWifiManager, false /* forSavedNetworksPage */));
+        when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED);
+        when(spyEntry.isSaved()).thenReturn(false);
+        when(spyEntry.isSuggestion()).thenReturn(false);
+
+        assertThat(spyEntry.hasAdminRestrictions()).isEqualTo(false);
+    }
+
+    @Test
+    public void testHasAdminRestrictions_userRestrictionSet_returnsTrue() {
+        assumeTrue(BuildCompat.isAtLeastT());
+        WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
+        ScanResult scan = buildScanResult("ssid", "bssid0", 0, TestUtils.GOOD_RSSI);
+        scan.capabilities = "PSK";
+        when(mUserManager.hasUserRestriction(
+                UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true);
+        StandardWifiEntry spyEntry = spy(new StandardWifiEntry(
+                mMockInjector, mTestHandler,
+                ssidAndSecurityTypeToStandardWifiEntryKey("ssid", SECURITY_TYPE_PSK),
+                Collections.singletonList(config), Collections.singletonList(scan),
+                mMockWifiManager, false /* forSavedNetworksPage */));
+        when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED);
+        when(spyEntry.isSaved()).thenReturn(false);
+        when(spyEntry.isSuggestion()).thenReturn(false);
+
+        assertThat(spyEntry.hasAdminRestrictions()).isEqualTo(true);
+    }
 }
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/UtilsTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/UtilsTest.java
index 91002dd..448bd2e 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/UtilsTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/UtilsTest.java
@@ -62,6 +62,7 @@
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiScanner;
+import android.os.Build;
 import android.os.Handler;
 import android.os.PersistableBundle;
 import android.os.test.TestLooper;
@@ -72,6 +73,7 @@
 import android.text.SpannableString;
 import android.text.style.ClickableSpan;
 
+import androidx.annotation.RequiresApi;
 import androidx.core.os.BuildCompat;
 
 import com.android.wifitrackerlib.shadow.ShadowSystem;
@@ -88,6 +90,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.StringJoiner;
 
 @Config(shadows = {ShadowSystem.class})
 public class UtilsTest {
@@ -130,6 +133,8 @@
     private static final String BAND_24_GHZ = "2.4 GHz";
     private static final String BAND_5_GHZ = "5 GHz";
     private static final String BAND_6_GHZ = "6 GHz";
+    private static final String STRING_LINK_SPEED_MBPS = " Mbps";
+    private static final String STRING_LINK_SPEED_ON_BAND = " on ";
 
     @Mock private WifiTrackerInjector mMockInjector;
     @Mock private Context mMockContext;
@@ -146,7 +151,7 @@
     private Handler mTestHandler;
 
     private StandardWifiEntry getStandardWifiEntry(WifiConfiguration config) {
-        return new StandardWifiEntry(mMockInjector, mMockContext, mTestHandler,
+        return new StandardWifiEntry(mMockInjector, mTestHandler,
                 new StandardWifiEntryKey(config), Collections.singletonList(config), null,
                 mMockWifiManager, false /* forSavedNetworksPage */);
     }
@@ -191,6 +196,8 @@
                 .thenReturn(STRING_NETWORK_AVAILABLE_SIGN_IN);
         when(mMockContext.getString(R.string.wifitrackerlib_summary_separator))
                 .thenReturn(STRING_SUMMARY_SEPARATOR);
+        when(mMockContext.getString(R.string.wifitrackerlib_multiband_separator))
+                .thenReturn(BAND_SEPARATOR);
         when(mMockContext.getString(R.string.wifi_connected_low_quality))
                 .thenReturn(STRING_CONNECTED_LOW_QUALITY);
         when(mMockContext.getString(R.string.wifitrackerlib_wifi_limited_connection))
@@ -207,6 +214,11 @@
                 any())).thenAnswer((answer) -> STRING_CONNECTED_VIA_APP + answer.getArguments()[1]);
         when(mMockContext.getString(eq(R.string.wifitrackerlib_available_via_app),
                 any())).thenAnswer((answer) -> STRING_AVAILABLE_VIA_APP + answer.getArguments()[1]);
+        when(mMockContext.getString(eq(R.string.wifitrackerlib_link_speed_mbps),
+                any())).thenAnswer((answer) -> answer.getArguments()[1] + STRING_LINK_SPEED_MBPS);
+        when(mMockContext.getString(eq(R.string.wifitrackerlib_link_speed_on_band),
+                any())).thenAnswer((answer) -> answer.getArguments()[1] + STRING_LINK_SPEED_ON_BAND
+                + answer.getArguments()[2]);
     }
 
     @Test
@@ -682,7 +694,7 @@
         when(wifiInfo.getWifiStandard()).thenReturn(ScanResult.WIFI_STANDARD_11BE);
         when(wifiInfo.getAssociatedMloLinks()).thenReturn(mloLinks);
 
-        assertThat(Utils.getBandString(mMockContext, wifiInfo))
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo))
                 .isEqualTo("2.4 GHz, 5 GHz, 6 GHz");
     }
 
@@ -694,16 +706,16 @@
         when(wifiInfo.getAssociatedMloLinks()).thenReturn(Collections.emptyList());
 
         when(wifiInfo.getFrequency()).thenReturn(0);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_UNKNOWN);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_UNKNOWN);
 
         when(wifiInfo.getFrequency()).thenReturn(2400);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_24_GHZ);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_24_GHZ);
 
         when(wifiInfo.getFrequency()).thenReturn(5200);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_5_GHZ);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_5_GHZ);
 
         when(wifiInfo.getFrequency()).thenReturn(6000);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_6_GHZ);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_6_GHZ);
     }
 
     @Test
@@ -712,16 +724,16 @@
         WifiInfo wifiInfo = mock(WifiInfo.class);
 
         when(wifiInfo.getFrequency()).thenReturn(0);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_UNKNOWN);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_UNKNOWN);
 
         when(wifiInfo.getFrequency()).thenReturn(2400);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_24_GHZ);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_24_GHZ);
 
         when(wifiInfo.getFrequency()).thenReturn(5200);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_5_GHZ);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_5_GHZ);
 
         when(wifiInfo.getFrequency()).thenReturn(6000);
-        assertThat(Utils.getBandString(mMockContext, wifiInfo)).isEqualTo(BAND_6_GHZ);
+        assertThat(Utils.wifiInfoToBandString(mMockContext, wifiInfo)).isEqualTo(BAND_6_GHZ);
     }
 
     @Test
@@ -731,20 +743,30 @@
         ConnectivityDiagnosticsManager.ConnectivityReport connectivityReport = mock(
                 ConnectivityDiagnosticsManager.ConnectivityReport.class);
 
-        // Not default. Do not show "Connected"
+        // Checking for internet access...
+        assertThat(Utils.getConnectedDescription(
+                mMockContext,
+                wifiConfig,
+                networkCapabilities,
+                true,
+                false,
+                null)).isEqualTo(STRING_CHECKING_FOR_INTERNET_ACCESS);
+        // Checking for internet access... without WifiConfiguration (i.e. Passpoint)
         assertThat(Utils.getConnectedDescription(
                 mMockContext,
                 null,
-                null,
+                networkCapabilities,
                 false,
                 false,
-                null)).isEmpty();
+                null)).isEqualTo(STRING_CHECKING_FOR_INTERNET_ACCESS);
 
-        // Default but no info, return "Connected"
+        // Connected
+        when(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
+                .thenReturn(true);
         assertThat(Utils.getConnectedDescription(
                 mMockContext,
                 null,
-                null,
+                networkCapabilities,
                 true,
                 false,
                 null)).isEqualTo(STRING_WIFI_STATUS_CONNECTED);
@@ -753,15 +775,17 @@
         assertThat(Utils.getConnectedDescription(
                 mMockContext,
                 null,
-                null,
+                networkCapabilities,
                 false,
                 true,
                 null)).isEqualTo(STRING_CONNECTED_LOW_QUALITY);
 
-        // No internet access
+        // Connected / No internet access
+        when(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
+                .thenReturn(false);
         assertThat(Utils.getConnectedDescription(
                 mMockContext,
-                null,
+                wifiConfig,
                 networkCapabilities,
                 true,
                 false,
@@ -788,16 +812,6 @@
                 false,
                 connectivityReport)).isEqualTo(STRING_PRIVATE_DNS_BROKEN);
 
-        // Checking for internet access...
-        when(wifiConfig.isNoInternetAccessExpected()).thenReturn(false);
-        assertThat(Utils.getConnectedDescription(
-                mMockContext,
-                wifiConfig,
-                networkCapabilities,
-                true,
-                false,
-                null)).isEqualTo(STRING_CHECKING_FOR_INTERNET_ACCESS);
-
         // Limited connection
         when(networkCapabilities.hasCapability(
                 NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY)).thenReturn(true);
@@ -839,18 +853,9 @@
                 connectivityReport)).isEqualTo(STRING_CONNECTED_VIA_APP + "appLabel"
                 + STRING_SUMMARY_SEPARATOR + STRING_NO_INTERNET);
 
-        // Connected via app + Low quality + No internet access
-        assertThat(Utils.getConnectedDescription(
-                mMockContext,
-                suggestionConfig,
-                networkCapabilities,
-                true,
-                true,
-                connectivityReport)).isEqualTo(STRING_CONNECTED_VIA_APP + "appLabel"
-                + STRING_SUMMARY_SEPARATOR + STRING_CONNECTED_LOW_QUALITY
-                + STRING_SUMMARY_SEPARATOR + STRING_NO_INTERNET);
-
-        // Available via app + Low quality + No internet access
+        // Available via app + Low quality
+        when(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
+                .thenReturn(true);
         assertThat(Utils.getConnectedDescription(
                 mMockContext,
                 suggestionConfig,
@@ -858,8 +863,35 @@
                 false,
                 true,
                 connectivityReport)).isEqualTo(STRING_AVAILABLE_VIA_APP + "appLabel"
-                + STRING_SUMMARY_SEPARATOR + STRING_CONNECTED_LOW_QUALITY
-                + STRING_SUMMARY_SEPARATOR + STRING_NO_INTERNET);
+                + STRING_SUMMARY_SEPARATOR + STRING_CONNECTED_LOW_QUALITY);
+
+        // Available via app + Sign in to network
+        when(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
+                .thenReturn(false);
+        when(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL))
+                .thenReturn(true);
+        assertThat(Utils.getConnectedDescription(
+                mMockContext,
+                suggestionConfig,
+                networkCapabilities,
+                true,
+                false,
+                connectivityReport)).isEqualTo(STRING_AVAILABLE_VIA_APP + "appLabel"
+                + STRING_SUMMARY_SEPARATOR + STRING_NETWORK_AVAILABLE_SIGN_IN);
+
+        // Connected via app + Limited connection...
+        when(networkCapabilities.hasCapability(
+                NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY)).thenReturn(true);
+        when(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL))
+                .thenReturn(false);
+        assertThat(Utils.getConnectedDescription(
+                mMockContext,
+                suggestionConfig,
+                networkCapabilities,
+                true,
+                false,
+                connectivityReport)).isEqualTo(STRING_CONNECTED_VIA_APP + "appLabel"
+                + STRING_SUMMARY_SEPARATOR + STRING_LIMITED_CONNECTION);
     }
 
     @Test
@@ -894,4 +926,122 @@
                         WifiInfo.SECURITY_TYPE_PASSPOINT_R1_R2)))
                 .isEqualTo(WifiInfo.SECURITY_TYPE_PASSPOINT_R3);
     }
+
+    @Test
+    public void testGetSpeedStringUnknownSpeed() {
+        WifiInfo wifiInfo = mock(WifiInfo.class);
+        when(wifiInfo.getTxLinkSpeedMbps()).thenReturn(WifiInfo.LINK_SPEED_UNKNOWN);
+        when(wifiInfo.getRxLinkSpeedMbps()).thenReturn(WifiInfo.LINK_SPEED_UNKNOWN);
+
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, true))
+                .isEqualTo("");
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, false))
+                .isEqualTo("");
+    }
+
+    @Test
+    public void testGetSpeedString() {
+        int txSpeedMbps = 15;
+        int rxSpeedMbps = 100;
+        WifiInfo wifiInfo = mock(WifiInfo.class);
+        when(wifiInfo.getTxLinkSpeedMbps()).thenReturn(txSpeedMbps);
+        when(wifiInfo.getRxLinkSpeedMbps()).thenReturn(rxSpeedMbps);
+
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, true))
+                .isEqualTo(txSpeedMbps + STRING_LINK_SPEED_MBPS);
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, false))
+                .isEqualTo(rxSpeedMbps + STRING_LINK_SPEED_MBPS);
+    }
+
+    @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    private MloLink createMockMloLink(int band, int linkState, int txSpeedMbps, int rxSpeedMbps) {
+        if (!BuildCompat.isAtLeastU()) {
+            return null;
+        }
+        MloLink link = mock(MloLink.class);
+        when(link.getBand()).thenReturn(band);
+        when(link.getState()).thenReturn(linkState);
+        when(link.getTxLinkSpeedMbps()).thenReturn(txSpeedMbps);
+        when(link.getRxLinkSpeedMbps()).thenReturn(rxSpeedMbps);
+        return link;
+    }
+
+    @Test
+    public void testGetSpeedStringWithSingleMloLink() {
+        assumeTrue(BuildCompat.isAtLeastU());
+        int txSpeedMbps = 15;
+        int rxSpeedMbps = 100;
+        WifiInfo wifiInfo = mock(WifiInfo.class);
+        when(wifiInfo.getTxLinkSpeedMbps()).thenReturn(txSpeedMbps);
+        when(wifiInfo.getRxLinkSpeedMbps()).thenReturn(rxSpeedMbps);
+        List<MloLink> links = List.of(
+                createMockMloLink(WifiScanner.WIFI_BAND_24_GHZ, MloLink.MLO_LINK_STATE_ACTIVE,
+                        txSpeedMbps, rxSpeedMbps)
+        );
+        when(wifiInfo.getAssociatedMloLinks()).thenReturn(links);
+
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, true))
+                .isEqualTo(txSpeedMbps + STRING_LINK_SPEED_MBPS);
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, false))
+                .isEqualTo(rxSpeedMbps + STRING_LINK_SPEED_MBPS);
+    }
+
+    @Test
+    public void testGetSpeedStringWithMultipleMloLinks() {
+        assumeTrue(BuildCompat.isAtLeastU());
+        int txSpeedMbps = 15;
+        int rxSpeedMbps = 100;
+        WifiInfo wifiInfo = mock(WifiInfo.class);
+        when(wifiInfo.getTxLinkSpeedMbps()).thenReturn(txSpeedMbps);
+        when(wifiInfo.getRxLinkSpeedMbps()).thenReturn(rxSpeedMbps);
+        List<MloLink> links = List.of(
+                createMockMloLink(WifiScanner.WIFI_BAND_UNSPECIFIED, MloLink.MLO_LINK_STATE_ACTIVE,
+                        txSpeedMbps, rxSpeedMbps),
+                createMockMloLink(WifiScanner.WIFI_BAND_24_GHZ, MloLink.MLO_LINK_STATE_ACTIVE,
+                        txSpeedMbps, rxSpeedMbps),
+                createMockMloLink(WifiScanner.WIFI_BAND_24_GHZ, MloLink.MLO_LINK_STATE_IDLE,
+                        txSpeedMbps, rxSpeedMbps),
+                createMockMloLink(WifiScanner.WIFI_BAND_5_GHZ, MloLink.MLO_LINK_STATE_ACTIVE,
+                        txSpeedMbps, rxSpeedMbps),
+                createMockMloLink(WifiScanner.WIFI_BAND_5_GHZ, MloLink.MLO_LINK_STATE_ACTIVE,
+                        txSpeedMbps, rxSpeedMbps),
+                createMockMloLink(WifiScanner.WIFI_BAND_6_GHZ, MloLink.MLO_LINK_STATE_ACTIVE,
+                        txSpeedMbps, rxSpeedMbps),
+                createMockMloLink(WifiScanner.WIFI_BAND_6_GHZ, MloLink.MLO_LINK_STATE_ACTIVE,
+                        -1, 0)
+        );
+        when(wifiInfo.getAssociatedMloLinks()).thenReturn(links);
+
+        // The idle 2 Ghz link should not be included
+        // The extra 5 Ghz link should be included
+        // The extra 5 Ghz link should be included
+        // The 6 Ghz link with non-positive link speed should not be included
+        String expectedTxSpeed = new StringJoiner(BAND_SEPARATOR)
+                .add(txSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_UNKNOWN)
+                .add(txSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_24_GHZ)
+                .add(txSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_5_GHZ)
+                .add(txSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_5_GHZ)
+                .add(txSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_6_GHZ).toString();
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, true))
+                .isEqualTo(expectedTxSpeed);
+
+        String expectedRxSpeed = new StringJoiner(BAND_SEPARATOR)
+                .add(rxSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_UNKNOWN)
+                .add(rxSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_24_GHZ)
+                .add(rxSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_5_GHZ)
+                .add(rxSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_5_GHZ)
+                .add(rxSpeedMbps + STRING_LINK_SPEED_MBPS
+                        + STRING_LINK_SPEED_ON_BAND + BAND_6_GHZ).toString();
+        assertThat(Utils.getSpeedString(mMockContext, wifiInfo, false))
+                .isEqualTo(expectedRxSpeed);
+    }
 }
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
index 96b3e54..6062fe1 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
@@ -41,6 +41,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.when;
 
 import android.content.BroadcastReceiver;
@@ -70,6 +71,7 @@
 import android.net.wifi.sharedconnectivity.app.NetworkProviderInfo;
 import android.net.wifi.sharedconnectivity.app.SharedConnectivityClientCallback;
 import android.net.wifi.sharedconnectivity.app.SharedConnectivityManager;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.test.TestLooper;
 import android.telephony.SubscriptionManager;
@@ -80,7 +82,6 @@
 import androidx.annotation.NonNull;
 import androidx.lifecycle.Lifecycle;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -196,14 +197,18 @@
                 });
         // A real NetworkCapabilities is needed here in order to create a copy (with location info)
         // using the NetworkCapabilities constructor in handleOnStart.
-        when(mMockConnectivityManager.getNetworkCapabilities(mMockNetwork))
-                .thenReturn(new NetworkCapabilities.Builder()
-                        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
-                        .build());
+        NetworkCapabilities realNetCaps = new NetworkCapabilities.Builder()
+                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+                .setTransportInfo(mock(WifiInfo.class))
+                .build();
+        when(mMockConnectivityManager.getNetworkCapabilities(mMockNetwork)).thenReturn(realNetCaps);
         when(mMockConnectivityManager.getLinkProperties(mMockNetwork))
                 .thenReturn(mMockLinkProperties);
         when(mMockSharedConnectivityManager.unregisterCallback(any())).thenReturn(true);
+        when(mInjector.getContext()).thenReturn(mMockContext);
         when(mMockContext.getResources()).thenReturn(mMockResources);
+        when(mMockContext.getSystemService(ConnectivityManager.class))
+                .thenReturn(mMockConnectivityManager);
         when(mMockContext.getSystemService(TelephonyManager.class))
                 .thenReturn(mMockTelephonyManager);
         when(mMockContext.getSystemService(SubscriptionManager.class))
@@ -218,13 +223,7 @@
                 new String[]{"", "Scanning", "Connecting", "Authenticating", "Obtaining IP address",
                         "Connected", "Suspended", "Disconnecting", "Unsuccessful", "Blocked",
                         "Temporarily avoiding poor connection"});
-
-        BaseWifiTracker.mEnableSharedConnectivityFeature = true;
-    }
-
-    @After
-    public void tearDown() {
-        BaseWifiTracker.mEnableSharedConnectivityFeature = false;
+        when(mInjector.isSharedConnectivityFeatureEnabled()).thenReturn(true);
     }
 
     /**
@@ -303,8 +302,10 @@
 
         mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
                 new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
+        mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS);
     }
 
     /**
@@ -534,6 +535,37 @@
     }
 
     /**
+     * Tests that a CONFIGURED_NETWORKS_CHANGED broadcast does not create WifiEntries based on
+     * cached scan results if Wi-Fi is disabled.
+     */
+    @Test
+    public void testGetWifiEntries_configuredNetworksChangedWifiDisabled_doesntUpdateEntries() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockContext).registerReceiver(mBroadcastReceiverCaptor.capture(),
+                any(), any(), any());
+        // Start off with Wi-Fi enabled
+        when(mMockWifiManager.getScanResults()).thenReturn(Arrays.asList(
+                buildScanResult("ssid", "bssid", START_MILLIS)));
+        mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
+                new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
+        assertThat(wifiPickerTracker.getWifiEntries()).isNotEmpty();
+
+        // Disable Wi-Fi and verify wifi entries is empty
+        when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+        mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
+                new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION).putExtra(
+                        WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED));
+        assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
+
+        // Receive CONFIGURED_NETWORKS_CHANGED, verify wifi entries is still empty
+        mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
+                new Intent(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION));
+        assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
+    }
+
+    /**
      * Tests that getConnectedEntry() returns the connected WifiEntry if we start already connected
      * to a network.
      */
@@ -578,8 +610,10 @@
         when(mMockWifiInfo.getRssi()).thenReturn(-50);
         mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(
                 mMockNetwork, mMockNetworkCapabilities);
+        mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
         assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
         assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry);
     }
@@ -608,6 +642,46 @@
 
         // Simulate an L2 connected network that's still authenticating.
         when(mMockWifiInfo.getNetworkId()).thenReturn(1);
+        when(mMockWifiInfo.getRssi()).thenReturn(GOOD_RSSI);
+        NetworkInfo mockNetworkInfo = mock(NetworkInfo.class);
+        when(mockNetworkInfo.getDetailedState())
+                .thenReturn(NetworkInfo.DetailedState.AUTHENTICATING);
+        Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo);
+        mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged);
+        mTestLooper.dispatchAll();
+
+        // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected.
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
+        assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
+        assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry);
+        assertThat(entry.isPrimaryNetwork()).isTrue();
+        assertThat(entry.getLevel()).isEqualTo(GOOD_LEVEL);
+    }
+
+    /**
+     * Tests that an L2 connected network request (i.e. from NETWORK_STATE_CHANGED) will correctly
+     * be returned in getConnectedEntry().
+     */
+    @Test
+    public void testGetConnectedEntry_networkRequestL2Connected_returnsConnectedEntry() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        config.fromWifiNetworkSpecifier = true;
+        when(mMockWifiManager.getPrivilegedConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockContext).registerReceiver(
+                mBroadcastReceiverCaptor.capture(), any(), any(), any());
+        verify(mMockConnectivityManager).registerNetworkCallback(
+                any(), mNetworkCallbackCaptor.capture(), any());
+
+        // Simulate an L2 connected network that's still authenticating.
+        when(mMockWifiInfo.getNetworkId()).thenReturn(1);
         when(mMockWifiInfo.getRssi()).thenReturn(-50);
         NetworkInfo mockNetworkInfo = mock(NetworkInfo.class);
         when(mockNetworkInfo.getDetailedState())
@@ -615,12 +689,12 @@
         Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
         networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo);
         mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged);
+        mTestLooper.dispatchAll();
 
         // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected.
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
-//        assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
-        assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry);
-        assertThat(entry.isPrimaryNetwork()).isTrue();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
+        assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull();
     }
 
     /**
@@ -648,8 +722,10 @@
         when(mMockWifiInfo.getRssi()).thenReturn(-50);
         mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(
                 mMockNetwork, mMockNetworkCapabilities);
+        mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
         assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull();
         assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo("ssid");
     }
@@ -675,12 +751,89 @@
                 any(), mNetworkCallbackCaptor.capture(), any());
 
         mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
+        mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
         assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull();
     }
 
     /**
+     * Tests that disconnecting from a network during the stopped state will result in the network
+     * being disconnected once we've started again.
+     */
+    @Test
+    public void testGetConnectedEntry_disconnectFromNetworkWhileStopped_returnsNull() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        when(mMockWifiManager.getPrivilegedConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        when(mMockWifiManager.getScanResults()).thenReturn(Arrays.asList(
+                buildScanResult("ssid", "bssid", START_MILLIS)));
+        when(mMockWifiInfo.getNetworkId()).thenReturn(1);
+        when(mMockWifiInfo.getRssi()).thenReturn(-50);
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockConnectivityManager).registerNetworkCallback(
+                any(), mNetworkCallbackCaptor.capture(), any());
+
+        // Simulate network disconnecting while in stopped state
+        wifiPickerTracker.onStop();
+        mTestLooper.dispatchAll();
+        when(mMockWifiManager.getCurrentNetwork()).thenReturn(null);
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
+        assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull();
+    }
+
+    /**
+     * Tests that captive portal will auto open if the activity stops and starts before we've
+     * connected, such as if the user needs to input a password in a full screen dialog.
+     */
+    @Test
+    public void testCaptivePortal_activityStopsAndStartsBeforeConnection_captivePortalAutoOpens() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        when(mMockWifiManager.getPrivilegedConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        when(mMockWifiManager.getScanResults()).thenReturn(Arrays.asList(
+                buildScanResult("ssid", "bssid", START_MILLIS)));
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockConnectivityManager).registerNetworkCallback(
+                any(), mNetworkCallbackCaptor.capture(), any());
+        final WifiEntry entry = wifiPickerTracker.getWifiEntries().get(0);
+
+        // Simulate user connection
+        entry.connect(null);
+        // Activity is stopped and started
+        wifiPickerTracker.onStop();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+
+        // Verify captive portal auto-opens upon connection.
+        when(mMockWifiInfo.getNetworkId()).thenReturn(1);
+        when(mMockWifiInfo.getRssi()).thenReturn(-50);
+        when(mMockNetworkCapabilities.hasCapability(
+                NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)).thenReturn(true);
+        MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking();
+        try {
+            mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(
+                    mMockNetwork, mMockNetworkCapabilities);
+            verify(() -> NonSdkApiWrapper.startCaptivePortalApp(any(), any()), times(1));
+        } finally {
+            session.finishMocking();
+        }
+    }
+
+    /**
      * Tests that the wifi state changing to something other than WIFI_STATE_ENABLED will update
      * getConnectedEntry() to return null.
      */
@@ -704,8 +857,10 @@
         when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
         mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
                 new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION));
+        mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
         assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull();
     }
 
@@ -764,6 +919,56 @@
         // Lose the default network
         mDefaultNetworkCallbackCaptor.getValue().onLost(mock(Network.class));
         assertThat(wifiPickerTracker.getConnectedWifiEntry().isDefaultNetwork()).isFalse();
+
+        // Disconnect
+        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
+        assertThat(wifiPickerTracker.getWifiEntries().get(0).isDefaultNetwork()).isFalse();
+    }
+
+    /**
+     * Tests that a connected WifiEntry will become the default network if the network underlies
+     * the current default network.
+     */
+    @Test
+    public void testGetConnectedEntry_defaultNetworkHasUnderlyingWifi_becomesDefaultNetwork() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        when(mMockWifiManager.getCurrentNetwork()).thenReturn(null);
+        when(mMockWifiManager.getConnectionInfo()).thenReturn(null);
+        when(mMockWifiManager.getPrivilegedConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        when(mMockWifiManager.getScanResults()).thenReturn(Arrays.asList(
+                buildScanResult("ssid", "bssid", START_MILLIS)));
+        when(mMockWifiInfo.getNetworkId()).thenReturn(1);
+        when(mMockWifiInfo.getRssi()).thenReturn(-50);
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockConnectivityManager)
+                .registerNetworkCallback(any(), mNetworkCallbackCaptor.capture(), any());
+        verify(mMockConnectivityManager, atLeast(0)).registerSystemDefaultNetworkCallback(
+                mDefaultNetworkCallbackCaptor.capture(), any());
+        verify(mMockConnectivityManager, atLeast(0)).registerDefaultNetworkCallback(
+                mDefaultNetworkCallbackCaptor.capture(), any());
+
+        Network vpnNetwork = mock(Network.class);
+        NetworkCapabilities vpnCaps = new NetworkCapabilities.Builder()
+                .addCapability(NetworkCapabilities.TRANSPORT_VPN)
+                .setUnderlyingNetworks(List.of(mMockNetwork))
+                .build();
+        mDefaultNetworkCallbackCaptor.getValue().onCapabilitiesChanged(vpnNetwork, vpnCaps);
+        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(
+                mMockNetwork, mMockNetworkCapabilities);
+
+        assertThat(wifiPickerTracker.getConnectedWifiEntry().isDefaultNetwork()).isTrue();
+
+        // Losing the network and regaining it should not reset it being the default.
+        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
+        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(
+                mMockNetwork, mMockNetworkCapabilities);
+
+        assertThat(wifiPickerTracker.getConnectedWifiEntry().isDefaultNetwork()).isTrue();
     }
 
     /**
@@ -1468,7 +1673,8 @@
         wifiPickerTracker.onStart();
         mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
         assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo(friendlyName);
     }
 
@@ -1512,7 +1718,8 @@
                 new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
         mTestLooper.dispatchAll();
 
-        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        verify(mMockCallback, atLeastOnce())
+                .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL);
         assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull();
         assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo(friendlyName);
     }
@@ -2071,10 +2278,12 @@
         mTestLooper.moveTimeForward(SCAN_INTERVAL_MILLIS);
         mTestLooper.dispatchAll();
         verify(mMockWifiManager, never()).startScan();
+        verify(mMockCallback).onScanRequested();
 
         mScanListenerCaptor.getValue().onResults(null);
         mTestLooper.dispatchAll();
         verify(mMockWifiManager).startScan();
+        verify(mMockCallback, times(2)).onScanRequested();
     }
 
     /**
@@ -2104,6 +2313,28 @@
         verify(mMockWifiManager).startScan();
     }
 
+    /**
+     * Tests that the BaseWifiTracker.Scanner does not scan if scanning was disabled.
+     */
+    @Test
+    public void testScanner_scanningDisabled_scannerDoesNotStart() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.disableScanning();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockContext).registerReceiver(mBroadcastReceiverCaptor.capture(),
+                any(), any(), any());
+        mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
+                new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION).putExtra(
+                        WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED));
+
+        ArgumentCaptor<WifiScanner.ScanListener> mScanListenerCaptor =
+                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
+        verify(mWifiScanner, never()).startScan(any(), mScanListenerCaptor.capture());
+        verify(mMockWifiManager, never()).startScan();
+        verify(mInjector).disableVerboseLogging();
+    }
+
     @Test
     public void testScanner_startAfterOnStop_doesNotStart() {
         final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
@@ -2157,6 +2388,55 @@
 
         verify(mMockSharedConnectivityManager).getKnownNetworks();
         verify(mMockSharedConnectivityManager).getHotspotNetworks();
+        verify(mMockSharedConnectivityManager).getHotspotNetworkConnectionStatus();
+    }
+
+    @Test
+    public void testSharedConnectivityManager_onServiceDisconnected_networksCleared() {
+        final KnownNetwork testKnownNetwork = new KnownNetwork.Builder()
+                .setNetworkSource(KnownNetwork.NETWORK_SOURCE_NEARBY_SELF)
+                .setSsid("ssid")
+                .addSecurityType(SECURITY_TYPE_PSK)
+                .addSecurityType(SECURITY_TYPE_SAE)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .build();
+        when(mMockSharedConnectivityManager.getKnownNetworks()).thenReturn(
+                Collections.singletonList(testKnownNetwork));
+        when(mMockWifiManager.getScanResults()).thenReturn(
+                Collections.singletonList(buildScanResult("ssid", "bssid", START_MILLIS,
+                        "[PSK/SAE]")));
+        final HotspotNetwork testHotspotNetwork = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .build();
+        when(mMockSharedConnectivityManager.getHotspotNetworks()).thenReturn(
+                Collections.singletonList(testHotspotNetwork));
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockSharedConnectivityManager).registerCallback(any(),
+                mSharedConnectivityCallbackCaptor.capture());
+        mSharedConnectivityCallbackCaptor.getValue().onServiceConnected();
+        mTestLooper.dispatchAll();
+
+        mSharedConnectivityCallbackCaptor.getValue().onServiceDisconnected();
+
+        assertThat(wifiPickerTracker.getWifiEntries().stream().filter(
+                entry -> entry instanceof KnownNetworkEntry).toList()).isEmpty();
+        assertThat(wifiPickerTracker.getWifiEntries().stream().filter(
+                entry -> entry instanceof HotspotNetworkEntry).toList()).isEmpty();
     }
 
     @Test
@@ -2264,6 +2544,40 @@
     }
 
     @Test
+    public void testKnownNetworks_newKnownNetworkMatchesSavedNetwork_knownNetworkNotIncluded() {
+        final KnownNetwork testKnownNetwork = new KnownNetwork.Builder()
+                .setNetworkSource(KnownNetwork.NETWORK_SOURCE_NEARBY_SELF)
+                .setSsid("ssid")
+                .addSecurityType(SECURITY_TYPE_PSK)
+                .addSecurityType(SECURITY_TYPE_SAE)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .build();
+        when(mMockWifiManager.getScanResults()).thenReturn(
+                Collections.singletonList(buildScanResult("ssid", "bssid", START_MILLIS,
+                        "[PSK/SAE]")));
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
+        when(mMockWifiManager.getPrivilegedConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        wifiPickerTracker.handleKnownNetworksUpdated(Collections.singletonList(testKnownNetwork));
+
+        assertThat(wifiPickerTracker.getWifiEntries().stream().filter(
+                entry -> entry instanceof KnownNetworkEntry).toList()).isEmpty();
+        assertThat(wifiPickerTracker.getWifiEntries().stream().filter(
+                entry -> entry instanceof StandardWifiEntry).toList()).hasSize(1);
+    }
+
+    @Test
     public void testKnownNetworks_onKnownNetworkConnectionStatusChanged_matchingEntryCalled() {
         final KnownNetwork testKnownNetwork1 = new KnownNetwork.Builder()
                 .setNetworkSource(KnownNetwork.NETWORK_SOURCE_NEARBY_SELF)
@@ -2322,6 +2636,41 @@
     }
 
     @Test
+    public void testKnownNetworks_entryRemoved() {
+        final KnownNetwork testKnownNetwork = new KnownNetwork.Builder()
+                .setNetworkSource(KnownNetwork.NETWORK_SOURCE_NEARBY_SELF)
+                .setSsid("ssid")
+                .addSecurityType(SECURITY_TYPE_PSK)
+                .addSecurityType(SECURITY_TYPE_SAE)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .build();
+        when(mMockSharedConnectivityManager.getKnownNetworks()).thenReturn(
+                Collections.singletonList(testKnownNetwork));
+        when(mMockWifiManager.getScanResults()).thenReturn(
+                Collections.singletonList(buildScanResult("ssid", "bssid", START_MILLIS,
+                        "[PSK/SAE]")));
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockSharedConnectivityManager).registerCallback(any(),
+                mSharedConnectivityCallbackCaptor.capture());
+        mSharedConnectivityCallbackCaptor.getValue().onServiceConnected();
+        mTestLooper.dispatchAll();
+        assertThat(wifiPickerTracker.getWifiEntries().stream().filter(
+                entry -> entry instanceof KnownNetworkEntry).toList()).hasSize(1);
+
+        wifiPickerTracker.handleKnownNetworksUpdated(Collections.emptyList());
+
+        assertThat(wifiPickerTracker.getWifiEntries().stream().filter(
+                entry -> entry instanceof KnownNetworkEntry).toList()).isEmpty();
+    }
+
+    @Test
     public void testHotspotNetworks_noActiveHotspot_virtualEntryIncluded() {
         final HotspotNetwork testHotspotNetwork = new HotspotNetwork.Builder()
                 .setDeviceId(1)
@@ -2366,9 +2715,7 @@
                 .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
                 .setNetworkName("Google Fi")
                 .setHotspotSsid("Instant Hotspot abcde")
-                .setHotspotBssid("0a:0b:0c:0d:0e:0f")
                 .addHotspotSecurityType(SECURITY_TYPE_PSK)
-                .addHotspotSecurityType(SECURITY_TYPE_SAE)
                 .build();
         when(mMockSharedConnectivityManager.getHotspotNetworks()).thenReturn(
                 Collections.singletonList(testHotspotNetwork));
@@ -2402,9 +2749,7 @@
                 .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
                 .setNetworkName("Google Fi")
                 .setHotspotSsid("Instant Hotspot abcde")
-                .setHotspotBssid("0a:0b:0c:0d:0e:0f")
                 .addHotspotSecurityType(SECURITY_TYPE_PSK)
-                .addHotspotSecurityType(SECURITY_TYPE_SAE)
                 .build();
         when(mMockSharedConnectivityManager.getHotspotNetworks()).thenReturn(
                 Collections.singletonList(testHotspotNetwork));
@@ -2447,22 +2792,19 @@
                 .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
                 .setNetworkName("Google Fi")
                 .setHotspotSsid("Instant Hotspot abcde")
-                .setHotspotBssid("0a:0b:0c:0d:0e:0f")
                 .addHotspotSecurityType(SECURITY_TYPE_PSK)
-                .addHotspotSecurityType(SECURITY_TYPE_SAE)
                 .build();
         when(mMockSharedConnectivityManager.getHotspotNetworks()).thenReturn(
                 Collections.singletonList(testHotspotNetwork));
         final WifiConfiguration config = new WifiConfiguration();
         config.SSID = "\"Instant Hotspot abcde\"";
-        config.BSSID = "0a:0b:0c:0d:0e:0f";
         config.networkId = 1;
         config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
         when(mMockWifiManager.getPrivilegedConfiguredNetworks())
                 .thenReturn(Collections.singletonList(config));
         when(mMockWifiInfo.getNetworkId()).thenReturn(1);
         when(mMockWifiInfo.getRssi()).thenReturn(GOOD_RSSI);
-        when(mMockWifiInfo.getBSSID()).thenReturn("0a:0b:0c:0d:0e:0f");
+        when(mMockWifiInfo.getSSID()).thenReturn("Instant Hotspot abcde");
         when(mMockWifiInfo.getCurrentSecurityType()).thenReturn(SECURITY_TYPE_PSK);
         when(mMockWifiManager.getScanResults()).thenReturn(Collections.singletonList(
                 buildScanResult("Instant Hotspot abcde", "0a:0b:0c:0d:0e:0f", START_MILLIS,
@@ -2535,4 +2877,101 @@
         verify(connectCallback1).onConnectResult(anyInt());
         verify(connectCallback2, never()).onConnectResult(anyInt());
     }
+
+    @Test
+    public void testHotspotNetworks_multipleAvailableNetworks_sortedByUpstreamConnectionStrength() {
+        final HotspotNetwork testHotspotNetwork1 = new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone 1", "Pixel 5")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(2)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .build();
+        final HotspotNetwork testHotspotNetwork2 = new HotspotNetwork.Builder()
+                .setDeviceId(2)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone 2", "Pixel 6")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(4)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .build();
+        final HotspotNetwork testHotspotNetwork3 = new HotspotNetwork.Builder()
+                .setDeviceId(3)
+                .setNetworkProviderInfo(new NetworkProviderInfo
+                        .Builder("My Phone 3", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .build();
+        when(mMockSharedConnectivityManager.getHotspotNetworks()).thenReturn(
+                List.of(testHotspotNetwork1, testHotspotNetwork2, testHotspotNetwork3));
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockSharedConnectivityManager).registerCallback(any(),
+                mSharedConnectivityCallbackCaptor.capture());
+
+        mSharedConnectivityCallbackCaptor.getValue().onServiceConnected();
+        mTestLooper.dispatchAll();
+
+        assertThat(wifiPickerTracker.getWifiEntries()).hasSize(3);
+        assertThat(((HotspotNetworkEntry) wifiPickerTracker.getWifiEntries().get(0))
+                .getHotspotNetworkEntryKey().getDeviceId()).isEqualTo(2);
+        assertThat(((HotspotNetworkEntry) wifiPickerTracker.getWifiEntries().get(1))
+                .getHotspotNetworkEntryKey().getDeviceId()).isEqualTo(3);
+        assertThat(((HotspotNetworkEntry) wifiPickerTracker.getWifiEntries().get(2))
+                .getHotspotNetworkEntryKey().getDeviceId()).isEqualTo(1);
+    }
+
+    @Test
+    public void testHotspotNetworks_onHotspotNetworkConnectionStatusChanged_connectedExtra() {
+        final HotspotNetwork testHotspotNetwork =
+            new HotspotNetwork.Builder()
+                .setDeviceId(1)
+                .setNetworkProviderInfo(
+                    new NetworkProviderInfo.Builder("My Phone", "Pixel 7")
+                        .setDeviceType(NetworkProviderInfo.DEVICE_TYPE_PHONE)
+                        .setBatteryPercentage(100)
+                        .setConnectionStrength(3)
+                        .build())
+                .setHostNetworkType(HotspotNetwork.NETWORK_TYPE_CELLULAR)
+                .setNetworkName("Google Fi")
+                .build();
+        when(mMockSharedConnectivityManager.getHotspotNetworks())
+            .thenReturn(Collections.singletonList(testHotspotNetwork));
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockSharedConnectivityManager)
+            .registerCallback(any(), mSharedConnectivityCallbackCaptor.capture());
+        mSharedConnectivityCallbackCaptor.getValue().onServiceConnected();
+        mTestLooper.dispatchAll();
+
+        final WifiEntry.ConnectCallback connectCallback = mock(WifiEntry.ConnectCallback.class);
+        wifiPickerTracker.getWifiEntries().get(0).connect(connectCallback);
+
+        Bundle extras = new Bundle();
+        extras.putBoolean("connection_status_connected", true);
+        mSharedConnectivityCallbackCaptor
+            .getValue()
+            .onHotspotNetworkConnectionStatusChanged(
+                new HotspotNetworkConnectionStatus.Builder()
+                    .setStatus(HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN)
+                    .setExtras(extras)
+                    .setHotspotNetwork(testHotspotNetwork)
+                    .build());
+        mTestLooper.dispatchAll();
+
+        verify(connectCallback).onConnectResult(WifiEntry.ConnectCallback.CONNECT_STATUS_SUCCESS);
+    }
 }
diff --git a/libwifi_hal/Android.bp b/libwifi_hal/Android.bp
index cc8157b..9e75776 100644
--- a/libwifi_hal/Android.bp
+++ b/libwifi_hal/Android.bp
@@ -43,6 +43,7 @@
         "cflags",
         "defaults",
         "shared_libs",
+        "static_libs",
         "whole_static_libs",
     ],
 }
@@ -159,7 +160,7 @@
                 whole_static_libs: ["libwifi-hal-syna"],
             },
             qcwcn: {
-                whole_static_libs: ["libwifi-hal-qcom"],
+                defaults: ["libwifi-hal-qcom"],
             },
             mrvl: {
                 // this is commented because none of the nexus devices
@@ -167,7 +168,10 @@
                 // whole_static_libs: ["libwifi-hal-mrvl"],
             },
             mediaTek: {
-                whole_static_libs: ["libwifi-hal-mt66xx"],
+                defaults: ["libwifi-hal-mediatek"],
+            },
+            nxp: {
+                whole_static_libs: ["//vendor/nxp/boreal/wifi:libwifi-hal-nxp"],
             },
             realtek: {
                 whole_static_libs: ["libwifi-hal-rtk"],
@@ -197,9 +201,6 @@
                 shared_libs: ["libcrypto"],
                 defaults: ["google_wifi_config_lib_defaults"],
             },
-            qcwcn: {
-                shared_libs: ["libcld80211", "libcrypto"],
-            },
         },
     },
 }
@@ -235,190 +236,3 @@
         integer_overflow: true,
     },
 }
-
-// Expose make-built libwifi-hal-<vendor> via wifi_cc_prebuilt_library_static.
-
-// Licenses for imported libwifi-hal-<vendor> libraries
-
-license {
-    name: "libwifi_hal_apache20_license",
-    visibility: [":__subpackages__"],
-    license_kinds: [
-        "SPDX-license-identifier-Apache-2.0",
-    ],
-}
-
-license {
-    name: "libwifi_hal_bsd_license",
-    visibility: [":__subpackages__"],
-    license_kinds: [
-        "SPDX-license-identifier-BSD",
-    ],
-}
-
-// Additional soong_config_module_types to enable/disable according to BOARD_WLAN_DEVICE
-// If libwifi-hal-<vendor> libs are migrated to soong modules, these are not necessary.
-
-soong_config_module_type {
-    name: "wifi_cc_prebuilt_library_static",
-    module_type: "cc_prebuilt_library_static",
-    config_namespace: "wifi",
-    variables: [
-        "board_wlan_device", // BOARD_WLAN_DEVICE
-    ],
-    properties: [
-        "enabled",
-    ],
-}
-
-soong_config_module_type {
-    name: "wifi_cc_prebuilt_library_shared",
-    module_type: "cc_prebuilt_library_shared",
-    config_namespace: "wifi",
-    variables: [
-        "board_wlan_device", // BOARD_WLAN_DEVICE
-    ],
-    properties: [
-        "enabled",
-    ],
-}
-
-soong_config_module_type {
-    name: "wifi_makefile_goal",
-    module_type: "makefile_goal",
-    config_namespace: "wifi",
-    variables: [
-        "board_wlan_device", // BOARD_WLAN_DEVICE
-    ],
-    properties: [
-        "enabled",
-    ],
-}
-
-// libwifi-hal-syna
-
-wifi_cc_prebuilt_library_static {
-    name: "libwifi-hal-syna",
-    proprietary: true,
-    srcs: [":make-libwifi-hal-syna"],
-    compile_multilib: "first",
-    installable: false,
-    licenses: ["libwifi_hal_apache20_license"],
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            synadhd: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-wifi_makefile_goal {
-    name: "make-libwifi-hal-syna",
-    product_out_path: "obj/STATIC_LIBRARIES/libwifi-hal-syna_intermediates/libwifi-hal-syna.a",
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            synadhd: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-// libwifi-hal-qcom
-
-wifi_cc_prebuilt_library_static {
-    name: "libwifi-hal-qcom",
-    proprietary: true,
-    srcs: [":make-libwifi-hal-qcom"],
-    compile_multilib: "first",
-    installable: false,
-    licenses: ["libwifi_hal_apache20_license", "libwifi_hal_bsd_license"],
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            qcwcn: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-wifi_makefile_goal {
-    name: "make-libwifi-hal-qcom",
-    product_out_path: "obj/STATIC_LIBRARIES/libwifi-hal-qcom_intermediates/libwifi-hal-qcom.a",
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            qcwcn: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-// libcld80211
-
-wifi_cc_prebuilt_library_shared {
-    name: "libcld80211",
-    vendor: true,
-    srcs: [":make-libcld80211"],
-    compile_multilib: "first",
-    installable: false,
-    licenses: ["libwifi_hal_bsd_license"],
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            qcwcn: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-wifi_makefile_goal {
-    name: "make-libcld80211",
-    product_out_path: "obj/SHARED_LIBRARIES/libcld80211_intermediates/LINKED/libcld80211.so",
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            qcwcn: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-// libwifi-hal-mt66xx
-
-wifi_cc_prebuilt_library_static {
-    name: "libwifi-hal-mt66xx",
-    proprietary: true,
-    srcs: [":make-libwifi-hal-mt66xx"],
-    compile_multilib: "first",
-    installable: false,
-    licenses: ["libwifi_hal_apache20_license"],
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            mediaTek: {
-                enabled: true,
-            },
-        },
-    },
-}
-
-wifi_makefile_goal {
-    name: "make-libwifi-hal-mt66xx",
-    product_out_path: "obj/STATIC_LIBRARIES/libwifi-hal-mt66xx_intermediates/libwifi-hal-mt66xx.a",
-    enabled: false,
-    soong_config_variables: {
-        board_wlan_device: {
-            mediaTek: {
-                enabled: true,
-            },
-        },
-    },
-}