[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,
- },
- },
- },
-}