diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-02-02 23:58:19 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-02-02 23:58:19 +0000 |
commit | 6be5a5b74dec5a129e5147c14fa4d3a14ac94dbf (patch) | |
tree | 36c2e576b8c46c113f1a32fffaf72abc33019356 | |
parent | 52794ef3f27a94bcad74d4188fc45c89e4dd0a7e (diff) | |
parent | 2f5d40b1318f1758ad1397fdaf4bd65a54e60ff6 (diff) | |
download | wifi-simpleperf-release.tar.gz |
Snap for 11400057 from 2f5d40b1318f1758ad1397fdaf4bd65a54e60ff6 to simpleperf-releasesimpleperf-release
Change-Id: I217719c460c81f4eb713f524ebaee8003b9725a8
48 files changed, 1344 insertions, 469 deletions
diff --git a/libs/WifiTrackerLib/Android.bp b/libs/WifiTrackerLib/Android.bp index ca94243ff..baf355e9b 100644 --- a/libs/WifiTrackerLib/Android.bp +++ b/libs/WifiTrackerLib/Android.bp @@ -1,4 +1,5 @@ package { + default_team: "trendy_team_fwk_wifi_hal", default_applicable_licenses: ["Android-Apache-2.0"], } diff --git a/libs/WifiTrackerLib/res/values-ar/strings.xml b/libs/WifiTrackerLib/res/values-ar/strings.xml index 298ecfe2a..2b4a3fd03 100644 --- a/libs/WifiTrackerLib/res/values-ar/strings.xml +++ b/libs/WifiTrackerLib/res/values-ar/strings.xml @@ -19,7 +19,7 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"جارٍ التأكّد من الاتصال بالإنترنت..."</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"الاتصال التلقائي غير مُفعَّل."</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"تم الحفظ من قِبل <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"تم الحفظ من قِبل <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"لن يتم الاتصال بالإنترنت تلقائيًا."</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"لا يتوفّر اتصال بالإنترنت"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"حدثت مشكلة في المصادقة."</string> diff --git a/libs/WifiTrackerLib/res/values-ca/arrays.xml b/libs/WifiTrackerLib/res/values-ca/arrays.xml index 3d226f588..8c28cf048 100644 --- a/libs/WifiTrackerLib/res/values-ca/arrays.xml +++ b/libs/WifiTrackerLib/res/values-ca/arrays.xml @@ -26,7 +26,7 @@ <item msgid="9055468790485684083">"S\'està connectant…"</item> <item msgid="6099499723199990208">"S\'està autenticant…"</item> <item msgid="6794055951297347103">"S\'està obtenint l\'adreça IP…"</item> - <item msgid="5450920562291300229">"Connectada"</item> + <item msgid="5450920562291300229">"Connectat"</item> <item msgid="6332116533879646145">"Suspesa"</item> <item msgid="294459081501073818">"S\'està desconnectant…"</item> <item msgid="1577368920272598676">"Desconnectada"</item> diff --git a/libs/WifiTrackerLib/res/values-ca/strings.xml b/libs/WifiTrackerLib/res/values-ca/strings.xml index 5d1002fd3..fc28a37a1 100644 --- a/libs/WifiTrackerLib/res/values-ca/strings.xml +++ b/libs/WifiTrackerLib/res/values-ca/strings.xml @@ -21,7 +21,7 @@ <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"Connexió automàtica desactivada"</string> <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Desada per <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"No es connectarà automàticament"</string> - <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Sense accés a Internet"</string> + <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"No hi ha accés a Internet"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Problema d\'autenticació"</string> <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"Comprova la contrasenya i torna-ho a provar"</string> <string name="wifitrackerlib_wifi_disabled_network_failure" msgid="3046956554224277166">"Error de configuració d\'IP"</string> diff --git a/libs/WifiTrackerLib/res/values-cs/strings.xml b/libs/WifiTrackerLib/res/values-cs/strings.xml index ed574bb8a..0472dc5f7 100644 --- a/libs/WifiTrackerLib/res/values-cs/strings.xml +++ b/libs/WifiTrackerLib/res/values-cs/strings.xml @@ -19,9 +19,9 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"Kontrola přístupu k internetu…"</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"Automatické připojení je vypnuté"</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Uložil(a): <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Uloženo uživatelem <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"Nelze se automaticky připojit"</string> - <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Není připojení k internetu"</string> + <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Nejste připojeni k internetu"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Problém s ověřením"</string> <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"Zkontrolujte heslo a zkuste to znovu"</string> <string name="wifitrackerlib_wifi_disabled_network_failure" msgid="3046956554224277166">"Selhání konfigurace protokolu IP"</string> diff --git a/libs/WifiTrackerLib/res/values-eu/strings.xml b/libs/WifiTrackerLib/res/values-eu/strings.xml index 9e5526f3c..58cc61c3f 100644 --- a/libs/WifiTrackerLib/res/values-eu/strings.xml +++ b/libs/WifiTrackerLib/res/values-eu/strings.xml @@ -75,7 +75,7 @@ <string name="wifitrackerlib_osu_completing_sign_up" msgid="4359503050543182480">"Izena ematen…"</string> <string name="wifitrackerlib_osu_sign_up_failed" msgid="3964140125523395898">"Ezin izan da erregistratu. Berriro saiatzeko, ukitu hau."</string> <string name="wifitrackerlib_osu_sign_up_complete" msgid="3279606633343124580">"Erregistratu da. Konektatzen…"</string> - <string name="wifitrackerlib_imsi_protection_warning" msgid="7202210931586169466">"Gailuaren kokapenaren jarraipena egiteko balio duen SIM identifikatzaile bat jasotzen du sare honek. "<annotation id="url">"Lortu informazio gehiago"</annotation></string> + <string name="wifitrackerlib_imsi_protection_warning" msgid="7202210931586169466">"Gailuaren kokapenaren jarraipena egiteko balio duen SIM ID bat jasotzen du sare honek. "<annotation id="url">"Lortu informazio gehiago"</annotation></string> <string name="wifitrackerlib_wifi_wont_autoconnect_for_now" msgid="4923161724964349851">"Oraingoz ez da automatikoki konektatuko wifira"</string> <string name="wifitrackerlib_wifi_standard_unknown" msgid="8339211498889012019">"Ezezaguna"</string> <string name="wifitrackerlib_wifi_standard_legacy" msgid="7760511318791054384">"Zaharkitua"</string> diff --git a/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml b/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml index 968ceaccf..9248e42fe 100644 --- a/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml +++ b/libs/WifiTrackerLib/res/values-fr-rCA/strings.xml @@ -19,7 +19,7 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"Recherche d\'un accès Internet…"</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"La connexion automatique est désactivée"</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Enregistré par <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Enregistrés par <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"Reconnexion automatique impossible"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Aucun accès à Internet"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Problème d\'authentification"</string> @@ -57,7 +57,7 @@ <string name="wifitrackerlib_wifi_security_short_eap_suiteb" msgid="6335062557041604336">"Suite-B-192"</string> <string name="wifitrackerlib_wifi_security_eap_suiteb" msgid="4715703239786225763">"WPA3-Enterprise 192 bits"</string> <string name="wifitrackerlib_wifi_security_short_wpa_wpa2" msgid="6770438383385707243">"WPA/WPA2"</string> - <string name="wifitrackerlib_wifi_security_wpa_wpa2" msgid="5767878305316110228">"WPA/WPA2-Personnel"</string> + <string name="wifitrackerlib_wifi_security_wpa_wpa2" msgid="5767878305316110228">"WPA/WPA2-Personal"</string> <string name="wifitrackerlib_wifi_security_short_wpa_wpa2_wpa3" msgid="4489424775550194618">"WPA/WPA2/WPA3"</string> <string name="wifitrackerlib_wifi_security_wpa_wpa2_wpa3" msgid="4154428413248489642">"WPA/WPA2/WPA3-Personal"</string> <string name="wifitrackerlib_wifi_security_wep" msgid="7714779033848180369">"WEP"</string> diff --git a/libs/WifiTrackerLib/res/values-hy/strings.xml b/libs/WifiTrackerLib/res/values-hy/strings.xml index f1749bb5b..1a881b219 100644 --- a/libs/WifiTrackerLib/res/values-hy/strings.xml +++ b/libs/WifiTrackerLib/res/values-hy/strings.xml @@ -19,7 +19,7 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"Ինտերնետի հասանելիության ստուգում…"</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"Ավտոմատ միացումն անջատված է"</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Պահված է՝ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Ով է պահել՝ <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"Չի միանա ավտոմատ"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Ինտերնետ կապ չկա"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Նույնականացման խնդիր"</string> diff --git a/libs/WifiTrackerLib/res/values-iw/strings.xml b/libs/WifiTrackerLib/res/values-iw/strings.xml index 500806c8a..c2366b405 100644 --- a/libs/WifiTrackerLib/res/values-iw/strings.xml +++ b/libs/WifiTrackerLib/res/values-iw/strings.xml @@ -19,7 +19,7 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"מתבצעת בדיקה לצורך גישה לאינטרנט..."</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"החיבור האוטומטי כבוי"</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"נשמרה על-ידי: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"נשמרה על-ידי <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"לא יתבצע חיבור באופן אוטומטי"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"אין גישה לאינטרנט"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"בעיית אימות"</string> diff --git a/libs/WifiTrackerLib/res/values-kn/strings.xml b/libs/WifiTrackerLib/res/values-kn/strings.xml index e47928534..acdc3716f 100644 --- a/libs/WifiTrackerLib/res/values-kn/strings.xml +++ b/libs/WifiTrackerLib/res/values-kn/strings.xml @@ -23,18 +23,18 @@ <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವಿಲ್ಲ"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"ದೃಢೀಕರಣದ ಸಮಸ್ಯೆ"</string> - <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"ಪಾಸ್ವರ್ಡ್ ಪರಿಶೀಲಿಸಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string> + <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"ಪಾಸ್ವರ್ಡ್ ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string> <string name="wifitrackerlib_wifi_disabled_network_failure" msgid="3046956554224277166">"IP ಕಾನ್ಫಿಗರೇಶನ್ ವೈಫಲ್ಯ"</string> <string name="wifitrackerlib_wifi_disabled_transition_disable_indication" msgid="6416221593061166867">"ಪ್ರಸ್ತುತ ಭದ್ರತಾ ಸೆಟ್ಟಿಂಗ್ಗಳ ಜೊತೆ ಲಭ್ಯವಿಲ್ಲ"</string> <string name="wifitrackerlib_wifi_disabled_generic" msgid="4278806060337007814">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> - <string name="wifitrackerlib_wifi_ap_unable_to_handle_new_sta" msgid="931922372010639716">"ಆ್ಯಕ್ಸೆಸ್ ಪಾಯಿಂಟ್ ತಾತ್ಕಾಲಿಕವಾಗಿ ಭರ್ತಿಯಾಗಿದೆ"</string> + <string name="wifitrackerlib_wifi_ap_unable_to_handle_new_sta" msgid="931922372010639716">"ಪ್ರವೇಶ ಕೇಂದ್ರ ತಾತ್ಕಾಲಿಕವಾಗಿ ಭರ್ತಿಯಾಗಿದೆ"</string> <string name="wifitrackerlib_wifi_poor_channel_conditions" msgid="26484680900376236">"ತಾತ್ಕಾಲಿಕ ಕಳಪೆ ನೆಟ್ವರ್ಕ್ ಸ್ಥಿತಿಗಳು"</string> <string name="wifitrackerlib_wifi_mbo_oce_assoc_disallowed_insufficient_rssi" msgid="5078611817423181773">"ದುರ್ಬಲ ಸಿಗ್ನಲ್. ರೂಟರ್ನ ಹತ್ತಿರ ಹೋಗಿ ಕನೆಕ್ಟ್ ಮಾಡಿ ನೋಡಿ."</string> <string name="wifitrackerlib_wifi_mbo_assoc_disallowed_max_num_sta_associated" msgid="4418848919914618807">"ನೆಟ್ವರ್ಕ್ ಸಾಮರ್ಥ್ಯದ ಮಿತಿ ಮೀರಿದೆ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="wifitrackerlib_wifi_mbo_assoc_disallowed_cannot_connect" msgid="2692286425448897083">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="wifitrackerlib_wifi_network_not_found" msgid="1308764769892463388">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="wifitrackerlib_wifi_disconnected" msgid="3320414360982942679">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string> - <string name="wifitrackerlib_wifi_remembered" msgid="2406091442008343041">"ಸೇವ್ ಮಾಡಲಾಗಿದೆ"</string> + <string name="wifitrackerlib_wifi_remembered" msgid="2406091442008343041">"ಉಳಿಸಲಾಗಿದೆ"</string> <string name="wifitrackerlib_wifi_metered_label" msgid="8818508951778620385">"ಮೀಟರ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="wifitrackerlib_wifi_unmetered_label" msgid="1902150402929678469">"ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ"</string> <string name="wifitrackerlib_connected_via_app" msgid="7823921840931347560">"<xliff:g id="NAME">%1$s</xliff:g> ಆ್ಯಪ್ ಮೂಲಕ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string> diff --git a/libs/WifiTrackerLib/res/values-or/arrays.xml b/libs/WifiTrackerLib/res/values-or/arrays.xml index 838ab874c..607552e7b 100644 --- a/libs/WifiTrackerLib/res/values-or/arrays.xml +++ b/libs/WifiTrackerLib/res/values-or/arrays.xml @@ -26,7 +26,7 @@ <item msgid="9055468790485684083">"ସଂଯୋଗ ହେଉଛି…"</item> <item msgid="6099499723199990208">"ପ୍ରାମାଣିକରଣ କରାଯାଉଛି…"</item> <item msgid="6794055951297347103">"IP ଠିକଣା ପ୍ରାପ୍ତ କରୁଛି…"</item> - <item msgid="5450920562291300229">"କନେକ୍ଟ କରାଯାଇଛି"</item> + <item msgid="5450920562291300229">"ସଂଯୋଗ ହୋଇଛି"</item> <item msgid="6332116533879646145">"ସାମୟିକ ଭାବରେ ବନ୍ଦ କରାଯାଇଛି"</item> <item msgid="294459081501073818">"ବିଚ୍ଛିନ୍ନ କରାଯାଉଛି…"</item> <item msgid="1577368920272598676">"ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି"</item> diff --git a/libs/WifiTrackerLib/res/values-or/strings.xml b/libs/WifiTrackerLib/res/values-or/strings.xml index 9e992f962..2cfe11bbe 100644 --- a/libs/WifiTrackerLib/res/values-or/strings.xml +++ b/libs/WifiTrackerLib/res/values-or/strings.xml @@ -34,7 +34,7 @@ <string name="wifitrackerlib_wifi_mbo_assoc_disallowed_cannot_connect" msgid="2692286425448897083">"ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="wifitrackerlib_wifi_network_not_found" msgid="1308764769892463388">"ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="wifitrackerlib_wifi_disconnected" msgid="3320414360982942679">"ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି"</string> - <string name="wifitrackerlib_wifi_remembered" msgid="2406091442008343041">"ସେଭ କରାଯାଇଛି"</string> + <string name="wifitrackerlib_wifi_remembered" msgid="2406091442008343041">"ସେଭ୍ କରାଯାଇଛି"</string> <string name="wifitrackerlib_wifi_metered_label" msgid="8818508951778620385">"ମିଟର ହୋଇଥିବା"</string> <string name="wifitrackerlib_wifi_unmetered_label" msgid="1902150402929678469">"ମିଟର ହୋଇନଥିବା"</string> <string name="wifitrackerlib_connected_via_app" msgid="7823921840931347560">"<xliff:g id="NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ ସଂଯୋଗ କରାଯାଇଛି"</string> diff --git a/libs/WifiTrackerLib/res/values-pa/strings.xml b/libs/WifiTrackerLib/res/values-pa/strings.xml index 322e547c7..ba9beec75 100644 --- a/libs/WifiTrackerLib/res/values-pa/strings.xml +++ b/libs/WifiTrackerLib/res/values-pa/strings.xml @@ -23,7 +23,7 @@ <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"ਪ੍ਰਮਾਣੀਕਰਨ ਸਮੱਸਿਆ"</string> - <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰ ਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string> + <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string> <string name="wifitrackerlib_wifi_disabled_network_failure" msgid="3046956554224277166">"IP ਸੰਰੂਪਣ ਅਸਫਲਤਾ"</string> <string name="wifitrackerlib_wifi_disabled_transition_disable_indication" msgid="6416221593061166867">"ਮੌਜੂਦਾ ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ ਨਾਲ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> <string name="wifitrackerlib_wifi_disabled_generic" msgid="4278806060337007814">"ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> diff --git a/libs/WifiTrackerLib/res/values-pt-rPT/arrays.xml b/libs/WifiTrackerLib/res/values-pt-rPT/arrays.xml index 351582278..822b09180 100644 --- a/libs/WifiTrackerLib/res/values-pt-rPT/arrays.xml +++ b/libs/WifiTrackerLib/res/values-pt-rPT/arrays.xml @@ -26,7 +26,7 @@ <item msgid="9055468790485684083">"A ligar…"</item> <item msgid="6099499723199990208">"A autenticar…"</item> <item msgid="6794055951297347103">"A obter endereço IP…"</item> - <item msgid="5450920562291300229">"Ligada"</item> + <item msgid="5450920562291300229">"Ligado"</item> <item msgid="6332116533879646145">"Suspenso"</item> <item msgid="294459081501073818">"A desligar…"</item> <item msgid="1577368920272598676">"Desligado"</item> diff --git a/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml b/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml index 0ba5796f0..179435b6f 100644 --- a/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml +++ b/libs/WifiTrackerLib/res/values-pt-rPT/strings.xml @@ -23,7 +23,7 @@ <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"Não é efetuada uma ligação automaticamente."</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Sem acesso à Internet."</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Problema de autenticação"</string> - <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"Verifique palavra-passe e tente de novo"</string> + <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"Verifique a palavra-passe e tente novamente."</string> <string name="wifitrackerlib_wifi_disabled_network_failure" msgid="3046956554224277166">"Falha de configuração de IP"</string> <string name="wifitrackerlib_wifi_disabled_transition_disable_indication" msgid="6416221593061166867">"Indisponível com as definições de segurança atuais"</string> <string name="wifitrackerlib_wifi_disabled_generic" msgid="4278806060337007814">"Desativada"</string> diff --git a/libs/WifiTrackerLib/res/values-ru/strings.xml b/libs/WifiTrackerLib/res/values-ru/strings.xml index b25060f77..befda266b 100644 --- a/libs/WifiTrackerLib/res/values-ru/strings.xml +++ b/libs/WifiTrackerLib/res/values-ru/strings.xml @@ -21,9 +21,9 @@ <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"Автоподключение отключено"</string> <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Сохранено: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"Подключение не будет выполняться автоматически"</string> - <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Без доступа к интернету"</string> + <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Без доступа к Интернету"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Ошибка аутентификации"</string> - <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"Неверный пароль. Повторите попытку."</string> + <string name="wifitrackerlib_wifi_check_password_try_again" msgid="2327777719175574699">"Похоже, вы указали неверный пароль. Повторите попытку."</string> <string name="wifitrackerlib_wifi_disabled_network_failure" msgid="3046956554224277166">"Ошибка конфигурации IP"</string> <string name="wifitrackerlib_wifi_disabled_transition_disable_indication" msgid="6416221593061166867">"Доступ закрыт согласно настройкам безопасности"</string> <string name="wifitrackerlib_wifi_disabled_generic" msgid="4278806060337007814">"Отключено"</string> diff --git a/libs/WifiTrackerLib/res/values-sk/strings.xml b/libs/WifiTrackerLib/res/values-sk/strings.xml index c757dc71c..e3e495511 100644 --- a/libs/WifiTrackerLib/res/values-sk/strings.xml +++ b/libs/WifiTrackerLib/res/values-sk/strings.xml @@ -19,7 +19,7 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"Kontroluje sa dostupnosť internetového pripojenia..."</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"Automatické pripojenie je vypnuté"</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Uložila aplikácia <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"Uložil používateľ <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"Nedôjde k automatickému pripojeniu"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"Bez prístupu k internetu"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"Problém s overením"</string> diff --git a/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml b/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml index 5be532e2e..cbf3a82b8 100644 --- a/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml +++ b/libs/WifiTrackerLib/res/values-zh-rCN/strings.xml @@ -19,7 +19,7 @@ <string name="wifitrackerlib_summary_separator" msgid="6613897475167609815">" / "</string> <string name="wifitrackerlib_checking_for_internet_access" msgid="4787495471423429472">"正在检查互联网访问权限…"</string> <string name="wifitrackerlib_auto_connect_disable" msgid="4714835547164460651">"自动连接已关闭"</string> - <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"由<xliff:g id="NAME">%1$s</xliff:g>保存"</string> + <string name="wifitrackerlib_saved_network" msgid="5353460010746484376">"已由<xliff:g id="NAME">%1$s</xliff:g>保存"</string> <string name="wifitrackerlib_wifi_no_internet_no_reconnect" msgid="6618216332537706908">"无法自动连接"</string> <string name="wifitrackerlib_wifi_no_internet" msgid="4998563744669636949">"无法访问互联网"</string> <string name="wifitrackerlib_wifi_disabled_password_failure" msgid="2850244218754633550">"身份验证出现问题"</string> diff --git a/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml b/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml index 3b2aae751..cb8ac49c4 100644 --- a/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml +++ b/libs/WifiTrackerLib/res/values-zh-rHK/strings.xml @@ -43,7 +43,7 @@ <string name="wifitrackerlib_private_dns_broken" msgid="6049401148262718707">"無法存取私人 DNS 伺服器"</string> <string name="wifitrackerlib_wifi_connected_cannot_provide_internet" msgid="3803471522215612745">"已連接裝置,但無法提供互聯網連線。"</string> <string name="wifi_connected_low_quality" msgid="4478331645458058445">"品質欠佳"</string> - <string name="wifitrackerlib_admin_restricted_network" msgid="5439914801076897515">"你的機構禁止使用"</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_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> diff --git a/libs/WifiTrackerLib/res/values/config.xml b/libs/WifiTrackerLib/res/values/config.xml new file mode 100644 index 000000000..91df95872 --- /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">false</bool> +</resources> diff --git a/libs/WifiTrackerLib/res/values/strings.xml b/libs/WifiTrackerLib/res/values/strings.xml index 691fb214f..5ebf2ba26 100644 --- a/libs/WifiTrackerLib/res/values/strings.xml +++ b/libs/WifiTrackerLib/res/values/strings.xml @@ -247,5 +247,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/src/com/android/wifitrackerlib/BaseWifiTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java index 5f1abd9a5..e464090a5 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java @@ -42,6 +42,7 @@ import android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus; import android.net.wifi.sharedconnectivity.app.SharedConnectivityClientCallback; import android.net.wifi.sharedconnectivity.app.SharedConnectivityManager; import android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.telephony.SubscriptionManager; @@ -93,8 +94,6 @@ public class BaseWifiTracker { private static boolean sVerboseLogging; - public static boolean mEnableSharedConnectivityFeature = false; - public static boolean isVerboseLoggingEnabled() { return BaseWifiTracker.sVerboseLogging; } @@ -102,6 +101,7 @@ public class BaseWifiTracker { 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 +126,8 @@ public class BaseWifiTracker { 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 +136,7 @@ public class BaseWifiTracker { }; private final BaseWifiTracker.Scanner mScanner; private final BaseWifiTrackerCallback mListener; + private final @NonNull LifecycleObserver mLifecycleObserver; protected final WifiTrackerInjector mInjector; protected final Context mContext; @@ -189,6 +192,20 @@ public class BaseWifiTracker { @WorkerThread public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { + List<Network> underlyingNetworks = + networkCapabilities.getUnderlyingNetworks(); + if (underlyingNetworks != null) { + Network currentWifiNetwork = mWifiManager.getCurrentNetwork(); + if (underlyingNetworks.contains(currentWifiNetwork)) { + // 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. + handleDefaultNetworkCapabilitiesChanged(currentWifiNetwork, + new NetworkCapabilities.Builder(networkCapabilities) + .setTransportInfo(mWifiManager.getConnectionInfo()) + .build()); + return; + } + } handleDefaultNetworkCapabilitiesChanged(network, networkCapabilities); } @@ -279,7 +296,12 @@ public class BaseWifiTracker { /** * 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 +314,7 @@ public class BaseWifiTracker { @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 +326,7 @@ public class BaseWifiTracker { 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 +344,16 @@ public class BaseWifiTracker { public void onDestroy() { BaseWifiTracker.this.onDestroy(); } - }); + }; + if (lifecycle != null) { + lifecycle.addObserver(mLifecycleObserver); + } 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 +367,31 @@ public class BaseWifiTracker { mScanResultUpdater = new ScanResultUpdater(clock, maxScanAgeMillis + scanIntervalMillis); mScanner = new BaseWifiTracker.Scanner(workerHandler.getLooper()); - sVerboseLogging = mWifiManager.isVerboseLoggingEnabled(); + if (mContext.getResources().getBoolean( + R.bool.wifitrackerlib_enable_verbose_logging_for_userdebug) + && Build.TYPE.equals("userdebug")) { + sVerboseLogging = true; + } else { + sVerboseLogging = mWifiManager.isVerboseLoggingEnabled(); + } + } + + /** + * 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. + sVerboseLogging = false; + } + + /** + * Returns the LifecycleObserver to listen on the app's lifecycle state. + */ + @AnyThread + public LifecycleObserver getLifecycleObserver() { + return mLifecycleObserver; } /** @@ -360,6 +409,9 @@ public class BaseWifiTracker { 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 +554,14 @@ public class BaseWifiTracker { } /** + * 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 +811,7 @@ public class BaseWifiTracker { * 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 +829,8 @@ public class BaseWifiTracker { 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); diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java index a30dd5e7c..6b392954f 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkDetailsTracker.java @@ -111,7 +111,7 @@ public class HotspotNetworkDetailsTracker extends NetworkDetailsTracker { @WorkerThread @Override protected void handleServiceConnected() { - if (mEnableSharedConnectivityFeature && mSharedConnectivityManager != null) { + if (mInjector.isSharedConnectivityFeatureEnabled() && mSharedConnectivityManager != null) { mHotspotNetworkData = mSharedConnectivityManager.getHotspotNetworks().stream().filter( network -> network.getDeviceId() == mChosenEntry.getHotspotNetworkEntryKey() .getDeviceId()).findFirst().orElse(null); @@ -126,7 +126,7 @@ public class HotspotNetworkDetailsTracker extends NetworkDetailsTracker { @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 0495fef9c..9da34caa0 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java @@ -16,6 +16,7 @@ package com.android.wifitrackerlib; +import static android.net.wifi.WifiInfo.DEFAULT_MAC_ADDRESS; import static android.os.Build.VERSION_CODES; import android.annotation.TargetApi; @@ -28,6 +29,7 @@ import android.net.wifi.sharedconnectivity.app.NetworkProviderInfo; 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; @@ -42,6 +44,7 @@ import org.json.JSONObject; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Collections; import java.util.Objects; /** @@ -59,8 +62,6 @@ public class HotspotNetworkEntry extends WifiEntry { @Nullable private HotspotNetwork mHotspotNetworkData; @NonNull private HotspotNetworkEntryKey mKey; - private boolean mServerInitiatedConnection = false; - /** * If editing this IntDef also edit the definition in: * {@link android.net.wifi.sharedconnectivity.app.HotspotNetwork} @@ -123,7 +124,7 @@ public class HotspotNetworkEntry extends WifiEntry { @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 +141,7 @@ public class HotspotNetworkEntry extends WifiEntry { @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 +176,21 @@ public class HotspotNetworkEntry extends WifiEntry { 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 int getLevel() { + if (getConnectedState() == CONNECTED_STATE_DISCONNECTED) { + return WIFI_LEVEL_MAX; + } + return super.getLevel(); } @Override - public String getTitle() { + public synchronized String getTitle() { if (mHotspotNetworkData == null) { return ""; } @@ -187,11 +198,11 @@ public class HotspotNetworkEntry extends WifiEntry { } @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, @@ -205,7 +216,7 @@ public class HotspotNetworkEntry extends WifiEntry { * * @return Display string. */ - public String getAlternateSummary() { + public synchronized String getAlternateSummary() { if (mHotspotNetworkData == null) { return ""; } @@ -215,13 +226,73 @@ public class HotspotNetworkEntry extends WifiEntry { mHotspotNetworkData.getNetworkProviderInfo().getDeviceName())); } + @Override + public synchronized String getSsid() { + StandardWifiEntry.ScanResultKey scanResultKey = mKey.getScanResultKey(); + if (scanResultKey == null) { + return null; + } + return scanResultKey.getSsid(); + } + + @Override + @Nullable + 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 +305,7 @@ public class HotspotNetworkEntry extends WifiEntry { * @return NetworkType enum. */ @NetworkType - public int getNetworkType() { + public synchronized int getNetworkType() { if (mHotspotNetworkData == null) { return HotspotNetwork.NETWORK_TYPE_UNKNOWN; } @@ -247,7 +318,7 @@ public class HotspotNetworkEntry extends WifiEntry { * @return DeviceType enum. */ @DeviceType - public int getDeviceType() { + public synchronized int getDeviceType() { if (mHotspotNetworkData == null) { return NetworkProviderInfo.DEVICE_TYPE_UNKNOWN; } @@ -258,7 +329,7 @@ public class HotspotNetworkEntry extends WifiEntry { * 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,7 +339,7 @@ public class HotspotNetworkEntry extends WifiEntry { /** * If the host device is currently charging its battery. */ - public boolean isBatteryCharging() { + public synchronized boolean isBatteryCharging() { if (mHotspotNetworkData == null) { return false; } @@ -276,12 +347,12 @@ public class HotspotNetworkEntry extends WifiEntry { } @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 +365,12 @@ public class HotspotNetworkEntry extends WifiEntry { } @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) { mDisconnectCallback = callback; if (mSharedConnectivityManager == null) { if (callback != null) { @@ -324,7 +395,7 @@ public class HotspotNetworkEntry extends WifiEntry { if (mConnectCallback == null) return; switch (status) { case HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT: - mServerInitiatedConnection = true; + mCalledConnect = true; notifyOnUpdated(); break; case HotspotNetworkConnectionStatus.CONNECTION_STATUS_UNKNOWN_ERROR: @@ -337,7 +408,7 @@ public class HotspotNetworkEntry extends WifiEntry { case HotspotNetworkConnectionStatus.CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED: mCallbackHandler.post(() -> mConnectCallback.onConnectResult( ConnectCallback.CONNECT_STATUS_FAILURE_UNKNOWN)); - mServerInitiatedConnection = false; + mCalledConnect = false; notifyOnUpdated(); break; default: @@ -348,14 +419,11 @@ public class HotspotNetworkEntry extends WifiEntry { 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 +433,12 @@ public class HotspotNetworkEntry extends WifiEntry { */ 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 +463,6 @@ public class HotspotNetworkEntry extends WifiEntry { 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 +481,6 @@ public class HotspotNetworkEntry extends WifiEntry { 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 +500,6 @@ public class HotspotNetworkEntry extends WifiEntry { } /** - * 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 diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java index f163ee300..c5632c17e 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/KnownNetworkEntry.java @@ -19,7 +19,6 @@ package com.android.wifitrackerlib; 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 class KnownNetworkEntry extends StandardWifiEntry{ 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 413a1ee2d..090592dea 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java @@ -21,7 +21,6 @@ import static android.net.wifi.WifiInfo.sanitizeSsid; import static com.android.wifitrackerlib.Utils.getVerboseLoggingDescription; -import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; @@ -42,16 +41,14 @@ public class MergedCarrierEntry extends WifiEntry { 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; } @@ -170,7 +167,10 @@ public class MergedCarrierEntry extends WifiEntry { } } - /* package */ int getSubscriptionId() { + /** + * Returns the current subscription ID this merged carrier network is for. + */ + public int getSubscriptionId() { return mSubscriptionId; } @@ -178,4 +178,11 @@ public class MergedCarrierEntry extends WifiEntry { 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 efeb19ad0..a0261a80a 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 @@ public class NetworkRequestEntry extends StandardWifiEntry { 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/OsuWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java index 7d8ad4edb..ffb933009 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 androidx.core.util.Preconditions.checkNotNull; 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.ArrayList; 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 @@ class OsuWifiEntry extends WifiEntry { @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 @@ class OsuWifiEntry extends WifiEntry { */ 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 @@ class OsuWifiEntry extends WifiEntry { mIsAlreadyProvisioned = isAlreadyProvisioned; } - private boolean hasAdminRestrictions() { + @Override + public synchronized boolean hasAdminRestrictions() { if (mHasAddConfigUserRestriction && !mIsAlreadyProvisioned) { return true; } @@ -314,4 +313,13 @@ class OsuWifiEntry extends WifiEntry { } } } + + @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 b6be43f48..d4c1b4ad1 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java @@ -94,7 +94,7 @@ public class PasspointNetworkDetailsTracker extends NetworkDetailsTracker { uniqueIdToPasspointWifiEntryKey(passpointConfig.getUniqueId()))) .findAny(); if (optionalPasspointConfig.isPresent()) { - mChosenEntry = new PasspointWifiEntry(mInjector, mContext, mMainHandler, + mChosenEntry = new PasspointWifiEntry(mInjector, mMainHandler, optionalPasspointConfig.get(), mWifiManager, false /* forSavedNetworksPage */); } else { @@ -222,7 +222,7 @@ public class PasspointNetworkDetailsTracker extends NetworkDetailsTracker { 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 c47570061..cb500c23c 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java @@ -70,8 +70,6 @@ public class PasspointWifiEntry extends WifiEntry implements WifiEntry.WifiEntry @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 +93,13 @@ public class PasspointWifiEntry extends WifiEntry implements WifiEntry.WifiEntry */ 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 +121,12 @@ public class PasspointWifiEntry extends WifiEntry implements WifiEntry.WifiEntry @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; @@ -468,13 +462,14 @@ public class PasspointWifiEntry extends WifiEntry implements WifiEntry.WifiEntry @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 +617,17 @@ public class PasspointWifiEntry extends WifiEntry implements WifiEntry.WifiEntry 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 cf6288a2f..fa9c320db 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/SavedNetworkTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/SavedNetworkTracker.java @@ -468,7 +468,7 @@ public class SavedNetworkTracker extends BaseWifiTracker { // 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 +500,7 @@ public class SavedNetworkTracker extends BaseWifiTracker { // 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 b1a8f83e7..2accc2321 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java @@ -83,10 +83,10 @@ public class StandardNetworkDetailsTracker extends NetworkDetailsTracker { 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 diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java index 95ab2599c..1c8e06c2c 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java @@ -48,7 +48,6 @@ import static com.android.wifitrackerlib.Utils.getVerboseLoggingDescription; 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 @@ public class StandardWifiEntry extends WifiEntry { @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 @@ public class StandardWifiEntry extends WifiEntry { 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 @@ public class StandardWifiEntry extends WifiEntry { 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); @@ -590,74 +585,7 @@ public class StandardWifiEntry extends WifiEntry { @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 +602,10 @@ public class StandardWifiEntry extends WifiEntry { @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 +1003,8 @@ public class StandardWifiEntry extends WifiEntry { 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 3392ac2e6..ad5231d4e 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java @@ -19,6 +19,14 @@ package com.android.wifitrackerlib; 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; @@ -1080,26 +1088,59 @@ public class Utils { } /** - * Converts a frequency in MHz to the display string of the corresponding Wi-Fi band. + * 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 String getBandString(@NonNull Context context, int freqMhz) { + public static int getBand(int freqMhz) { if (freqMhz >= WifiEntry.MIN_FREQ_24GHZ && freqMhz < WifiEntry.MAX_FREQ_24GHZ) { - return context.getResources().getString(R.string.wifitrackerlib_wifi_band_24_ghz); + return WifiScanner.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); + return WifiScanner.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); + return WifiScanner.WIFI_BAND_6_GHZ; } else { - return context.getResources().getString(R.string.wifitrackerlib_wifi_band_unknown); + 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 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 +1150,49 @@ public class Utils { .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) + .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 +1207,78 @@ public class Utils { } 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 0c575f73b..0dea00695 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 androidx.core.util.Preconditions.checkNotNull; 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.WifiConfiguration; 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 @@ public class WifiEntry { 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 @@ public class WifiEntry { 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. @@ -253,10 +259,14 @@ public class WifiEntry { 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; @@ -658,6 +668,20 @@ public class WifiEntry { 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; @@ -733,6 +757,13 @@ public class WifiEntry { } /** + * 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 +901,21 @@ public class WifiEntry { /** * 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; + mWifiInfo = primaryWifiInfo; + if (networkInfo != null) { + mNetworkInfo = networkInfo; + } notifyOnUpdated(); } @@ -1088,18 +1122,9 @@ public class WifiEntry { @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 +1132,7 @@ public class WifiEntry { 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 +1173,61 @@ public class WifiEntry { @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(); } /** diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java index dc2a7b4dc..4abffbaf8 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java @@ -70,11 +70,11 @@ import androidx.lifecycle.Lifecycle; 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; @@ -236,8 +236,8 @@ public class WifiPickerTracker extends BaseWifiTracker { // 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 +265,7 @@ public class WifiPickerTracker extends BaseWifiTracker { allEntries.addAll(mSuggestedWifiEntryCache); allEntries.addAll(mPasspointWifiEntryCache.values()); allEntries.addAll(mOsuWifiEntryCache.values()); - if (mEnableSharedConnectivityFeature) { + if (mInjector.isSharedConnectivityFeatureEnabled()) { allEntries.addAll(mKnownNetworkEntryCache); allEntries.addAll(mHotspotNetworkEntryCache); } @@ -283,12 +283,11 @@ public class WifiPickerTracker extends BaseWifiTracker { mSuggestedWifiEntryCache.clear(); mPasspointWifiEntryCache.clear(); mOsuWifiEntryCache.clear(); - if (mEnableSharedConnectivityFeature) { + if (mInjector.isSharedConnectivityFeatureEnabled()) { mKnownNetworkEntryCache.clear(); mHotspotNetworkEntryCache.clear(); } mNetworkRequestEntry = null; - mMergedCarrierEntry = null; } @WorkerThread @@ -364,7 +363,7 @@ public class WifiPickerTracker extends BaseWifiTracker { updateNetworkRequestEntryScans(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. @@ -380,8 +379,8 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +390,17 @@ public class WifiPickerTracker extends BaseWifiTracker { @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 +464,7 @@ public class WifiPickerTracker extends BaseWifiTracker { @WorkerThread @Override protected void handleKnownNetworksUpdated(List<KnownNetwork> networks) { - if (mEnableSharedConnectivityFeature) { + if (mInjector.isSharedConnectivityFeatureEnabled()) { mKnownNetworkDataCache.clear(); mKnownNetworkDataCache.addAll(networks); updateKnownNetworkEntryScans(mScanResultUpdater.getScanResults()); @@ -466,7 +476,7 @@ public class WifiPickerTracker extends BaseWifiTracker { @WorkerThread @Override protected void handleHotspotNetworksUpdated(List<HotspotNetwork> networks) { - if (mEnableSharedConnectivityFeature) { + if (mInjector.isSharedConnectivityFeatureEnabled()) { mHotspotNetworkDataCache.clear(); mHotspotNetworkDataCache.addAll(networks); updateHotspotNetworkEntries(); @@ -499,7 +509,7 @@ public class WifiPickerTracker extends BaseWifiTracker { @WorkerThread @Override protected void handleServiceConnected() { - if (mEnableSharedConnectivityFeature) { + if (mInjector.isSharedConnectivityFeatureEnabled()) { mKnownNetworkDataCache.clear(); mKnownNetworkDataCache.addAll(mSharedConnectivityManager.getKnownNetworks()); mHotspotNetworkDataCache.clear(); @@ -510,6 +520,19 @@ public class WifiPickerTracker extends BaseWifiTracker { } } + @TargetApi(VERSION_CODES.UPSIDE_DOWN_CAKE) + @WorkerThread + @Override + protected void handleServiceDisconnected() { + if (mInjector.isSharedConnectivityFeatureEnabled()) { + mKnownNetworkDataCache.clear(); + mHotspotNetworkDataCache.clear(); + mKnownNetworkEntryCache.clear(); + mHotspotNetworkEntryCache.clear(); + updateWifiEntries(); + } + } + /** * Update the list returned by getWifiEntries() with the current states of the entry caches. */ @@ -520,7 +543,7 @@ public class WifiPickerTracker extends BaseWifiTracker { mActiveWifiEntries.addAll(mStandardWifiEntryCache); mActiveWifiEntries.addAll(mSuggestedWifiEntryCache); mActiveWifiEntries.addAll(mPasspointWifiEntryCache.values()); - if (mEnableSharedConnectivityFeature) { + if (mInjector.isSharedConnectivityFeatureEnabled()) { mActiveWifiEntries.addAll(mHotspotNetworkEntryCache); } if (mNetworkRequestEntry != null) { @@ -566,6 +589,7 @@ public class WifiPickerTracker extends BaseWifiTracker { hotspotNetworkEntry.getHotspotNetworkEntryKey().getScanResultKey()); } } + Set<ScanResultKey> savedEntryKeys = new ArraySet<>(); for (StandardWifiEntry entry : mStandardWifiEntryCache) { entry.updateAdminRestrictions(); if (mActiveWifiEntries.contains(entry)) { @@ -580,14 +604,19 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +634,11 @@ public class WifiPickerTracker extends BaseWifiTracker { && !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,9 +646,19 @@ public class WifiPickerTracker extends BaseWifiTracker { } 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())); + 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(); @@ -638,8 +679,8 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 = @@ -704,7 +745,7 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +797,7 @@ public class WifiPickerTracker extends BaseWifiTracker { || !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 +834,7 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +869,7 @@ public class WifiPickerTracker extends BaseWifiTracker { // 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 +921,10 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +957,7 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +1054,7 @@ public class WifiPickerTracker extends BaseWifiTracker { updateSuggestedWifiEntryScans(Collections.emptyList()); updatePasspointWifiEntryScans(Collections.emptyList()); updateOsuWifiEntryScans(Collections.emptyList()); - if (mEnableSharedConnectivityFeature && BuildCompat.isAtLeastU()) { + if (mInjector.isSharedConnectivityFeatureEnabled() && BuildCompat.isAtLeastU()) { mKnownNetworkEntryCache.clear(); mHotspotNetworkEntryCache.clear(); } @@ -1033,7 +1078,7 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +1186,18 @@ public class WifiPickerTracker extends BaseWifiTracker { // 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 +1205,9 @@ public class WifiPickerTracker extends BaseWifiTracker { * 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 +1225,11 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +1237,7 @@ public class WifiPickerTracker extends BaseWifiTracker { * 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 +1259,8 @@ public class WifiPickerTracker extends BaseWifiTracker { } } 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 +1271,7 @@ public class WifiPickerTracker extends BaseWifiTracker { * 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 +1288,8 @@ public class WifiPickerTracker extends BaseWifiTracker { } } 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 +1300,7 @@ public class WifiPickerTracker extends BaseWifiTracker { * 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 +1318,7 @@ public class WifiPickerTracker extends BaseWifiTracker { 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 +1327,6 @@ public class WifiPickerTracker extends BaseWifiTracker { cachedWifiConfig, mWifiManager, false /* forSavedNetworksPage */); } - connectedEntry.onNetworkCapabilitiesChanged(network, capabilities); mPasspointWifiEntryCache.put(connectedEntry.getKey(), connectedEntry); } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java index c61f13105..f9f3eed91 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiTrackerInjector.java @@ -19,6 +19,7 @@ package com.android.wifitrackerlib; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.os.UserManager; +import android.provider.DeviceConfig; import android.util.ArraySet; import androidx.annotation.NonNull; @@ -28,7 +29,10 @@ import java.util.Set; /** * 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 UserManager mUserManager; private final DevicePolicyManager mDevicePolicyManager; @@ -36,6 +40,7 @@ class WifiTrackerInjector { // TODO(b/201571677): Migrate the rest of the common objects to WifiTrackerInjector. WifiTrackerInjector(@NonNull Context context) { + mContext = context; mIsDemoMode = NonSdkApiWrapper.isDemoMode(context); mUserManager = context.getSystemService(UserManager.class); mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); @@ -47,6 +52,10 @@ class WifiTrackerInjector { } } + @NonNull Context getContext() { + return mContext; + } + boolean isDemoMode() { return mIsDemoMode; } @@ -65,4 +74,9 @@ class WifiTrackerInjector { @NonNull Set<String> getNoAttributionAnnotationPackages() { return mNoAttributionAnnotationPackages; } + + public boolean isSharedConnectivityFeatureEnabled() { + return DeviceConfig.getBoolean(DEVICE_CONFIG_NAMESPACE, + "shared_connectivity_enabled", false); + } } diff --git a/libs/WifiTrackerLib/tests/Android.bp b/libs/WifiTrackerLib/tests/Android.bp index 3ce536c58..c7c30f59d 100644 --- a/libs/WifiTrackerLib/tests/Android.bp +++ b/libs/WifiTrackerLib/tests/Android.bp @@ -13,6 +13,7 @@ // limitations under the License. package { + default_team: "trendy_team_fwk_wifi_hal", default_applicable_licenses: ["Android-Apache-2.0"], } @@ -25,7 +26,7 @@ java_defaults { "frameworks-base-testutils", "mockito-target-extended-minus-junit4", "truth", - "Robolectric_all-target", + "Robolectric_all-target_upstream", ], libs: [ diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java index 9bbbd4c10..4bb599480 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java @@ -16,10 +16,14 @@ 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.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 +37,7 @@ import static org.mockito.Mockito.verify; 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; @@ -55,6 +60,7 @@ public class HotspotNetworkEntryTest { @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; @@ -75,7 +81,6 @@ public class HotspotNetworkEntryTest { .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 +93,12 @@ public class HotspotNetworkEntryTest { 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…"); @@ -104,38 +114,50 @@ public class HotspotNetworkEntryTest { 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 +169,6 @@ public class HotspotNetworkEntryTest { 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 @@ -228,6 +248,80 @@ public class HotspotNetworkEntryTest { } @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 +358,19 @@ public class HotspotNetworkEntryTest { } @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, diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/KnownNetworkEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/KnownNetworkEntryTest.java index 8e33fb8bd..0ac498b26 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 @@ public class KnownNetworkEntryTest { 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 @@ public class KnownNetworkEntryTest { @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 @@ public class KnownNetworkEntryTest { @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 @@ public class KnownNetworkEntryTest { @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 @@ public class KnownNetworkEntryTest { @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 d8c257884..7bf21d5db 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.Mock; 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 @@ public class MergedCarrierEntryTest { 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 @@ public class MergedCarrierEntryTest { @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 class MergedCarrierEntryTest { 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 @@ public class MergedCarrierEntryTest { @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 @@ public class MergedCarrierEntryTest { @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 @@ public class MergedCarrierEntryTest { @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 ff4cec1c7..bc7667f74 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.junit.Assert.fail; 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 @@ public class NetworkDetailsTrackerTest { @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 @@ public class NetworkDetailsTrackerTest { 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 ebd86cb02..481e9783d 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { @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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { 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 @@ public class PasspointWifiEntryTest { @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 @@ public class PasspointWifiEntryTest { @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 @@ public class PasspointWifiEntryTest { @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 @@ public class PasspointWifiEntryTest { 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 c3880a47c..616ac3a5f 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 static org.mockito.Mockito.when; 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 @@ public class SavedNetworkTrackerTest { @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 @@ public class SavedNetworkTrackerTest { .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); diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardNetworkDetailsTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardNetworkDetailsTrackerTest.java index 8bac4f8d3..e00688c08 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 static org.mockito.Mockito.when; 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 @@ public class StandardNetworkDetailsTrackerTest { @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 @@ public class StandardNetworkDetailsTrackerTest { .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 609b00c31..ebb24d987 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 @@ public class StandardWifiEntryTest { .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 class StandardWifiEntryTest { 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 @@ public class StandardWifiEntryTest { @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 @@ public class StandardWifiEntryTest { 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 @@ public class StandardWifiEntryTest { @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 @@ public class StandardWifiEntryTest { @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 @@ public class StandardWifiEntryTest { @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 @@ public class StandardWifiEntryTest { 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 @@ public class StandardWifiEntryTest { 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 @@ public class StandardWifiEntryTest { 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 @@ public class StandardWifiEntryTest { 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,7 +341,7 @@ public class StandardWifiEntryTest { 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 */); @@ -363,7 +364,7 @@ public class StandardWifiEntryTest { 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 */); @@ -382,7 +383,7 @@ public class StandardWifiEntryTest { 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 +407,7 @@ public class StandardWifiEntryTest { 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 +431,7 @@ public class StandardWifiEntryTest { 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 +457,7 @@ public class StandardWifiEntryTest { 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 +488,7 @@ public class StandardWifiEntryTest { 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 +506,7 @@ public class StandardWifiEntryTest { 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,7 +529,7 @@ public class StandardWifiEntryTest { @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 */); @@ -543,7 +544,7 @@ public class StandardWifiEntryTest { 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 +570,7 @@ public class StandardWifiEntryTest { .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 +590,7 @@ public class StandardWifiEntryTest { 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 +614,7 @@ public class StandardWifiEntryTest { 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 +663,7 @@ public class StandardWifiEntryTest { 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 +712,7 @@ public class StandardWifiEntryTest { 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 +731,7 @@ public class StandardWifiEntryTest { 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 +743,7 @@ public class StandardWifiEntryTest { 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 +766,7 @@ public class StandardWifiEntryTest { 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 +796,7 @@ public class StandardWifiEntryTest { 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 +820,7 @@ public class StandardWifiEntryTest { 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 +873,7 @@ public class StandardWifiEntryTest { 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 +909,7 @@ public class StandardWifiEntryTest { 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 +948,7 @@ public class StandardWifiEntryTest { 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 +1025,7 @@ public class StandardWifiEntryTest { 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 +1045,7 @@ public class StandardWifiEntryTest { 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 +1071,7 @@ public class StandardWifiEntryTest { @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 +1085,7 @@ public class StandardWifiEntryTest { 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 +1095,7 @@ public class StandardWifiEntryTest { // 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 +1109,7 @@ public class StandardWifiEntryTest { 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 +1181,7 @@ public class StandardWifiEntryTest { 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 +1191,7 @@ public class StandardWifiEntryTest { 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 +1201,7 @@ public class StandardWifiEntryTest { 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 +1211,7 @@ public class StandardWifiEntryTest { 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 +1221,7 @@ public class StandardWifiEntryTest { 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 +1241,7 @@ public class StandardWifiEntryTest { 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 +1262,7 @@ public class StandardWifiEntryTest { 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 +1286,7 @@ public class StandardWifiEntryTest { 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 +1313,7 @@ public class StandardWifiEntryTest { 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 +1342,7 @@ public class StandardWifiEntryTest { 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 +1369,7 @@ public class StandardWifiEntryTest { 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 +1396,7 @@ public class StandardWifiEntryTest { 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 +1423,7 @@ public class StandardWifiEntryTest { 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 +1445,7 @@ public class StandardWifiEntryTest { 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 +1466,7 @@ public class StandardWifiEntryTest { 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 +1487,7 @@ public class StandardWifiEntryTest { 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 +1509,7 @@ public class StandardWifiEntryTest { 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 +1529,7 @@ public class StandardWifiEntryTest { 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 +1574,7 @@ public class StandardWifiEntryTest { 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 +1602,7 @@ public class StandardWifiEntryTest { 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 +1622,7 @@ public class StandardWifiEntryTest { 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 +1642,7 @@ public class StandardWifiEntryTest { 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 +1672,7 @@ public class StandardWifiEntryTest { 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 +1692,7 @@ public class StandardWifiEntryTest { 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 +1712,7 @@ public class StandardWifiEntryTest { 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 +1775,48 @@ public class StandardWifiEntryTest { 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 91002dd78..eb7afc8db 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.WifiEnterpriseConfig; 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.telephony.TelephonyManager; 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.Arrays; 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 @@ public class UtilsTest { 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 @@ public class UtilsTest { 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 @@ public class UtilsTest { .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 @@ public class UtilsTest { 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 @@ public class UtilsTest { 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 @@ public class UtilsTest { 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 @@ public class UtilsTest { 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 @@ -894,4 +906,122 @@ public class UtilsTest { 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 96b3e5459..ee6c4199c 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java @@ -80,7 +80,6 @@ import android.util.Pair; 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,13 +195,15 @@ public class WifiPickerTrackerTest { }); // 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(TelephonyManager.class)) .thenReturn(mMockTelephonyManager); @@ -218,13 +219,7 @@ public class WifiPickerTrackerTest { 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); } /** @@ -618,12 +613,47 @@ public class WifiPickerTrackerTest { // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected. verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); -// assertThat(wifiPickerTracker.getWifiEntries()).isEmpty(); + assertThat(wifiPickerTracker.getWifiEntries()).isEmpty(); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry); assertThat(entry.isPrimaryNetwork()).isTrue(); } /** + * 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()) + .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); + + // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected. + verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); + } + + /** * Tests that connecting to a network will update getConnectedEntry() to return the connected * WifiEntry if the framework times out and gives us an empty list of configs. */ @@ -767,6 +797,41 @@ public class WifiPickerTrackerTest { } /** + * 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.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); + + assertThat(wifiPickerTracker.getConnectedWifiEntry().isDefaultNetwork()).isTrue(); + } + + /** * Tests that a connected WifiEntry will return "Low quality" as the summary if Wifi is * validated but cell is the default route. */ @@ -2104,6 +2169,27 @@ public class WifiPickerTrackerTest { 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(); + } + @Test public void testScanner_startAfterOnStop_doesNotStart() { final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker(); @@ -2160,6 +2246,54 @@ public class WifiPickerTrackerTest { } @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 public void testKnownNetworks_noMatchingScanResult_entryNotIncluded() { final KnownNetwork testKnownNetwork = new KnownNetwork.Builder() .setNetworkSource(KnownNetwork.NETWORK_SOURCE_NEARBY_SELF) @@ -2264,6 +2398,40 @@ public class WifiPickerTrackerTest { } @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 +2490,41 @@ public class WifiPickerTrackerTest { } @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 +2569,7 @@ public class WifiPickerTrackerTest { .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 +2603,7 @@ public class WifiPickerTrackerTest { .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 +2646,19 @@ public class WifiPickerTrackerTest { .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 +2731,59 @@ public class WifiPickerTrackerTest { 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); + } } |