diff options
114 files changed, 1193 insertions, 1218 deletions
diff --git a/OsuLogin/Android.bp b/OsuLogin/Android.bp index 1044873b34..864883f443 100644 --- a/OsuLogin/Android.bp +++ b/OsuLogin/Android.bp @@ -4,6 +4,7 @@ package { android_app { name: "OsuLogin", + package_name: "com.android.hotspot2.osulogin", defaults: ["wifi-module-sdk-version-defaults"], static_libs: ["androidx.legacy_legacy-support-v4"], resource_dirs: ["res"], diff --git a/WifiDialog/Android.bp b/WifiDialog/Android.bp index e9264ac61e..8a9de613cf 100644 --- a/WifiDialog/Android.bp +++ b/WifiDialog/Android.bp @@ -18,6 +18,7 @@ package { android_app { name: "WifiDialog", + package_name: "com.android.wifi.dialog", defaults: ["wifi-module-sdk-version-defaults"], certificate: ":com.android.wifi.dialog.certificate", diff --git a/WifiDialog/src/com/android/wifi/dialog/WifiDialogActivity.java b/WifiDialog/src/com/android/wifi/dialog/WifiDialogActivity.java index 7db2c83c81..48b92639e4 100644 --- a/WifiDialog/src/com/android/wifi/dialog/WifiDialogActivity.java +++ b/WifiDialog/src/com/android/wifi/dialog/WifiDialogActivity.java @@ -294,7 +294,7 @@ public class WifiDialogActivity extends Activity { * Creates and shows a dialog for the given dialogId and Intent. * Returns {@code true} if the dialog was successfully created, {@code false} otherwise. */ - private @Nullable boolean createAndShowDialogForIntent(int dialogId, @NonNull Intent intent) { + private boolean createAndShowDialogForIntent(int dialogId, @NonNull Intent intent) { String action = intent.getAction(); if (!WifiManager.ACTION_LAUNCH_DIALOG.equals(action)) { return false; @@ -334,9 +334,6 @@ public class WifiDialogActivity extends Activity { } return false; } - if (dialog == null) { - return false; - } dialog.setOnDismissListener((dialogDismiss) -> { if (mIsVerboseLoggingEnabled) { Log.v(TAG, "Dialog id=" + dialogId @@ -425,9 +422,9 @@ public class WifiDialogActivity extends Activity { } /** - * Returns a simple dialog for the given Intent, or {@code null} if no dialog could be created. + * Returns a simple dialog for the given Intent. */ - private @Nullable AlertDialog createSimpleDialog( + private @NonNull AlertDialog createSimpleDialog( int dialogId, @Nullable String title, @Nullable String message, @@ -440,10 +437,18 @@ public class WifiDialogActivity extends Activity { SpannableString spannableMessage = null; if (message != null) { spannableMessage = new SpannableString(message); - if (messageUrlStart >= 0 && messageUrlEnd <= message.length() - && messageUrlStart < messageUrlEnd) { - spannableMessage.setSpan(new URLSpan(messageUrl), messageUrlStart, messageUrlEnd, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + if (messageUrl != null) { + if (messageUrlStart < 0) { + Log.w(TAG, "Span start cannot be less than 0!"); + } else if (messageUrlEnd > message.length()) { + Log.w(TAG, "Span end index " + messageUrlEnd + + " cannot be greater than message length " + message.length() + "!"); + } else if (messageUrlStart > messageUrlEnd) { + Log.w(TAG, "Span start index cannot be greater than end index!"); + } else { + spannableMessage.setSpan(new URLSpan(messageUrl), messageUrlStart, + messageUrlEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } } } AlertDialog dialog = new AlertDialog.Builder( @@ -497,27 +502,21 @@ public class WifiDialogActivity extends Activity { } /** - * Returns a P2P Invitation Sent Dialog for the given Intent, or {@code null} if no Dialog - * could be created. + * Returns a P2P Invitation Sent Dialog for the given Intent. */ - private @Nullable AlertDialog createP2pInvitationSentDialog( + private @NonNull AlertDialog createP2pInvitationSentDialog( final int dialogId, - final @NonNull String deviceName, - @Nullable String displayPin) { - if (TextUtils.isEmpty(deviceName)) { - if (mIsVerboseLoggingEnabled) { - Log.v(TAG, "Could not create P2P Invitation Sent dialog with null or empty" - + " device name." - + " id=" + dialogId - + " deviceName=" + deviceName - + " displayPin=" + displayPin); - } - return null; - } - + @Nullable final String deviceName, + @Nullable final String displayPin) { final View textEntryView = LayoutInflater.from(this) .inflate(getLayoutId("wifi_p2p_dialog"), null); ViewGroup group = textEntryView.findViewById(getViewId("info")); + if (TextUtils.isEmpty(deviceName)) { + Log.w(TAG, "P2P Invitation Sent dialog device name is null or empty." + + " id=" + dialogId + + " deviceName=" + deviceName + + " displayPin=" + displayPin); + } addRowToP2pDialog(group, getStringId("wifi_p2p_to_message"), deviceName); if (displayPin != null) { @@ -546,29 +545,22 @@ public class WifiDialogActivity extends Activity { } /** - * Returns a P2P Invitation Received Dialog for the given Intent, or {@code null} if no Dialog - * could be created. + * Returns a P2P Invitation Received Dialog for the given Intent. */ - private @Nullable AlertDialog createP2pInvitationReceivedDialog( + private @NonNull AlertDialog createP2pInvitationReceivedDialog( final int dialogId, - final @NonNull String deviceName, + @Nullable final String deviceName, final boolean isPinRequested, - @Nullable String displayPin) { - if (TextUtils.isEmpty(deviceName)) { - if (mIsVerboseLoggingEnabled) { - Log.v(TAG, "Could not create P2P Invitation Received dialog with null or empty" - + " device name." - + " id=" + dialogId - + " deviceName=" + deviceName - + " isPinRequested=" + isPinRequested - + " displayPin=" + displayPin); - } - return null; - } - + @Nullable final String displayPin) { final View textEntryView = LayoutInflater.from(this) .inflate(getLayoutId("wifi_p2p_dialog"), null); ViewGroup group = textEntryView.findViewById(getViewId("info")); + if (TextUtils.isEmpty(deviceName)) { + Log.w(TAG, "P2P Invitation Received dialog device name is null or empty." + + " id=" + dialogId + + " deviceName=" + deviceName + + " displayPin=" + displayPin); + } addRowToP2pDialog(group, getStringId("wifi_p2p_from_message"), deviceName); final EditText pinEditText; diff --git a/service/ServiceWifiResources/Android.bp b/service/ServiceWifiResources/Android.bp index d17a17082f..3bd98198c4 100644 --- a/service/ServiceWifiResources/Android.bp +++ b/service/ServiceWifiResources/Android.bp @@ -21,6 +21,7 @@ package { android_app { name: "ServiceWifiResources", + package_name: "com.android.wifi.resources", defaults: ["wifi-service-common"], resource_dirs: [ "res", diff --git a/service/ServiceWifiResources/res/values-af/strings.xml b/service/ServiceWifiResources/res/values-af/strings.xml index 5d1f8d355d..a58881e0f9 100644 --- a/service/ServiceWifiResources/res/values-af/strings.xml +++ b/service/ServiceWifiResources/res/values-af/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is deur jou administrateur gedeaktiveer."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Maak toe"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑fi is aan in vliegtuigmodus"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"As jy wi-fi aangeskakel hou, sal jou foon onthou om dit aan te hou wanneer jy weer in vliegtuigmodus is"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑fi bly aan"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Jou foon onthou om wi‑fi aan te hou in vliegtuigmodus. Skakel wi-fi af as jy nie wil hê dit moet aan bly nie."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ar/strings.xml b/service/ServiceWifiResources/res/values-ar/strings.xml index 213e287182..93e26c2ecc 100644 --- a/service/ServiceWifiResources/res/values-ar/strings.xml +++ b/service/ServiceWifiResources/res/values-ar/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"تم إيقاف معرّف <xliff:g id="SSID">%1$s</xliff:g> من قِبل المشرف."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"إغلاق"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"شبكة Wi‑Fi مفعَّلة في \"وضع الطيران\""</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"إذا واصلت تفعيل شبكة Wi‑Fi، سيتذكر هاتفك إبقاءها مفعَّلة في المرة القادمة التي تفعِّل فيها \"وضع الطيران\"."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"تظل شبكة Wi-Fi مفعّلة"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"يتذكر هاتفك إبقاء شبكة Wi‑Fi مفعَّلة في \"وضع الطيران\". يمكنك إيقاف شبكة Wi‑Fi إذا لم تكن تريد مواصلة تفعيلها."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-as/strings.xml b/service/ServiceWifiResources/res/values-as/strings.xml index 6cca27a589..f71156dd47 100644 --- a/service/ServiceWifiResources/res/values-as/strings.xml +++ b/service/ServiceWifiResources/res/values-as/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"আপোনাৰ প্ৰশাসকে <xliff:g id="SSID">%1$s</xliff:g> অক্ষম কৰিছে।"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"বন্ধ কৰক"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"এয়াৰপ্লেন ম’ডত ৱাই‐ফাই অন হৈ থাকিব"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"আপুনি যদি ৱাই-ফাই অন কৰি ৰাখে, পৰৱৰ্তী সময়ত আপুনি এয়াৰপ্লেন ম’ড ব্যৱহাৰ কৰিলে আপোনাৰ ফ’নটোৱে এয়া অন কৰি ৰাখিবলৈ মনত ৰাখিব"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi অন হৈ থাকিব"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"আপোনাৰ ফ’নটোৱে এয়াৰপ্লেন ম’ডত ৱাই-ফাই অন ৰাখিবলৈ মনত ৰাখে। আপুনি যদি ৱাই-ফাই অন হৈ থকাটো নিবিচাৰে, তেন্তে ইয়াক অফ কৰক।"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-az/strings.xml b/service/ServiceWifiResources/res/values-az/strings.xml index 3938db2f13..8459318e09 100644 --- a/service/ServiceWifiResources/res/values-az/strings.xml +++ b/service/ServiceWifiResources/res/values-az/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> administratorunuz tərəfindən deaktiv edilib."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Bağlayın"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Təyyarə rejimində Wi‑Fi aktiv qalsın"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wi‑Fi\'ı aktiv saxlasanız, növbəti dəfə təyyarə rejimində olduqda telefonunuz onu aktiv saxlayacaq"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi aktiv qalacaq"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefonunuz təyyarə rejimində Wi‑Fi\'ı aktiv saxlayacaq. Aktiv qalmasını istəmirsinizsə, Wi‑Fi\'ı deaktiv edin."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-b+sr+Latn/strings.xml b/service/ServiceWifiResources/res/values-b+sr+Latn/strings.xml index e77f0c579a..795e931116 100644 --- a/service/ServiceWifiResources/res/values-b+sr+Latn/strings.xml +++ b/service/ServiceWifiResources/res/values-b+sr+Latn/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administrator je onemogućio <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zatvori"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"WiFi je uključen u režimu rada u avionu"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ako odlučite da ne isključujete WiFi, telefon će zapamtiti da ga ne isključuje sledeći put kada budete u režimu rada u avionu"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"WiFi ostaje uključen"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefon pamti da ne treba da isključuje WiFi u režimu rada u avionu. Isključite WiFi ako ne želite da ostane uključen."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-be/strings.xml b/service/ServiceWifiResources/res/values-be/strings.xml index 04758ca32f..1db0a71c22 100644 --- a/service/ServiceWifiResources/res/values-be/strings.xml +++ b/service/ServiceWifiResources/res/values-be/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Сетка \"<xliff:g id="SSID">%1$s</xliff:g>\" адключана вашым адміністратарам."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Закрыць"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"У рэжыме палёту сетка Wi‑Fi застанецца ўключанай"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Калі вы не выключыце сетку Wi‑Fi, падчас наступнага пераходу ў рэжым палёту тэлефон будзе захоўваць яе ўключанай"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Сетка Wi‑Fi застаецца ўключанай"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"На тэлефоне ў рэжыме палёту сетка Wi‑Fi будзе заставацца ўключанай, але вы можаце выключыць яе."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-bg/strings.xml b/service/ServiceWifiResources/res/values-bg/strings.xml index 020583b05a..9f0c8d8057 100644 --- a/service/ServiceWifiResources/res/values-bg/strings.xml +++ b/service/ServiceWifiResources/res/values-bg/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Функцията <xliff:g id="SSID">%1$s</xliff:g> е деактивирана от администратора ви."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Затваряне"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Включване на Wi‑Fi в самолетния режим"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ако не изключите функцията за Wi‑Fi, телефонът ви ще я остави активна следващия път, когато използвате самолетния режим"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi няма да се изключи"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Функцията за Wi‑Fi ще бъде включена, докато телефонът ви е в самолетен режим. Ако не искате това, изключете я."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-bn/strings.xml b/service/ServiceWifiResources/res/values-bn/strings.xml index 0d23bf34ba..40d404f57a 100644 --- a/service/ServiceWifiResources/res/values-bn/strings.xml +++ b/service/ServiceWifiResources/res/values-bn/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"আপনার অ্যাডমিনিস্ট্রেটর <xliff:g id="SSID">%1$s</xliff:g> বন্ধ করে দিয়েছেন।"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"বন্ধ করুন"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"\'বিমান মোড\'-এ ওয়াই-ফাই চালু থাকে"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"আপনি ওয়াই-ফাই চালু রাখলে, আপনি \'বিমান\' মোডে থাকলে পরবর্তী সময় আপনার ফোন এটি চালু রাখার জন্য মনে রাখবে"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"ওয়াই-ফাই চালু থাকে"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"\'বিমান মোড\'-এ থাকাকালীন আপনার ফোন ওয়াই-ফাই চালু রাখে। আপনি এটি চালু না রাখতে চাইলে ওয়াই-ফাই বন্ধ করুন।"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-bs/strings.xml b/service/ServiceWifiResources/res/values-bs/strings.xml index ac272e8b1b..a214af1acb 100644 --- a/service/ServiceWifiResources/res/values-bs/strings.xml +++ b/service/ServiceWifiResources/res/values-bs/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administrator je onemogućio <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zatvori"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"WiFi je uključen u načinu rada u avionu"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ako ostavite WiFi uključen, telefon će zapamtiti da ga ostavi uključenog sljedeći put kada budete u načinu rada u avionu"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"WiFi ostaje uključen"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefon pamti da zadrži WiFi u načinu rada u avionu. Isključite WiFi ako ne želite da ostane uključen."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ca/strings.xml b/service/ServiceWifiResources/res/values-ca/strings.xml index 0e45b307d1..9a08fd3d1c 100644 --- a/service/ServiceWifiResources/res/values-ca/strings.xml +++ b/service/ServiceWifiResources/res/values-ca/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"L\'administrador ha desactivat <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Tanca"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi activada en mode d\'avió"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Si tens activada la Wi‑Fi, el telèfon recordarà mantenir-la així la pròxima vegada que utilitzis el mode d\'avió"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"La Wi‑Fi es manté activada"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"El telèfon recorda mantenir la Wi‑Fi activada en mode d\'avió. Desactiva la Wi‑Fi si no vols que es quedi activada."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-cs/strings.xml b/service/ServiceWifiResources/res/values-cs/strings.xml index 895cbfc7a9..29e9096759 100644 --- a/service/ServiceWifiResources/res/values-cs/strings.xml +++ b/service/ServiceWifiResources/res/values-cs/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Funkce <xliff:g id="SSID">%1$s</xliff:g> byla deaktivována administrátorem."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zavřít"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Zapnutá Wi-Fi v režimu Letadlo"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Pokud Wi-Fi necháte zapnutou, telefon si zapamatuje, že ji má příště v režimu Letadlo ponechat zapnutou"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi zůstane zapnutá"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefon si pamatuje, že má v režimu Letadlo ponechat zapnutou Wi-Fi. Pokud nechcete, aby Wi-Fi zůstala zapnutá, vypněte ji."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-da/strings.xml b/service/ServiceWifiResources/res/values-da/strings.xml index 570662b0af..72f67ce3b8 100644 --- a/service/ServiceWifiResources/res/values-da/strings.xml +++ b/service/ServiceWifiResources/res/values-da/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> er blevet deaktiveret af din administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Luk"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi-Fi aktiveret i flytilstand"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Hvis du holder Wi-Fi aktiveret, sørger din telefon for, at Wi-Fi forbliver aktiveret, næste gang du sætter den til flytilstand"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi forbliver aktiv"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Din telefon holder Wi-Fi aktiveret i flytilstand. Deaktiver Wi-Fi, hvis du ikke vil have, at det forbliver aktiveret."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-de/strings.xml b/service/ServiceWifiResources/res/values-de/strings.xml index f98966269f..392f48fa13 100644 --- a/service/ServiceWifiResources/res/values-de/strings.xml +++ b/service/ServiceWifiResources/res/values-de/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Die Funktion „<xliff:g id="SSID">%1$s</xliff:g>“ wurde von deinem Administrator deaktiviert."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Schließen"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"WLAN im Flugzeugmodus"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wenn das WLAN aktiviert bleibt, lässt es dein Smartphone eingeschaltet, wenn du das nächste Mal in den Flugmodus wechselst"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"WLAN bleibt eingeschaltet"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Dein Smartphone lässt das WLAN im Flugmodus eingeschaltet. Schalte das WLAN aus, wenn du das nicht möchtest."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-el/strings.xml b/service/ServiceWifiResources/res/values-el/strings.xml index 6ff37212db..d0f897f445 100644 --- a/service/ServiceWifiResources/res/values-el/strings.xml +++ b/service/ServiceWifiResources/res/values-el/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Το <xliff:g id="SSID">%1$s</xliff:g> έχει απενεργοποιηθεί από τον διαχειριστή σας."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Κλείσιμο"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi ενεργό σε λειτουργία πτήσης"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Αν διατηρήσετε το Wi‑Fi ενεργοποιημένο, το τηλέφωνό σας θα θυμάται να το διατηρήσει ενεργοποιημένο την επόμενη φορά που θα βρεθεί σε λειτουργία πτήσης"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Το Wi‑Fi παραμένει ενεργό"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Το τηλέφωνο θυμάται να διατηρεί ενεργοποιημένο το Wi‑Fi σε λειτουργία πτήσης. Απενεργοποιήστε το Wi‑Fi, αν δεν επιθυμείτε να είναι ενεργοποιημένο."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-en-rAU/strings.xml b/service/ServiceWifiResources/res/values-en-rAU/strings.xml index 61a990664d..c5745af51a 100644 --- a/service/ServiceWifiResources/res/values-en-rAU/strings.xml +++ b/service/ServiceWifiResources/res/values-en-rAU/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is disabled by your administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Close"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi on in aeroplane mode"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"If you keep Wi‑Fi on, your phone will remember to keep it on the next time that you\'re in aeroplane mode"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi stays on"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Your phone remembers to keep Wi‑Fi on in aeroplane mode. Turn off Wi‑Fi if you don\'t want it to stay on."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-en-rCA/strings.xml b/service/ServiceWifiResources/res/values-en-rCA/strings.xml index 057cdc7453..794be91659 100644 --- a/service/ServiceWifiResources/res/values-en-rCA/strings.xml +++ b/service/ServiceWifiResources/res/values-en-rCA/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is disabled by your administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Close"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi on in airplane mode"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"If you keep Wi‑Fi on, your phone will remember to keep it on the next time you\'re in airplane mode"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi stays on"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Your phone remembers to keep Wi‑Fi on in airplane mode. Turn off Wi‑Fi if you don\'t want it to stay on."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-en-rGB/strings.xml b/service/ServiceWifiResources/res/values-en-rGB/strings.xml index 61a990664d..c5745af51a 100644 --- a/service/ServiceWifiResources/res/values-en-rGB/strings.xml +++ b/service/ServiceWifiResources/res/values-en-rGB/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is disabled by your administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Close"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi on in aeroplane mode"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"If you keep Wi‑Fi on, your phone will remember to keep it on the next time that you\'re in aeroplane mode"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi stays on"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Your phone remembers to keep Wi‑Fi on in aeroplane mode. Turn off Wi‑Fi if you don\'t want it to stay on."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-en-rIN/strings.xml b/service/ServiceWifiResources/res/values-en-rIN/strings.xml index 61a990664d..c5745af51a 100644 --- a/service/ServiceWifiResources/res/values-en-rIN/strings.xml +++ b/service/ServiceWifiResources/res/values-en-rIN/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is disabled by your administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Close"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi on in aeroplane mode"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"If you keep Wi‑Fi on, your phone will remember to keep it on the next time that you\'re in aeroplane mode"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi stays on"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Your phone remembers to keep Wi‑Fi on in aeroplane mode. Turn off Wi‑Fi if you don\'t want it to stay on."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-en-rXC/strings.xml b/service/ServiceWifiResources/res/values-en-rXC/strings.xml index f1a9c7ef06..4aba4e823d 100644 --- a/service/ServiceWifiResources/res/values-en-rXC/strings.xml +++ b/service/ServiceWifiResources/res/values-en-rXC/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is disabled by your administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Close"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi on in airplane mode"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"If you keep Wi‑Fi on, your phone will remember to keep it on the next time you\'re in airplane mode"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi stays on"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Your phone remembers to keep Wi‑Fi on in airplane mode. Turn off Wi‑Fi if you don\'t want it to stay on."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-es-rUS/strings.xml b/service/ServiceWifiResources/res/values-es-rUS/strings.xml index f8af29acaa..6d2dd5952e 100644 --- a/service/ServiceWifiResources/res/values-es-rUS/strings.xml +++ b/service/ServiceWifiResources/res/values-es-rUS/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Tu administrador inhabilitó <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Cerrar"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi-Fi activado en modo de avión"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Si mantienes el Wi-Fi activado, tu teléfono recordará mantenerlo activado la próxima vez que actives el modo de avión"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"El Wi-Fi permanece activado"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"El teléfono dejará activado el Wi-Fi en el modo de avión. Desactiva el Wi-Fi si no quieres permanecer conectado."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-es/strings.xml b/service/ServiceWifiResources/res/values-es/strings.xml index 29464d4922..08498836ac 100644 --- a/service/ServiceWifiResources/res/values-es/strings.xml +++ b/service/ServiceWifiResources/res/values-es/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Tu administrador ha inhabilitado <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Cerrar"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi-Fi activado en modo Avión"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Si dejas el Wi-Fi activado, tu teléfono se acordará de dejarlo así la próxima vez que uses el modo Avión"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"El Wi‑Fi se mantiene activado"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Tu teléfono dejará el Wi-Fi activado en modo Avión. Desactiva el Wi-Fi si no quieres que se quede activado."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-et/strings.xml b/service/ServiceWifiResources/res/values-et/strings.xml index 2a28aa6cd6..ebcef37ffe 100644 --- a/service/ServiceWifiResources/res/values-et/strings.xml +++ b/service/ServiceWifiResources/res/values-et/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administraator on funktsiooni <xliff:g id="SSID">%1$s</xliff:g> keelanud."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Sule"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"WiFi on lennukirežiimis sisse lülitatud"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Kui hoiate WiFi sisselülitatuna, jätab telefon teie valiku meelde ja kasutab seda järgmisel korral lennukirežiimi aktiveerimisel."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"WiFi jääb sisselülitatuks"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Teie telefon hoiab WiFi lennukirežiimis sisselülitatuna. Lülitage WiFi välja, kui te ei soovi, et see oleks sisse lülitatud."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-eu/strings.xml b/service/ServiceWifiResources/res/values-eu/strings.xml index 08ca5d0cb4..d8b280ecd4 100644 --- a/service/ServiceWifiResources/res/values-eu/strings.xml +++ b/service/ServiceWifiResources/res/values-eu/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administratzaileak desgaitu du <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Itxi"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wifia aktibatuta hegaldi moduan"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wifia aktibatuta utziz gero, hura aktibatuta mantentzeaz gogoratuko da telefonoa hegaldi modua erabiltzen duzun hurrengoan"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wifia aktibatuta mantentzen da"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Hegaldi moduan, wifia aktibatuta mantentzeaz gogoratzen da telefonoa. Halakorik nahi ez baduzu, desaktiba ezazu zuk zeuk."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-fa/strings.xml b/service/ServiceWifiResources/res/values-fa/strings.xml index 1688041b0e..d59e7bcba5 100644 --- a/service/ServiceWifiResources/res/values-fa/strings.xml +++ b/service/ServiceWifiResources/res/values-fa/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"سرپرست شما <xliff:g id="SSID">%1$s</xliff:g> را غیرفعال کرده است."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"بستن"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi در «حالت هواپیما» روشن باشد"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"اگر Wi-Fi را روشن نگه دارید، تلفنتان بهیاد خواهد داشت تا دفعه بعدی که در «حالت هواپیما» هستید آن را روشن نگه دارد"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi روشن بماند"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"تلفنتان بهیاد میآورد که Wi-Fi را در حالت هواپیما روشن نگه دارد. اگر نمیخواهید Wi-Fi روشن بماند، آن را خاموش کنید."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-fi/strings.xml b/service/ServiceWifiResources/res/values-fi/strings.xml index 698d951763..2879a0ae56 100644 --- a/service/ServiceWifiResources/res/values-fi/strings.xml +++ b/service/ServiceWifiResources/res/values-fi/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> on järjestelmänvalvojan käytöstä poistama."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Sulje"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi päällä lentokonetilassa"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Jos pidät Wi-Fi-yhteyden päällä, puhelin pitää sen päällä, kun seuraavan kerran olet lentokonetilassa"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi pysyy päällä"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Puhelimen Wi-Fi-yhteys pysyy päällä lentokonetilassa. Voit halutessasi laittaa Wi-Fi-yhteyden pois päältä."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-fr-rCA/strings.xml b/service/ServiceWifiResources/res/values-fr-rCA/strings.xml index cc081880f5..1e622b7300 100644 --- a/service/ServiceWifiResources/res/values-fr-rCA/strings.xml +++ b/service/ServiceWifiResources/res/values-fr-rCA/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Fonctionnalité <xliff:g id="SSID">%1$s</xliff:g> désactivée par votre administrateur."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Fermer"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi activé en mode Avion"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Si vous laissez le Wi-Fi activé, votre téléphone se rappellera qu\'il doit le laisser activé la prochaine fois que vous serez en mode Avion"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Le Wi‑Fi reste activé"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Votre téléphone se rappelle de garder le Wi-Fi activé en mode Avion. Désactivez le Wi-Fi si vous ne voulez pas qu\'il reste allumé."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-fr/strings.xml b/service/ServiceWifiResources/res/values-fr/strings.xml index 1701a10937..9aa3dbbc3f 100644 --- a/service/ServiceWifiResources/res/values-fr/strings.xml +++ b/service/ServiceWifiResources/res/values-fr/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> est désactivé par votre administrateur."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Fermer"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi-Fi activé en mode Avion"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Si vous laissez le Wi-Fi activé, votre téléphone s\'en souviendra et le Wi-Fi restera activé la prochaine fois que vous serez en mode Avion"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Le Wi‑Fi reste activé"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Le Wi‑Fi de votre téléphone restera activé en mode Avion. Désactivez le Wi-Fi si ce paramètre ne vous convient pas."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-gl/strings.xml b/service/ServiceWifiResources/res/values-gl/strings.xml index 6f0f6055e8..545745d23f 100644 --- a/service/ServiceWifiResources/res/values-gl/strings.xml +++ b/service/ServiceWifiResources/res/values-gl/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"O teu administrador desactivou a rede <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Pechar"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"A wifi está activada no modo avión"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Se mantés a wifi activada, o teléfono lembrará que ten que deixala nese estado a próxima vez que esteas no modo avión"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"A wifi permanece activada"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"O teléfono lembrará manter a wifi activada no modo avión. Desactívaa se non queres que permaneza activada."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-gu/strings.xml b/service/ServiceWifiResources/res/values-gu/strings.xml index e662e3f22d..2700496640 100644 --- a/service/ServiceWifiResources/res/values-gu/strings.xml +++ b/service/ServiceWifiResources/res/values-gu/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g>ને તમારા ઍડમિનિસ્ટ્રેટર દ્વારા બંધ કરવામાં આવ્યું છે."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"બંધ કરો"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"એરપ્લેન મોડમાં વાઇ-ફાઇ ચાલુ રહેશે"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"જો તમે વાઇ-ફાઇ ચાલુ રાખો, તો તમે જ્યારે આગલી વખતે એરપ્લેન મોડ પર જશો, ત્યારે તમારો ફોન તેને ચાલુ રાખવાનું યાદ રાખશે"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"વાઇ-ફાઇ ચાલુ રહેશે"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"તમારો ફોન વાઇ-ફાઇને એરપ્લેન મોડમાં ચાલુ રાખવાનું યાદ રાખે છે. જો તમે વાઇ-ફાઇ ચાલુ રાખવા માગતા ન હો, તો તેને બંધ કરો."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-hi/strings.xml b/service/ServiceWifiResources/res/values-hi/strings.xml index dc0411c165..8e89891f1b 100644 --- a/service/ServiceWifiResources/res/values-hi/strings.xml +++ b/service/ServiceWifiResources/res/values-hi/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"आपके एडमिन ने <xliff:g id="SSID">%1$s</xliff:g> को बंद किया हुआ है."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"बंद करें"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"हवाई जहाज़ मोड में वाई-फ़ाई चालू रहेगा"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"वाई-फ़ाई चालू रखने पर आपका फ़ोन, अगली बार हवाई जहाज़ मोड चालू होने पर भी वाई-फ़ाई चालू रखेगा"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"वाई-फ़ाई चालू रहेगा"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"हवाई जहाज़ मोड में भी आपका फ़ोन वाई-फ़ाई चालू रखता है. अगर वाई-फ़ाई चालू नहीं रखना है, तो उसे बंद कर दें."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-hr/strings.xml b/service/ServiceWifiResources/res/values-hr/strings.xml index c41836c5d7..824bbc907a 100644 --- a/service/ServiceWifiResources/res/values-hr/strings.xml +++ b/service/ServiceWifiResources/res/values-hr/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Značajku <xliff:g id="SSID">%1$s</xliff:g> onemogućio je vaš administrator."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zatvori"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi je uključen u načinu rada u zrakoplovu"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ako Wi-Fi ostane uključen, telefon će zapamtiti da treba ostati uključen u načinu rada u zrakoplovu"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi ostaje uključen"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefon će zapamtiti da Wi‑Fi treba ostati uključen u načinu rada u zrakoplovu. Isključite Wi-Fi ako ne želite da ostane uključen."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-hu/strings.xml b/service/ServiceWifiResources/res/values-hu/strings.xml index 438c32d3f1..6f0b5162b4 100644 --- a/service/ServiceWifiResources/res/values-hu/strings.xml +++ b/service/ServiceWifiResources/res/values-hu/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> letiltva a rendszergazda által."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Bezárás"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"A Wi‑Fi bekapcsolva marad Repülős üzemmódban"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ha bekapcsolva tartja a Wi-Fi-t, a telefon emlékezni fog arra, hogy a következő alkalommal, amikor Repülős üzemmódban van, bekapcsolva tartsa a funkciót"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"A Wi‑Fi bekapcsolva marad"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"A telefon bekapcsolva tartja a Wi‑Fi-t Repülős üzemmódban. Kapcsolja ki a Wi-Fi-t, ha nem szeretné, hogy bekapcsolva maradjon."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-hy/strings.xml b/service/ServiceWifiResources/res/values-hy/strings.xml index 8c3d758bd5..e92aab7e63 100644 --- a/service/ServiceWifiResources/res/values-hy/strings.xml +++ b/service/ServiceWifiResources/res/values-hy/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Ադմինիստրատորն անջատել է <xliff:g id="SSID">%1$s</xliff:g> գործառույթը։"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Փակել"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Ավիառեժիմում Wi‑Fi-ը միացված կլինի"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Եթե Wi-Fi-ը միացված թողնեք, հաջորդ անգամ այն ավտոմատ միացված կմնա ավիառեժիմում"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi-ը մնում է միացված"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Ավիառեժիմում Wi‑Fi-ը միացված կմնա։ Ցանկության դեպքում կարող եք անջատել Wi-Fi-ը։"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-in/strings.xml b/service/ServiceWifiResources/res/values-in/strings.xml index 6ba3e6e5e9..9e37de347a 100644 --- a/service/ServiceWifiResources/res/values-in/strings.xml +++ b/service/ServiceWifiResources/res/values-in/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> dinonaktifkan oleh administrator Anda."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Tutup"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi aktif dalam mode pesawat"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Jika Wi-Fi tetap diaktifkan, ponsel akan ingat untuk tetap mengaktifkannya saat berikutnya ponsel Anda disetel ke mode pesawat"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi tetap aktif"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Ponsel akan ingat untuk tetap mengaktifkan Wi-Fi dalam mode pesawat. Nonaktifkan jika Anda tidak ingin Wi-Fi terus aktif."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-is/strings.xml b/service/ServiceWifiResources/res/values-is/strings.xml index 575a11580f..b8d06cc798 100644 --- a/service/ServiceWifiResources/res/values-is/strings.xml +++ b/service/ServiceWifiResources/res/values-is/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Stjórnandinn hefur slökkt á <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Loka"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Kveikt á Wi‑Fi í flugstillingu"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ef þú hefur kveikt á Wi-Fi mun síminn muna að hafa kveikt á því næst þegar þú stillir á flugstillingu"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Áfram kveikt á Wi‑Fi"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Síminn man að hafa kveikt á Wi-Fi í flugstillingu. Slökktu á Wi-Fi ef þú vilt ekki hafa kveikt á því."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-it/strings.xml b/service/ServiceWifiResources/res/values-it/strings.xml index 651d0e55f5..5ea81a8b47 100644 --- a/service/ServiceWifiResources/res/values-it/strings.xml +++ b/service/ServiceWifiResources/res/values-it/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"L\'amministratore ha disattivato la funzionalità <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Chiudi"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi attivo in modalità aereo"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Se tieni attivo il Wi-fi, il telefono ricorderà di mantenerlo attivo la prossima volta che sarai in modalità aereo"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Il Wi-Fi rimane attivo"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Il telefono ricorda di mantenere attivo il Wi‑Fi in modalità aereo. Disattiva il Wi-Fi se non vuoi che resti attivo."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-iw/strings.xml b/service/ServiceWifiResources/res/values-iw/strings.xml index 1b6dcc6cb4..3db16546aa 100644 --- a/service/ServiceWifiResources/res/values-iw/strings.xml +++ b/service/ServiceWifiResources/res/values-iw/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"האדמין השבית את <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"סגירה"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi מופעל במצב טיסה"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"אם חיבור ה-Wi‑Fi נשאר מופעל, הטלפון יזכור להשאיר אותו מופעל בפעם הבאה שהוא יועבר למצב טיסה"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"חיבור ה-Wi‑Fi יישאר מופעל"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"חיבור ה-Wi‑Fi בטלפון יישאר מופעל במצב טיסה. אפשר להשבית את ה-Wi-Fi אם לא רוצים שהוא יפעל."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ja/strings.xml b/service/ServiceWifiResources/res/values-ja/strings.xml index c4054439e9..e6b2135d8b 100644 --- a/service/ServiceWifiResources/res/values-ja/strings.xml +++ b/service/ServiceWifiResources/res/values-ja/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> は管理者によって無効にされています。"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"閉じる"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"機内モードで Wi-Fi を ON"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wi-Fi を ON にしておくと、次に機内モードになったときも ON のままになります"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi を ON のままにする"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"機内モードでも、スマートフォンの Wi-Fi は ON のままになります。Wi-Fi を ON にしたくない場合は OFF にしてください。"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ka/strings.xml b/service/ServiceWifiResources/res/values-ka/strings.xml index e643cf6a14..d67d04482d 100644 --- a/service/ServiceWifiResources/res/values-ka/strings.xml +++ b/service/ServiceWifiResources/res/values-ka/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> გათიშულია თქვენი ადმინისტრატორის მიერ."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"დახურვა"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi ჩართულია თვითმფრინავის რეჟიმში"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"თუ Wi‑Fi-ს ჩართულს დატოვებთ, თქვენი ტელეფონი დაიმახსოვრებს და ჩართულს დატოვებს, როდესაც შემდგომში თვითმფრინავის რეჟიმში იქნებით"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi კვლავ ჩართულია"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"თქვენს ტელეფონს ემახსოვრება, რომ Wi‑Fi ჩართული უნდა იყოს თვითმფრინავის რეჟიმში. Wi‑Fi if-ის გამორთვა, თუ არ გსურთ ჩართული დატოვოთ."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-kk/strings.xml b/service/ServiceWifiResources/res/values-kk/strings.xml index af1817ef49..0dde1eccf8 100644 --- a/service/ServiceWifiResources/res/values-kk/strings.xml +++ b/service/ServiceWifiResources/res/values-kk/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> әкімші тарапынан өшірілді."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Жабу"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi ұшақ режимінде қосулы болады"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wi‑Fi қосулы болса, ол келесіде телефондағы ұшақ режимінде қосулы болады."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi қосулы тұрады"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Телефондағы Wi‑Fi ұшақ режимінде қосулы болады. Wi‑Fi желісінің қосулы тұрғанын қаламасаңыз, оны өшіріңіз."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-km/strings.xml b/service/ServiceWifiResources/res/values-km/strings.xml index 6e6ea9a651..a109192e6d 100644 --- a/service/ServiceWifiResources/res/values-km/strings.xml +++ b/service/ServiceWifiResources/res/values-km/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> ត្រូវបានបិទដោយអ្នកគ្រប់គ្រងរបស់អ្នក។"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"បិទ"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"បើក Wi-Fi នៅក្នុងមុខងារពេលជិះយន្តហោះ"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"ប្រសិនបើអ្នកបន្តបើក Wi‑Fi នោះទូរសព្ទរបស់អ្នកនឹងចាំថាត្រូវបន្តបើកវា នៅលើកក្រោយដែលអ្នកស្ថិតក្នុងមុខងារពេលជិះយន្តហោះ"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi នៅតែបើក"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ទូរសព្ទរបស់អ្នកចាំថាត្រូវបន្តបើក Wi-Fi នៅក្នុងមុខងារពេលជិះយន្តហោះ។ បិទ Wi‑Fi ប្រសិនបើអ្នកមិនចង់ឱ្យវាបន្តបើក។"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-kn/strings.xml b/service/ServiceWifiResources/res/values-kn/strings.xml index 34e8d407c0..9379121343 100644 --- a/service/ServiceWifiResources/res/values-kn/strings.xml +++ b/service/ServiceWifiResources/res/values-kn/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"ಮುಚ್ಚಿರಿ"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ನಲ್ಲಿ ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"ನೀವು ವೈ-ಫೈ ಆನ್ ಮಾಡಿದರೆ, ಮುಂದಿನ ಬಾರಿ ನೀವು ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ನಲ್ಲಿರುವಾಗ ಅದನ್ನು ಆನ್ ಮಾಡಲು ನಿಮ್ಮ ಫೋನ್ ನೆನಪಿಸಿಕೊಳ್ಳುತ್ತದೆ"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"ವೈ-ಫೈ ಆನ್ ಇರುತ್ತದೆ"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ವೈ-ಫೈ ಅನ್ನು ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ನಲ್ಲಿ ಇರಿಸಿಕೊಳ್ಳಲು ನಿಮ್ಮ ಫೋನ್ ನೆನಪಿನಲ್ಲಿರಿಸಿಕೊಳ್ಳುತ್ತದೆ. ವೈ-ಫೈ ಆನ್ ಆಗಿರಲು ನೀವು ಬಯಸದಿದ್ದರೆ ಅದನ್ನು ಆಫ್ ಮಾಡಿ."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ko/strings.xml b/service/ServiceWifiResources/res/values-ko/strings.xml index 98b5dc6728..aa4a7983fe 100644 --- a/service/ServiceWifiResources/res/values-ko/strings.xml +++ b/service/ServiceWifiResources/res/values-ko/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g>이(가) 관리자에 의해 사용 중지되었습니다."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"닫기"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"비행기 모드에서 Wi-Fi 사용"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wi-Fi를 켜진 상태로 유지하면 다음에 비행기 모드를 사용할 때도 Wi-Fi 연결이 유지됩니다."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi가 켜진 상태로 유지됨"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"휴대전화가 비행기 모드에서 Wi-Fi를 켜진 상태로 유지합니다. 유지하지 않으려면 Wi-Fi를 사용 중지하세요."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ky/strings.xml b/service/ServiceWifiResources/res/values-ky/strings.xml index ce19b53812..a1ea5b292b 100644 --- a/service/ServiceWifiResources/res/values-ky/strings.xml +++ b/service/ServiceWifiResources/res/values-ky/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> администраторуңуз тарабынан өчүрүлдү."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Жабуу"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi учак режиминде күйгүзүлөт"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Эгер Wi-Fi күйүк бойдон калса, кийинки жолу учак режимине өткөнүңүздө телефонуңуз аны эстеп калат"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi күйгөн бойдон калат"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Телефонуңуз учак режиминде Wi‑Fi\'га туташкан бойдон калат. Кааласаңыз, Wi‑Fi\'ды өчүрүп койсоңуз болот."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-lo/strings.xml b/service/ServiceWifiResources/res/values-lo/strings.xml index d580e25f51..844aa86757 100644 --- a/service/ServiceWifiResources/res/values-lo/strings.xml +++ b/service/ServiceWifiResources/res/values-lo/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"ປິດ"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi ເປີດຢູ່ໃນໂໝດຢູ່ໃນຍົນ"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"ຫາກທ່ານເປີດ Wi‑Fi ໄວ້, ໂທລະສັບຂອງທ່ານຈະຈື່ວ່າຕ້ອງເປີດ Wi‑Fi ໃນເທື່ອຕໍ່ໄປທີ່ທ່ານຢູ່ໃນໂໝດຢູ່ໃນຍົນ"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi ເປີດຢູ່"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ໂທລະສັບຂອງທ່ານຈື່ວ່າຈະຕ້ອງເປີດ Wi-Fi ໄວ້ໃນໂໝດຢູ່ໃນຍົນ. ປິດ Wi‑Fi ຫາກທ່ານບໍ່ຕ້ອງການໃຫ້ເປີດມັນໄວ້."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-lt/strings.xml b/service/ServiceWifiResources/res/values-lt/strings.xml index 36db1ef849..ffbf73b117 100644 --- a/service/ServiceWifiResources/res/values-lt/strings.xml +++ b/service/ServiceWifiResources/res/values-lt/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"„<xliff:g id="SSID">%1$s</xliff:g>“ išjungė administratorius."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Uždaryti"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"„Wi‑Fi“ ryšys įjungtas lėktuvo režimu"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Jei paliksite „Wi‑Fi“ ryšį įjungtą, telefonas, prisimins palikti jį įjungtą, kai kitą kartą įjungsite lėktuvo režimą"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"„Wi‑Fi“ lieka įjungtas"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefonas prisimena, kad lėktuvo režimu reikia palikti įjungtą „Wi‑Fi“ ryšį. Išjunkite „Wi‑Fi“, jei nenorite, kad jis liktų įjungtas."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-lv/strings.xml b/service/ServiceWifiResources/res/values-lv/strings.xml index abd4905744..b400073217 100644 --- a/service/ServiceWifiResources/res/values-lv/strings.xml +++ b/service/ServiceWifiResources/res/values-lv/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administrators atspējoja tīklu <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Aizvērt"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi ieslēgts lidojuma režīmā"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ja Wi‑Fi savienojums paliks ieslēgts, tālrunī tas paliks ieslēgts arī nākamreiz, kad ieslēgsiet lidojuma režīmu."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi joprojām ieslēgts"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Tālrunī joprojām būs ieslēgts Wi-Fi savienojums lidojuma režīmā. Izslēdziet Wi‑Fi savienojumu, ja nevēlaties, lai tas paliktu ieslēgts."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-mk/strings.xml b/service/ServiceWifiResources/res/values-mk/strings.xml index 8abed0719d..61abc94f0b 100644 --- a/service/ServiceWifiResources/res/values-mk/strings.xml +++ b/service/ServiceWifiResources/res/values-mk/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> е оневозможенa од вашиот администратор."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Затвори"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi е вклучено во авионски режим"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ако го оставите Wi‑Fi вклучено, телефонот ќе запомни да го остави вклучено до следниот пат кога ќе бидете во авионски режим"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi останува вклучено"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Телефонот помни да го остави Wi‑Fi вклучено во авионски режим. Исклучете го Wi‑Fi ако не сакате да остане вклучено."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ml/strings.xml b/service/ServiceWifiResources/res/values-ml/strings.xml index da1ed6d4aa..cc608aa0c1 100644 --- a/service/ServiceWifiResources/res/values-ml/strings.xml +++ b/service/ServiceWifiResources/res/values-ml/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"അടയ്ക്കുക"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"ഫ്ലൈറ്റ് മോഡിൽ വൈഫൈ ഓണാണ്"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"വൈഫൈ ഓണാക്കി വച്ചാൽ, അടുത്ത തവണ നിങ്ങൾ ഫ്ലൈറ്റ് മോഡിൽ ആയിരിക്കുമ്പോൾ നിങ്ങളുടെ ഫോൺ അത് ഓണാക്കി വയ്ക്കാൻ ഓർക്കും"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"വൈഫൈ ഓണായിരിക്കും"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ഫ്ലൈറ്റ് മോഡിലായിരിക്കുമ്പോൾ വൈഫൈ ഓണാക്കി വയ്ക്കാൻ നിങ്ങളുടെ ഫോൺ ഓർമ്മിക്കും. വൈഫൈ ഓണാക്കി വയ്ക്കാൻ താൽപ്പര്യമില്ലെങ്കിൽ അത് ഓഫാക്കുക."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-mn/strings.xml b/service/ServiceWifiResources/res/values-mn/strings.xml index c940864362..76a2150fa8 100644 --- a/service/ServiceWifiResources/res/values-mn/strings.xml +++ b/service/ServiceWifiResources/res/values-mn/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g>-г танай администратор идэвхгүй болгосон."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Хаах"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi нислэгийн горимд асаалттай"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Хэрэв та Wi-Fi-аа асаалттай байлгавал таныг дараагийн удаа нислэгийн горимд байх үед утас тань үүнийг асаалттай байлгахыг санана"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi асаалттай байна"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Таны утас Wi-Fi-г нислэгийн горимд асаалттай байлгахыг санана. Хэрэв та үүнийг асаалттай байлгахыг хүсэхгүй байвал Wi-Fi-г унтраана уу."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-mr/strings.xml b/service/ServiceWifiResources/res/values-mr/strings.xml index c285271d66..bad462c163 100644 --- a/service/ServiceWifiResources/res/values-mr/strings.xml +++ b/service/ServiceWifiResources/res/values-mr/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"तुमच्या अॅडमिनिस्ट्रेटर ने <xliff:g id="SSID">%1$s</xliff:g> बंद केले आहे."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"बंद करा"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"विमान मोडमध्ये वाय-फाय सुरू आहे"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"तुम्ही वाय-फाय सुरू ठेवल्यास, पुढील वेळी विमान मोडमध्ये असाल, तेव्हा तुमचा फोन ते सुरू ठेवण्याचे लक्षात ठेवेल"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"वाय-फाय सुरू राहते"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"तुमचा फोन विमान मोडमध्ये वाय-फाय सुरू ठेवण्याचे लक्षात ठेवतो. तुम्हाला सुरू ठेवायचे नसल्यास, वाय-फाय बंद करा."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ms/strings.xml b/service/ServiceWifiResources/res/values-ms/strings.xml index 930c49d16b..c26fe01408 100644 --- a/service/ServiceWifiResources/res/values-ms/strings.xml +++ b/service/ServiceWifiResources/res/values-ms/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> dilumpuhkan oleh pentadbir anda."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Tutup"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi dihidupkan dalam mod pesawat"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Jika anda terus menghidupkan Wi-Fi, telefon anda akan ingat untuk membiarkan Wi-Fi hidup pada kali seterusnya telefon anda berada dalam mod pesawat"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi terus dihidupkan"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefon anda diingatkan untuk terus menghidupkan Wi-Fi dalam mod pesawat. Matikan Wi‑Fi jika anda tidak mahu Wi‑Fi sentiasa hidup."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-my/strings.xml b/service/ServiceWifiResources/res/values-my/strings.xml index 9fc959273c..d2faa7a708 100644 --- a/service/ServiceWifiResources/res/values-my/strings.xml +++ b/service/ServiceWifiResources/res/values-my/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"သင့်စီမံခန့်ခွဲသူက <xliff:g id="SSID">%1$s</xliff:g> ကို ပိတ်ထားသည်။"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"ပိတ်ရန်"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"လေယာဉ်ပျံမုဒ်တွင် Wi‑Fi ပွင့်နေသည်"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wi‑Fi ဆက်ဖွင့်ထားပါက နောက်တစ်ကြိမ်လေယာဉ်ပျံမုဒ် သုံးချိန်တွင် ၎င်းဆက်ဖွင့်ရန် သင့်ဖုန်းက မှတ်ထားမည်။"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi ဆက်ပွင့်နေသည်"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"လေယာဉ်ပျံမုဒ်သုံးစဉ် Wi-Fi ဆက်ဖွင့်ထားရန် သင့်ဖုန်းက မှတ်မိသည်။ Wi‑Fi ဆက်ဖွင့်မထားလိုပါက ပိတ်နိုင်သည်။"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-nb/strings.xml b/service/ServiceWifiResources/res/values-nb/strings.xml index b9188a6373..d5cc3eb13c 100644 --- a/service/ServiceWifiResources/res/values-nb/strings.xml +++ b/service/ServiceWifiResources/res/values-nb/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administratoren din har deaktivert <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Lukk"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wifi på i flymodus"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Hvis du lar wifi være på, husker telefonen dette til den neste gangen du bruker flymodus"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wifi holdes på"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefonen husker å la wifi være påslått i flymodus. Du kan slå av wifi hvis du ikke vil la det være på."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ne/strings.xml b/service/ServiceWifiResources/res/values-ne/strings.xml index b9e72840f5..684887a4c7 100644 --- a/service/ServiceWifiResources/res/values-ne/strings.xml +++ b/service/ServiceWifiResources/res/values-ne/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"तपाईंका एड्मिनले <xliff:g id="SSID">%1$s</xliff:g> अफ गर्नुभएको छ।"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"बन्द गर्नुहोस्"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"हवाइजहाज मोडमा Wi-Fi अन रहन्छ"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"तपाईंले Wi‑Fi अन राख्नुभयो भने तपाईंले फेरि हवाइजहाज मोड सेट गर्दा फोनले Wi-Fi अन राख्नु पर्ने कुरा याद राख्छ"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi अन रहन्छ"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"हवाइजहाज मोडमा पनि तपाईंको फोनमा Wi-Fi अन नै रहने छ। तपाईं Wi‑Fi अन भइनरहोस् भन्ने चाहनुहुन्छ भने अफ गर्नुहोस्।"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-nl/strings.xml b/service/ServiceWifiResources/res/values-nl/strings.xml index 53fc90e0e6..a43ad53947 100644 --- a/service/ServiceWifiResources/res/values-nl/strings.xml +++ b/service/ServiceWifiResources/res/values-nl/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> is uitgezet door je beheerder."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Sluiten"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wifi aan in vliegtuigmodus"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Als je wifi laat aanstaan, onthoudt je telefoon dit en blijft de wifi aanstaan als je de vliegtuigmodus weer aanzet"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wifi blijft aan"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"De wifi op je telefoon blijft aan in de vliegtuigmodus. Zet wifi uit als je niet wilt dat dit aan blijft."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-or/strings.xml b/service/ServiceWifiResources/res/values-or/strings.xml index f210f4c2f6..a8ff3ea601 100644 --- a/service/ServiceWifiResources/res/values-or/strings.xml +++ b/service/ServiceWifiResources/res/values-or/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି।"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"ଏୟାରପ୍ଲେନ ମୋଡରେ ୱାଇ-ଫାଇ ଚାଲୁ ଅଛି"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"ଯଦି ଆପଣ ୱାଇ-ଫାଇ ଚାଲୁ ରଖନ୍ତି, ତେବେ ଆପଣ ପରବର୍ତ୍ତୀ ଥର ଏୟାରପ୍ଲେନ ମୋଡରେ ଥିବା ସମୟରେ ଆପଣଙ୍କ ଫୋନ ଏହାକୁ ଚାଲୁ ରଖିବାକୁ ମନେ ରଖିବ"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"ୱାଇ-ଫାଇ ଚାଲୁ ରହିବ"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ଆପଣଙ୍କ ଫୋନ ଏୟାରପ୍ଲେନ ମୋଡରେ ୱାଇ-ଫାଇ ଚାଲୁ ରଖିବାକୁ ମନେ ରଖେ। ଯଦି ଆପଣ ୱାଇ-ଫାଇ ଚାଲୁ ରଖିବାକୁ ଚାହାଁନ୍ତି ନାହିଁ ତେବେ ୱାଇ-ଫାଇ ବନ୍ଦ କରନ୍ତୁ।"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-pa/strings.xml b/service/ServiceWifiResources/res/values-pa/strings.xml index 46b352de09..1b42c2b532 100644 --- a/service/ServiceWifiResources/res/values-pa/strings.xml +++ b/service/ServiceWifiResources/res/values-pa/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ <xliff:g id="SSID">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ।"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"ਬੰਦ ਕਰੋ"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਵਿੱਚ ਵਾਈ-ਫਾਈ ਚਾਲੂ ਹੈ"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"ਜੇ ਤੁਸੀਂ ਵਾਈ-ਫਾਈ ਨੂੰ ਚਾਲੂ ਰੱਖਦੇ ਹੋ, ਤਾਂ ਅਗਲੀ ਵਾਰ ਤੁਹਾਡਾ ਫ਼ੋਨ ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਵਿੱਚ ਹੋਣ \'ਤੇ ਤੁਹਾਡਾ ਫ਼ੋਨ ਇਸਨੂੰ ਚਾਲੂ ਰੱਖਣਾ ਯਾਦ ਰੱਖੇਗਾ"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"ਵਾਈ-ਫਾਈ ਚਾਲੂ ਰਹੇਗਾ"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਵਿੱਚ ਵਾਈ-ਫਾਈ ਨੂੰ ਚਾਲੂ ਰੱਖਣਾ ਯਾਦ ਰੱਖਦਾ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਚਾਲੂ ਨਹੀਂ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਵਾਈ-ਫਾਈ ਨੂੰ ਬੰਦ ਕਰੋ।"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-pl/strings.xml b/service/ServiceWifiResources/res/values-pl/strings.xml index 6a13a74fd2..f0b9ec59be 100644 --- a/service/ServiceWifiResources/res/values-pl/strings.xml +++ b/service/ServiceWifiResources/res/values-pl/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administrator wyłączył sieć <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zamknij"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi włączone w trybie samolotowym"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Jeśli pozostawisz funkcję Wi‑Fi włączoną, telefon zachowa się podobnie przy kolejnym przejściu w tryb samolotowy"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi pozostanie włączone"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Wi-Fi na telefonie pozostaje włączone w trybie samolotowym. Wyłącz Wi‑Fi, jeśli nie chcesz, aby ta funkcja pozostała uruchomiona."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-pt-rBR/strings.xml b/service/ServiceWifiResources/res/values-pt-rBR/strings.xml index 6b044eac0e..e4e27d7a07 100644 --- a/service/ServiceWifiResources/res/values-pt-rBR/strings.xml +++ b/service/ServiceWifiResources/res/values-pt-rBR/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"O recurso <xliff:g id="SSID">%1$s</xliff:g> foi desativado pelo administrador."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Fechar"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi-Fi ativado no modo avião"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Se você escolher manter o Wi‑Fi ligado, na próxima vez que você estiver em modo avião, o Wi-Fi do smartphone vai continuar ativado"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"O Wi-Fi fica ativado"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"O smartphone vai manter o Wi-Fi ligado no modo avião. Desligue o Wi‑Fi se você não quer que ele fique ativado."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-pt-rPT/strings.xml b/service/ServiceWifiResources/res/values-pt-rPT/strings.xml index 4ee0be601f..fb0be094eb 100644 --- a/service/ServiceWifiResources/res/values-pt-rPT/strings.xml +++ b/service/ServiceWifiResources/res/values-pt-rPT/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"O administrador desativou a funcionalidade <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Fechar"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi ativado no modo de avião"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Se mantiver o Wi‑Fi ativado, o telemóvel vai lembrar-se de o manter ativado da próxima vez que estiver no modo de avião"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"O Wi‑Fi mantém-se ativado"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"O seu telemóvel mantém o Wi-Fi ativado no modo de avião. Desative o Wi-Fi se não quiser que fique ativado."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-pt/strings.xml b/service/ServiceWifiResources/res/values-pt/strings.xml index 6b044eac0e..e4e27d7a07 100644 --- a/service/ServiceWifiResources/res/values-pt/strings.xml +++ b/service/ServiceWifiResources/res/values-pt/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"O recurso <xliff:g id="SSID">%1$s</xliff:g> foi desativado pelo administrador."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Fechar"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi-Fi ativado no modo avião"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Se você escolher manter o Wi‑Fi ligado, na próxima vez que você estiver em modo avião, o Wi-Fi do smartphone vai continuar ativado"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"O Wi-Fi fica ativado"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"O smartphone vai manter o Wi-Fi ligado no modo avião. Desligue o Wi‑Fi se você não quer que ele fique ativado."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ro/strings.xml b/service/ServiceWifiResources/res/values-ro/strings.xml index bed936e8b9..5fe9d8dc3d 100644 --- a/service/ServiceWifiResources/res/values-ro/strings.xml +++ b/service/ServiceWifiResources/res/values-ro/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Administratorul a dezactivat <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Închide"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi activat în modul Avion"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Dacă păstrezi Wi‑Fi activat, telefonul tău va reține să-l păstreze activat data viitoare când ești în modul Avion"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Funcția Wi‑Fi rămâne activată"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefonul reține să păstreze funcția Wi-Fi activată în modul Avion. Dezactivează Wi‑Fi dacă nu vrei să rămână activat."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ru/strings.xml b/service/ServiceWifiResources/res/values-ru/strings.xml index 7179dd51ae..041ef1f897 100644 --- a/service/ServiceWifiResources/res/values-ru/strings.xml +++ b/service/ServiceWifiResources/res/values-ru/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Администратор отключил функцию \"<xliff:g id="SSID">%1$s</xliff:g>\"."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Закрыть"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi будет включен в режиме полета"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Если не отключить функцию Wi-Fi, в следующий раз она останется включенной в режиме полета."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Функция Wi‑Fi остается включенной"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Функция Wi‑Fi останется включенной в режиме полета. Вы можете отключить ее, если хотите."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-si/strings.xml b/service/ServiceWifiResources/res/values-si/strings.xml index ea269f6d6b..892104648b 100644 --- a/service/ServiceWifiResources/res/values-si/strings.xml +++ b/service/ServiceWifiResources/res/values-si/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> ඔබේ පරිපාලක විසින් අබල කර ඇත."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"වසන්න"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"ගුවන්යානා ප්රකාරය තුළ Wi‑Fi සක්රීයයි"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"ඔබ Wi‑Fi ක්රියාත්මක කර තබා ගන්නේ නම්, ඔබ අහස්යානා ආකාරයේ සිටින මීළඟ වතාවේ එය ක්රියාත්මක කිරීමට ඔබේ දුරකථනයට මතක තිබෙනු ඇත."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi ක්රියාත්මකව පවතී"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"ඔබේ දුරකථනය අහස්යානා ආකාරයේ දී Wi‑Fi ක්රියාත්මකව තබා ගැනීමට මතක තබා ගනියි. ඔබට Wi‑Fi ක්රියාත්මක වීමට අවශ්ය නොවේ නම් එය ක්රියාවිරහිත කරන්න."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-sk/strings.xml b/service/ServiceWifiResources/res/values-sk/strings.xml index 8d00f9019c..835cbc75a7 100644 --- a/service/ServiceWifiResources/res/values-sk/strings.xml +++ b/service/ServiceWifiResources/res/values-sk/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Funkcia <xliff:g id="SSID">%1$s</xliff:g> je deaktivovaná správcom."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zavrieť"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Sieť Wi‑Fi bude v režime v lietadle zapnutá"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ak ponecháte sieť Wi‑Fi zapnutú, váš telefón si zapamätá, že ju má ponechať zapnutú pri ďalšom aktivovaní režimu v lietadle"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Pripojenie Wi‑Fi zostane zapnuté"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefón si zapamätá, aby v režime v lietadle nevypínal sieť Wi‑Fi. Vypnite ju, ak nechcete, aby zostala zapnutá."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-sl/strings.xml b/service/ServiceWifiResources/res/values-sl/strings.xml index ab763ba559..3f02e07d7a 100644 --- a/service/ServiceWifiResources/res/values-sl/strings.xml +++ b/service/ServiceWifiResources/res/values-sl/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Omrežje <xliff:g id="SSID">%1$s</xliff:g> je onemogočil skrbnik."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Zapri"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi je vklopljen v načinu za letalo."</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Če pustite Wi-Fi vklopljen, bo telefon ob naslednjem preklopu na način za letalo pustil Wi-Fi vklopljen."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi ostane vklopljen"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefon v načinu za letalo pusti Wi-Fi vklopljen. Če ne želite, da ostane vklopljen, izklopite vmesnik Wi‑Fi."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-sq/strings.xml b/service/ServiceWifiResources/res/values-sq/strings.xml index bd22a68f83..418e67ab74 100644 --- a/service/ServiceWifiResources/res/values-sq/strings.xml +++ b/service/ServiceWifiResources/res/values-sq/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> është çaktivizuar nga administratori yt."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Mbyll"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi është në modalitetin e aeroplanit"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Nëse e mban Wi-Fi të aktivizuar, telefoni yt do të kujtohet ta mbajë atë të aktivizuar herën tjetër që të jesh në modalitetin e aeroplanit"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi qëndron aktiv"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefoni yt kujtohet që ta mbajë Wi-Fi të aktivizuar në modalitetin e aeroplanit. Çaktivizo Wi‑Fi nëse nuk dëshiron që të qëndrojë e aktivizuar."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-sr/strings.xml b/service/ServiceWifiResources/res/values-sr/strings.xml index 4f514c9612..75cc48a167 100644 --- a/service/ServiceWifiResources/res/values-sr/strings.xml +++ b/service/ServiceWifiResources/res/values-sr/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Администратор је онемогућио <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Затвори"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"WiFi је укључен у режиму рада у авиону"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Ако одлучите да не искључујете WiFi, телефон ће запамтити да га не искључује следећи пут када будете у режиму рада у авиону"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"WiFi остаје укључен"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Телефон памти да не треба да искључује WiFi у режиму рада у авиону. Искључите WiFi ако не желите да остане укључен."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-sv/strings.xml b/service/ServiceWifiResources/res/values-sv/strings.xml index 337363185f..2daf149846 100644 --- a/service/ServiceWifiResources/res/values-sv/strings.xml +++ b/service/ServiceWifiResources/res/values-sv/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> har inaktiverats av administratören."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Stäng"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wifi är aktiverat i flygplansläget"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Om du håller wifi aktiverat kommer telefonen ihåg att hålla det aktiverat nästa gång du använder flygplansläge."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wifi inaktiveras inte"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefonen håller wifi aktiverat i flygplansläge. Inaktivera wifi om du inte vill att wifi ska hållas aktiverat."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-sw/strings.xml b/service/ServiceWifiResources/res/values-sw/strings.xml index 5d4dee3f8c..63df9faf47 100644 --- a/service/ServiceWifiResources/res/values-sw/strings.xml +++ b/service/ServiceWifiResources/res/values-sw/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> umezimwa na msimamizi wako."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Funga"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi itawashwa katika hali ya ndegeni"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Usipozima Wi-Fi, simu yako itakumbuka kuiwasha wakati mwingine unapokuwa katika hali ya ndegeni"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi itaendelea kuwaka"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Simu yako itaendelea kuwasha Wi-Fi inapokuwa katika hali ya ndegeni. Zima Wi-Fi iwapo hutaki iendelee kuwaka."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ta/strings.xml b/service/ServiceWifiResources/res/values-ta/strings.xml index d385417da4..47728160b9 100644 --- a/service/ServiceWifiResources/res/values-ta/strings.xml +++ b/service/ServiceWifiResources/res/values-ta/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> உங்கள் நிர்வாகியால் முடக்கப்பட்டுள்ளது."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"மூடுக"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"விமானப் பயன்முறையில் வைஃபை இயக்கத்திலேயே இருக்கும்"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"வைஃபையை இயக்கத்தில் வைத்திருந்தால், அடுத்த முறை நீங்கள் விமானப் பயன்முறையைப் பயன்படுத்தும்போது உங்கள் மொபைல் வைஃபையை இயக்கத்தில் வைக்கும்"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"வைஃபை இயக்கத்திலேயே இருக்கும்"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"உங்கள் மொபைல் விமானப் பயன்முறையில் இருக்கும்போது வைஃபையை இயக்கத்திலேயே வைத்திருக்கும். வைஃபையைப் பயன்படுத்த விரும்பவில்லை என்றால் அதை முடக்கவும்."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-te/strings.xml b/service/ServiceWifiResources/res/values-te/strings.xml index 47f53eda42..26fbd27d2a 100644 --- a/service/ServiceWifiResources/res/values-te/strings.xml +++ b/service/ServiceWifiResources/res/values-te/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g>ను మీ అడ్మినిస్ట్రేటర్ డిజేబుల్ చేశారు."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"మూసివేయండి"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"విమానం మోడ్లో Wi‑Fi ఆన్ చేయబడింది"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"మీరు Wi‑Fiని ఆన్లో ఉంచినట్లయితే, మీరు తదుపరిసారి విమానం మోడ్లో ఉన్నప్పుడు దాన్ని ఆన్లో ఉంచాలని మీ ఫోన్ గుర్తుంచుకుంటుంది"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi ఆన్లోనే ఉంటుంది"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"మీ ఫోన్ విమానం మోడ్లో Wi‑Fiని ఆన్లో ఉంచాలని గుర్తుంచుకుంటుంది. Wi‑Fi ఆన్లో ఉండకూడదనుకుంటే దాన్ని ఆఫ్ చేయండి."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-th/strings.xml b/service/ServiceWifiResources/res/values-th/strings.xml index 38355e7c44..85cea77bdc 100644 --- a/service/ServiceWifiResources/res/values-th/strings.xml +++ b/service/ServiceWifiResources/res/values-th/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"ผู้ดูแลระบบปิดใช้ <xliff:g id="SSID">%1$s</xliff:g>"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"ปิด"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi จะเปิดในโหมดบนเครื่องบิน"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"หากเปิด Wi-Fi ไว้ โทรศัพท์จะจำว่าต้องเปิด Wi-Fi ในครั้งถัดไปที่คุณอยู่ในโหมดบนเครื่องบิน"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi-Fi เปิดอยู่"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"โทรศัพท์จำว่าจะต้องเปิด Wi-Fi ในโหมดบนเครื่องบิน ปิด Wi-Fi หากคุณไม่ต้องการให้เปิดไว้"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-tl/strings.xml b/service/ServiceWifiResources/res/values-tl/strings.xml index 8ab7d880ba..77306771ce 100644 --- a/service/ServiceWifiResources/res/values-tl/strings.xml +++ b/service/ServiceWifiResources/res/values-tl/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Na-disable ng iyong administrator ang <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Isara"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"I-on ang Wi‑Fi habang nasa airplane mode"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Kung papanatilihin mong naka-on ang Wi‑Fi, tatandaan ng iyong telepono na panatilihin itong naka-on sa susunod na nasa airplane mode ka"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Mananatiling naka-on ang Wi‑Fi"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Tinatandaan ng iyong telepono na panatilihing naka-on ang Wi-Fi habang nasa airplane mode. I-off ang Wi‑Fi kung ayaw mo itong manatiling naka-on."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-tr/strings.xml b/service/ServiceWifiResources/res/values-tr/strings.xml index f8a1b6ae89..088f30f426 100644 --- a/service/ServiceWifiResources/res/values-tr/strings.xml +++ b/service/ServiceWifiResources/res/values-tr/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g>, yöneticiniz tarafından devre dışı bırakıldı."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Kapat"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Uçak modundayken kablosuz bağlantı açık"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Kablosuz bağlantıyı açık tutarsanız telefonunuz, daha sonra tekrar uçak modunda olduğunuzda kablosuz bağlantıyı açık tutar"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Kablosuz bağlantı açık kalır"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefonunuz, uçak modundayken kablosuz bağlantıyı açık tutmayı hatırlar. Açık kalmasını istemiyorsanız kablosuz bağlantıyı kapatın."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-uk/strings.xml b/service/ServiceWifiResources/res/values-uk/strings.xml index 2a34dc0621..797f361baf 100644 --- a/service/ServiceWifiResources/res/values-uk/strings.xml +++ b/service/ServiceWifiResources/res/values-uk/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Адміністратор вимкнув мережу <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Закрити"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Ви ввімкнули Wi‑Fi у режимі польоту"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Якщо ви не вимкнете Wi‑Fi на телефоні, ця функція залишатиметься ввімкненою під час наступного використання режиму польоту"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi не буде вимкнено"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"У режимі польоту функція Wi‑Fi на телефоні залишатиметься ввімкненою. Якщо захочете вимкнути її, вимкніть Wi‑Fi."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-ur/strings.xml b/service/ServiceWifiResources/res/values-ur/strings.xml index 8f8f6f0ac2..58789120f1 100644 --- a/service/ServiceWifiResources/res/values-ur/strings.xml +++ b/service/ServiceWifiResources/res/values-ur/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> کو آپ کے منتظم کے ذریعے مسدود کر دیا گیا ہے۔"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"بند کریں"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"ہوائی جہاز وضع میں Wi‑Fi آن ہے"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"اگر آپ Wi-Fi کو آن رکھتے ہیں تو آپ کا فون آپ کے اگلی مرتبہ ہوائی جہاز وضع میں ہونے پر اسے آن رکھنا یاد رکھے گا"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi آن رہتا ہے"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"آپ کا فون ہوائی جہاز وضع میں Wi‑Fi کو آن رکھنا یاد رکھتا ہے۔ اگر آپ نہیں چاہتے ہیں کہ Wi-Fi آن رہے تو اسے آف کریں۔"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-uz/strings.xml b/service/ServiceWifiResources/res/values-uz/strings.xml index e62ec1e76d..32996676a3 100644 --- a/service/ServiceWifiResources/res/values-uz/strings.xml +++ b/service/ServiceWifiResources/res/values-uz/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> administrator tomonidan faolsizlantirilgan."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Yopish"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi parvoz rejimida yoniq"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Wi-Fi yoniq qolsa, telefon keyingi safar parvoz rejimida ham uni yoniq qoldiradi."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi yoniq turadi"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Telefoningiz parvoz rejimida Wi‑Fi yoqilganini eslab qoladi. Yoniq qolmasligi uchun Wi-Fi aloqasini oʻchiring."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-vi/strings.xml b/service/ServiceWifiResources/res/values-vi/strings.xml index 1470d42809..56ccaf2902 100644 --- a/service/ServiceWifiResources/res/values-vi/strings.xml +++ b/service/ServiceWifiResources/res/values-vi/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"Quản trị viên của bạn đã tắt tính năng <xliff:g id="SSID">%1$s</xliff:g>."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Đóng"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"Wi‑Fi bật ở chế độ trên máy bay"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Nếu bạn không tắt Wi‑Fi, điện thoại sẽ luôn bật Wi‑Fi vào lần tiếp theo bạn dùng chế độ trên máy bay"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi ‑ Fi luôn được bật"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Điện thoại của bạn sẽ luôn bật Wi-Fi ở chế độ trên máy bay. Nếu không muốn như vậy thì bạn có thể tắt Wi-Fi."</string> </resources> diff --git a/service/ServiceWifiResources/res/values-zh-rCN/strings.xml b/service/ServiceWifiResources/res/values-zh-rCN/strings.xml index 24f5cb288f..ff15bf9933 100644 --- a/service/ServiceWifiResources/res/values-zh-rCN/strings.xml +++ b/service/ServiceWifiResources/res/values-zh-rCN/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"<xliff:g id="SSID">%1$s</xliff:g> 已被您的管理员停用。"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"关闭"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"飞行模式时开启 WLAN"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"如果您不关闭 WLAN,那么您下次进入飞行模式时手机将记住保持 WLAN 开启"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"WLAN 保持开启状态"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"在飞行模式下手机将记住保持 WLAN 开启。如果您不想让 WLAN 保持开启,请将其关闭。"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-zh-rHK/strings.xml b/service/ServiceWifiResources/res/values-zh-rHK/strings.xml index f4f56b7f8d..e287aa040e 100644 --- a/service/ServiceWifiResources/res/values-zh-rHK/strings.xml +++ b/service/ServiceWifiResources/res/values-zh-rHK/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"您的管理員已停用「<xliff:g id="SSID">%1$s</xliff:g>」。"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"關閉"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"在飛行模式下開啟 Wi-Fi"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"如果您不關閉 Wi-Fi,下次手機進入飛行模式時,Wi-Fi 將保持開啟"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"保持 Wi-Fi 連線"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"手機會記得在飛行模式下保持 Wi-Fi 開啟。如果您不希望保持開啟,請關閉 Wi-Fi。"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-zh-rTW/strings.xml b/service/ServiceWifiResources/res/values-zh-rTW/strings.xml index c941f23239..d2e462c16c 100644 --- a/service/ServiceWifiResources/res/values-zh-rTW/strings.xml +++ b/service/ServiceWifiResources/res/values-zh-rTW/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"你的系統管理員已停用 <xliff:g id="SSID">%1$s</xliff:g>。"</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"關閉"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"在飛航模式下保持 Wi-Fi 開啟狀態"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"如果你不關閉 Wi-Fi,下次手機進入飛航模式時,Wi-Fi 將保持開啟"</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"Wi‑Fi 會保持開啟狀態"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"手機會記得在飛航模式下保持 Wi-Fi 開啟。如果不要保持開啟,請關閉 Wi-Fi。"</string> </resources> diff --git a/service/ServiceWifiResources/res/values-zu/strings.xml b/service/ServiceWifiResources/res/values-zu/strings.xml index 69f841ce72..7fc09bc7c8 100644 --- a/service/ServiceWifiResources/res/values-zu/strings.xml +++ b/service/ServiceWifiResources/res/values-zu/strings.xml @@ -164,9 +164,7 @@ <string name="wifi_network_disabled_by_admin_message" msgid="7830360441333155462">"I-<xliff:g id="SSID">%1$s</xliff:g> ikhutshazwe umlawuli wakho."</string> <string name="wifi_network_disabled_by_admin_button" msgid="3350310756265122689">"Vala"</string> <string name="wifi_enabled_apm_first_time_title" msgid="4814302384637588804">"I-Wi‑Fi ivuliwe kumodi yendiza"</string> - <!-- no translation found for wifi_enabled_apm_first_time_message (5443101896157496353) --> - <skip /> + <string name="wifi_enabled_apm_first_time_message" msgid="5443101896157496353">"Uma ugcina i-Wi‑Fi ivuliwe, ifoni yakho izokhumbula ukuyigcina ivuliwe ngesikhathi esilandelayo uma ukumodi yendiza."</string> <string name="apm_enabled_first_time_title" msgid="2534167413190488009">"I-Wi‑Fi ihlala ivuliwe"</string> - <!-- no translation found for apm_enabled_first_time_message (4753441005253327841) --> - <skip /> + <string name="apm_enabled_first_time_message" msgid="4753441005253327841">"Ifoni yakho ikhumbula ukugcina i-Wi‑Fi ivuliwe kumodi yendiza. Vala i-Wi-Fi uma ungafuni ukuthi ihlale ivuliwe."</string> </resources> diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java index ff60ec7a8d..481cc8869a 100644 --- a/service/java/com/android/server/wifi/ActiveModeWarden.java +++ b/service/java/com/android/server/wifi/ActiveModeWarden.java @@ -39,6 +39,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.location.LocationManager; +import android.net.Network; import android.net.wifi.ISubsystemRestartCallback; import android.net.wifi.IWifiConnectedNetworkScorer; import android.net.wifi.SoftApCapability; @@ -63,6 +64,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.Pair; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IState; import com.android.internal.util.Preconditions; @@ -149,6 +151,10 @@ public class ActiveModeWarden { @Nullable private WorkSource mLastScanOnlyClientModeManagerRequestorWs = null; private AtomicLong mSupportedFeatureSet = new AtomicLong(0); + // Mutex lock between service Api binder thread and Wifi main thread + private final Object mServiceApiLock = new Object(); + @GuardedBy("mServiceApiLock") + private Network mCurrentNetwork; /** * One of {@link WifiManager#WIFI_STATE_DISABLED}, @@ -2485,4 +2491,24 @@ public class ActiveModeWarden { public long getSupportedFeatureSet() { return mSupportedFeatureSet.get(); } + + /** + * Get the current default Wifi network. + * @return the default Wifi network + */ + public Network getCurrentNetwork() { + synchronized (mServiceApiLock) { + return mCurrentNetwork; + } + } + + /** + * Set the current default Wifi network. Called from ClientModeImpl. + * @param network the default Wifi network + */ + protected void setCurrentNetwork(Network network) { + synchronized (mServiceApiLock) { + mCurrentNetwork = network; + } + } } diff --git a/service/java/com/android/server/wifi/ClientMode.java b/service/java/com/android/server/wifi/ClientMode.java index dfef172c61..e021a7f7ae 100644 --- a/service/java/com/android/server/wifi/ClientMode.java +++ b/service/java/com/android/server/wifi/ClientMode.java @@ -95,7 +95,11 @@ public interface ClientMode { boolean syncQueryPasspointIcon(long bssid, String fileName); - Network syncGetCurrentNetwork(); + /** + * Get the current Wifi network information + * @return network + */ + Network getCurrentNetwork(); DhcpResultsParcelable syncGetDhcpResultsParcelable(); diff --git a/service/java/com/android/server/wifi/ClientModeDefaults.java b/service/java/com/android/server/wifi/ClientModeDefaults.java index 33c3b7a0b3..3e8583c162 100644 --- a/service/java/com/android/server/wifi/ClientModeDefaults.java +++ b/service/java/com/android/server/wifi/ClientModeDefaults.java @@ -86,7 +86,7 @@ public interface ClientModeDefaults extends ClientMode { return false; } - default Network syncGetCurrentNetwork() { + default Network getCurrentNetwork() { return null; } diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index 05eb8230a1..55a2426e9f 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -288,7 +288,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode { private boolean mCurrentConnectionDetectedCaptivePortal; private String getTag() { - return TAG + "[" + (mInterfaceName == null ? "unknown" : mInterfaceName) + "]"; + return TAG + "[" + mId + ":" + (mInterfaceName == null ? "unknown" : mInterfaceName) + "]"; } private void processRssiThreshold(byte curRssi, int reason, @@ -1862,30 +1862,13 @@ public class ClientModeImpl extends StateMachine implements ClientMode { } /** - * Should only be used internally. - * External callers should use {@link #syncGetCurrentNetwork()}. - */ - private Network getCurrentNetwork() { - if (mNetworkAgent != null) { - return mNetworkAgent.getNetwork(); - } else { - return null; - } - } - - /** * Get Network object of currently connected wifi network, or null if not connected. * @return Network object of current wifi network */ - public Network syncGetCurrentNetwork() { - return mWifiThreadRunner.call( - () -> { - if (getCurrentState() == mL3ConnectedState - || getCurrentState() == mRoamingState) { - return getCurrentNetwork(); - } - return null; - }, null); + public Network getCurrentNetwork() { + if (getCurrentState() != mL3ConnectedState + && getCurrentState() != mRoamingState) return null; + return (mNetworkAgent != null) ? mNetworkAgent.getNetwork() : null; } /** @@ -3830,6 +3813,9 @@ public class ClientModeImpl extends StateMachine implements ClientMode { * Helper method called when a L3 connection is successfully established to a network. */ void registerConnected() { + if (isPrimary()) { + mWifiInjector.getActiveModeWarden().setCurrentNetwork(getCurrentNetwork()); + } if (mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { WifiConfiguration config = getConnectedWifiConfigurationInternal(); boolean shouldSetUserConnectChoice = config != null @@ -3849,6 +3835,9 @@ public class ClientModeImpl extends StateMachine implements ClientMode { } void registerDisconnected() { + if (isPrimary()) { + mWifiInjector.getActiveModeWarden().setCurrentNetwork(getCurrentNetwork()); + } if (mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { mWifiConfigManager.updateNetworkAfterDisconnect(mLastNetworkId); } @@ -4555,7 +4544,9 @@ public class ClientModeImpl extends StateMachine implements ClientMode { if (!uids.isEmpty() && !mWifiConnectivityManager.hasMultiInternetConnection()) { // Remove internet capability. - builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + if (!mNetworkFactory.shouldHaveInternetCapabilities()) { + builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + } if (SdkLevel.isAtLeastS()) { builder.setUids(getUidRangeSet(uids)); } else { @@ -7217,11 +7208,11 @@ public class ClientModeImpl extends StateMachine implements ClientMode { scanResultInfo = new ProvisioningConfiguration.ScanResultInfo(scanResult.SSID, scanResult.BSSID, ies); } - + final Network network = (mNetworkAgent != null) ? mNetworkAgent.getNetwork() : null; if (!isUsingStaticIp) { prov = new ProvisioningConfiguration.Builder() .withPreDhcpAction() - .withNetwork(getCurrentNetwork()) + .withNetwork(network) .withDisplayName(config.SSID) .withScanResultInfo(scanResultInfo) .withLayer2Information(layer2Info); @@ -7229,7 +7220,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode { StaticIpConfiguration staticIpConfig = config.getStaticIpConfiguration(); prov = new ProvisioningConfiguration.Builder() .withStaticConfiguration(staticIpConfig) - .withNetwork(getCurrentNetwork()) + .withNetwork(network) .withDisplayName(config.SSID) .withLayer2Information(layer2Info); } diff --git a/service/java/com/android/server/wifi/ConcreteClientModeManager.java b/service/java/com/android/server/wifi/ConcreteClientModeManager.java index 7f6bbc0b72..5cf3234368 100644 --- a/service/java/com/android/server/wifi/ConcreteClientModeManager.java +++ b/service/java/com/android/server/wifi/ConcreteClientModeManager.java @@ -178,7 +178,8 @@ public class ConcreteClientModeManager implements ClientModeManager { } private String getTag() { - return TAG + "[" + (mClientInterfaceName == null ? "unknown" : mClientInterfaceName) + "]"; + return TAG + "[" + mId + ":" + (mClientInterfaceName == null ? "unknown" + : mClientInterfaceName) + "]"; } /** @@ -743,6 +744,8 @@ public class ConcreteClientModeManager implements ClientModeManager { mClientModeImpl.handleIfaceDestroyed(); } + // set it to null since the interface had been destroyed + mClientInterfaceName = null; sendMessage(CMD_INTERFACE_DESTROYED); } } @@ -865,11 +868,17 @@ public class ConcreteClientModeManager implements ClientModeManager { private void setRoleInternalAndInvokeCallback(@NonNull RoleChangeInfo roleChangeInfo) { if (roleChangeInfo.role == mRole) return; if (mRole == null) { - Log.v(getTag(), "ClientModeManager started in role: " + roleChangeInfo); + if (mVerboseLoggingEnabled) { + Log.v(getTag(), "CurState:" + getCurrentStateName() + + ", clientModeManager started in role: " + roleChangeInfo); + } setRoleInternal(roleChangeInfo); mModeListener.onStarted(ConcreteClientModeManager.this); } else { - Log.v(getTag(), "ClientModeManager role changed: " + roleChangeInfo); + if (mVerboseLoggingEnabled) { + Log.v(getTag(), "CurState:" + getCurrentStateName() + + ", clientModeManager role changed: " + roleChangeInfo); + } setRoleInternal(roleChangeInfo); reset(); mModeListener.onRoleChanged(ConcreteClientModeManager.this); @@ -895,10 +904,16 @@ public class ConcreteClientModeManager implements ClientModeManager { // started normally this will will not send a duplicate broadcast since mIsStopped // will get set to false the first time the exit happens. cleanupOnQuitIfApplicable(); + Log.d(getTag(), "IdleState.exit()"); } @Override public boolean processMessage(Message message) { + if (mVerboseLoggingEnabled) { + Log.d(getTag(), + getName() + " cmd = " + getWhatToString(message.what) + " " + + message.toString()); + } switch (message.what) { case CMD_START: // Always start in scan mode first. @@ -923,7 +938,7 @@ public class ConcreteClientModeManager implements ClientModeManager { } break; default: - Log.d(getTag(), "received an invalid message: " + message); + Log.d(getTag(), getName() + ", received an invalid message: " + message); return NOT_HANDLED; } return HANDLED; @@ -939,7 +954,7 @@ public class ConcreteClientModeManager implements ClientModeManager { mIfaceIsUp = isUp; if (!isUp) { // if the interface goes down we should exit and go back to idle state. - Log.d(getTag(), "interface down!"); + Log.d(getTag(), getName() + ", interface down!"); mStateMachine.sendMessage(CMD_INTERFACE_DOWN); } if (mClientModeImpl != null) { @@ -957,6 +972,11 @@ public class ConcreteClientModeManager implements ClientModeManager { @Override public boolean processMessage(Message message) { + if (mVerboseLoggingEnabled) { + Log.d(getTag(), + getName() + " cmd = " + getWhatToString(message.what) + " " + + message.toString()); + } switch (message.what) { case CMD_START: // Already started, ignore this command. @@ -998,8 +1018,9 @@ public class ConcreteClientModeManager implements ClientModeManager { break; } case CMD_INTERFACE_DOWN: - Log.e(getTag(), "Detected an interface down, reporting failure to " - + "SelfRecovery"); + Log.e(getTag(), + getName() + ", detected an interface down, reporting failure to " + + "SelfRecovery"); mSelfRecovery.trigger(SelfRecovery.REASON_STA_IFACE_DOWN); // once interface down, nothing else to do... stop the state machine captureObituaryAndQuitNow(); @@ -1009,7 +1030,7 @@ public class ConcreteClientModeManager implements ClientModeManager { onUpChanged(isUp); break; case CMD_INTERFACE_DESTROYED: - Log.e(getTag(), "interface destroyed - client mode stopping"); + Log.e(getTag(), getName() + ", interface destroyed - client mode stopping"); mClientInterfaceName = null; // once interface destroyed, nothing else to do... stop the state machine captureObituaryAndQuitNow(); @@ -1031,7 +1052,7 @@ public class ConcreteClientModeManager implements ClientModeManager { mIfaceIsUp = false; } - Log.i(getTag(), "StartedState#exit(), setting mRole = null"); + Log.i(getTag(), "StartedState.exit(), setting mRole = null"); mIsStopped = true; cleanupOnQuitIfApplicable(); } @@ -1067,6 +1088,11 @@ public class ConcreteClientModeManager implements ClientModeManager { @Override public boolean processMessage(Message message) { + if (mVerboseLoggingEnabled) { + Log.d(getTag(), + getName() + " cmd = " + getWhatToString(message.what) + " " + + message.toString()); + } switch (message.what) { case CMD_SWITCH_TO_SCAN_ONLY_MODE: // Already in scan only mode, ignore this command. @@ -1123,6 +1149,11 @@ public class ConcreteClientModeManager implements ClientModeManager { @Override public boolean processMessage(Message message) { + if (mVerboseLoggingEnabled) { + Log.d(getTag(), + getName() + " cmd = " + getWhatToString(message.what) + " " + + message.toString()); + } switch (message.what) { case CMD_SWITCH_TO_CONNECT_MODE: RoleChangeInfo roleChangeInfo = (RoleChangeInfo) message.obj; @@ -1136,7 +1167,7 @@ public class ConcreteClientModeManager implements ClientModeManager { // If this call failed, the iface would be torn down. // Thus, simply abort and let the iface down handling take care of the // rest. - Log.e(getTag(), "Failed to switch ClientModeManager=" + Log.e(getTag(), getName() + ", Failed to switch ClientModeManager=" + ConcreteClientModeManager.this + "'s requestorWs"); } break; @@ -1186,7 +1217,7 @@ public class ConcreteClientModeManager implements ClientModeManager { if (mClientModeImpl == null) { Log.w(getTag(), "ConnectModeState.exit(): mClientModeImpl is already null?!"); } else { - Log.d(getTag(), "Stopping ClientModeImpl"); + Log.d(getTag(), "ConnectModeState.exit(): Stopping ClientModeImpl"); mClientModeImpl.stop(); mGraveyard.inter(mClientModeImpl); mClientModeImpl = null; @@ -1311,8 +1342,8 @@ public class ConcreteClientModeManager implements ClientModeManager { } @Override - public Network syncGetCurrentNetwork() { - return getClientMode().syncGetCurrentNetwork(); + public Network getCurrentNetwork() { + return getClientMode().getCurrentNetwork(); } @Override diff --git a/service/java/com/android/server/wifi/HalDeviceManager.java b/service/java/com/android/server/wifi/HalDeviceManager.java index a59c63b685..84e87bf7b0 100644 --- a/service/java/com/android/server/wifi/HalDeviceManager.java +++ b/service/java/com/android/server/wifi/HalDeviceManager.java @@ -72,8 +72,6 @@ import org.json.JSONException; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -2469,90 +2467,6 @@ public class HalDeviceManager { return false; } - private static final int PRIORITY_INTERNAL = 0; - private static final int PRIORITY_BG = 1; - private static final int PRIORITY_FG_SERVICE = 2; - private static final int PRIORITY_FG_APP = 3; - private static final int PRIORITY_SYSTEM = 4; - private static final int PRIORITY_PRIVILEGED = 5; - // Keep these in sync with any additions/deletions to above buckets. - private static final int PRIORITY_MIN = PRIORITY_INTERNAL; - private static final int PRIORITY_MAX = PRIORITY_PRIVILEGED; - @IntDef(prefix = { "PRIORITY_" }, value = { - PRIORITY_INTERNAL, - PRIORITY_BG, - PRIORITY_FG_SERVICE, - PRIORITY_FG_APP, - PRIORITY_SYSTEM, - PRIORITY_PRIVILEGED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface RequestorWsPriority {} - - /** - * Returns integer priority level for the provided |ws| based on rules mentioned in - * {@link #selectInterfacesToDelete(int, int, WorkSource, int, WifiIfaceInfo[])}. - */ - private static @RequestorWsPriority int getRequestorWsPriority(WorkSourceHelper ws) { - if (ws.hasAnyPrivilegedAppRequest()) return PRIORITY_PRIVILEGED; - if (ws.hasAnySystemAppRequest()) return PRIORITY_SYSTEM; - if (ws.hasAnyForegroundAppRequest(/* allowOverlayBypass */ true)) return PRIORITY_FG_APP; - if (ws.hasAnyForegroundServiceRequest()) return PRIORITY_FG_SERVICE; - if (ws.hasAnyInternalRequest()) return PRIORITY_INTERNAL; - return PRIORITY_BG; - } - - /** - * Returns true if the requested iface can delete an existing iface only after user approval. - */ - public boolean needsUserApprovalToDelete( - int requestedCreateType, WorkSource newWorksource, - int existingCreateType, WorkSource existingWorksource) { - return needsUserApprovalToDelete( - requestedCreateType, - getRequestorWsPriority(mWifiInjector.makeWsHelper(newWorksource)), - existingCreateType, - getRequestorWsPriority(mWifiInjector.makeWsHelper(existingWorksource))); - } - - private boolean needsUserApprovalToDelete( - int requestedCreateType, int newRequestorWsPriority, - int existingCreateType, int existingRequestorWsPriority) { - if (!mWifiUserApprovalRequiredForD2dInterfacePriority - || newRequestorWsPriority <= PRIORITY_BG - || existingRequestorWsPriority == PRIORITY_INTERNAL) { - return false; - } - - // Allow LOHS to beat Settings STA if there's no STA+AP concurrency (legacy behavior) - if (allowedToDeleteForNoStaApConcurrencyLohs( - requestedCreateType, newRequestorWsPriority, - existingCreateType, existingRequestorWsPriority)) { - return false; - } - - if (requestedCreateType == HDM_CREATE_IFACE_AP - || requestedCreateType == HDM_CREATE_IFACE_AP_BRIDGE) { - if (existingCreateType == HDM_CREATE_IFACE_P2P - || existingCreateType == HDM_CREATE_IFACE_NAN) { - return true; - } - } else if (requestedCreateType == HDM_CREATE_IFACE_P2P) { - if (existingCreateType == HDM_CREATE_IFACE_AP - || existingCreateType == HDM_CREATE_IFACE_AP_BRIDGE - || existingCreateType == HDM_CREATE_IFACE_NAN) { - return true; - } - } else if (requestedCreateType == HDM_CREATE_IFACE_NAN) { - if (existingCreateType == HDM_CREATE_IFACE_AP - || existingCreateType == HDM_CREATE_IFACE_AP_BRIDGE - || existingCreateType == HDM_CREATE_IFACE_P2P) { - return true; - } - } - return false; - } - /** * Returns whether interface request from |newRequestorWsPriority| is allowed to delete an * interface request from |existingRequestorWsPriority|. @@ -2568,19 +2482,24 @@ public class HalDeviceManager { */ private boolean allowedToDelete( @HdmIfaceTypeForCreation int requestedCreateType, - @RequestorWsPriority int newRequestorWsPriority, + @NonNull WorkSourceHelper newRequestorWs, @HdmIfaceTypeForCreation int existingCreateType, - @RequestorWsPriority int existingRequestorWsPriority) { + @NonNull WorkSourceHelper existingRequestorWs) { if (!SdkLevel.isAtLeastS()) { return allowedToDeleteForR(requestedCreateType, existingCreateType); } // Defer deletion decision to the InterfaceConflictManager dialog. - if (needsUserApprovalToDelete(requestedCreateType, newRequestorWsPriority, - existingCreateType, existingRequestorWsPriority)) { + if (mWifiInjector.getInterfaceConflictManager().needsUserApprovalToDelete( + requestedCreateType, newRequestorWs, + existingCreateType, existingRequestorWs)) { return true; } + @HdmIfaceTypeForCreation int newRequestorWsPriority = + newRequestorWs.getRequestorWsPriority(); + @HdmIfaceTypeForCreation int existingRequestorWsPriority = + existingRequestorWs.getRequestorWsPriority(); // If the new request is higher priority than existing priority, then the new requestor // wins. This is because at all other priority levels (except privileged), existing caller // wins if both the requests are at the same priority level. @@ -2596,7 +2515,7 @@ public class HalDeviceManager { // If both the requests are privileged, the new requestor wins. The exception is for // backwards compatibility with P2P Settings, prefer SoftAP over P2P for when the user // enables SoftAP with P2P Settings open. - if (newRequestorWsPriority == PRIORITY_PRIVILEGED) { + if (newRequestorWsPriority == WorkSourceHelper.PRIORITY_PRIVILEGED) { if (requestedCreateType == HDM_CREATE_IFACE_P2P && (existingCreateType == HDM_CREATE_IFACE_AP || existingCreateType == HDM_CREATE_IFACE_AP_BRIDGE)) { @@ -2622,9 +2541,9 @@ public class HalDeviceManager { */ private boolean allowedToDeleteForNoStaApConcurrencyLohs( @HdmIfaceTypeForCreation int requestedCreateType, - @RequestorWsPriority int newRequestorWsPriority, + @WorkSourceHelper.RequestorWsPriority int newRequestorWsPriority, @HdmIfaceTypeForCreation int existingCreateType, - @RequestorWsPriority int existingRequestorWsPriority) { + @WorkSourceHelper.RequestorWsPriority int existingRequestorWsPriority) { return !canDeviceSupportCreateTypeCombo( new SparseArray<Integer>() {{ put(IfaceConcurrencyType.STA, 1); @@ -2632,10 +2551,10 @@ public class HalDeviceManager { }}) && (requestedCreateType == HDM_CREATE_IFACE_AP || requestedCreateType == HDM_CREATE_IFACE_AP_BRIDGE) - && newRequestorWsPriority != PRIORITY_INTERNAL - && newRequestorWsPriority != PRIORITY_PRIVILEGED + && newRequestorWsPriority != WorkSourceHelper.PRIORITY_INTERNAL + && newRequestorWsPriority != WorkSourceHelper.PRIORITY_PRIVILEGED && existingCreateType == HDM_CREATE_IFACE_STA - && existingRequestorWsPriority == PRIORITY_PRIVILEGED; + && existingRequestorWsPriority == WorkSourceHelper.PRIORITY_PRIVILEGED; } /** @@ -2737,10 +2656,10 @@ public class HalDeviceManager { lookupError = true; break; } - int newRequestorWsPriority = getRequestorWsPriority(newRequestorWsHelper); - int existingRequestorWsPriority = getRequestorWsPriority(cacheEntry.requestorWsHelper); - boolean isAllowedToDelete = allowedToDelete(requestedCreateType, newRequestorWsPriority, - existingCreateType, existingRequestorWsPriority); + int newRequestorWsPriority = newRequestorWsHelper.getRequestorWsPriority(); + int existingRequestorWsPriority = cacheEntry.requestorWsHelper.getRequestorWsPriority(); + boolean isAllowedToDelete = allowedToDelete(requestedCreateType, newRequestorWsHelper, + existingCreateType, cacheEntry.requestorWsHelper); if (VDBG) { Log.d(TAG, "info=" + info + ": allowedToDelete=" + isAllowedToDelete + " (requestedCreateType=" + requestedCreateType @@ -2762,7 +2681,7 @@ public class HalDeviceManager { int numIfacesToDelete = 0; ifacesToDelete = new ArrayList<>(requestedQuantity); // Iterate from lowest priority to highest priority ifaces. - for (int i = PRIORITY_MIN; i <= PRIORITY_MAX; i++) { + for (int i = WorkSourceHelper.PRIORITY_MIN; i <= WorkSourceHelper.PRIORITY_MAX; i++) { List<WifiIfaceInfo> ifacesToDeleteListWithinPriority = ifacesToDeleteMap.getOrDefault(i, new ArrayList<>()); int numIfacesToDeleteWithinPriority = diff --git a/service/java/com/android/server/wifi/InterfaceConflictManager.java b/service/java/com/android/server/wifi/InterfaceConflictManager.java index c7ba72f450..bb2cf2114e 100644 --- a/service/java/com/android/server/wifi/InterfaceConflictManager.java +++ b/service/java/com/android/server/wifi/InterfaceConflictManager.java @@ -39,9 +39,12 @@ import android.util.LocalLog; import android.util.Log; import android.util.Pair; +import androidx.annotation.NonNull; + import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.wifi.util.WaitingState; +import com.android.server.wifi.util.WorkSourceHelper; import com.android.wifi.resources.R; import java.io.FileDescriptor; @@ -61,6 +64,7 @@ public class InterfaceConflictManager { private static final String TAG = "InterfaceConflictManager"; private boolean mVerboseLoggingEnabled = false; + private final WifiInjector mWifiInjector; private final WifiContext mContext; private final FrameworkFacade mFrameworkFacade; private final HalDeviceManager mHdm; @@ -86,9 +90,10 @@ public class InterfaceConflictManager { private static final String MESSAGE_BUNDLE_KEY_PENDING_USER = "pending_user_decision"; - public InterfaceConflictManager(WifiContext wifiContext, FrameworkFacade frameworkFacade, - HalDeviceManager hdm, WifiThreadRunner threadRunner, + public InterfaceConflictManager(@NonNull WifiInjector wifiInjector, WifiContext wifiContext, + FrameworkFacade frameworkFacade, HalDeviceManager hdm, WifiThreadRunner threadRunner, WifiDialogManager wifiDialogManager, LocalLog localLog) { + mWifiInjector = wifiInjector; mContext = wifiContext; mFrameworkFacade = frameworkFacade; mHdm = hdm; @@ -125,30 +130,67 @@ public class InterfaceConflictManager { } /** - * Returns an indication as to whether user approval is needed for this specific request. User - * approval is controlled by: + * Returns whether user approval is needed to delete an existing interface for a new one. + * User approval is controlled by: * - A global overlay `config_wifiUserApprovalRequiredForD2dInterfacePriority` * - An exemption list overlay `config_wifiExcludedFromUserApprovalForD2dInterfacePriority` * which is a list of packages which are *exempted* from user approval * - A shell command which can be used to override * - * @param requestorWs The WorkSource of the requestor - used to determine whether it is exempted - * from user approval. All requesting packages must be exempted for the - * dialog to NOT be displayed. + * @param requestedCreateType Requested interface type + * @param newRequestorWsHelper WorkSourceHelper of the new interface + * @param existingCreateType Existing interface type + * @param existingRequestorWsHelper WorkSourceHelper of the existing interface + * @return true if the new interface needs user approval to delete the existing one. */ - private boolean isUserApprovalNeeded(WorkSource requestorWs) { - if (mUserApprovalNeededOverride) return mUserApprovalNeededOverrideValue; - if (!mUserApprovalNeeded || mUserApprovalExemptedPackages.isEmpty()) { - return mUserApprovalNeeded; + public boolean needsUserApprovalToDelete( + int requestedCreateType, @NonNull WorkSourceHelper newRequestorWsHelper, + int existingCreateType, @NonNull WorkSourceHelper existingRequestorWsHelper) { + if (!isUserApprovalEnabled()) { + return false; } - for (int i = 0; i < requestorWs.size(); ++i) { - if (!mUserApprovalExemptedPackages.contains(requestorWs.getPackageName(i))) { + // Check if every package in the WorkSource are exempt from user approval. + if (!mUserApprovalExemptedPackages.isEmpty()) { + boolean exemptFromUserApproval = true; + WorkSource requestorWs = newRequestorWsHelper.getWorkSource(); + for (int i = 0; i < requestorWs.size(); i++) { + if (!mUserApprovalExemptedPackages.contains(requestorWs.getPackageName(i))) { + exemptFromUserApproval = false; + break; + } + } + if (exemptFromUserApproval) { + return false; + } + } + // Check if priority level can get user approval. + if (newRequestorWsHelper.getRequestorWsPriority() <= WorkSourceHelper.PRIORITY_BG + || existingRequestorWsHelper.getRequestorWsPriority() + == WorkSourceHelper.PRIORITY_INTERNAL) { + return false; + } + // Check if the conflicting interface types can get user approval. + if (requestedCreateType == HDM_CREATE_IFACE_AP + || requestedCreateType == HDM_CREATE_IFACE_AP_BRIDGE) { + if (existingCreateType == HDM_CREATE_IFACE_P2P + || existingCreateType == HDM_CREATE_IFACE_NAN) { + return true; + } + } else if (requestedCreateType == HDM_CREATE_IFACE_P2P) { + if (existingCreateType == HDM_CREATE_IFACE_AP + || existingCreateType == HDM_CREATE_IFACE_AP_BRIDGE + || existingCreateType == HDM_CREATE_IFACE_NAN) { + return true; + } + } else if (requestedCreateType == HDM_CREATE_IFACE_NAN) { + if (existingCreateType == HDM_CREATE_IFACE_AP + || existingCreateType == HDM_CREATE_IFACE_AP_BRIDGE + || existingCreateType == HDM_CREATE_IFACE_P2P) { return true; } } - - return false; // all packages of the requestor are excluded + return false; } /** @@ -165,6 +207,13 @@ public class InterfaceConflictManager { mUserApprovalNeededOverrideValue = overrideValue; } + private boolean isUserApprovalEnabled() { + if (mUserApprovalNeededOverride) { + return mUserApprovalNeededOverrideValue; + } + return mUserApprovalNeeded; + } + /** * Return values for {@link #manageInterfaceConflictForStateMachine} */ @@ -236,6 +285,7 @@ public class InterfaceConflictManager { @HalDeviceManager.HdmIfaceTypeForCreation int createIfaceType, WorkSource requestorWs, boolean bypassDialog) { synchronized (mLock) { + // Check if we're waiting for user approval for a different caller. if (mUserApprovalPending && !TextUtils.equals(tag, mUserApprovalPendingTag)) { Log.w(TAG, tag + ": rejected since there's a pending user approval for " + mUserApprovalPendingTag); @@ -257,6 +307,7 @@ public class InterfaceConflictManager { return mUserJustApproved ? ICM_EXECUTE_COMMAND : ICM_ABORT_COMMAND; } + // Check if we're already waiting for user approval for this caller. if (mUserApprovalPending) { Log.w(TAG, tag + ": trying for another potentially waiting operation - but should be" @@ -265,8 +316,13 @@ public class InterfaceConflictManager { return ICM_SKIP_COMMAND_WAIT_FOR_USER; // same effect } - if (bypassDialog || !isUserApprovalNeeded(requestorWs)) return ICM_EXECUTE_COMMAND; + // Execute the command if the dialogs aren't enabled. + if (!isUserApprovalEnabled()) return ICM_EXECUTE_COMMAND; + + // Auto-approve dialog if bypass is specified. + if (bypassDialog) return ICM_EXECUTE_COMMAND; + // Check if we need to show the dialog. List<Pair<Integer, WorkSource>> impact = mHdm.reportImpactToCreateIface(createIfaceType, false, requestorWs); localLog(tag + ": Asking user about creating the interface, impact=" + impact); @@ -276,6 +332,7 @@ public class InterfaceConflictManager { return ICM_EXECUTE_COMMAND; } + // Auto-approve dialog if we only need to delete a disconnected P2P. if (mUserApprovalNotRequireForDisconnectedP2p && !mIsP2pConnected && impact.size() == 1 && impact.get(0).first == HDM_CREATE_IFACE_P2P) { localLog(tag @@ -285,8 +342,9 @@ public class InterfaceConflictManager { boolean shouldShowDialogToDelete = false; for (Pair<Integer, WorkSource> ifaceToDelete : impact) { - if (mHdm.needsUserApprovalToDelete(createIfaceType, requestorWs, - ifaceToDelete.first, ifaceToDelete.second)) { + if (needsUserApprovalToDelete( + createIfaceType, mWifiInjector.makeWsHelper(requestorWs), + ifaceToDelete.first, mWifiInjector.makeWsHelper(ifaceToDelete.second))) { shouldShowDialogToDelete = true; break; } diff --git a/service/java/com/android/server/wifi/SupplicantStaIfaceHalHidlImpl.java b/service/java/com/android/server/wifi/SupplicantStaIfaceHalHidlImpl.java index 47b76b1795..d5a55a2e8e 100644 --- a/service/java/com/android/server/wifi/SupplicantStaIfaceHalHidlImpl.java +++ b/service/java/com/android/server/wifi/SupplicantStaIfaceHalHidlImpl.java @@ -79,7 +79,6 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; -import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; @@ -130,6 +129,7 @@ public class SupplicantStaIfaceHalHidlImpl implements ISupplicantStaIfaceHal { private SupplicantDeathRecipient mSupplicantDeathRecipient; // Death recipient cookie registered for current supplicant instance. private long mDeathRecipientCookie = 0; + private CountDownLatch mWaitForDeathLatch; private final Context mContext; private final WifiMonitor mWifiMonitor; private final FrameworkFacade mFrameworkFacade; @@ -176,6 +176,12 @@ public class SupplicantStaIfaceHalHidlImpl implements ISupplicantStaIfaceHal { private class SupplicantDeathRecipient implements DeathRecipient { @Override public void serviceDied(long cookie) { + synchronized (mLock) { + if (mWaitForDeathLatch != null) { + mWaitForDeathLatch.countDown(); + } + } + mEventHandler.post(() -> { synchronized (mLock) { Log.w(TAG, "ISupplicant died: cookie=" + cookie); @@ -640,6 +646,7 @@ public class SupplicantStaIfaceHalHidlImpl implements ISupplicantStaIfaceHal { Log.i(TAG, "Ignoring stale death recipient notification"); return; } + Log.i(TAG, "Handling service death"); clearState(); if (mDeathEventHandler != null) { mDeathEventHandler.onDeath(); @@ -715,18 +722,7 @@ public class SupplicantStaIfaceHalHidlImpl implements ISupplicantStaIfaceHal { */ public void terminate() { synchronized (mLock) { - // Register for a new death listener to block until supplicant is dead. - final long waitForDeathCookie = new Random().nextLong(); - final CountDownLatch waitForDeathLatch = new CountDownLatch(1); - linkToSupplicantDeath((cookie) -> { - mEventHandler.post(() -> { - Log.d(TAG, "ISupplicant died: cookie=" + cookie); - if (cookie != waitForDeathCookie) return; - supplicantServiceDiedHandler(mDeathRecipientCookie); - waitForDeathLatch.countDown(); - }); - }, waitForDeathCookie); - + mWaitForDeathLatch = new CountDownLatch(1); if (isV1_1()) { Log.i(TAG, "Terminating supplicant using HIDL"); terminate_V1_1(); @@ -734,15 +730,15 @@ public class SupplicantStaIfaceHalHidlImpl implements ISupplicantStaIfaceHal { Log.i(TAG, "Terminating supplicant using init"); mFrameworkFacade.stopSupplicant(); } + } - // Now wait for death listener callback to confirm that it's dead. - try { - if (!waitForDeathLatch.await(WAIT_FOR_DEATH_TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - Log.w(TAG, "Timed out waiting for confirmation of supplicant death"); - } - } catch (InterruptedException e) { - Log.w(TAG, "Failed to wait for supplicant death"); + // Now wait for death listener callback to confirm that it's dead. + try { + if (!mWaitForDeathLatch.await(WAIT_FOR_DEATH_TIMEOUT_MS, TimeUnit.MILLISECONDS)) { + Log.w(TAG, "Timed out waiting for confirmation of supplicant death"); } + } catch (InterruptedException e) { + Log.w(TAG, "Failed to wait for supplicant death"); } } diff --git a/service/java/com/android/server/wifi/WifiDataStall.java b/service/java/com/android/server/wifi/WifiDataStall.java index 7a10fd8ae5..9d5e6ea96d 100644 --- a/service/java/com/android/server/wifi/WifiDataStall.java +++ b/service/java/com/android/server/wifi/WifiDataStall.java @@ -574,8 +574,8 @@ public class WifiDataStall { tputSufficientLowThrKbps = mDeviceConfigFacade.getRxTputSufficientLowThrKbps(); tputSufficientHighThrKbps = mDeviceConfigFacade.getRxTputSufficientHighThrKbps(); } - boolean isL3TputLow = (l3TputKbps * mDeviceConfigFacade.getTputSufficientRatioThrDen()) - < (tputSufficientLowThrKbps * mDeviceConfigFacade.getTputSufficientRatioThrNum()); + boolean isL3TputLow = (l3TputKbps * mDeviceConfigFacade.getTputSufficientRatioThrNum()) + < (tputSufficientLowThrKbps * mDeviceConfigFacade.getTputSufficientRatioThrDen()); boolean isL2TputAboveLowThr = l2TputKbps >= tputSufficientLowThrKbps; if (isL3TputLow) return isL2TputAboveLowThr; diff --git a/service/java/com/android/server/wifi/WifiDialogManager.java b/service/java/com/android/server/wifi/WifiDialogManager.java index 0dc49f1d2e..73e5c5c39e 100644 --- a/service/java/com/android/server/wifi/WifiDialogManager.java +++ b/service/java/com/android/server/wifi/WifiDialogManager.java @@ -369,8 +369,8 @@ public class WifiDialogManager { } private class SimpleDialogHandle extends DialogHandleInternal { - private @NonNull SimpleDialogCallback mCallback; - private @NonNull WifiThreadRunner mCallbackThreadRunner; + @Nullable private final SimpleDialogCallback mCallback; + @Nullable private final WifiThreadRunner mCallbackThreadRunner; SimpleDialogHandle( final String title, @@ -381,8 +381,8 @@ public class WifiDialogManager { final String positiveButtonText, final String negativeButtonText, final String neutralButtonText, - @NonNull SimpleDialogCallback callback, - @NonNull WifiThreadRunner callbackThreadRunner) throws IllegalArgumentException { + @Nullable final SimpleDialogCallback callback, + @Nullable final WifiThreadRunner callbackThreadRunner) { Intent intent = getBaseLaunchIntent(WifiManager.DIALOG_TYPE_SIMPLE); if (intent != null) { intent.putExtra(WifiManager.EXTRA_DIALOG_TITLE, title) @@ -396,45 +396,35 @@ public class WifiDialogManager { setIntent(intent); } setDisplayId(Display.DEFAULT_DISPLAY); - if (messageUrl != null) { - if (message == null) { - throw new IllegalArgumentException("Cannot set span for null message!"); - } - if (messageUrlStart < 0) { - throw new IllegalArgumentException("Span start cannot be less than 0!"); - } - if (messageUrlEnd > message.length()) { - throw new IllegalArgumentException("Span end index " + messageUrlEnd - + " cannot be greater than message length " + message.length() + "!"); - } - } - if (callback == null) { - throw new IllegalArgumentException("Callback cannot be null!"); - } - if (callbackThreadRunner == null) { - throw new IllegalArgumentException("Callback thread runner cannot be null!"); - } mCallback = callback; mCallbackThreadRunner = callbackThreadRunner; } void notifyOnPositiveButtonClicked() { - mCallbackThreadRunner.post(() -> mCallback.onPositiveButtonClicked()); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onPositiveButtonClicked); + } unregisterDialog(); } void notifyOnNegativeButtonClicked() { - mCallbackThreadRunner.post(() -> mCallback.onNegativeButtonClicked()); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onNegativeButtonClicked); + } unregisterDialog(); } void notifyOnNeutralButtonClicked() { - mCallbackThreadRunner.post(() -> mCallback.onNeutralButtonClicked()); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onNeutralButtonClicked); + } unregisterDialog(); } void notifyOnCancelled() { - mCallbackThreadRunner.post(() -> mCallback.onCancelled()); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onCancelled); + } unregisterDialog(); } } @@ -448,8 +438,8 @@ public class WifiDialogManager { final String mPositiveButtonText; final String mNegativeButtonText; final String mNeutralButtonText; - @NonNull SimpleDialogCallback mCallback; - @NonNull WifiThreadRunner mCallbackThreadRunner; + @Nullable final SimpleDialogCallback mCallback; + @Nullable final WifiThreadRunner mCallbackThreadRunner; private Runnable mTimeoutRunnable; private AlertDialog mAlertDialog; int mWindowType = WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; @@ -464,42 +454,32 @@ public class WifiDialogManager { final String positiveButtonText, final String negativeButtonText, final String neutralButtonText, - @NonNull SimpleDialogCallback callback, - @NonNull WifiThreadRunner callbackThreadRunner) throws IllegalArgumentException { - if (messageUrl != null) { - if (message == null) { - throw new IllegalArgumentException("Cannot set span for null message!"); - } - if (messageUrlStart < 0) { - throw new IllegalArgumentException("Span start cannot be less than 0!"); - } - if (messageUrlEnd > message.length()) { - throw new IllegalArgumentException("Span end index " + messageUrlEnd - + " cannot be greater than message length " + message.length() + "!"); - } - } - if (callback == null) { - throw new IllegalArgumentException("Callback cannot be null!"); - } - if (callbackThreadRunner == null) { - throw new IllegalArgumentException("Callback thread runner cannot be null!"); - } + @Nullable final SimpleDialogCallback callback, + @Nullable final WifiThreadRunner callbackThreadRunner) { mTitle = title; if (message != null) { mMessage = new SpannableString(message); - if (messageUrlStart >= 0 && messageUrlEnd <= message.length() - && messageUrlStart < messageUrlEnd) { - mMessage.setSpan(new URLSpan(messageUrl) { - @Override - public void onClick(@NonNull View widget) { - Context c = widget.getContext(); - Intent openLinkIntent = new Intent(Intent.ACTION_VIEW) - .setData(Uri.parse(messageUrl)) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(Browser.EXTRA_APPLICATION_ID, c.getPackageName()); - c.startActivity(openLinkIntent); - LegacySimpleDialogHandle.this.dismissDialog(); - }}, messageUrlStart, messageUrlEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + if (messageUrl != null) { + if (messageUrlStart < 0) { + Log.w(TAG, "Span start cannot be less than 0!"); + } else if (messageUrlEnd > message.length()) { + Log.w(TAG, "Span end index " + messageUrlEnd + " cannot be greater than " + + "message length " + message.length() + "!"); + } else if (messageUrlStart > messageUrlEnd) { + Log.w(TAG, "Span start index cannot be greater than end index!"); + } else { + mMessage.setSpan(new URLSpan(messageUrl) { + @Override + public void onClick(@NonNull View widget) { + Context c = widget.getContext(); + Intent openLinkIntent = new Intent(Intent.ACTION_VIEW) + .setData(Uri.parse(messageUrl)) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(Browser.EXTRA_APPLICATION_ID, c.getPackageName()); + c.startActivity(openLinkIntent); + LegacySimpleDialogHandle.this.dismissDialog(); + }}, messageUrlStart, messageUrlEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } } } else { mMessage = null; @@ -531,25 +511,33 @@ public class WifiDialogManager { if (mVerboseLoggingEnabled) { Log.v(TAG, "Positive button pressed for legacy simple dialog"); } - mCallbackThreadRunner.post(mCallback::onPositiveButtonClicked); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onPositiveButtonClicked); + } }) .setNegativeButton(mNegativeButtonText, (dialogNegative, which) -> { if (mVerboseLoggingEnabled) { Log.v(TAG, "Negative button pressed for legacy simple dialog"); } - mCallbackThreadRunner.post(mCallback::onNegativeButtonClicked); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onNegativeButtonClicked); + } }) .setNeutralButton(mNeutralButtonText, (dialogNeutral, which) -> { if (mVerboseLoggingEnabled) { Log.v(TAG, "Neutral button pressed for legacy simple dialog"); } - mCallbackThreadRunner.post(mCallback::onNeutralButtonClicked); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onNeutralButtonClicked); + } }) .setOnCancelListener((dialogCancel) -> { if (mVerboseLoggingEnabled) { Log.v(TAG, "Legacy simple dialog cancelled."); } - mCallbackThreadRunner.post(mCallback::onCancelled); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onCancelled); + } }) .setOnDismissListener((dialogDismiss) -> { mWifiThreadRunner.post(() -> { @@ -649,7 +637,7 @@ public class WifiDialogManager { * be created. */ @AnyThread - @Nullable + @NonNull public DialogHandle createSimpleDialog( @Nullable String title, @Nullable String message, @@ -659,16 +647,16 @@ public class WifiDialogManager { @NonNull SimpleDialogCallback callback, @NonNull WifiThreadRunner callbackThreadRunner) { return createSimpleDialogWithUrl( - title, - message, - null /* messageUrl */, - 0 /* messageUrlStart */, - 0 /* messageUrlEnd */, - positiveButtonText, - negativeButtonText, - neutralButtonText, - callback, - callbackThreadRunner); + title, + message, + null /* messageUrl */, + 0 /* messageUrlStart */, + 0 /* messageUrlEnd */, + positiveButtonText, + negativeButtonText, + neutralButtonText, + callback, + callbackThreadRunner); } /** @@ -691,7 +679,7 @@ public class WifiDialogManager { * be created. */ @AnyThread - @Nullable + @NonNull public DialogHandle createSimpleDialogWithUrl( @Nullable String title, @Nullable String message, @@ -703,41 +691,36 @@ public class WifiDialogManager { @Nullable String neutralButtonText, @NonNull SimpleDialogCallback callback, @NonNull WifiThreadRunner callbackThreadRunner) { - try { - if (SdkLevel.isAtLeastT()) { - return new DialogHandle( - new SimpleDialogHandle( - title, - message, - messageUrl, - messageUrlStart, - messageUrlEnd, - positiveButtonText, - negativeButtonText, - neutralButtonText, - callback, - callbackThreadRunner) - ); - } else { - // TODO(b/238353074): Remove this fallback to the legacy implementation once the - // AlertDialog style on pre-T platform is fixed. - return new DialogHandle( - new LegacySimpleDialogHandle( - title, - message, - messageUrl, - messageUrlStart, - messageUrlEnd, - positiveButtonText, - negativeButtonText, - neutralButtonText, - callback, - callbackThreadRunner) - ); - } - } catch (IllegalArgumentException e) { - Log.e(TAG, "Could not create DialogHandle for simple dialog: " + e); - return null; + if (SdkLevel.isAtLeastT()) { + return new DialogHandle( + new SimpleDialogHandle( + title, + message, + messageUrl, + messageUrlStart, + messageUrlEnd, + positiveButtonText, + negativeButtonText, + neutralButtonText, + callback, + callbackThreadRunner) + ); + } else { + // TODO(b/238353074): Remove this fallback to the legacy implementation once the + // AlertDialog style on pre-T platform is fixed. + return new DialogHandle( + new LegacySimpleDialogHandle( + title, + message, + messageUrl, + messageUrlStart, + messageUrlEnd, + positiveButtonText, + negativeButtonText, + neutralButtonText, + callback, + callbackThreadRunner) + ); } } @@ -756,7 +739,7 @@ public class WifiDialogManager { * be created. */ @AnyThread - @Nullable + @NonNull public DialogHandle createLegacySimpleDialog( @Nullable String title, @Nullable String message, @@ -798,7 +781,7 @@ public class WifiDialogManager { * be created. */ @AnyThread - @Nullable + @NonNull public DialogHandle createLegacySimpleDialogWithUrl( @Nullable String title, @Nullable String message, @@ -808,26 +791,21 @@ public class WifiDialogManager { @Nullable String positiveButtonText, @Nullable String negativeButtonText, @Nullable String neutralButtonText, - @NonNull SimpleDialogCallback callback, - @NonNull WifiThreadRunner callbackThreadRunner) { - try { - return new DialogHandle( - new LegacySimpleDialogHandle( - title, - message, - messageUrl, - messageUrlStart, - messageUrlEnd, - positiveButtonText, - negativeButtonText, - neutralButtonText, - callback, - callbackThreadRunner) - ); - } catch (IllegalArgumentException e) { - Log.e(TAG, "Could not create DialogHandle for simple dialog: " + e); - return null; - } + @Nullable SimpleDialogCallback callback, + @Nullable WifiThreadRunner callbackThreadRunner) { + return new DialogHandle( + new LegacySimpleDialogHandle( + title, + message, + messageUrl, + messageUrlStart, + messageUrlEnd, + positiveButtonText, + negativeButtonText, + neutralButtonText, + callback, + callbackThreadRunner) + ); } /** @@ -873,16 +851,16 @@ public class WifiDialogManager { } private class P2pInvitationReceivedDialogHandle extends DialogHandleInternal { - private @NonNull P2pInvitationReceivedDialogCallback mCallback; - private @NonNull WifiThreadRunner mCallbackThreadRunner; + @Nullable private final P2pInvitationReceivedDialogCallback mCallback; + @Nullable private final WifiThreadRunner mCallbackThreadRunner; P2pInvitationReceivedDialogHandle( - final @NonNull String deviceName, + final @Nullable String deviceName, final boolean isPinRequested, @Nullable String displayPin, int displayId, - @NonNull P2pInvitationReceivedDialogCallback callback, - @NonNull WifiThreadRunner callbackThreadRunner) throws IllegalArgumentException { + @Nullable P2pInvitationReceivedDialogCallback callback, + @Nullable WifiThreadRunner callbackThreadRunner) { Intent intent = getBaseLaunchIntent(WifiManager.DIALOG_TYPE_P2P_INVITATION_RECEIVED); if (intent != null) { intent.putExtra(WifiManager.EXTRA_P2P_DEVICE_NAME, deviceName) @@ -891,26 +869,21 @@ public class WifiDialogManager { setIntent(intent); } setDisplayId(displayId); - if (deviceName == null) { - throw new IllegalArgumentException("Device name cannot be null!"); - } - if (callback == null) { - throw new IllegalArgumentException("Callback cannot be null!"); - } - if (callbackThreadRunner == null) { - throw new IllegalArgumentException("Callback thread runner cannot be null!"); - } mCallback = callback; mCallbackThreadRunner = callbackThreadRunner; } void notifyOnAccepted(@Nullable String optionalPin) { - mCallbackThreadRunner.post(() -> mCallback.onAccepted(optionalPin)); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(() -> mCallback.onAccepted(optionalPin)); + } unregisterDialog(); } void notifyOnDeclined() { - mCallbackThreadRunner.post(() -> mCallback.onDeclined()); + if (mCallbackThreadRunner != null && mCallback != null) { + mCallbackThreadRunner.post(mCallback::onDeclined); + } unregisterDialog(); } } @@ -947,27 +920,23 @@ public class WifiDialogManager { * be created. */ @AnyThread + @NonNull public DialogHandle createP2pInvitationReceivedDialog( - @NonNull String deviceName, + @Nullable String deviceName, boolean isPinRequested, @Nullable String displayPin, int displayId, - @NonNull P2pInvitationReceivedDialogCallback callback, - @NonNull WifiThreadRunner callbackThreadRunner) { - try { - return new DialogHandle( - new P2pInvitationReceivedDialogHandle( - deviceName, - isPinRequested, - displayPin, - displayId, - callback, - callbackThreadRunner) - ); - } catch (IllegalArgumentException e) { - Log.e(TAG, "Could not create DialogHandle for P2P Invitation Received dialog: " + e); - return null; - } + @Nullable P2pInvitationReceivedDialogCallback callback, + @Nullable WifiThreadRunner callbackThreadRunner) { + return new DialogHandle( + new P2pInvitationReceivedDialogHandle( + deviceName, + isPinRequested, + displayPin, + displayId, + callback, + callbackThreadRunner) + ); } /** @@ -1012,9 +981,9 @@ public class WifiDialogManager { private class P2pInvitationSentDialogHandle extends DialogHandleInternal { P2pInvitationSentDialogHandle( - final @NonNull String deviceName, - final @Nullable String displayPin, - int displayId) throws IllegalArgumentException { + @Nullable final String deviceName, + @Nullable final String displayPin, + int displayId) { Intent intent = getBaseLaunchIntent(WifiManager.DIALOG_TYPE_P2P_INVITATION_SENT); if (intent != null) { intent.putExtra(WifiManager.EXTRA_P2P_DEVICE_NAME, deviceName) @@ -1022,9 +991,6 @@ public class WifiDialogManager { setIntent(intent); } setDisplayId(displayId); - if (deviceName == null) { - throw new IllegalArgumentException("Device name cannot be null!"); - } } } @@ -1038,16 +1004,12 @@ public class WifiDialogManager { * be created. */ @AnyThread + @NonNull public DialogHandle createP2pInvitationSentDialog( - @NonNull String deviceName, + @Nullable String deviceName, @Nullable String displayPin, int displayId) { - try { - return new DialogHandle(new P2pInvitationSentDialogHandle(deviceName, displayPin, - displayId)); - } catch (IllegalArgumentException e) { - Log.e(TAG, "Could not create DialogHandle for P2P Invitation Sent dialog: " + e); - return null; - } + return new DialogHandle(new P2pInvitationSentDialogHandle(deviceName, displayPin, + displayId)); } } diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index f84e6206fa..bf8f2ef061 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -308,7 +308,7 @@ public class WifiInjector { mFrameworkFacade, mContext); // Modules interacting with Native. mHalDeviceManager = new HalDeviceManager(mContext, mClock, this, wifiHandler); - mInterfaceConflictManager = new InterfaceConflictManager(mContext, mFrameworkFacade, + mInterfaceConflictManager = new InterfaceConflictManager(this, mContext, mFrameworkFacade, mHalDeviceManager, mWifiThreadRunner, mWifiDialogManager, new LocalLog( mContext.getSystemService(ActivityManager.class).isLowRamDevice() ? 128 : 256)); mWifiVendorHal = new WifiVendorHal(mContext, mHalDeviceManager, wifiHandler, mWifiGlobals, diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java index 02ab14bd60..b187da9b57 100644 --- a/service/java/com/android/server/wifi/WifiNetworkFactory.java +++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java @@ -165,6 +165,7 @@ public class WifiNetworkFactory extends NetworkFactory { @Nullable private NetworkRequest mConnectedSpecificNetworkRequest; @Nullable private WifiNetworkSpecifier mConnectedSpecificNetworkRequestSpecifier; @Nullable private WifiConfiguration mUserSelectedNetwork; + private boolean mShouldHaveInternetCapabilities = false; private Set<Integer> mConnectedUids = new ArraySet<>(); private int mUserSelectedNetworkConnectRetryCount; // Map of bssid to latest scan results for all scan results matching a request. Will be @@ -377,6 +378,10 @@ public class WifiNetworkFactory extends NetworkFactory { mActiveModeWarden.removeClientModeManager(modeManager); return; } + if (modeManager != mClientModeManager) { + // If clientModeManager changes, teardown the current connection + removeClientModeManagerIfNecessary(); + } mClientModeManager = modeManager; mClientModeManagerRole = modeManager.getRole(); if (mVerboseLoggingEnabled) { @@ -994,6 +999,14 @@ public class WifiNetworkFactory extends NetworkFactory { return Collections.emptySet(); } + /** + * Return whether if current network request should have the internet capabilities due to a + * same saved/suggestion network is present. + */ + public boolean shouldHaveInternetCapabilities() { + return mShouldHaveInternetCapabilities; + } + // Helper method to add the provided network configuration to WifiConfigManager, if it does not // already exist & return the allocated network ID. This ID will be used in the CONNECT_NETWORK // request to ClientModeImpl. @@ -1114,12 +1127,30 @@ public class WifiNetworkFactory extends NetworkFactory { Log.v(TAG, "Requesting new ClientModeManager instance - didUserSeeUi = " + didUserSeeUi); } + mShouldHaveInternetCapabilities = false; + ClientModeManagerRequestListener listener = new ClientModeManagerRequestListener(); + if (mWifiPermissionsUtil.checkEnterCarModePrioritized(mActiveSpecificNetworkRequest + .getRequestorUid())) { + mShouldHaveInternetCapabilities = hasNetworkForInternet(mUserSelectedNetwork); + if (mShouldHaveInternetCapabilities) { + listener.onAnswer(mActiveModeWarden.getPrimaryClientModeManager()); + return; + } + } WorkSource ws = new WorkSource(mActiveSpecificNetworkRequest.getRequestorUid(), mActiveSpecificNetworkRequest.getRequestorPackageName()); mActiveModeWarden.requestLocalOnlyClientModeManager(new ClientModeManagerRequestListener(), ws, networkToConnect.SSID, networkToConnect.BSSID, didUserSeeUi); } + private boolean hasNetworkForInternet(WifiConfiguration network) { + List<WifiConfiguration> networks = mWifiConfigManager.getConfiguredNetworksWithPasswords(); + return networks.stream().anyMatch(a -> Objects.equals(a.SSID, network.SSID) + && !WifiConfigurationUtil.hasCredentialChanged(a, network) + && !a.fromWifiNetworkSpecifier + && !a.noInternetAccessExpected); + } + private void handleConnectToNetworkUserSelection(WifiConfiguration network, boolean didUserSeeUi) { Log.d(TAG, "User initiated connect to network: " + network.SSID); @@ -1278,7 +1309,6 @@ public class WifiNetworkFactory extends NetworkFactory { mActiveSpecificNetworkRequest = null; mActiveSpecificNetworkRequestSpecifier = null; mSkipUserDialogue = false; - mUserSelectedNetwork = null; mUserSelectedNetworkConnectRetryCount = 0; mIsPeriodicScanEnabled = false; mIsPeriodicScanPaused = false; diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index 7fcca1d8bd..5849650c14 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -5209,7 +5209,7 @@ public class WifiServiceImpl extends BaseWifiService { if (mVerboseLoggingEnabled) { mLog.info("getCurrentNetwork uid=%").c(Binder.getCallingUid()).flush(); } - return getPrimaryClientModeManagerBlockingThreadSafe().syncGetCurrentNetwork(); + return mActiveModeWarden.getCurrentNetwork(); } public static String toHexString(String s) { diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java index 17dbcd5c84..02a5413c7f 100644 --- a/service/java/com/android/server/wifi/WifiShellCommand.java +++ b/service/java/com/android/server/wifi/WifiShellCommand.java @@ -2340,7 +2340,7 @@ public class WifiShellCommand extends BasicShellCommandHandler { if (info.getSupplicantState() != SupplicantState.COMPLETED) { continue; } - Network network = cm.syncGetCurrentNetwork(); + Network network = cm.getCurrentNetwork(); NetworkCapabilities capabilities = mConnectivityManager.getNetworkCapabilities(network); pw.println("NetworkCapabilities: " + capabilities); diff --git a/service/java/com/android/server/wifi/util/WorkSourceHelper.java b/service/java/com/android/server/wifi/util/WorkSourceHelper.java index cbd65a8f5f..3651ddc6f7 100644 --- a/service/java/com/android/server/wifi/util/WorkSourceHelper.java +++ b/service/java/com/android/server/wifi/util/WorkSourceHelper.java @@ -19,6 +19,7 @@ package com.android.server.wifi.util; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; +import android.annotation.IntDef; import android.annotation.NonNull; import android.app.ActivityManager; import android.content.pm.ApplicationInfo; @@ -32,6 +33,8 @@ import android.util.Log; import com.android.wifi.resources.R; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; /** @@ -49,6 +52,67 @@ public class WorkSourceHelper { private final PackageManager mPackageManager; private final Resources mResources; + // Internal opportunistic request. + public static final int PRIORITY_INTERNAL = 0; + + // Request from a background app. + public static final int PRIORITY_BG = 1; + + // Request from a foreground service. + public static final int PRIORITY_FG_SERVICE = 2; + + // Request from a foreground app. + public static final int PRIORITY_FG_APP = 3; + + // Request from a system app. + public static final int PRIORITY_SYSTEM = 4; + + // Request from an app with NETWORK_SETTINGS, NETWORK_SETUP_WIZARD or NETWORK_STACK permission. + public static final int PRIORITY_PRIVILEGED = 5; + + // Keep these in sync with any additions/deletions to above buckets. + public static final int PRIORITY_MIN = PRIORITY_INTERNAL; + public static final int PRIORITY_MAX = PRIORITY_PRIVILEGED; + @IntDef(prefix = { "PRIORITY_" }, value = { + PRIORITY_INTERNAL, + PRIORITY_BG, + PRIORITY_FG_SERVICE, + PRIORITY_FG_APP, + PRIORITY_SYSTEM, + PRIORITY_PRIVILEGED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RequestorWsPriority {} + + /** + * Returns integer priority level for the provided |ws|. + */ + public @RequestorWsPriority int getRequestorWsPriority() { + @RequestorWsPriority int totalPriority = PRIORITY_INTERNAL; + for (int i = 0; i < mWorkSource.size(); i++) { + String packageName = mWorkSource.getPackageName(i); + int uid = mWorkSource.getUid(i); + final @RequestorWsPriority int priority; + if (uid == Process.WIFI_UID) { + priority = PRIORITY_INTERNAL; + } else if (isPrivileged(uid)) { + priority = PRIORITY_PRIVILEGED; + } else if (isSystem(packageName, uid)) { + priority = PRIORITY_SYSTEM; + } else if (isForegroundApp(packageName)) { + priority = PRIORITY_FG_APP; + } else if (isForegroundService(packageName)) { + priority = PRIORITY_FG_SERVICE; + } else { + priority = PRIORITY_BG; + } + if (priority > totalPriority) { + totalPriority = priority; + } + } + return totalPriority; + } + public WorkSourceHelper( @NonNull WorkSource workSource, @NonNull WifiPermissionsUtil wifiPermissionsUtil, @@ -71,6 +135,9 @@ public class WorkSourceHelper { return mWorkSource.toString(); } + /** + * Check if the request comes from an app with privileged permissions. + */ private boolean isPrivileged(int uid) { return mWifiPermissionsUtil.checkNetworkSettingsPermission(uid) || mWifiPermissionsUtil.checkNetworkSetupWizardPermission(uid) @@ -79,19 +146,8 @@ public class WorkSourceHelper { } /** - * Returns whether any of the one or more worksource objects contains a privileged app - * request. - * - * Privileged = Request from an app with NETWORK_SETTINGS, NETWORK_SETUP_WIZARD or - * NETWORK_STACK permissions. + * Check if the request comes from a system app. */ - public boolean hasAnyPrivilegedAppRequest() { - for (int i = 0; i < mWorkSource.size(); i++) { - if (isPrivileged(mWorkSource.getUid(i))) return true; - } - return false; - } - private boolean isSystem(String packageName, int uid) { // when checking ActiveModeWarden#INTERNAL_REQUESTOR_WS if (packageName == null) { @@ -112,28 +168,14 @@ public class WorkSourceHelper { } /** - * Returns whether any of the one or more worksource objects contains a system app - * request. - */ - public boolean hasAnySystemAppRequest() { - for (int i = 0; i < mWorkSource.size(); i++) { - if (isSystem(mWorkSource.getPackageName(i), mWorkSource.getUid(i))) return true; - } - return false; - } - - /** - * Check if the request comes from foreground app. + * Check if the request comes from a foreground app. */ - private boolean isForegroundApp(@NonNull String requestorPackageName, - boolean allowOverlayBypass) { - if (allowOverlayBypass) { - String[] exceptionList = mResources.getStringArray( - R.array.config_wifiInterfacePriorityTreatAsForegroundList); - if (exceptionList != null && Arrays.stream(exceptionList).anyMatch( - s -> TextUtils.equals(requestorPackageName, s))) { - return true; - } + private boolean isForegroundApp(@NonNull String requestorPackageName) { + String[] exceptionList = mResources.getStringArray( + R.array.config_wifiInterfacePriorityTreatAsForegroundList); + if (exceptionList != null && Arrays.stream(exceptionList).anyMatch( + s -> TextUtils.equals(requestorPackageName, s))) { + return true; } try { return mActivityManager.getPackageImportance(requestorPackageName) @@ -145,21 +187,7 @@ public class WorkSourceHelper { } /** - * Returns whether any of the one or more worksource objects contains a foreground app - * request. - * - * @param allowOverlayBypass Use the `config_wifiInterfacePriorityTreatAsForegroundList` overlay - * to consider the specified packages are foreground. - */ - public boolean hasAnyForegroundAppRequest(boolean allowOverlayBypass) { - for (int i = 0; i < mWorkSource.size(); i++) { - if (isForegroundApp(mWorkSource.getPackageName(i), allowOverlayBypass)) return true; - } - return false; - } - - /** - * Check if the request comes from foreground service. + * Check if the request comes from a foreground service. */ private boolean isForegroundService(@NonNull String requestorPackageName) { try { @@ -171,26 +199,4 @@ public class WorkSourceHelper { return false; } } - - /** - * Returns whether any of the one or more worksource objects contains a foreground service - * request. - */ - public boolean hasAnyForegroundServiceRequest() { - for (int i = 0; i < mWorkSource.size(); i++) { - if (isForegroundService(mWorkSource.getPackageName(i))) return true; - } - return false; - } - - /** - * Returns whether any of the one or more worksource objects contains an internal - * (i.e uid = Process.WIFI_UID) request. - */ - public boolean hasAnyInternalRequest() { - for (int i = 0; i < mWorkSource.size(); i++) { - if (mWorkSource.getUid(i) == Process.WIFI_UID) return true; - } - return false; - } } diff --git a/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java b/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java index 2cc22f638f..96448661fa 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java @@ -63,6 +63,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; import android.location.LocationManager; +import android.net.Network; import android.net.wifi.ISubsystemRestartCallback; import android.net.wifi.IWifiConnectedNetworkScorer; import android.net.wifi.SoftApCapability; @@ -169,6 +170,7 @@ public class ActiveModeWardenTest extends WifiBaseTest { @Mock HalDeviceManager mHalDeviceManager; @Mock UserManager mUserManager; @Mock PackageManager mPackageManager; + @Mock Network mNetwork; Listener<ConcreteClientModeManager> mClientListener; Listener<SoftApManager> mSoftApListener; @@ -336,6 +338,7 @@ public class ActiveModeWardenTest extends WifiBaseTest { mActiveModeWarden.wifiToggled(TEST_WORKSOURCE); mLooper.dispatchAll(); when(mClientModeManager.getRole()).thenReturn(ROLE_CLIENT_PRIMARY); + when(mClientModeManager.getCurrentNetwork()).thenReturn(mNetwork); when(mWifiNative.getSupportedFeatureSet(WIFI_IFACE_NAME)).thenReturn(TEST_FEATURE_SET); // ClientModeManager starts in SCAN_ONLY role. mClientListener.onRoleChanged(mClientModeManager); @@ -380,6 +383,7 @@ public class ActiveModeWardenTest extends WifiBaseTest { mLooper.dispatchAll(); when(mClientModeManager.getRole()).thenReturn(ROLE_CLIENT_SCAN_ONLY); when(mClientModeManager.getInterfaceName()).thenReturn(WIFI_IFACE_NAME); + when(mClientModeManager.getCurrentNetwork()).thenReturn(null); when(mWifiNative.getSupportedFeatureSet(null)).thenReturn(TEST_FEATURE_SET); if (!isClientModeSwitch) { mClientListener.onStarted(mClientModeManager); @@ -4786,4 +4790,15 @@ public class ActiveModeWardenTest extends WifiBaseTest { testGetSupportedFeaturesCaseForRtt( featureLongBits | featureInfra | featureD2dRtt | featureD2apRtt, true)); } + + @Test + public void testGetCurrentNetworkScanOnly() throws Exception { + enterScanOnlyModeActiveState(); + assertNull(mActiveModeWarden.getCurrentNetwork()); + } + + @Test public void testGetCurrentNetworkClientMode() throws Exception { + mActiveModeWarden.setCurrentNetwork(mNetwork); + assertEquals(mNetwork, mActiveModeWarden.getCurrentNetwork()); + } } diff --git a/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java index efa7011aa3..34250fa0ca 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java @@ -2794,18 +2794,26 @@ public class ClientModeImplTest extends WifiBaseTest { } @Test - public void testSyncGetCurrentNetwork() throws Exception { - // syncGetCurrentNetwork() returns null when disconnected - mLooper.startAutoDispatch(); - assertNull(mCmi.syncGetCurrentNetwork()); - mLooper.stopAutoDispatch(); - + public void testGetCurrentNetwork() throws Exception { + // getCurrentNetwork() returns null when disconnected + assertNull(mCmi.getCurrentNetwork()); connect(); - // syncGetCurrentNetwork() returns non-null Network when connected - mLooper.startAutoDispatch(); - assertEquals(mNetwork, mCmi.syncGetCurrentNetwork()); - mLooper.stopAutoDispatch(); + assertEquals("L3ConnectedState", getCurrentState().getName()); + // getCurrentNetwork() returns non-null Network when connected + assertEquals(mNetwork, mCmi.getCurrentNetwork()); + // Now trigger disconnect + mCmi.disconnect(); + DisconnectEventInfo disconnectEventInfo = + new DisconnectEventInfo(mConnectedNetwork.SSID, TEST_BSSID_STR, 0, false); + mCmi.sendMessage(WifiMonitor.NETWORK_DISCONNECTION_EVENT, disconnectEventInfo); + mLooper.dispatchAll(); + mCmi.sendMessage(WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0, + new StateChangeResult(0, WifiSsid.fromUtf8Text(mConnectedNetwork.SSID), + TEST_BSSID_STR, SupplicantState.DISCONNECTED)); + mLooper.dispatchAll(); + assertEquals("DisconnectedState", getCurrentState().getName()); + assertNull(mCmi.getCurrentNetwork()); } /** @@ -5100,7 +5108,7 @@ public class ClientModeImplTest extends WifiBaseTest { * when both Tx and Rx link speed are unavailable. */ @Test - public void verifyNetworkCapabilitiesForSpecificRequest() throws Exception { + public void verifyNetworkCapabilitiesForSpecificRequestWithInternet() throws Exception { mWifiInfo.setFrequency(2437); when(mPerNetwork.getTxLinkBandwidthKbps()).thenReturn(30_000); when(mPerNetwork.getRxLinkBandwidthKbps()).thenReturn(40_000); @@ -5147,6 +5155,58 @@ public class ClientModeImplTest extends WifiBaseTest { } /** + * Verify that we set the INTERNET capability in the network agent when connected + * as a result of the new network which indicate the internet capabilites should be set. + */ + @Test + public void verifyNetworkCapabilitiesForSpecificRequest() throws Exception { + mWifiInfo.setFrequency(2437); + when(mPerNetwork.getTxLinkBandwidthKbps()).thenReturn(30_000); + when(mPerNetwork.getRxLinkBandwidthKbps()).thenReturn(40_000); + when(mWifiNetworkFactory.getSpecificNetworkRequestUids(any(), any())) + .thenReturn(Set.of(TEST_UID)); + when(mWifiNetworkFactory.getSpecificNetworkRequestUidAndPackageName(any(), any())) + .thenReturn(Pair.create(TEST_UID, OP_PACKAGE_NAME)); + when(mWifiNetworkFactory.shouldHaveInternetCapabilities()).thenReturn(true); + // Simulate the first connection. + connectWithValidInitRssi(-42); + ArgumentCaptor<NetworkCapabilities> networkCapabilitiesCaptor = + ArgumentCaptor.forClass(NetworkCapabilities.class); + + verify(mWifiInjector).makeWifiNetworkAgent( + networkCapabilitiesCaptor.capture(), any(), any(), any(), any()); + + NetworkCapabilities networkCapabilities = networkCapabilitiesCaptor.getValue(); + assertNotNull(networkCapabilities); + + // should not have internet capability. + assertTrue(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + + NetworkSpecifier networkSpecifier = networkCapabilities.getNetworkSpecifier(); + assertTrue(networkSpecifier instanceof WifiNetworkAgentSpecifier); + WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier = + (WifiNetworkAgentSpecifier) networkSpecifier; + + // createNetworkAgentSpecifier does not write the BSSID to the current wifi configuration. + WifiConfiguration expectedConfig = new WifiConfiguration( + mCmi.getConnectedWifiConfiguration()); + expectedConfig.BSSID = TEST_BSSID_STR; + WifiNetworkAgentSpecifier expectedWifiNetworkAgentSpecifier = + new WifiNetworkAgentSpecifier(expectedConfig, ScanResult.WIFI_BAND_24_GHZ, + true /* matchLocalOnlySpecifiers */); + assertEquals(expectedWifiNetworkAgentSpecifier, wifiNetworkAgentSpecifier); + if (SdkLevel.isAtLeastS()) { + assertEquals(Set.of(new Range<Integer>(TEST_UID, TEST_UID)), + networkCapabilities.getUids()); + } else { + assertEquals(TEST_UID, networkCapabilities.getRequestorUid()); + assertEquals(OP_PACKAGE_NAME, networkCapabilities.getRequestorPackageName()); + } + assertEquals(30_000, networkCapabilities.getLinkUpstreamBandwidthKbps()); + assertEquals(40_000, networkCapabilities.getLinkDownstreamBandwidthKbps()); + } + + /** * Verifies that no RSSI change broadcast should be sent */ private void failOnRssiChangeBroadcast() throws Exception { diff --git a/service/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java index 8ae6cb7131..9116ff5b4c 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java @@ -630,6 +630,10 @@ public class ConcreteClientModeManagerTest extends WifiBaseTest { when(mClientModeImpl.hasQuit()).thenReturn(true); mClientModeManager.onClientModeImplQuit(); verify(mListener).onStopped(mClientModeManager); + + mClientModeManager.stop(); + mLooper.dispatchAll(); + verify(mWifiNative, never()).teardownInterface(TEST_INTERFACE_NAME); } /** @@ -638,11 +642,11 @@ public class ConcreteClientModeManagerTest extends WifiBaseTest { @Test public void noCallbackOnInterfaceDestroyedWhenAlreadyStopped() throws Exception { startClientInConnectModeAndVerifyEnabled(); - reset(mListener); mClientModeManager.stop(); mLooper.dispatchAll(); + verify(mWifiNative).teardownInterface(TEST_INTERFACE_NAME); // now trigger interface destroyed and make sure callback doesn't get called mInterfaceCallbackCaptor.getValue().onDestroyed(TEST_INTERFACE_NAME); diff --git a/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java index 04e4f5384f..629d2257de 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java @@ -36,7 +36,6 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; -import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; @@ -139,6 +138,7 @@ public class HalDeviceManagerTest extends WifiBaseTest { @Mock private WifiInjector mWifiInjector; @Mock private SoftApManager mSoftApManager; @Mock private WifiSettingsConfigStore mWifiSettingsConfigStore; + @Mock private InterfaceConflictManager mInterfaceConflictManager; @Mock private WorkSourceHelper mWorkSourceHelper0; @Mock private WorkSourceHelper mWorkSourceHelper1; @Mock private WorkSourceHelper mWorkSourceHelper2; @@ -234,12 +234,18 @@ public class HalDeviceManagerTest extends WifiBaseTest { setupWifiV15(mWifiMock); + when(mWifiInjector.getInterfaceConflictManager()).thenReturn(mInterfaceConflictManager); + when(mInterfaceConflictManager.needsUserApprovalToDelete(anyInt(), any(), anyInt(), any())) + .thenReturn(false); when(mWifiInjector.makeWsHelper(TEST_WORKSOURCE_0)).thenReturn(mWorkSourceHelper0); when(mWifiInjector.makeWsHelper(TEST_WORKSOURCE_1)).thenReturn(mWorkSourceHelper1); when(mWifiInjector.makeWsHelper(TEST_WORKSOURCE_2)).thenReturn(mWorkSourceHelper2); - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(true); - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); - when(mWorkSourceHelper2.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); + when(mWorkSourceHelper2.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); when(mWorkSourceHelper0.getWorkSource()).thenReturn(TEST_WORKSOURCE_0); when(mWorkSourceHelper1.getWorkSource()).thenReturn(TEST_WORKSOURCE_1); when(mWorkSourceHelper2.getWorkSource()).thenReturn(TEST_WORKSOURCE_2); @@ -845,8 +851,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("P2P was not created", p2pIface, IsNull.notNullValue()); // get NAN interface from a system app: should fail - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); List<Pair<Integer, WorkSource>> nanDetails = mDut.reportImpactToCreateIface( HDM_CREATE_IFACE_NAN, false, TEST_WORKSOURCE_1); assertNull("Should not create this NAN", nanDetails); @@ -856,13 +862,13 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("not allocated interface", nanIface, IsNull.nullValue()); // Now replace the requestorWs (fg app now) for the P2P iface. - when(mWorkSourceHelper2.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper2.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper2.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertTrue(mDut.replaceRequestorWs(p2pIface, TEST_WORKSOURCE_2)); // get AP interface again from a system app: should succeed now - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); nanIface = (IWifiNanIface) validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV1.STA_CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true) @@ -878,24 +884,17 @@ public class HalDeviceManagerTest extends WifiBaseTest { } /** - * Validate a flow sequence for test chip 2 if the - * |config_wifiUserApprovalRequiredForD2dInterfacePriority| overlay value is true. If enabled, - * interface requests for AP/P2P/NAN should be approved over other AP/P2P/NAN interfaces as - * long as the new requestor's worksource priority is > PRIORITY_BG and they aren't the same - * type. + * Validate a flow sequence for test chip 2 if a new interface is able to delete an existing + * interface with user approval. * * Flow sequence: * - create P2P (privileged app) - * - create NAN (foreground app) - * - tear down NAN - * - create P2P (privileged app) - * - create NAN (background app): should fail. + * - create NAN (foreground app) but cannot delete P2P with user approval: should fail + * - create NAN (foreground app) but can delete P2P with user approval: should succeed */ @Test - public void testInterfaceCreationFlowIfD2dInterfacePriorityOverlayEnabled() throws Exception { + public void testInterfaceCreationFlowIfCanDeleteWithUserApproval() throws Exception { assumeTrue(SdkLevel.isAtLeastT()); - when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) - .thenReturn(true); mDut = new HalDeviceManagerSpy(); ChipMockBase chipMock = new TestChipV2(); chipMock.initialize(); @@ -920,18 +919,24 @@ public class HalDeviceManagerTest extends WifiBaseTest { ); collector.checkThat("P2P was not created", p2pIface, IsNull.notNullValue()); - // Check if we can create a new P2P interface from foreground app: should fail. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); - List<Pair<Integer, WorkSource>> p2pDetails = mDut.reportImpactToCreateIface( - HDM_CREATE_IFACE_P2P, true, TEST_WORKSOURCE_1); - assertNull("Should not create this P2P", p2pDetails); - - // Create NAN interface from foreground app: should succeed. + // Create NAN interface from foreground app: should fail. + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); List<Pair<Integer, WorkSource>> nanDetails = mDut.reportImpactToCreateIface( HDM_CREATE_IFACE_NAN, true, TEST_WORKSOURCE_1); + assertNull("Should not create this NAN", nanDetails); + IWifiIface nanIface = mDut.createNanIface(null, null, TEST_WORKSOURCE_1); + collector.checkThat("NAN was created", nanIface, IsNull.nullValue()); + + // Can now delete P2P with user approval + when(mInterfaceConflictManager.needsUserApprovalToDelete(anyInt(), any(), anyInt(), any())) + .thenReturn(true); + + // Can create NAN now. + nanDetails = mDut.reportImpactToCreateIface( + HDM_CREATE_IFACE_NAN, true, TEST_WORKSOURCE_1); assertNotNull("Should create this NAN", nanDetails); - IWifiIface nanIface = validateInterfaceSequence(chipMock, + nanIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV2.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true) HDM_CREATE_IFACE_NAN, @@ -943,140 +948,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { new InterfaceDestroyedListenerWithIfaceName(getName(p2pIface), nanDestroyedListener) ); collector.checkThat("NAN was not created", nanIface, IsNull.notNullValue()); - - // Tear down the NAN interface. - mDut.removeIface(nanIface); - mTestLooper.dispatchAll(); - - // Create a new P2P interface from privileged app: should succeed. - p2pIface = validateInterfaceSequence(chipMock, - true, // chipModeValid - TestChipV2.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true) - HDM_CREATE_IFACE_P2P, - "wlan0", - TestChipV2.CHIP_MODE_ID, - null, // tearDownList - nanDestroyedListener, // destroyedListener - TEST_WORKSOURCE_0 // requestorWs - ); - collector.checkThat("P2P was not created", p2pIface, IsNull.notNullValue()); - - // Check if we can create a new NAN interface from background app: should fail. - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); - nanDetails = mDut.reportImpactToCreateIface(HDM_CREATE_IFACE_NAN, true, TEST_WORKSOURCE_1); - assertNull("Should not create this NAN", nanDetails); } - /** - * Tests that - * {@link HalDeviceManager#needsUserApprovalToDelete(int, WorkSource, int, WorkSource)} returns - * true on the following conditions: - * 1) Requested interface is AP, AP_BRIDGED, P2P, or NAN. - * 2) Existing interface is AP, AP_BRIDGED, P2P, or NAN (but not the same as the requested). - * 3) Requestor worksource has higher priority than PRIORITY_BG. - * 4) Existing worksource is not PRIORITY_INTERNAL. - */ - @Test - public void testShouldShowDialogToDelete() throws Exception { - WorkSource newWorkSource = mock(WorkSource.class); - WorkSource oldWorkSource = mock(WorkSource.class); - WorkSourceHelper newWsHelper = mock(WorkSourceHelper.class); - WorkSourceHelper oldWsHelper = mock(WorkSourceHelper.class); - when(mWifiInjector.makeWsHelper(newWorkSource)).thenReturn(newWsHelper); - when(mWifiInjector.makeWsHelper(oldWorkSource)).thenReturn(oldWsHelper); - - when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) - .thenReturn(false); - mDut = new HalDeviceManagerSpy(); - - // No dialog if dialogs aren't enabled - when(newWsHelper.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(true); - when(oldWsHelper.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(true); - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_P2P, newWorkSource, - HDM_CREATE_IFACE_AP, oldWorkSource)); - - when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) - .thenReturn(true); - mDut = new HalDeviceManagerSpy(); - - // Should show dialog for appropriate types. - when(newWsHelper.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(true); - when(oldWsHelper.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(true); - - // Requesting AP - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP, newWorkSource, - HDM_CREATE_IFACE_AP, oldWorkSource)); - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP, newWorkSource, - HDM_CREATE_IFACE_AP_BRIDGE, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP, newWorkSource, - HDM_CREATE_IFACE_NAN, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP, newWorkSource, - HDM_CREATE_IFACE_P2P, oldWorkSource)); - - // Requesting AP_BRIDGE - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP_BRIDGE, newWorkSource, - HDM_CREATE_IFACE_AP, oldWorkSource)); - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP_BRIDGE, newWorkSource, - HDM_CREATE_IFACE_AP_BRIDGE, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP_BRIDGE, newWorkSource, - HDM_CREATE_IFACE_NAN, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_AP_BRIDGE, newWorkSource, - HDM_CREATE_IFACE_P2P, oldWorkSource)); - - // Requesting P2P - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_P2P, newWorkSource, - HDM_CREATE_IFACE_AP, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_P2P, newWorkSource, - HDM_CREATE_IFACE_AP_BRIDGE, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_P2P, newWorkSource, - HDM_CREATE_IFACE_NAN, oldWorkSource)); - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_P2P, newWorkSource, - HDM_CREATE_IFACE_P2P, oldWorkSource)); - - // Requesting NAN - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_NAN, newWorkSource, - HDM_CREATE_IFACE_AP, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_NAN, newWorkSource, - HDM_CREATE_IFACE_AP_BRIDGE, oldWorkSource)); - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_NAN, newWorkSource, - HDM_CREATE_IFACE_NAN, oldWorkSource)); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_NAN, newWorkSource, - HDM_CREATE_IFACE_P2P, oldWorkSource)); - - // Foreground should show dialog over Privileged - when(newWsHelper.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(true); - when(oldWsHelper.hasAnyPrivilegedAppRequest()).thenReturn(true); - assertTrue(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_NAN, newWorkSource, - HDM_CREATE_IFACE_P2P, oldWorkSource)); - - // Foreground should delete Internal without showing dialog - when(oldWsHelper.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(oldWsHelper.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(false); - when(oldWsHelper.hasAnyInternalRequest()).thenReturn(true); - assertFalse(mDut.needsUserApprovalToDelete( - HDM_CREATE_IFACE_NAN, newWorkSource, - HDM_CREATE_IFACE_P2P, oldWorkSource)); - } - - ////////////////////////////////////////////////////////////////////////////////////// // Chip Specific Tests - but should work on all chips! // (i.e. add copies for each test chip) @@ -1512,8 +1385,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { mInOrder.verify(chipMock.chip).configureChip(TestChipV1.STA_CHIP_MODE_ID); // Now Create AP Iface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(anyBoolean())).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); IWifiApIface apIface = mock(IWifiApIface.class); doAnswer(new GetNameAnswer("wlan0")).when(apIface).getName( any(IWifiIface.getNameCallback.class)); @@ -1712,8 +1585,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA created", staIface1, IsNull.notNullValue()); // get STA interface again (from a system app) - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); List<Pair<Integer, WorkSource>> staDetails = mDut.reportImpactToCreateIface( HDM_CREATE_IFACE_STA, false, TEST_WORKSOURCE_1); assertNotNull("Should not have a problem if STA already exists", staDetails); @@ -1938,8 +1811,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { executeAndValidateStartupSequence(); // get STA interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -1953,27 +1826,27 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA created", staIface, IsNull.notNullValue()); // FG app not allowed to create AP interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_AP, TEST_WORKSOURCE_1)); // New system app not allowed to create AP interface. - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_AP, TEST_WORKSOURCE_1)); // Privileged app allowed to create AP interface. - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_AP, TEST_WORKSOURCE_1)); // FG app allowed to create NAN interface (since there is no need to delete any interfaces). - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_NAN, TEST_WORKSOURCE_1)); // BG app allowed to create P2P interface (since there is no need to delete any interfaces). - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); + when(mWorkSourceHelper1.getRequestorWsPriority()).thenReturn(WorkSourceHelper.PRIORITY_BG); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_P2P, TEST_WORKSOURCE_1)); } @@ -2006,12 +1879,12 @@ public class HalDeviceManagerTest extends WifiBaseTest { assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_AP, TEST_WORKSOURCE_1)); // Allow to create NAN interface (since there is no need to delete any interfaces). - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_NAN, TEST_WORKSOURCE_1)); // Allow to create P2P interface (since there is no need to delete any interfaces). - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); + when(mWorkSourceHelper1.getRequestorWsPriority()).thenReturn(WorkSourceHelper.PRIORITY_BG); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_P2P, TEST_WORKSOURCE_1)); } @@ -2061,8 +1934,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { // create STA (system app) when(mClock.getUptimeSinceBootMillis()).thenReturn(15L); - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -2076,8 +1949,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA interface wasn't created", staIface, IsNull.notNullValue()); // create P2P (system app) - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface p2pIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV2.CHIP_MODE_ID, // chipModeId @@ -2386,8 +2259,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { executeAndValidateStartupSequence(); // get STA interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -2401,8 +2274,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA created", staIface, IsNull.notNullValue()); // get AP interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface apIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV2.CHIP_MODE_ID, // chipModeId @@ -2416,27 +2289,27 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("AP created", apIface, IsNull.notNullValue()); // FG app not allowed to create STA interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // New system app not allowed to create STA interface. - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // Privileged app allowed to create STA interface. - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // FG app allowed to create NAN interface (since there is no need to delete any interfaces). - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_NAN, TEST_WORKSOURCE_1)); // BG app allowed to create P2P interface (since there is no need to delete any interfaces). - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); + when(mWorkSourceHelper0.getRequestorWsPriority()).thenReturn(WorkSourceHelper.PRIORITY_BG); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_P2P, TEST_WORKSOURCE_1)); } @@ -2486,8 +2359,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { // create STA (system app) when(mClock.getUptimeSinceBootMillis()).thenReturn(15L); - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -2501,8 +2374,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA interface wasn't created", staIface, IsNull.notNullValue()); // create P2P (system app) - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface p2pIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV3.CHIP_MODE_ID, // chipModeId @@ -2628,8 +2501,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { verify(staDestroyedListener2).onDestroyed(getName(staIface2)); // request STA2 (foreground app): should fail - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); staDetails = mDut.reportImpactToCreateIface(HDM_CREATE_IFACE_STA, false, TEST_WORKSOURCE_1); assertNotNull("should not fail when asking for same STA", staDetails); assertEquals(0, staDetails.size()); @@ -2723,8 +2596,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { executeAndValidateStartupSequence(); // get STA interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -2738,8 +2611,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA created", staIface, IsNull.notNullValue()); // get AP interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface apIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV3.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true) @@ -2753,27 +2626,28 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("AP created", apIface, IsNull.notNullValue()); // FG app not allowed to create STA interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // New system app not allowed to create STA interface. - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // Privileged app allowed to create STA interface. - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // FG app not allowed to create NAN interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_NAN, TEST_WORKSOURCE_1)); // Privileged app allowed to create P2P interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_P2P, TEST_WORKSOURCE_1)); } @@ -2822,8 +2696,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { // create STA (system app) when(mClock.getUptimeSinceBootMillis()).thenReturn(15L); - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -2837,8 +2711,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA interface wasn't created", staIface, IsNull.notNullValue()); // create P2P (system app) - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface p2pIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV4.CHIP_MODE_ID, // chipModeId @@ -2945,8 +2819,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("NAN interface wasn't created", nanIface, IsNull.notNullValue()); // request STA2 (foreground app): should fail - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); staDetails = mDut.reportImpactToCreateIface(HDM_CREATE_IFACE_STA, false, TEST_WORKSOURCE_1); assertNotNull("should not fail when asking for same STA", staDetails); assertEquals(0, staDetails.size()); @@ -3132,8 +3006,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { InterfaceDestroyedListener.class); // create P2P (internal request) - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnyInternalRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_INTERNAL); // create NAN (privileged app): will destroy P2P IWifiIface nanIface = validateInterfaceSequence(chipMock, true, // chipModeValid @@ -3254,8 +3128,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { executeAndValidateStartupSequence(); // get STA interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface = validateInterfaceSequence(chipMock, false, // chipModeValid -1000, // chipModeId (only used if chipModeValid is true) @@ -3269,8 +3143,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA created", staIface, IsNull.notNullValue()); // get AP interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface apIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV4.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true) @@ -3284,27 +3158,28 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("AP created", apIface, IsNull.notNullValue()); // FG app not allowed to create STA interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // New system app not allowed to create STA interface. - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // Privileged app allowed to create STA interface. - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_STA, TEST_WORKSOURCE_1)); // FG app not allowed to create NAN interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_NAN, TEST_WORKSOURCE_1)); // Privileged app allowed to create P2P interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_P2P, TEST_WORKSOURCE_1)); } @@ -3376,8 +3251,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { executeAndValidateStartupSequence(); // get STA interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface staIface; if (isWigigSupported) { staIface = validateInterfaceSequence(chipMock, @@ -3403,8 +3278,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { } // get AP interface from system app. - when(mWorkSourceHelper0.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper0.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper0.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface apIface; if (isWigigSupported) { apIface = validateInterfaceSequence(chipMock, @@ -3429,7 +3304,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { } if (SdkLevel.isAtLeastS()) { // Privileged app allowed to create P2P interface. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertThat(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_P2P, android.hardware.wifi.V1_5.IWifiChip.ChipCapabilityMask.WIGIG, TEST_WORKSOURCE_1), is(isWigigSupported)); @@ -3837,9 +3713,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("STA created", staIface, IsNull.notNullValue()); // get STA interface from foreground app. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnyForegroundAppRequest(true)).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); staIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV7.DUAL_STA_CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true) @@ -3854,13 +3729,14 @@ public class HalDeviceManagerTest extends WifiBaseTest { // New system app not allowed to create AP interface since it would tear down the privileged // app STA during the chip mode change. - when(mWorkSourceHelper2.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper2.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper2.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); assertFalse(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_AP, TEST_WORKSOURCE_2)); // Privileged app allowed to create AP interface since it is able to tear down the // privileged app STA during the chip mode change. - when(mWorkSourceHelper2.hasAnyPrivilegedAppRequest()).thenReturn(true); + when(mWorkSourceHelper2.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); assertTrue(mDut.isItPossibleToCreateIface(HDM_CREATE_IFACE_AP, TEST_WORKSOURCE_2)); } @@ -3898,8 +3774,8 @@ public class HalDeviceManagerTest extends WifiBaseTest { collector.checkThat("Bridged AP created", apBridgedIface, IsNull.notNullValue()); // get AP interface for a system app. - when(mWorkSourceHelper1.hasAnyPrivilegedAppRequest()).thenReturn(false); - when(mWorkSourceHelper1.hasAnySystemAppRequest()).thenReturn(true); + when(mWorkSourceHelper1.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_SYSTEM); IWifiIface apIface = validateInterfaceSequence(chipMock, true, // chipModeValid TestChipV8.CHIP_MODE_ID, // chipModeId diff --git a/service/tests/wifitests/src/com/android/server/wifi/InterfaceConflictManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/InterfaceConflictManagerTest.java index a90e8e19db..387b5c54dc 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/InterfaceConflictManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/InterfaceConflictManagerTest.java @@ -16,11 +16,17 @@ package com.android.server.wifi; +import static com.android.server.wifi.HalDeviceManager.HDM_CREATE_IFACE_AP; +import static com.android.server.wifi.HalDeviceManager.HDM_CREATE_IFACE_AP_BRIDGE; +import static com.android.server.wifi.HalDeviceManager.HDM_CREATE_IFACE_NAN; +import static com.android.server.wifi.HalDeviceManager.HDM_CREATE_IFACE_P2P; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -47,6 +53,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.wifi.util.WaitingState; +import com.android.server.wifi.util.WorkSourceHelper; import com.android.wifi.resources.R; import org.junit.Before; @@ -67,6 +74,7 @@ public class InterfaceConflictManagerTest { private TestLooper mTestLooper; private InterfaceConflictManager mDut; + @Mock WifiInjector mWifiInjector; @Mock WifiContext mWifiContext; @Mock Resources mResources; @Mock FrameworkFacade mFrameworkFacade; @@ -77,11 +85,18 @@ public class InterfaceConflictManagerTest { @Mock WifiDialogManager mWifiDialogManager; @Mock WifiDialogManager.DialogHandle mDialogHandle; @Mock LocalLog mLocalLog; + @Mock WorkSourceHelper mWsHelper; + @Mock WorkSourceHelper mExistingWsHelper; private static final int TEST_UID = 1234; private static final String TEST_PACKAGE_NAME = "some.package.name"; private static final String TEST_APP_NAME = "Some App Name"; private static final WorkSource TEST_WS = new WorkSource(TEST_UID, TEST_PACKAGE_NAME); + private static final int EXISTING_UID = 5678; + private static final String EXISTING_PACKAGE_NAME = "existing.package.name"; + private static final String EXISTING_APP_NAME = "Existing App Name"; + private static final WorkSource EXISTING_WS = + new WorkSource(EXISTING_UID, EXISTING_PACKAGE_NAME); ArgumentCaptor<WifiDialogManager.SimpleDialogCallback> mCallbackCaptor = ArgumentCaptor.forClass(WifiDialogManager.SimpleDialogCallback.class); @@ -99,15 +114,25 @@ public class InterfaceConflictManagerTest { when(mResources.getBoolean( R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)).thenReturn(true); - when(mHdm.needsUserApprovalToDelete(anyInt(), any(), anyInt(), any())).thenReturn(true); - - when(mFrameworkFacade.getAppName(any(), anyString(), anyInt())).thenReturn(TEST_APP_NAME); + when(mFrameworkFacade.getAppName(any(), eq(TEST_PACKAGE_NAME), anyInt())) + .thenReturn(TEST_APP_NAME); + when(mFrameworkFacade.getAppName(any(), eq(EXISTING_PACKAGE_NAME), anyInt())) + .thenReturn(EXISTING_APP_NAME); when(mWifiDialogManager.createSimpleDialog( any(), any(), any(), any(), any(), any(), any())).thenReturn(mDialogHandle); + + when(mWifiInjector.makeWsHelper(eq(TEST_WS))).thenReturn(mWsHelper); + when(mWifiInjector.makeWsHelper(eq(EXISTING_WS))).thenReturn(mExistingWsHelper); + when(mWsHelper.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); + when(mExistingWsHelper.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_FG_APP); + when(mWsHelper.getWorkSource()).thenReturn(TEST_WS); + when(mExistingWsHelper.getWorkSource()).thenReturn(EXISTING_WS); } private void initInterfaceConflictManager() { - mDut = new InterfaceConflictManager(mWifiContext, mFrameworkFacade, mHdm, + mDut = new InterfaceConflictManager(mWifiInjector, mWifiContext, mFrameworkFacade, mHdm, new WifiThreadRunner(new Handler(mTestLooper.getLooper())), mWifiDialogManager, mLocalLog); mDut.handleBootCompleted(); @@ -215,30 +240,6 @@ public class InterfaceConflictManagerTest { } /** - * Verify that if interface cannot be created or if interface can be created w/o side effects - * then command simply proceeds. - */ - @Test - public void testUserApprovalNotNeeded() { - initInterfaceConflictManager(); - - int interfaceType = HalDeviceManager.HDM_CREATE_IFACE_P2P; - Message msg = Message.obtain(); - - // can delete iface without user approval - when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); - when(mHdm.needsUserApprovalToDelete(anyInt(), any(), anyInt(), any())).thenReturn(false); - - // request should pass through without the dialog - assertEquals(InterfaceConflictManager.ICM_EXECUTE_COMMAND, - mDut.manageInterfaceConflictForStateMachine("Some Tag", msg, - mStateMachine, mWaitingState, mTargetState, - interfaceType, TEST_WS, false)); - } - - /** * Verify flow with user approval. */ @Test @@ -250,8 +251,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, @@ -291,8 +291,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, @@ -332,8 +331,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, @@ -384,7 +382,7 @@ public class InterfaceConflictManagerTest { // Unexpected impact to create, launch the dialog again when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))) .thenReturn(Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); + EXISTING_WS))); assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, mDut.manageInterfaceConflictForStateMachine("Some Tag", waitingMsg, mStateMachine, mWaitingState, mTargetState, interfaceType, TEST_WS, @@ -411,8 +409,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, @@ -492,8 +489,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_P2P, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_P2P, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_EXECUTE_COMMAND, @@ -532,8 +528,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_P2P, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_P2P, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, @@ -560,8 +555,7 @@ public class InterfaceConflictManagerTest { // can create interface - but with side effects when(mHdm.reportImpactToCreateIface(eq(interfaceType), eq(false), eq(TEST_WS))).thenReturn( - Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, - new WorkSource(10, "something else")))); + Arrays.asList(Pair.create(HalDeviceManager.HDM_CREATE_IFACE_NAN, EXISTING_WS))); // send request assertEquals(InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER, @@ -593,4 +587,137 @@ public class InterfaceConflictManagerTest { any(), any(), any(), any(), any(), any(), any()); verify(mDialogHandle, times(2)).launchDialog(); } + + /** + * Tests that + * {@link InterfaceConflictManager#needsUserApprovalToDelete(int, WorkSourceHelper, int, + * WorkSourceHelper)} returns true on the following conditions: + * 1) Requested interface is AP, AP_BRIDGED, P2P, or NAN. + * 2) Existing interface is AP, AP_BRIDGED, P2P, or NAN (but not the same as the requested). + * 3) Requestor worksource has higher priority than PRIORITY_BG. + * 4) Existing worksource is not PRIORITY_INTERNAL. + * 5) User approval is required (by overlay or override). + * 6) Requestor package is not exempt from user approval. + */ + @Test + public void testCanDeleteWithUserApproval() throws Exception { + // No dialog if dialogs aren't enabled. + when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) + .thenReturn(false); + initInterfaceConflictManager(); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + + // No dialog if requesting package is exempt. + when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) + .thenReturn(true); + when(mResources.getStringArray( + R.array.config_wifiExcludedFromUserApprovalForD2dInterfacePriority)).thenReturn( + new String[]{TEST_PACKAGE_NAME}); + initInterfaceConflictManager(); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + + // No dialog if override is set to false. + when(mResources.getStringArray( + R.array.config_wifiExcludedFromUserApprovalForD2dInterfacePriority)) + .thenReturn(null); + initInterfaceConflictManager(); + mDut.setUserApprovalNeededOverride(true, false); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + + // Dialog if overlay is false but override is true. + when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) + .thenReturn(false); + initInterfaceConflictManager(); + mDut.setUserApprovalNeededOverride(true, true); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP, mWsHelper, + HDM_CREATE_IFACE_NAN, mExistingWsHelper)); + + // No dialog if overlay is false and override is changed from true to false. + mDut.setUserApprovalNeededOverride(false, false); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP, mWsHelper, + HDM_CREATE_IFACE_NAN, mExistingWsHelper)); + + // Should show dialog for appropriate types if overlay is set to true. + when(mResources.getBoolean(R.bool.config_wifiUserApprovalRequiredForD2dInterfacePriority)) + .thenReturn(true); + initInterfaceConflictManager(); + + // Requesting AP + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP, mWsHelper, + HDM_CREATE_IFACE_AP_BRIDGE, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP, mWsHelper, + HDM_CREATE_IFACE_NAN, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP, mWsHelper, + HDM_CREATE_IFACE_P2P, mExistingWsHelper)); + + // Requesting AP_BRIDGE + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP_BRIDGE, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP_BRIDGE, mWsHelper, + HDM_CREATE_IFACE_AP_BRIDGE, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP_BRIDGE, mWsHelper, + HDM_CREATE_IFACE_NAN, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_AP_BRIDGE, mWsHelper, + HDM_CREATE_IFACE_P2P, mExistingWsHelper)); + + // Requesting P2P + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_AP_BRIDGE, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_NAN, mExistingWsHelper)); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_P2P, mWsHelper, + HDM_CREATE_IFACE_P2P, mExistingWsHelper)); + + // Requesting NAN + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_NAN, mWsHelper, + HDM_CREATE_IFACE_AP, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_NAN, mWsHelper, + HDM_CREATE_IFACE_AP_BRIDGE, mExistingWsHelper)); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_NAN, mWsHelper, + HDM_CREATE_IFACE_NAN, mExistingWsHelper)); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_NAN, mWsHelper, + HDM_CREATE_IFACE_P2P, mExistingWsHelper)); + + // Foreground should show dialog over Privileged + when(mExistingWsHelper.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_PRIVILEGED); + assertTrue(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_NAN, mWsHelper, + HDM_CREATE_IFACE_P2P, mExistingWsHelper)); + + // Foreground should delete Internal without showing dialog + when(mExistingWsHelper.getRequestorWsPriority()) + .thenReturn(WorkSourceHelper.PRIORITY_INTERNAL); + assertFalse(mDut.needsUserApprovalToDelete( + HDM_CREATE_IFACE_NAN, mWsHelper, + HDM_CREATE_IFACE_P2P, mExistingWsHelper)); + } } diff --git a/service/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalHidlImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalHidlImplTest.java index 87d881cffb..c261a319e2 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalHidlImplTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalHidlImplTest.java @@ -2035,13 +2035,8 @@ public class SupplicantStaIfaceHalHidlImplTest extends WifiBaseTest { public void testTerminateV1_0() throws Exception { executeAndValidateInitializationSequence(); - doAnswer(new MockAnswerUtil.AnswerWithArguments() { - public boolean answer(IHwBinder.DeathRecipient cb, long cookie) throws RemoteException { - mHandler.post(() -> cb.serviceDied(cookie)); - return true; - } - }).when(mISupplicantMock).linkToDeath(any(IHwBinder.DeathRecipient.class), any(long.class)); mDut.terminate(); + mSupplicantDeathCaptor.getValue().serviceDied(mDeathRecipientCookieCaptor.getValue()); mLooper.dispatchAll(); verify(mFrameworkFacade).stopSupplicant(); @@ -2057,16 +2052,8 @@ public class SupplicantStaIfaceHalHidlImplTest extends WifiBaseTest { setupMocksForHalV1_1(); executeAndValidateInitializationSequenceV1_1(false, false); - - doAnswer(new MockAnswerUtil.AnswerWithArguments() { - public boolean answer(IHwBinder.DeathRecipient cb, long cookie) throws RemoteException { - mHandler.post(() -> cb.serviceDied(cookie)); - return true; - } - }).when(mISupplicantMockV11).linkToDeath(any(IHwBinder.DeathRecipient.class), - any(long.class)); - mDut.terminate(); + mSupplicantDeathCaptor.getValue().serviceDied(mDeathRecipientCookieCaptor.getValue()); mLooper.dispatchAll(); verify(mFrameworkFacade, never()).stopSupplicant(); verify(mISupplicantMockV11).terminate(); @@ -2797,7 +2784,7 @@ public class SupplicantStaIfaceHalHidlImplTest extends WifiBaseTest { assertTrue(mDut.isInitializationComplete()); assertTrue(mDut.setupIface(WLAN0_IFACE_NAME) == shouldSucceed); mInOrder.verify(mISupplicantMockV11).linkToDeath(mSupplicantDeathCaptor.capture(), - anyLong()); + mDeathRecipientCookieCaptor.capture()); // verify: addInterface is called mInOrder.verify(mISupplicantMockV11) .addInterface(any(ISupplicant.IfaceInfo.class), diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java index d76a860929..fb610b9a95 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java @@ -148,6 +148,7 @@ public class WifiDataStallTest extends WifiBaseTest { mWifiDataStall = new WifiDataStall(mWifiMetrics, mContext, mDeviceConfigFacade, mWifiChannelUtilization, mClock, mHandler, mThroughputPredictor, mActiveModeWarden, mClientModeImplMonitor); + mWifiDataStall.enableVerboseLogging(true); mOldLlStats.txmpdu_be = 1000; mOldLlStats.retries_be = 1000; mOldLlStats.lostmpdu_be = 3000; @@ -386,6 +387,7 @@ public class WifiDataStallTest extends WifiBaseTest { WifiIsUnusableEvent.TYPE_DATA_STALL_BAD_TX); } + /** * Verify there is no data stall from tx failures if tx is not consecutively bad */ @@ -416,7 +418,11 @@ public class WifiDataStallTest extends WifiBaseTest { */ @Test public void verifyDataStallRxFailure() throws Exception { - when(mWifiInfo.getRxLinkSpeedMbps()).thenReturn(1); + when(mWifiInfo.getRxLinkSpeedMbps()).thenReturn(2); + when(mDeviceConfigFacade.getTputSufficientRatioThrDen()).thenReturn(1); + when(mDeviceConfigFacade.getTputSufficientRatioThrNum()).thenReturn(3); + when(mDeviceConfigFacade.getRxTputSufficientLowThrKbps()).thenReturn(1); + mNewLlStats.retries_be = 2 * mOldLlStats.retries_be; when(mClock.getElapsedSinceBootMillis()).thenReturn(10L); assertEquals(WifiIsUnusableEvent.TYPE_UNKNOWN, mWifiDataStall @@ -431,7 +437,7 @@ public class WifiDataStallTest extends WifiBaseTest { mCapabilities, mOldLlStats, mNewLlStats, mWifiInfo, mTxBytes, mRxBytes)); assertEquals(false, mWifiDataStall.isThroughputSufficient()); assertEquals(4804, mWifiDataStall.getTxThroughputKbps()); - assertEquals(960, mWifiDataStall.getRxThroughputKbps()); + assertEquals(1921, mWifiDataStall.getRxThroughputKbps()); verify(mWifiMetrics).logWifiIsUnusableEvent(TEST_IFACE_NAME, WifiIsUnusableEvent.TYPE_DATA_STALL_TX_WITHOUT_RX); } diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java index a856e14de9..16bcd86a1b 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java @@ -270,6 +270,7 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { when(mActiveModeWarden.hasPrimaryClientModeManager()).thenReturn(true); when(mActiveModeWarden.getPrimaryClientModeManager()).thenReturn(mPrimaryClientModeManager); + when(mPrimaryClientModeManager.getRole()).thenReturn(ActiveModeManager.ROLE_CLIENT_PRIMARY); doAnswer(invocation -> { Object[] args = invocation.getArguments(); ActiveModeWarden.ExternalClientModeManagerRequestListener requestListener = @@ -3559,6 +3560,67 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { .getSpecificNetworkRequestUids(mSelectedNetwork, TEST_BSSID_1).size()); } + /** + * Validates a new network request with Car Mode Priority for same network which is already + * a saved network, the connection will be on primary STA and the should have the internet + * capabilities + */ + @Test + public void testShareConnectedNetworkWithCarModePriorityAndSavedNetwork() throws Exception { + mockPackageImportance(TEST_PACKAGE_NAME_1, true, true); + when(mWifiPermissionsUtil.checkEnterCarModePrioritized(TEST_UID_1)).thenReturn(true); + + // Connect to request 1 + when(mClock.getElapsedSinceBootMillis()).thenReturn(0L); + + sendNetworkRequestAndSetupForUserSelection(TEST_SSID_1, false); + + INetworkRequestUserSelectionCallback networkRequestUserSelectionCallback = + mNetworkRequestUserSelectionCallback.getValue(); + assertNotNull(networkRequestUserSelectionCallback); + + // Now trigger user selection to one of the network. + mSelectedNetwork = WifiConfigurationTestUtil.createPskNetwork(); + mSelectedNetwork.SSID = "\"" + TEST_SSID_1 + "\""; + mSelectedNetwork.preSharedKey = TEST_WPA_PRESHARED_KEY; + when(mWifiConfigManager.getConfiguredNetworksWithPasswords()) + .thenReturn(List.of(mSelectedNetwork)); + sendUserSelectionSelect(networkRequestUserSelectionCallback, mSelectedNetwork); + mLooper.dispatchAll(); + + verify(mActiveModeWarden, never()).requestLocalOnlyClientModeManager( + any(), any(), any(), any(), anyBoolean()); + verify(mActiveModeWarden, atLeastOnce()).getPrimaryClientModeManager(); + if (SdkLevel.isAtLeastS()) { + verify(mPrimaryClientModeManager, atLeastOnce()).getConnectedWifiConfiguration(); + verify(mPrimaryClientModeManager, atLeastOnce()).getConnectingWifiConfiguration(); + verify(mPrimaryClientModeManager, atLeastOnce()).getConnectingBssid(); + verify(mPrimaryClientModeManager, atLeastOnce()).getConnectedBssid(); + } + + // Cancel the periodic scan timer. + mInOrder.verify(mAlarmManager).cancel(mPeriodicScanListenerArgumentCaptor.getValue()); + // Disable connectivity manager + verify(mWifiConnectivityManager, atLeastOnce()).setSpecificNetworkRequestInProgress(true); + + // Increment the number of unique apps. + verify(mWifiMetrics).incrementNetworkRequestApiNumApps(); + + verify(mPrimaryClientModeManager, atLeastOnce()).disconnect(); + verify(mConnectHelper, atLeastOnce()).connectToNetwork( + eq(mPrimaryClientModeManager), + eq(new NetworkUpdateResult(TEST_NETWORK_ID_1)), + mConnectListenerArgumentCaptor.capture(), anyInt(), any()); + verify(mWifiMetrics, atLeastOnce()).incrementNetworkRequestApiNumConnectOnPrimaryIface(); + + // Start the connection timeout alarm. + mInOrder.verify(mAlarmManager).set(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), + eq((long) WifiNetworkFactory.NETWORK_CONNECTION_TIMEOUT_MS), any(), + mConnectionTimeoutAlarmListenerArgumentCaptor.capture(), any()); + assertNotNull(mConnectionTimeoutAlarmListenerArgumentCaptor.getValue()); + assertTrue(mWifiNetworkFactory.shouldHaveInternetCapabilities()); + } + private void sendNetworkRequestAndSetupForConnectionStatus() throws RemoteException { sendNetworkRequestAndSetupForConnectionStatus(TEST_SSID_1); } diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index c7c78f362e..cd73f7d0b6 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -126,6 +126,7 @@ import android.net.DhcpInfo; import android.net.DhcpOption; import android.net.DhcpResultsParcelable; import android.net.MacAddress; +import android.net.Network; import android.net.NetworkStack; import android.net.Uri; import android.net.wifi.CoexUnsafeChannel; @@ -10679,4 +10680,27 @@ public class WifiServiceImplTest extends WifiBaseTest { assertEquals(-1, mWifiServiceImpl.addOrUpdateNetwork(config, TEST_PACKAGE_NAME, mAttribution)); } + + /** + * Tests that {@link WifiServiceImpl#getCurrentNetwork} throws + * {@link SecurityException} if the caller doesn't have the necessary permissions. + */ + @Test(expected = SecurityException.class) + public void testGetCurrentNetworkNoPermission() throws Exception { + doThrow(SecurityException.class) + .when(mContext).enforceCallingOrSelfPermission(eq(ACCESS_WIFI_STATE), any()); + mWifiServiceImpl.getCurrentNetwork(); + } + + /** + * Verifies that WifiServiceImpl#getCurrentNetwork() returns the current Wifi network. + */ + @Test + public void testGetCurrentNetworkWithNetworkSettingsPermission() throws Exception { + when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS), + anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED); + Network mockNetwork = mock(Network.class); + when(mActiveModeWarden.getCurrentNetwork()).thenReturn(mockNetwork); + assertEquals(mockNetwork, mWifiServiceImpl.getCurrentNetwork()); + } } diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java index a522d0531a..fe4417815a 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java @@ -758,9 +758,9 @@ public class WifiShellCommandTest extends WifiBaseTest { new String[]{"status"}); verify(mActiveModeWarden).getClientModeManagers(); verify(mPrimaryClientModeManager).syncRequestConnectionInfo(); - verify(mPrimaryClientModeManager).syncGetCurrentNetwork(); + verify(mPrimaryClientModeManager).getCurrentNetwork(); verify(additionalClientModeManager).syncRequestConnectionInfo(); - verify(additionalClientModeManager).syncGetCurrentNetwork(); + verify(additionalClientModeManager).getCurrentNetwork(); } @Test diff --git a/service/tests/wifitests/src/com/android/server/wifi/util/WorkSourceHelperTest.java b/service/tests/wifitests/src/com/android/server/wifi/util/WorkSourceHelperTest.java index d7d46be3a7..a7210b9fee 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/util/WorkSourceHelperTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/util/WorkSourceHelperTest.java @@ -16,11 +16,11 @@ package com.android.server.wifi.util; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND; +import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.when; @@ -42,6 +42,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; /** Unit tests for {@link WorkSourceHelper}. */ @@ -58,91 +59,54 @@ public class WorkSourceHelperTest extends WifiBaseTest { @Mock private PackageManager mPackageManager; @Mock private Resources mResources; - private WorkSource mWorkSource; - private WorkSourceHelper mWorkSourceHelper; - - @Before public void setUp() { + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - - // Create a test worksource with 2 app's request. - mWorkSource = new WorkSource(); - mWorkSource.add(new WorkSource(TEST_UID_1, TEST_PACKAGE_1)); - mWorkSource.add(new WorkSource(TEST_UID_2, TEST_PACKAGE_2)); - - mWorkSourceHelper = new WorkSourceHelper( - mWorkSource, mWifiPermissionsUtil, mActivityManager, mPackageManager, mResources); - } - - @Test - public void testHasAnyPrivilegedRequest() { - assertFalse(mWorkSourceHelper.hasAnyPrivilegedAppRequest()); - - when(mWifiPermissionsUtil.checkNetworkSettingsPermission(TEST_UID_1)).thenReturn(true); - assertTrue(mWorkSourceHelper.hasAnyPrivilegedAppRequest()); - } - - @Test - public void testHasAnySystemRequest() throws Exception { - ApplicationInfo appInfo = new ApplicationInfo(); - when(mPackageManager.getApplicationInfoAsUser(any(), anyInt(), any())).thenReturn(appInfo); - - assertFalse(mWorkSourceHelper.hasAnySystemAppRequest()); - - appInfo.flags = ApplicationInfo.FLAG_SYSTEM; - assertTrue(mWorkSourceHelper.hasAnySystemAppRequest()); + when(mActivityManager.getPackageImportance(null)).thenReturn(IMPORTANCE_CACHED); + when(mPackageManager.getApplicationInfoAsUser(any(), anyInt(), any())).thenReturn( + Mockito.mock(ApplicationInfo.class)); } @Test - public void testHasAnyForegroundAppRequest() throws Exception { - // 2 from bg app. + public void testGetRequestorWsPriority() throws Exception { + // PRIORITY_INTERNAL + WorkSource ws = new WorkSource(Process.WIFI_UID, "com.android.wifi"); + WorkSourceHelper wsHelper = new WorkSourceHelper( + ws, mWifiPermissionsUtil, mActivityManager, mPackageManager, mResources); + assertEquals(wsHelper.getRequestorWsPriority(), WorkSourceHelper.PRIORITY_INTERNAL); + + // PRIORITY_BG + ws.add(new WorkSource(TEST_UID_1, TEST_PACKAGE_1)); + ws.add(new WorkSource(TEST_UID_2, TEST_PACKAGE_2)); + when(mActivityManager.getPackageImportance(TEST_PACKAGE_1)).thenReturn(IMPORTANCE_CACHED); + when(mActivityManager.getPackageImportance(TEST_PACKAGE_2)).thenReturn(IMPORTANCE_CACHED); + assertEquals(WorkSourceHelper.PRIORITY_BG, wsHelper.getRequestorWsPriority()); + + // PRIORITY_FG_SERVICE when(mActivityManager.getPackageImportance(TEST_PACKAGE_1)) - .thenReturn(IMPORTANCE_BACKGROUND); - when(mActivityManager.getPackageImportance(TEST_PACKAGE_2)) - .thenReturn(IMPORTANCE_BACKGROUND); - assertFalse(mWorkSourceHelper.hasAnyForegroundAppRequest(true)); - - // override background status - when(mResources.getStringArray( - R.array.config_wifiInterfacePriorityTreatAsForegroundList)).thenReturn( - new String[]{TEST_PACKAGE_2}); - assertTrue(mWorkSourceHelper.hasAnyForegroundAppRequest(true)); - assertFalse(mWorkSourceHelper.hasAnyForegroundAppRequest(false)); + .thenReturn(IMPORTANCE_FOREGROUND_SERVICE); + assertEquals(WorkSourceHelper.PRIORITY_FG_SERVICE, wsHelper.getRequestorWsPriority()); - // 1 request from fg app, 1 from bg app. + // PRIORITY_FG_APP when(mActivityManager.getPackageImportance(TEST_PACKAGE_1)) .thenReturn(IMPORTANCE_FOREGROUND); - assertTrue(mWorkSourceHelper.hasAnyForegroundAppRequest(true)); - } + assertEquals(WorkSourceHelper.PRIORITY_FG_APP, wsHelper.getRequestorWsPriority()); - @Test - public void testHasAnyForegroundServiceRequest() throws Exception { - // 2 from bg app. + // PRIORITY_FG_APP with "treat as foreground" package when(mActivityManager.getPackageImportance(TEST_PACKAGE_1)) .thenReturn(IMPORTANCE_BACKGROUND); - when(mActivityManager.getPackageImportance(TEST_PACKAGE_2)) - .thenReturn(IMPORTANCE_BACKGROUND); - assertFalse(mWorkSourceHelper.hasAnyForegroundServiceRequest()); - - // 1 request from fg service, 1 from bg app. - when(mActivityManager.getPackageImportance(TEST_PACKAGE_1)) - .thenReturn(IMPORTANCE_FOREGROUND_SERVICE); - when(mActivityManager.getPackageImportance(TEST_PACKAGE_2)) - .thenReturn(IMPORTANCE_BACKGROUND); - assertTrue(mWorkSourceHelper.hasAnyForegroundServiceRequest()); - } - + when(mResources.getStringArray( + R.array.config_wifiInterfacePriorityTreatAsForegroundList)).thenReturn( + new String[]{TEST_PACKAGE_2}); + assertEquals(WorkSourceHelper.PRIORITY_FG_APP, wsHelper.getRequestorWsPriority()); - @Test - public void testHasAnyInternalRequest() throws Exception { - // 2 from bg app. - when(mActivityManager.getPackageImportance(TEST_PACKAGE_1)) - .thenReturn(IMPORTANCE_BACKGROUND); - when(mActivityManager.getPackageImportance(TEST_PACKAGE_2)) - .thenReturn(IMPORTANCE_BACKGROUND); - assertFalse(mWorkSourceHelper.hasAnyInternalRequest()); + // PRIORITY_SYSTEM + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.flags = ApplicationInfo.FLAG_SYSTEM; + when(mPackageManager.getApplicationInfoAsUser(any(), anyInt(), any())).thenReturn(appInfo); + assertEquals(WorkSourceHelper.PRIORITY_SYSTEM, wsHelper.getRequestorWsPriority()); - // add a new internal request. - mWorkSource.add(new WorkSource(Process.WIFI_UID, "com.android.wifi")); - assertTrue(mWorkSourceHelper.hasAnyInternalRequest()); + // PRIORITY_PRIVILEGED + when(mWifiPermissionsUtil.checkNetworkSettingsPermission(TEST_UID_1)).thenReturn(true); + assertEquals(WorkSourceHelper.PRIORITY_PRIVILEGED, wsHelper.getRequestorWsPriority()); } } |