diff options
389 files changed, 7109 insertions, 1984 deletions
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java index 3af36ebb08ca..e200434d9ff2 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java @@ -1404,7 +1404,11 @@ public class BlobStoreManagerService extends SystemService { if (LOGV) { Slog.v(TAG, "Received " + intent); } - switch (intent.getAction()) { + final String action = intent.getAction(); + if (action == null) { + return; + } + switch (action) { case Intent.ACTION_PACKAGE_FULLY_REMOVED: case Intent.ACTION_PACKAGE_DATA_CLEARED: final String packageName = intent.getData().getSchemeSpecificPart(); @@ -1431,7 +1435,11 @@ public class BlobStoreManagerService extends SystemService { if (LOGV) { Slog.v(TAG, "Received: " + intent); } - switch (intent.getAction()) { + final String action = intent.getAction(); + if (action == null) { + return; + } + switch (action) { case Intent.ACTION_USER_REMOVED: final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index bc34f5bfe13f..20bcf5fdf6fb 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -442,6 +442,7 @@ package android { public static final class R.attr { field public static final int allowClearUserDataOnFailedRestore = 16844288; // 0x1010600 + field @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled") public static final int backgroundPermission; field @FlaggedApi("android.content.res.manifest_flagging") public static final int featureFlag = 16844428; // 0x101068c field public static final int gameSessionService = 16844373; // 0x1010655 field public static final int hotwordDetectionService = 16844326; // 0x1010626 diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index c21fe0e2d8b3..e8b0a36ffcfc 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3216,11 +3216,13 @@ public class Notification implements Parcelable */ @FlaggedApi(Flags.FLAG_UI_RICH_ONGOING) public boolean hasPromotableStyle() { - //TODO(b/367739672): Add progress style - return extras == null || !extras.containsKey(Notification.EXTRA_TEMPLATE) - || isStyle(Notification.BigPictureStyle.class) - || isStyle(Notification.BigTextStyle.class) - || isStyle(Notification.CallStyle.class); + final Class<? extends Style> notificationStyle = getNotificationStyle(); + + return notificationStyle == null + || BigPictureStyle.class.equals(notificationStyle) + || BigTextStyle.class.equals(notificationStyle) + || CallStyle.class.equals(notificationStyle) + || ProgressStyle.class.equals(notificationStyle); } /** diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 38f59adfcc1e..c1c96eaa098d 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -299,6 +299,14 @@ public class WallpaperManager { "android.service.wallpaper.extra.FROM_FOREGROUND_APP"; /** + * Extra passed on {@link Intent.ACTION_WALLPAPER_CHANGED} indicating if wallpaper was set from + * a foreground app. + * @hide + */ + public static final String EXTRA_WHICH_WALLPAPER_CHANGED = + "android.service.wallpaper.extra.WHICH_WALLPAPER_CHANGED"; + + /** * The different screen orientations. {@link #getOrientation} provides their exact definition. * This is only used internally by the framework and the WallpaperBackupAgent. * @hide diff --git a/core/java/android/app/wallpaper.aconfig b/core/java/android/app/wallpaper.aconfig index 409162202b59..c5bd56ff67aa 100644 --- a/core/java/android/app/wallpaper.aconfig +++ b/core/java/android/app/wallpaper.aconfig @@ -1,8 +1,16 @@ package: "android.app" container: "system" + flag { name: "remove_next_wallpaper_component" namespace: "systemui" description: "Remove deprecated field WallpaperData#nextWallpaperComponent. Only effective after rebooting." bug: "365991991" } + +flag { + name: "fix_wallpaper_changed" + namespace: "systemui" + description: "Fixes timing of wallpaper changed notification and adds extra information. Only effective after rebooting." + bug: "369814294" +} diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 303197dfd82d..e1732559e262 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -1079,9 +1079,12 @@ public class ZenModeConfig implements Parcelable { // in ensureManualZenRule() and setManualZenMode(). rt.manualRule.pkg = PACKAGE_ANDROID; rt.manualRule.type = AutomaticZenRule.TYPE_OTHER; - rt.manualRule.condition = new Condition( - rt.manualRule.conditionId != null ? rt.manualRule.conditionId - : Uri.EMPTY, "", Condition.STATE_TRUE); + // conditionId in rule must match condition.id to pass isValidManualRule(). + if (rt.manualRule.conditionId == null) { + rt.manualRule.conditionId = Uri.EMPTY; + } + rt.manualRule.condition = new Condition(rt.manualRule.conditionId, "", + Condition.STATE_TRUE); } } return rt; diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS index 31a8dfaaf86b..1ea58bcbb76a 100644 --- a/core/java/android/view/OWNERS +++ b/core/java/android/view/OWNERS @@ -48,6 +48,7 @@ per-file KeyCharacterMap.java = file:/services/core/java/com/android/server/inpu per-file VelocityTracker.java = file:/services/core/java/com/android/server/input/OWNERS per-file VerifiedInputEvent.java = file:/services/core/java/com/android/server/input/OWNERS per-file VerifiedInputEvent.aidl = file:/services/core/java/com/android/server/input/OWNERS +per-file LetterboxScrollProcessor*.java = file:/services/core/java/com/android/server/input/OWNERS # InputWindowHandle per-file InputWindowHandle.java = file:/services/core/java/com/android/server/input/OWNERS diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index ccaaf6322f11..086063f3887c 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -299,3 +299,11 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + name: "ensure_keyguard_does_transition_starting" + namespace: "windowing_frontend" + description: "Ensure that keyguard is the one starting transitions, instead of delegating to Core" + bug: "364930619" + is_fixed_read_only: true +} diff --git a/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java b/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java index 5651c1ca247f..d4dabf51d4c7 100644 --- a/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java +++ b/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java @@ -16,6 +16,7 @@ package com.android.internal.pm.pkg.component; +import static com.android.internal.pm.pkg.parsing.ParsingPackageUtils.PARSE_APK_IN_APEX; import static com.android.internal.pm.pkg.parsing.ParsingUtils.NOT_SET; import android.annotation.NonNull; @@ -26,6 +27,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.os.Build; +import android.permission.flags.Flags; import android.util.ArrayMap; import android.util.EventLog; import android.util.Slog; @@ -49,7 +51,7 @@ public class ParsedPermissionUtils { @NonNull public static ParseResult<ParsedPermission> parsePermission(ParsingPackage pkg, Resources res, - XmlResourceParser parser, boolean useRoundIcon, ParseInput input) + XmlResourceParser parser, boolean useRoundIcon, ParseInput input, int flags) throws IOException, XmlPullParserException { String packageName = pkg.getPackageName(); ParsedPermissionImpl permission = new ParsedPermissionImpl(); @@ -77,12 +79,18 @@ public class ParsedPermissionUtils { if (sa.hasValue( R.styleable.AndroidManifestPermission_backgroundPermission)) { - if ("android".equals(packageName)) { + final boolean isApkInApex = (flags & PARSE_APK_IN_APEX) != 0; + final boolean canUseBackgroundPermissionAttr = + "android".equals(packageName) || + (Flags.replaceBodySensorPermissionEnabled() && isApkInApex); + if (canUseBackgroundPermissionAttr) { permission.setBackgroundPermission(sa.getNonResourceString( - R.styleable.AndroidManifestPermission_backgroundPermission)); + R.styleable.AndroidManifestPermission_backgroundPermission)); } else { + String allowedPackages = "'android'" + + (Flags.replaceBodySensorPermissionEnabled() ? " and APK_IN_APEX" : ""); Slog.w(TAG, packageName + " defines a background permission. Only the " - + "'android' package can do that."); + + allowedPackages + " packages can do that."); } } diff --git a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java index 44fedb11b043..787006eb214c 100644 --- a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java +++ b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java @@ -1090,7 +1090,7 @@ public class ParsingPackageUtils { case TAG_PERMISSION_GROUP: return parsePermissionGroup(input, pkg, res, parser); case TAG_PERMISSION: - return parsePermission(input, pkg, res, parser); + return parsePermission(input, pkg, res, parser, flags); case TAG_PERMISSION_TREE: return parsePermissionTree(input, pkg, res, parser); case TAG_USES_PERMISSION: @@ -1329,10 +1329,10 @@ public class ParsingPackageUtils { } private static ParseResult<ParsingPackage> parsePermission(ParseInput input, - ParsingPackage pkg, Resources res, XmlResourceParser parser) + ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags) throws XmlPullParserException, IOException { ParseResult<ParsedPermission> result = ParsedPermissionUtils.parsePermission( - pkg, res, parser, sUseRoundIcon, input); + pkg, res, parser, sUseRoundIcon, input, flags); if (result.isError()) { return input.error(result); } diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 93fdf3dc5207..9b5a825b9e38 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -2408,9 +2408,9 @@ <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"За клавиатурната подредба са зададени <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> и <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Докоснете за промяна."</string> <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физическите клавиатури са конфигурирани"</string> <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Докоснете за преглед на клавиатурите"</string> - <string name="profile_label_private" msgid="6463418670715290696">"Частни"</string> + <string name="profile_label_private" msgid="6463418670715290696">"Частен"</string> <string name="profile_label_clone" msgid="769106052210954285">"Клониране"</string> - <string name="profile_label_work" msgid="3495359133038584618">"Служебни"</string> + <string name="profile_label_work" msgid="3495359133038584618">"Служебен"</string> <string name="profile_label_work_2" msgid="4691533661598632135">"Служебни 2"</string> <string name="profile_label_work_3" msgid="4834572253956798917">"Служебни 3"</string> <string name="profile_label_test" msgid="9168641926186071947">"Тестване"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 50f2221d8fde..9d5ecdcc1933 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2154,7 +2154,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Uredu"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string> - <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Poboljšana obavještenja su zamijenila Prilagodljiva obavještenja Androida u verziji Android 12. Ova funkcija prikazuje predložene radnje i odgovore te organizira vaša obavještenja.\n\nPoboljšana obavještenja mogu pristupiti sadržaju obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbacivati obavještenja ili reagirati na njih, npr. može odgovarati na telefonske pozive i kontrolirati funkciju Ne ometaj."</string> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Poboljšana obavještenja su zamijenila prilagodljiva obavještenja Androida u verziji Android 12. Ova funkcija prikazuje predložene radnje i odgovore te organizira vaša obavještenja.\n\nPoboljšana obavještenja mogu pristupiti sadržaju obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbacivati obavještenja ili reagirati na njih, npr. može odgovarati na telefonske pozive i kontrolirati funkciju Ne ometaj."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještenje za informacije Rutinskog načina"</string> <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Ušteda baterije je uključena"</string> <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Smanjena je potrošnja baterije da se produži vijek trajanja baterije"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index e37106d3b27c..6933a16dd97e 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="byteShort" msgid="202579285008794431">"بایت"</string> <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="untitled" msgid="3381766946944136678">"<بدون عنوان>"</string> + <string name="untitled" msgid="3381766946944136678">"<بیعنوان>"</string> <string name="emptyPhoneNumber" msgid="5812172618020360048">"(بدون شماره تلفن)"</string> <string name="unknownName" msgid="7078697621109055330">"نامشخص"</string> <string name="defaultVoiceMailAlphaTag" msgid="2190754495304236490">"پست صوتی"</string> @@ -196,7 +196,7 @@ <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"توسط یک شخص ثالث ناشناس"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"توسط سرپرست نمایه کاری شما"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"توسط <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> - <string name="work_profile_deleted" msgid="5891181538182009328">"نمایه کار حذف شد"</string> + <string name="work_profile_deleted" msgid="5891181538182009328">"نمایه کاری حذف شد"</string> <string name="work_profile_deleted_details" msgid="3773706828364418016">"برنامه سرپرست نمایه کاری یا وجود ندارد یا خراب است. در نتیجه، نمایه کاری شما و دادههای مرتبط با آن حذف شده است. برای دریافت راهنمایی با سرپرست سیستم تماس بگیرید."</string> <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"نمایه کاری شما دیگر در این دستگاه دردسترس نیست"</string> <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"تلاشهای بسیار زیادی برای وارد کردن گذرواژه انجام شده است"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 672e50805967..18c7902511a0 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -2010,7 +2010,7 @@ <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Näytön lukituksen asettaminen"</string> <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Aseta näytön lukitus"</string> <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Edellyttää näytön lukitusta"</string> - <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Jos haluat poistaa yksityisen tilan, aseta laitteelle näytön lukitus"</string> + <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Jos haluat poistaa yksityisen tilan, lisää laitteelle näytön lukitus"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Sovellus ei ole käytettävissä"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei ole nyt käytettävissä."</string> <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ei käytettävissä"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 126d55eec3e2..419dd17d233c 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -197,7 +197,7 @@ <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ನಿರ್ವಾಹಕರಿಂದ"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ಪ್ರಕಾರ"</string> <string name="work_profile_deleted" msgid="5891181538182009328">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string> - <string name="work_profile_deleted_details" msgid="3773706828364418016">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಕಳೆದು ಹೋಗಿದೆ ಅಥವಾ ಹಾಳಾಗಿದೆ. ಇದರ ಪರಿಣಾಮವಾಗಿ ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> + <string name="work_profile_deleted_details" msgid="3773706828364418016">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ನಿರ್ವಾಹಕ ಆ್ಯಪ್ ಕಳೆದು ಹೋಗಿದೆ ಅಥವಾ ಹಾಳಾಗಿದೆ. ಇದರ ಪರಿಣಾಮವಾಗಿ ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಈ ಸಾಧನದಲ್ಲಿ ಈಗ ಲಭ್ಯವಿಲ್ಲ"</string> <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"ಹಲವಾರು ಪಾಸ್ವರ್ಡ್ ಪ್ರಯತ್ನಗಳು"</string> <string name="device_ownership_relinquished" msgid="4080886992183195724">"ವೈಯಕ್ತಿಕ ಬಳಕೆಗಾಗಿ ನಿರ್ವಾಹಕರು ತೊರೆದ ಸಾಧನ"</string> @@ -217,7 +217,7 @@ <string name="device_policy_manager_service" msgid="5085762851388850332">"ಸಾಧನ ನೀತಿ ನಿರ್ವಾಹಕ ಸೇವೆ"</string> <string name="music_recognition_manager_service" msgid="7481956037950276359">"ಸಂಗೀತ ಗುರುತಿಸುವಿಕೆ ನಿರ್ವಾಹಕ ಸೇವೆ"</string> <string name="factory_reset_warning" msgid="6858705527798047809">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string> - <string name="factory_reset_message" msgid="2657049595153992213">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> + <string name="factory_reset_message" msgid="2657049595153992213">"ನಿರ್ವಹಣೆ ಆ್ಯಪ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ಮೂಲಕ ಪ್ರಿಂಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವವರೆಗೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ"</string> @@ -366,7 +366,7 @@ <string name="permlab_statusBar" msgid="8798267849526214017">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇಲ್ಲವೇ ಮಾರ್ಪಡಿಸಿ"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಥವಾ ಸೇರಿಸಲು ಮತ್ತು ಸಿಸ್ಟಂ ಐಕಾನ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿರಲು"</string> - <string name="permdesc_statusBarService" msgid="6652917399085712557">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_statusBarService" msgid="6652917399085712557">"ಆ್ಯಪ್ ಅನ್ನು ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_expandStatusBar" msgid="1184232794782141698">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ/ಸಂಕುಚಿಸಿ"</string> <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಲು ಅಥವಾ ಸಂಕುಚಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_fullScreenIntent" msgid="4310888199502509104">"ಲಾಕ್ ಮಾಡಲಾದ ಸಾಧನದಲ್ಲಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪೂರ್ಣ-ಸ್ಕ್ರೀನ್ ಚಟುವಟಿಕೆ ರೀತಿಯಲ್ಲಿ ಡಿಸ್ಪ್ಲೇ ಮಾಡಿ"</string> @@ -378,11 +378,11 @@ <string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"ಹೊರಹೋಗುವ ಕರೆಗಳ ಮಾರ್ಗ ಬದಲಿಸಿ"</string> <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"ಬೇರೊಂದು ಸಂಖ್ಯೆಗೆ ಕರೆಯನ್ನು ಮರುನಿರ್ದೇಶಿಸಲು ಆಯ್ಕೆಯ ಜೊತೆಗೆ ಹೊರ ಹೋಗುವ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಡಯಲ್ ಮಾಡಿದ ಸಂಖ್ಯೆಯನ್ನು ನೋಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string> <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"ಫೋನ್ ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸಿ"</string> - <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"ಒಳಬರುವ ಫೋನ್ ಕರೆಗೆ ಉತ್ತರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"ಒಳಬರುವ ಫೋನ್ ಕರೆಗೆ ಉತ್ತರಿಸಲು ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_receiveSms" msgid="505961632050451881">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (SMS)"</string> - <string name="permdesc_receiveSms" msgid="1797345626687832285">"SMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string> + <string name="permdesc_receiveSms" msgid="1797345626687832285">"SMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಆ್ಯಪ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string> <string name="permlab_receiveMms" msgid="4000650116674380275">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (MMS)"</string> - <string name="permdesc_receiveMms" msgid="958102423732219710">"MMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string> + <string name="permdesc_receiveMms" msgid="958102423732219710">"MMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಆ್ಯಪ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string> <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"ಸೆಲ್ ಪ್ರಸಾರ ಸಂದೇಶಗಳನ್ನು ಫಾರ್ವರ್ಡ್ ಮಾಡಿ"</string> <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"ಸೆಲ್ ಪ್ರಸಾರವು ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿದ ರೀತಿಯಲ್ಲಿಯೇ ಫಾರ್ವರ್ಡ್ ಮಾಡಲು, ಸೆಲ್ ಪ್ರಸಾರ ಮಾಡ್ಯುಲ್ ಅನ್ನು ಪ್ರತಿಬಂಧಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಕೆಲವು ಸ್ಥಳಗಳಲ್ಲಿ ತುರ್ತು ಸ್ಥಿತಿಗಳ ಕುರಿತು ನಿಮಗೆ ಎಚ್ಚರಿಸಲು ಸೆಲ್ ಪ್ರಸಾರದ ಎಚ್ಚರಿಕೆಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ತುರ್ತು ಸೆಲ್ ಪ್ರಸಾರವನ್ನು ಸ್ವೀಕರಿಸಿದಾಗ ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಾಚರಣೆ ಅಥವಾ ಕಾರ್ಯಕ್ಷಮತೆಗೆ ದುರುದ್ದೇಶಪೂರಿತ ಆ್ಯಪ್ಗಳು ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು."</string> <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string> @@ -396,9 +396,9 @@ <string name="permlab_sendSms" msgid="7757368721742014252">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string> <string name="permdesc_sendSms" msgid="6757089798435130769">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ಅನಿರೀಕ್ಷಿತ ವೆಚ್ಚಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ದೃಢೀಕರಣವಿಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಹಣವನ್ನು ವ್ಯಯಿಸಬಹುದು."</string> <string name="permlab_readSms" msgid="5164176626258800297">"ನಿಮ್ಮ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಓದಿ (SMS ಅಥವಾ MMS)"</string> - <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string> - <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ SMS (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string> - <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string> + <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string> + <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ SMS (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string> + <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string> <string name="permlab_receiveWapPush" msgid="4223747702856929056">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (WAP)"</string> <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು, ನಿಮಗೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡುವ ಅಥವಾ ಅಳಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string> <string name="permlab_getTasks" msgid="7460048811831750262">"ರನ್ ಆಗುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಹಿಂಪಡೆಯಿರಿ"</string> @@ -406,24 +406,24 @@ <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"ಪ್ರೊಫೈಲ್ ಮತ್ತು ಸಾಧನ ಮಾಲೀಕರನ್ನು ನಿರ್ವಹಿಸಿ"</string> <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"ಪ್ರೊಫೈಲ್ ಮಾಲೀಕರು ಮತ್ತು ಸಾಧನ ಮಾಲೀಕರನ್ನು ಹೊಂದಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_reorderTasks" msgid="7598562301992923804">"ರನ್ ಆಗುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮರುಕ್ರಮಗೊಳಿಸಿ"</string> - <string name="permdesc_reorderTasks" msgid="8796089937352344183">"ಮುನ್ನೆಲೆ ಮತ್ತು ಹಿನ್ನಲೆಗೆ ಕಾರ್ಯಗಳನ್ನು ಸರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ನಿಮ್ಮ ಇನ್ಪುಟ್ ಇಲ್ಲದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಈ ಕಾರ್ಯವನ್ನು ಮಾಡಬಹುದು."</string> + <string name="permdesc_reorderTasks" msgid="8796089937352344183">"ಮುನ್ನೆಲೆ ಮತ್ತು ಹಿನ್ನಲೆಗೆ ಕಾರ್ಯಗಳನ್ನು ಸರಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ನಿಮ್ಮ ಇನ್ಪುಟ್ ಇಲ್ಲದೆಯೇ, ಆ್ಯಪ್ ಈ ಕಾರ್ಯವನ್ನು ಮಾಡಬಹುದು."</string> <string name="permlab_enableCarMode" msgid="893019409519325311">"ಕಾರು ಮೋಡ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="permdesc_enableCarMode" msgid="56419168820473508">"ಕಾರು ಮೋಡ್ ಸಕ್ರಿಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"ಇತರೆ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮುಚ್ಚಿ"</string> <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಅಂತ್ಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಚಾಲನೆಯನ್ನು ನಿಲ್ಲಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು."</string> - <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು"</string> - <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಅಥವಾ ಪರದೆಯ ಇತರೆ ಭಾಗಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು. ಇದು ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ ಬಳಕೆಯ ಮೂಲಕ ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು ಮತ್ತು ಇತರೆ ಅಪ್ಲಿಕೇಶನ್ ಗೋಚರಿಸುವ ರೀತಿಯಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string> + <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"ಈ ಆ್ಯಪ್ ಇತರ ಆ್ಯಪ್ಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು"</string> + <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"ಈ ಆ್ಯಪ್ ಇತರ ಆ್ಯಪ್ಗಳ ಅಥವಾ ಪರದೆಯ ಇತರೆ ಭಾಗಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು. ಇದು ಸಾಮಾನ್ಯ ಆ್ಯಪ್ ಬಳಕೆಯ ಮೂಲಕ ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು ಮತ್ತು ಇತರೆ ಆ್ಯಪ್ಗಳು ಗೋಚರಿಸುವ ರೀತಿಯಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string> <string name="permlab_hideOverlayWindows" msgid="6382697828482271802">"ಇತರ ಆ್ಯಪ್ಗಳ ಓವರ್ಲೇಗಳನ್ನು ಮರೆಮಾಡಿ"</string> <string name="permdesc_hideOverlayWindows" msgid="5660242821651958225">"ಇತರ ಆ್ಯಪ್ಗಳಿಂದ ರಚಿಸಲ್ಪಡುವ ಓವರ್ಲೇಗಳು ಈ ಆ್ಯಪ್ನಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳದಂತೆ ಮರೆಮಾಡಲು ಸಿಸ್ಟಮ್ಗೆ ಈ ಆ್ಯಪ್ ವಿನಂತಿಸಬಹುದು."</string> <string name="permlab_runInBackground" msgid="541863968571682785">"ಹಿನ್ನಲೆಯಲ್ಲಿ ರನ್ ಮಾಡಿ"</string> - <string name="permdesc_runInBackground" msgid="4344539472115495141">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಹಿನ್ನಲೆಯಲ್ಲಿ ರನ್ ಆಗಬಹುದು. ಇದು ಬ್ಯಾಟರಿಯನ್ನು ವೇಗವಾಗಿ ಬರಿದಾಗಿಸಬಹುದು."</string> + <string name="permdesc_runInBackground" msgid="4344539472115495141">"ಈ ಆ್ಯಪ್ ಹಿನ್ನಲೆಯಲ್ಲಿ ರನ್ ಆಗಬಹುದು. ಇದು ಬ್ಯಾಟರಿಯನ್ನು ವೇಗವಾಗಿ ಬರಿದಾಗಿಸಬಹುದು."</string> <string name="permlab_useDataInBackground" msgid="783415807623038947">"ಹಿನ್ನಲೆಯಲ್ಲಿ ಡೇಟಾ ಬಳಕೆ ಮಾಡಿ"</string> - <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಹಿನ್ನಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು. ಇದರಿಂದ ಡೇಟಾ ಬಳಕೆ ಹೆಚ್ಚಾಗಬಹುದು."</string> + <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"ಈ ಆ್ಯಪ್ ಹಿನ್ನಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು. ಇದರಿಂದ ಡೇಟಾ ಬಳಕೆ ಹೆಚ್ಚಾಗಬಹುದು."</string> <string name="permlab_schedule_exact_alarm" msgid="6683283918033029730">"ನಿಖರವಾದ ಸಮಯೋಚಿತ ಕ್ರಿಯೆಗಳನ್ನು ನಿಗದಿಪಡಿಸಿ"</string> <string name="permdesc_schedule_exact_alarm" msgid="8198009212013211497">"ಈ ಆ್ಯಪ್, ಭವಿಷ್ಯದಲ್ಲಿ ಕಾರ್ಯವು ಅಪೇಕ್ಷಿತ ಸಮಯಕ್ಕೆ ನಡೆಯುವಂತೆ ಕಾರ್ಯವನ್ನು ನಿಗದಿಪಡಿಸಬಹುದು. ಇದರರ್ಥ ನೀವು ಸಾಧನವನ್ನು ಸಕ್ರಿಯವಾಗಿ ಬಳಸದೇ ಇರುವಾಗ ಆ್ಯಪ್ ರನ್ ಆಗಬಹುದು."</string> <string name="permlab_use_exact_alarm" msgid="348045139777131552">"ಅಲಾರಾಂಗಳು ಅಥವಾ ಈವೆಂಟ್ ರಿಮೈಂಡರ್ಗಳನ್ನು ನಿಗದಿಪಡಿಸಿ"</string> <string name="permdesc_use_exact_alarm" msgid="7033761461886938912">"ಈ ಆ್ಯಪ್ ಭವಿಷ್ಯದಲ್ಲಿ ಅಪೇಕ್ಷಿತ ಸಮಯದಲ್ಲಿ ನಿಮಗೆ ತಿಳಿಸುವುದಕ್ಕಾಗಿ ಅಲಾರಾಂಗಳು ಮತ್ತು ರಿಮೈಂಡರ್ಗಳಂತಹ ಕ್ರಿಯೆಗಳನ್ನು ನಿಗದಿಪಡಿಸಬಹುದು."</string> - <string name="permlab_persistentActivity" msgid="464970041740567970">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಯಾವಾಗಲೂ ರನ್ ಆಗುವಂತೆ ಮಾಡಿ"</string> + <string name="permlab_persistentActivity" msgid="464970041740567970">"ಆ್ಯಪ್ ಅನ್ನು ಯಾವಾಗಲೂ ರನ್ ಆಗುವಂತೆ ಮಾಡಿ"</string> <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"ಸ್ಮರಣೆಯಲ್ಲಿ ನಿರಂತರವಾಗಿ ತನ್ನದೇ ಭಾಗಗಳನ್ನು ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಟ್ಯಾಬ್ಲೆಟ್ ಕಾರ್ಯವನ್ನು ನಿಧಾನಗೊಳಿಸುವುದರ ಮೂಲಕ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಸ್ಮರಣೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ."</string> <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"ಮೆಮೊರಿಯಲ್ಲಿ ತನ್ನ ಭಾಗಗಳನ್ನು ನಿರಂತರವಾಗಿರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಮೆಮೊರಿಯನ್ನು ಮಿತಿಗೊಳಿಸಿ Android TV ಸಾಧನವನ್ನು ಇದು ನಿಧಾನಗೊಳಿಸಬಹುದು."</string> <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"ಸ್ಮರಣೆಯಲ್ಲಿ ನಿರಂತರವಾಗಿ ತನ್ನದೇ ಭಾಗಗಳನ್ನು ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಫೋನ್ ಕಾರ್ಯವನ್ನು ನಿಧಾನಗೊಳಿಸುವುದರ ಮೂಲಕ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಸ್ಮರಣೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ."</string> @@ -457,14 +457,14 @@ <string name="permdesc_foregroundServiceMediaProcessing" msgid="8303086172106677312">"\"mediaProcessing\" ಪ್ರಕಾರದೊಂದಿಗೆ ಮುನ್ನೆಲೆ ಸೇವೆಗಳನ್ನು ಬಳಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> <string name="permlab_foregroundServiceSpecialUse" msgid="7973536745876645082">"\"specialUse\" ಪ್ರಕಾರದೊಂದಿಗೆ ಮುನ್ನೆಲೆ ಸೇವೆಯನ್ನು ರನ್ ಮಾಡಿ"</string> <string name="permdesc_foregroundServiceSpecialUse" msgid="646713654541885919">"\"specialUse\" ಪ್ರಕಾರದೊಂದಿಗೆ ಮುನ್ನೆಲೆ ಸೇವೆಗಳನ್ನು ಬಳಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> - <string name="permlab_getPackageSize" msgid="375391550792886641">"ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹ ಸ್ಥಳವನ್ನು ಅಳೆಯಿರಿ"</string> + <string name="permlab_getPackageSize" msgid="375391550792886641">"ಆ್ಯಪ್ ಸಂಗ್ರಹ ಸ್ಥಳವನ್ನು ಅಳೆಯಿರಿ"</string> <string name="permdesc_getPackageSize" msgid="742743530909966782">"ಅದರ ಕೋಡ್, ಡೇಟಾ, ಮತ್ತು ಕ್ಯಾಷ್ ಗಾತ್ರಗಳನ್ನು ಹಿಂಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> <string name="permlab_writeSettings" msgid="8057285063719277394">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ"</string> <string name="permdesc_writeSettings" msgid="8293047411196067188">"ಸಿಸ್ಟಂನ ಸೆಟ್ಟಿಂಗ್ಗಳ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಕಾನ್ಫಿಗಿರೆಶನ್ ಅನ್ನು ಹಾನಿ ಮಾಡಬಹುದು."</string> <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"ಪ್ರಾರಂಭದಲ್ಲಿ ರನ್ ಮಾಡಿ"</string> - <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಟ್ಯಾಬ್ಲೆಟ್ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಟ್ಯಾಬ್ಲೆಟ್ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಆ್ಯಪ್ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಟ್ಯಾಬ್ಲೆಟ್ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಟ್ಯಾಬ್ಲೆಟ್ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ತಕ್ಷಣ ಸ್ವತಃ ಪ್ರಾರಂಭವಾಗಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು Android TV ಸಾಧನವನ್ನು ಪ್ರಾರಂಭಿಸಲು ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುವಂತೆ ಮಾಡಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟಾರೆ ಸಾಧನವನ್ನು ನಿಧಾನಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> - <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಫೋನ್ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಫೋನ್ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಆ್ಯಪ್ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಫೋನ್ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಫೋನ್ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_broadcastSticky" msgid="4552241916400572230">"ಸ್ಟಿಕಿ ಪ್ರಸಾರವನ್ನು ಕಳುಹಿಸಿ"</string> <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"ಪ್ರಸಾರ ಕೊನೆಗೊಂಡ ನಂತರ ಹಾಗೆಯೇ ಉಳಿಯುವ ಸ್ಟಿಕಿ ಪ್ರಸಾರಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಮಿತಿಮೀರಿದ ಬಳಕೆಯು ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ನಿಧಾನಗೊಳಿಸಬಹುದು ಅಥವಾ ಅತಿಯಾದ ಮೆಮೊರಿ ಬಳಕೆಯು ಅಸ್ಥಿರತೆಯನ್ನು ಉಂಟುಮಾಡಬಹುದು."</string> <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"ಪ್ರಸಾರವು ಮುಕ್ತಾಯಗೊಂಡ ನಂತರ ಉಳಿದಿರುವ ಜಿಗುಟಾದ ಪ್ರಸಾರಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದರ ಹೆಚ್ಚಿನ ಬಳಕೆಯು Android TV ಸಾಧನವನ್ನು ನಿಧಾನಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಅತಿಯಾಗಿ ಮೆಮೊರಿಯನ್ನು ಬಳಸುವಂತೆ ಮಾಡುವ ಮೂಲಕ ಅಸ್ಥಿರಗೊಳಿಸುತ್ತದೆ."</string> @@ -478,7 +478,7 @@ <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಸಂಪರ್ಕಗಳ ಕುರಿತಾದ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಸಂಪರ್ಕಗಳ ಕುರಿತಾದ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_readCallLog" msgid="1739990210293505948">"ಕರೆಯ ಲಾಗ್ ಓದಿ"</string> - <string name="permdesc_readCallLog" msgid="8964770895425873433">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಕರೆಯ ಇತಿಹಾಸ ಓದಬಹುದು."</string> + <string name="permdesc_readCallLog" msgid="8964770895425873433">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಕರೆಯ ಇತಿಹಾಸ ಓದಬಹುದು."</string> <string name="permlab_writeCallLog" msgid="670292975137658895">"ಕರೆ ಲಾಗ್ ಬರೆಯಿರಿ"</string> <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಕುರಿತ ಡೇಟಾ ಸೇರಿದಂತೆ, ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಅಳಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು."</string> <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಕುರಿತ ಡೇಟಾ ಸೇರಿದಂತೆ ನಿಮ್ಮ Android TV ಸಾಧನದ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಅಳಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು."</string> @@ -488,13 +488,13 @@ <string name="permlab_bodySensors_background" msgid="4912560779957760446">"ಹಿನ್ನಲೆಯಲ್ಲಿರುವಾಗ ಹೃದಯ ಬಡಿತದಂತಹ ದೇಹದ ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> <string name="permdesc_bodySensors_background" product="default" msgid="8870726027557749417">"ಆ್ಯಪ್ ಹಿನ್ನಲೆಯಲ್ಲಿರುವಾಗ ಹೃದಯ ಬಡಿತ, ತಾಪಮಾನ ಮತ್ತು ರಕ್ತದ ಆಮ್ಲಜನಕದ ಶೇಕಡಾವಾರು ಎಂಬಂತಹ ದೇಹದ ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_readCalendar" msgid="6408654259475396200">"ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳು ಮತ್ತು ವಿವರಗಳನ್ನು ಓದಿ"</string> - <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string> - <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string> - <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string> + <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string> + <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string> + <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string> <string name="permlab_writeCalendar" msgid="6422137308329578076">"ಮಾಲೀಕರ ಗಮನಕ್ಕೆ ತರದೆಯೇ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಿ ಅಥವಾ ಮಾರ್ಪಡಿಸಿ ಮತ್ತು ಅತಿಥಿಗಳಿಗೆ ಇಮೇಲ್ ಕಳುಹಿಸಿ"</string> - <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string> - <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬರುವಂತೆ ಕಾಣುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅದರ ಮಾಲೀಕರಿಗೆ ನೋಟಿಫಿಕೇಶನ್ ನೀಡದೆ ಈವೆಂಟ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string> - <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string> + <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಆ್ಯಪ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string> + <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಆ್ಯಪ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬರುವಂತೆ ಕಾಣುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅದರ ಮಾಲೀಕರಿಗೆ ನೋಟಿಫಿಕೇಶನ್ ನೀಡದೆ ಈವೆಂಟ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string> + <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಆ್ಯಪ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string> <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"ಹೆಚ್ಚುವರಿ ಸ್ಥಳ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"ಹೆಚ್ಚಿನ ಸ್ಥಳ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಳ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಬಹುದು."</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"ಮುನ್ನೆಲೆಯಲ್ಲಿ ಮಾತ್ರ ನಿಖರವಾದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> @@ -531,7 +531,7 @@ <string name="permlab_callPhone" msgid="1798582257194643320">"ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ನೇರವಾಗಿ ಕರೆ ಮಾಡಿ"</string> <string name="permdesc_callPhone" msgid="7892422187827695656">"ನಿಮ್ಮ ಹಸ್ತಕ್ಷೇಪವಿಲ್ಲದೆಯೇ ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ಕರೆ ಮಾಡಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಅನಿರೀಕ್ಷಿತ ಶುಲ್ಕಗಳು ಅಥವಾ ಕರೆಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ತುರ್ತು ಸಂಖ್ಯೆಗಳಿಗೆ ಕರೆ ಮಾಡಲು ಇದು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. ದುರುದ್ದೇಶಪ್ರೇರಿತ ಆ್ಯಪ್ಗಳು ನಿಮ್ಮ ದೃಢೀಕರಣವಿಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡುವ ಮೂಲಕ ಅಥವಾ ಒಳಬರುವ ಕರೆಗಳನ್ನು ಮತ್ತೊಂದು ಸಂಖ್ಯೆಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಫಾರ್ವರ್ಡ್ ಮಾಡಲು ಕಾರಣವಾಗುವ ವಾಹಕದ ಕೋಡ್ಗಳನ್ನು ಡಯಲ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ಹಣ ವೆಚ್ಚವಾಗುವಂತೆ ಮಾಡಬಹುದು."</string> <string name="permlab_accessImsCallService" msgid="442192920714863782">"IMS ಕರೆ ಸೇವೆಯನ್ನು ಪ್ರವೇಶಿಸಿ"</string> - <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ನಿಮ್ಮ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡಲು IMS ಸೇವೆಯನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ನಿಮ್ಮ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡಲು IMS ಸೇವೆಯನ್ನು ಬಳಸಲು ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ಫೋನ್ ಸ್ಥಿತಿ ಮತ್ತು ಗುರುತಿಸುವಿಕೆಯನ್ನು ಓದಿ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ಸಾಧನದ ಫೋನ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಫೋನ್ ಸಂಖ್ಯೆ ಮತ್ತು ಸಾಧನದ ID ಗಳನ್ನು ನಿರ್ಧರಿಸಲು, ಕರೆಯು ಸಕ್ರಿಯವಾಗಿದೆಯೇ ಮತ್ತು ಕರೆಯ ಮೂಲಕ ರಿಮೋಟ್ ಸಂಖ್ಯೆಯು ಸಂಪರ್ಕಗೊಂಡಿವೆಯೇ ಎಂಬುದನ್ನೂ ನಿರ್ಧರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸುತ್ತದೆ."</string> <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ಮೂಲ ಟೆಲಿಫೋನ್ ಸ್ಥಿತಿ ಮತ್ತು ಗುರುತನ್ನು ಓದಿ"</string> @@ -542,7 +542,7 @@ <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"ಸಾಧನದಲ್ಲಿನ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತು ನಿಯಂತ್ರಿಸಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ. ಕರೆಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಕರೆ ಸಂಖ್ಯೆಗಳು ಮತ್ತು ಕರೆ ಮಾಡಿದ ರಾಜ್ಯದಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string> <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡುವ ನಿರ್ಬಂಧಗಳಿಂದ ವಿನಾಯಿತಿ ನೀಡಿ"</string> <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡುವ ನಿರ್ಬಂಧದಿಂದ ಈ ಆ್ಯಪ್ಗೆ ವಿನಾಯಿತಿ ನೀಡಿ."</string> - <string name="permlab_acceptHandover" msgid="2925523073573116523">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string> + <string name="permlab_acceptHandover" msgid="2925523073573116523">"ಮತ್ತೊಂದು ಆ್ಯಪ್ ಮೂಲಕ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string> <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಪ್ರಾರಂಭವಾದ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ."</string> <string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"ಫೋನ್ ಸಂಖ್ಯೆಗಳನ್ನು ಓದಿ"</string> <string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"ಸಾಧನದ ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string> @@ -569,15 +569,15 @@ <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"ನಿಮ್ಮ Android TV ಸಾಧನದ ಸಮಯವಲಯವನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"ಫೋನ್ನ ಸಮಯ ವಲಯವನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_getAccounts" msgid="5304317160463582791">"ಸಾಧನದಲ್ಲಿ ಖಾತೆಗಳನ್ನು ಹುಡುಕಿ"</string> - <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"ಟ್ಯಾಬ್ಲೆಟ್ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string> + <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"ಟ್ಯಾಬ್ಲೆಟ್ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಆ್ಯಪ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string> <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"ನಿಮ್ಮ Android TV ಸಾಧನವು ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ನೀವು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಂದ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಗಳನ್ನು ಇದು ಒಳಗೊಂಡಿರಬಹುದು."</string> - <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"ಫೋನ್ನ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string> + <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"ಫೋನ್ನ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string> <string name="permlab_accessNetworkState" msgid="2349126720783633918">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಮತ್ತು ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಂಪರ್ಕಗಳಂತಹ ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳ ಕುರಿತ ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"ಪೂರ್ಣ ನೆಟ್ವರ್ಕ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರಿ"</string> <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"ನೆಟ್ವರ್ಕ್ ಸಾಕೆಟ್ಗಳನ್ನು ರಚಿಸಲು ಮತ್ತು ಕಸ್ಟಮ್ ನೆಟ್ವರ್ಕ್ ಪ್ರೊಟೋಕಾಲ್ಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಬ್ರೌಸರ್ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಇಂಟರ್ನೆಟ್ಗೆ ಡೇಟಾ ಕಳುಹಿಸಲು ಮಾರ್ಗವನ್ನುಂಟು ಮಾಡುತ್ತದೆ ಹಾಗಾಗಿ ಇಂಟರ್ನೆಟ್ಗೆ ಡೇಟಾ ಕಳುಹಿಸಲು ಈ ಅನುಮತಿ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string> <string name="permlab_changeNetworkState" msgid="8945711637530425586">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕತೆಯನ್ನು ಬದಲಾಯಿಸಿ"</string> - <string name="permdesc_changeNetworkState" msgid="649341947816898736">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕದ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_changeNetworkState" msgid="649341947816898736">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕದ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_changeTetherState" msgid="9079611809931863861">"ಟೆಥರಡ್ ಸಂಪರ್ಕತೆಯನ್ನು ಬದಲಾಯಿಸಿ"</string> <string name="permdesc_changeTetherState" msgid="3025129606422533085">"ಟೆಥರ್ ಮಾಡಲಾದ ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕದ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_accessWifiState" msgid="5552488500317911052">"ವೈ-ಫೈ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> @@ -589,15 +589,15 @@ <string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ನಿಮ್ಮ Android TV ಮಾತ್ರವಲ್ಲದೆ, ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್ ವಿಳಾಸಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಎಲ್ಲಾ ಸಾಧನಗಳಿಗೆ ಕಳುಹಿಸಲಾದ ಪ್ಯಾಕೆಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್ ಅಲ್ಲದ ಮೋಡ್ಗಿಂತಲೂ ಹೆಚ್ಚು ಪವರ್ ಬಳಸುತ್ತದೆ."</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"ನಿಮ್ಮ ಫೋನ್ ಮಾತ್ರವಲ್ಲದೇ, ಮಲ್ಟಿಕಾಸ್ಟ್ ವಿಳಾಸಗಳನ್ನು ಬಳಸಿಕೊಂಡು ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ಎಲ್ಲಾ ಸಾಧನಗಳಿಗೆ ಕಳುಹಿಸಲಾಗಿರುವ ಪ್ಯಾಕೆಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್ ಅಲ್ಲದ ಮೋಡ್ ಬಳಸುವ ಶಕ್ತಿಗಿಂತಲೂ ಹೆಚ್ಚಿನ ಶಕ್ತಿಯನ್ನು ಬಳಸುತ್ತದೆ."</string> <string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string> - <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್ ಟ್ಯಾಬ್ಲೆಟ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್ ಟ್ಯಾಬ್ಲೆಟ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಬ್ಲೂಟೂತ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ರಿಮೋಟ್ ಸಾಧನಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು ಮತ್ತು ಅವುಗಳೊಂದಿಗೆ ಜೋಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್ ಫೋನ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> <string name="permlab_accessWimaxState" msgid="7029563339012437434">"WiMAX ನಿಂದ ಸಂಪರ್ಕಗೊಳಿಸಿ ಮತ್ತು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ"</string> <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"WiMAX ಸಕ್ರಿಯಗೊಂಡಿದೆಯೇ ಮತ್ತು ಸಂಪರ್ಕಗೊಂಡಿರುವಂತಹ WiMAX ನೆಟ್ವರ್ಕ್ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ನಿರ್ಧರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string> <string name="permlab_changeWimaxState" msgid="6223305780806267462">"WiMAX ಸ್ಥಿತಿಯನ್ನು ಬದಲಿಸಿ"</string> - <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್ವರ್ಕ್ಗಳಿಂದ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> + <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"ಆ್ಯಪ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್ವರ್ಕ್ಗಳಿಂದ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> <string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"WiMAX ನೆಟ್ವರ್ಕ್ಗಳಿಗೆ ನಿಮ್ಮ Android TV ಸಾಧನವನ್ನು ಸಂಪರ್ಕಿಸಲು ಮತ್ತು ನಿಮ್ಮ Android TV ಸಾಧನವನ್ನು WiMAX ನೆಟ್ವರ್ಕ್ಗಳಿಂದ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> - <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಫೋನ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್ವರ್ಕ್ಗಳಿಂದ ಫೋನ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> + <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"ಆ್ಯಪ್ ಅನ್ನು ಫೋನ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್ವರ್ಕ್ಗಳಿಂದ ಫೋನ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> <string name="permlab_bluetooth" msgid="586333280736937209">"ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳೊಂದಿಗೆ ಜೋಡಿಸಿ"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಬ್ಲೂಟೂತ್ನ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತು ಜೋಡಿ ಮಾಡಿರುವ ಸಾಧನಗಳೊಂದಿಗೆ ಸಂಪರ್ಕಗಳನ್ನು ಕಲ್ಪಿಸಲು ಹಾಗೂ ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string> <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಬ್ಲೂಟೂತ್ನ ಕಾನ್ಫಿಗರೇಶನ್ ವೀಕ್ಷಿಸಲು ಮತ್ತು ಜೋಡಿಸಿರುವ ಸಾಧನಗಳೊಂದಿಗೆ ಸಂಪರ್ಕಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> @@ -613,9 +613,9 @@ <string name="permlab_nearby_wifi_devices" msgid="392774237063608500">"ಹತ್ತಿರದ ವೈ -ಫೈ ಸಾಧನಗಳ ಜೊತೆಗೆ ಸಂವಹನ ನಡೆಸಿ"</string> <string name="permdesc_nearby_wifi_devices" msgid="3054307728646332906">"ಹತ್ತಿರದ ವೈ -ಫೈ ಸಾಧನಗಳ ಸಂಬಂಧಿತ ಸ್ಥಾನವನ್ನು ಸೂಚಿಸಲು, ಕನೆಕ್ಟ್ ಮಾಡಲು ಮತ್ತು ನಿರ್ಧರಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವಾ ಮಾಹಿತಿ"</string> - <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ನೋಂದಾಯಿತ ಅಪ್ಲಿಕೇಶನ್ ಗುರುತಿಸುವಿಕೆಗಳು ಮತ್ತು ಮಾರ್ಗ ಗಮ್ಯಸ್ಥಾನಗಳಂತಹ ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವೆಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ನೋಂದಾಯಿತ ಆ್ಯಪ್ ಗುರುತಿಸುವಿಕೆಗಳು ಮತ್ತು ಮಾರ್ಗ ಗಮ್ಯಸ್ಥಾನಗಳಂತಹ ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವೆಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ಸಮೀಪ ಕ್ಷೇತ್ರ ಸಂವಹನವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string> - <string name="permdesc_nfc" msgid="8352737680695296741">"ಸಮೀಪದ ಕ್ಷೇತ್ರ ಸಂವಹನ (NFC) ಟ್ಯಾಗ್ಗಳು, ಕಾರ್ಡ್ಗಳು, ಮತ್ತು ಓದುಗರನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_nfc" msgid="8352737680695296741">"ಸಮೀಪದ ಕ್ಷೇತ್ರ ಸಂವಹನ (NFC) ಟ್ಯಾಗ್ಗಳು, ಕಾರ್ಡ್ಗಳು, ಮತ್ತು ಓದುಗರನ್ನು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ಸುರಕ್ಷಿತ ಅಂಶದ ವಹಿವಾಟು ಈವೆಂಟ್"</string> <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ಸುರಕ್ಷಿತ ಅಂಶದಲ್ಲಿ ನಡೆಯುತ್ತಿರುವ ವಹಿವಾಟುಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸ್ವೀಕರಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> @@ -757,7 +757,7 @@ <string name="face_error_vendor_unknown" msgid="7387005932083302070">"ಏನೋ ತಪ್ಪಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_icon_content_description" msgid="465030547475916280">"ಮುಖದ ಐಕಾನ್"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ರೀಡ್ ಮಾಡು"</string> - <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಅಪ್ಲಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string> + <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಲು ಆ್ಯಪ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಆ್ಯಪ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string> <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"ಸಿಂಕ್ ಆನ್ ಮತ್ತು ಸಿಂಕ್ ಆಫ್ ಟಾಗಲ್ ಮಾಡಿ"</string> <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"ಖಾತೆಗೆ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯನ್ನು ಹೊಂದಿರುವ ವ್ಯಕ್ತಿಗಳ ಸಿಂಕ್ ಸಕ್ರಿಯಗೊಳಿಸಲು ಇದನ್ನು ಬಳಸಬಹುದಾಗಿದೆ."</string> <string name="permlab_readSyncStats" msgid="3747407238320105332">"ಸಿಂಕ್ ಅಂಕಿಅಂಶಗಳನ್ನು ಓದಿರಿ"</string> @@ -779,19 +779,19 @@ <string name="permlab_register_sim_subscription" msgid="1653054249287576161">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string> <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"ಅಪ್ಲಿಕೇಶನ್ಗೆ ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_register_call_provider" msgid="6135073566140050702">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string> - <string name="permdesc_register_call_provider" msgid="4201429251459068613">"ಹೊಸ ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಣಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> + <string name="permdesc_register_call_provider" msgid="4201429251459068613">"ಹೊಸ ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಣಿ ಮಾಡಲು ಆ್ಯಪ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> <string name="permlab_connection_manager" msgid="3179365584691166915">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string> - <string name="permdesc_connection_manager" msgid="1426093604238937733">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> + <string name="permdesc_connection_manager" msgid="1426093604238937733">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಆ್ಯಪ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> <string name="permlab_bind_incall_service" msgid="5990625112603493016">"ಒಳ-ಕಾಲ್ ಸ್ಕ್ರೀನ್ ಮೂಲಕ ಸಂವಹನ ನಡೆಸಿ"</string> <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"ಬಳಕೆದಾರರು ಒಳ-ಕಾಲ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಯಾವಾಗ ಮತ್ತು ಹೇಗೆ ನೋಡುತ್ತಾರೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"ಟೆಲಿಫೋನಿ ಸೇವೆಗಳೊಂದಿಗೆ ಸಂವಾದ ನಡೆಸಿ"</string> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"ಕರೆಗಳನ್ನು ಮಾಡಲು/ಸ್ವೀಕರಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ ಲಿಫೋನಿ ಸೇವೆಗಳ ಜೊತೆ ಸಂವಾದ ನಡೆಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಕೊಡಿ."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"ಒಳ ಕರೆ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಿ"</string> - <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"ಒಳ ಕರೆಯ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"ಒಳ ಕರೆಯ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"ಐತಿಹಾಸಿಕ ನೆಟ್ವರ್ಕ್ ಬಳಕೆಯನ್ನು ಓದಿರಿ"</string> <string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"ನಿರ್ದಿಷ್ಟ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಐತಿಹಾಸಿಕ ನೆಟ್ವರ್ಕ್ನ ಬಳಕೆಯನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"ನೆಟ್ವರ್ಕ್ ನೀತಿಯನ್ನು ನಿರ್ವಹಿಸಿ"</string> - <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"ನೆಟ್ವರ್ಕ್ ನೀತಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ದಿಷ್ಟ ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"ನೆಟ್ವರ್ಕ್ ನೀತಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಆ್ಯಪ್ ನಿರ್ದಿಷ್ಟ ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"ನೆಟವರ್ಕ್ ಬಳಕೆಯ ಲೆಕ್ಕ ಪರಿಶೋಧನೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ವಿರುದ್ಧವಾಗಿ ನೆಟ್ವರ್ಕ್ ಬಳಕೆಯನ್ನು ಹೇಗೆ ಲೆಕ್ಕಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಬಳಸಲಾಗುವುದಿಲ್ಲ."</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string> @@ -803,7 +803,7 @@ <string name="permlab_bindDreamService" msgid="4776175992848982706">"ಕನಸಿನ ಸೇವೆಗೆ ಪ್ರತಿಬಂಧಿಸಿ"</string> <string name="permdesc_bindDreamService" msgid="9129615743300572973">"ಕನಸಿನ ಸೇವೆಯ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಮಾಲೀಕರಿಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string> <string name="permlab_invokeCarrierSetup" msgid="5098810760209818140">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ಗೆ ವಿನಂತಿಸಿಕೊಳ್ಳಿ"</string> - <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ವಿನಂತಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string> + <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಆ್ಯಪ್ ಅನ್ನು ವಿನಂತಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಆ್ಯಪ್ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string> <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"ನೆಟ್ವರ್ಕ್ ಪರಿಸ್ಥಿತಿಗಳ ಕುರಿತು ಪರಿಶೀಲನೆಗಳನ್ನು ಆಲಿಸಿ"</string> <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"ನೆಟ್ವರ್ಕ್ ಪರಿಸ್ಥಿತಿಗಳ ಕುರಿತು ಪರಿಶೀಲನೆಗಾಗಿ ಆಲಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string> <string name="permlab_setInputCalibration" msgid="932069700285223434">"ಇನ್ಪುಟ್ ಸಾಧನ ಮಾಪನಾಂಕ ನಿರ್ಣಯವನ್ನು ಬದಲಾಯಿಸಿ"</string> @@ -863,7 +863,7 @@ <string name="policylab_expirePassword" msgid="6015404400532459169">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಪಾಸ್ವರ್ಡ್ ಮುಕ್ತಾಯವನ್ನು ಹೊಂದಿಸಿ"</string> <string name="policydesc_expirePassword" msgid="9136524319325960675">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಪಾಸ್ವರ್ಡ್, ಪಿನ್, ಅಥವಾ ನಮೂನೆಯನ್ನು ಹೆಚ್ಚು ಪದೆ ಪದೇ ಬದಲಾಯಿಸಬೇಕಾಗಿರುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಿ."</string> <string name="policylab_encryptedStorage" msgid="9012936958126670110">"ಸಂಗ್ರಹಣೆ ಎನ್ಕ್ರಿಪ್ಶನ್ ಹೊಂದಿಸಿ"</string> - <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"ಸಂಗ್ರಹಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಬೇಕಾದ ಅಗತ್ಯವಿದೆ."</string> + <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"ಸಂಗ್ರಹಿಸಿರುವ ಆ್ಯಪ್ ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಬೇಕಾದ ಅಗತ್ಯವಿದೆ."</string> <string name="policylab_disableCamera" msgid="5749486347810162018">"ಕ್ಯಾಮರಾಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="policydesc_disableCamera" msgid="3204405908799676104">"ಎಲ್ಲಾ ಸಾಧನ ಕ್ಯಾಮರಾಗಳ ಬಳಕೆಯನ್ನು ತಡೆಯಿರಿ."</string> <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"ಕೆಲವು ಸ್ಕ್ರೀನ್ ಲಾಕ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> @@ -1200,7 +1200,7 @@ <string name="low_internal_storage_view_text" msgid="8172166728369697835">"ಕೆಲವು ಸಿಸ್ಟಂ ಕಾರ್ಯವಿಧಾನಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು"</string> <string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ಸಿಸ್ಟಂನಲ್ಲಿ ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆಯಿಲ್ಲ. ನೀವು 250MB ನಷ್ಟು ಖಾಲಿ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮರುಪ್ರಾರಂಭಿಸಿ."</string> <string name="app_running_notification_title" msgid="8985999749231486569">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಚಾಲನೆಯಲ್ಲಿದೆ"</string> - <string name="app_running_notification_text" msgid="5120815883400228566">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ನಿಲ್ಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> + <string name="app_running_notification_text" msgid="5120815883400228566">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಅಥವಾ ಆ್ಯಪ್ ನಿಲ್ಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="ok" msgid="2646370155170753815">"ಸರಿ"</string> <string name="cancel" msgid="6908697720451760115">"ರದ್ದುಮಾಡಿ"</string> <string name="yes" msgid="9069828999585032361">"ಸರಿ"</string> @@ -1235,7 +1235,7 @@ <string name="whichSendToApplication" msgid="77101541959464018">"ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ"</string> <string name="whichSendToApplicationNamed" msgid="3385686512014670003">"%1$s ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ"</string> <string name="whichSendToApplicationLabel" msgid="3543240188816513303">"ಕಳುಹಿಸು"</string> - <string name="whichHomeApplication" msgid="8276350727038396616">"ಮುಖಪುಟ ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string> + <string name="whichHomeApplication" msgid="8276350727038396616">"ಮುಖಪುಟ ಆ್ಯಪ್ ಆಯ್ಕೆಮಾಡಿ"</string> <string name="whichHomeApplicationNamed" msgid="5855990024847433794">"%1$s ಅನ್ನು ಹೋಮ್ ಆಗಿ ಬಳಸಿ"</string> <string name="whichHomeApplicationLabel" msgid="8907334282202933959">"ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string> <string name="whichImageCaptureApplication" msgid="2737413019463215284">"ಇದರ ಜೊತೆಗೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string> @@ -1251,12 +1251,12 @@ <string name="aerr_process" msgid="4268018696970966407">"<xliff:g id="PROCESS">%1$s</xliff:g> ನಿಲ್ಲಿಸಿದೆ"</string> <string name="aerr_application_repeated" msgid="7804378743218496566">"<xliff:g id="APPLICATION">%1$s</xliff:g> ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ"</string> <string name="aerr_process_repeated" msgid="1153152413537954974">"<xliff:g id="PROCESS">%1$s</xliff:g> ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ"</string> - <string name="aerr_restart" msgid="2789618625210505419">"ಅಪ್ಲಿಕೇಶನ್ ಮತ್ತೆ ತೆರೆಯಿರಿ"</string> + <string name="aerr_restart" msgid="2789618625210505419">"ಆ್ಯಪ್ ಮತ್ತೆ ತೆರೆಯಿರಿ"</string> <string name="aerr_report" msgid="3095644466849299308">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string> <string name="aerr_close" msgid="3398336821267021852">"ಮುಚ್ಚಿ"</string> <string name="aerr_mute" msgid="2304972923480211376">"ಸಾಧನವು ಮರುಪ್ರಾರಂಭವಾಗುವವರೆಗೂ ಮ್ಯೂಟ್ ಮಾಡಿ"</string> <string name="aerr_wait" msgid="3198677780474548217">"ನಿರೀಕ್ಷಿಸು"</string> - <string name="aerr_close_app" msgid="8318883106083050970">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮುಚ್ಚಿ"</string> + <string name="aerr_close_app" msgid="8318883106083050970">"ಆ್ಯಪ್ ಅನ್ನು ಮುಚ್ಚಿ"</string> <string name="anr_title" msgid="7290329487067300120"></string> <string name="anr_activity_application" msgid="8121716632960340680">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ"</string> <string name="anr_activity_process" msgid="3477362583767128667">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ"</string> @@ -1266,7 +1266,7 @@ <string name="report" msgid="2149194372340349521">"ವರದಿ ಮಾಡು"</string> <string name="wait" msgid="7765985809494033348">"ನಿರೀಕ್ಷಿಸು"</string> <string name="webpage_unresponsive" msgid="7850879412195273433">"ಪುಟವು ಪ್ರತಿಕ್ರಿಯೆ ರಹಿತವಾಗಿದೆ.\n\nನೀವದನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?"</string> - <string name="launch_warning_title" msgid="6725456009564953595">"ಅಪ್ಲಿಕೇಶನ್ ಮರುನಿರ್ದೇಶಿಸಲಾಗಿದೆ"</string> + <string name="launch_warning_title" msgid="6725456009564953595">"ಆ್ಯಪ್ ಮರುನಿರ್ದೇಶಿಸಲಾಗಿದೆ"</string> <string name="launch_warning_replace" msgid="3073392976283203402">"ಇದೀಗ <xliff:g id="APP_NAME">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ."</string> <string name="launch_warning_original" msgid="3332206576800169626">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಮೂಲತಃ ಲಾಂಚ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="screen_compat_mode_scale" msgid="8627359598437527726">"ಮಾಪಕ"</string> @@ -1277,7 +1277,7 @@ <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"Android OS ನ ಹೊಂದಾಣಿಕೆಯಾಗದ ಆವೃತ್ತಿ ಗಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ರಚಿಸಲಾಗಿದೆ ಮತ್ತು ಅನಿರೀಕ್ಷಿತವಾಗಿ ವರ್ತಿಸಬಹುದು. ಅಪ್ಲಿಕೇಶನ್ನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾದ ಆವೃತ್ತಿ ಲಭ್ಯವಿರಬಹುದು."</string> <string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"ಯಾವಾಗಲೂ ತೋರಿಸು"</string> <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"ಅಪ್ಡೇಟ್ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string> - <string name="smv_application" msgid="3775183542777792638">"ಅಪ್ಲಿಕೇಶನ್ <xliff:g id="APPLICATION">%1$s</xliff:g> (ಪ್ರಕ್ರಿಯೆಯು <xliff:g id="PROCESS">%2$s</xliff:g>) ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string> + <string name="smv_application" msgid="3775183542777792638">"ಆ್ಯಪ್ <xliff:g id="APPLICATION">%1$s</xliff:g> (ಪ್ರಕ್ರಿಯೆಯು <xliff:g id="PROCESS">%2$s</xliff:g>) ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string> <string name="smv_process" msgid="1398801497130695446">"<xliff:g id="PROCESS">%1$s</xliff:g> ಪ್ರಕ್ರಿಯೆಯು ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string> <string name="android_upgrading_title" product="default" msgid="7279077384220829683">"ಫೋನ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> <string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> @@ -1379,9 +1379,9 @@ <string name="sim_added_message" msgid="6602906609509958680">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string> <string name="sim_restart_button" msgid="8481803851341190038">"ಮರುಪ್ರಾರಂಭಿಸು"</string> <string name="install_carrier_app_notification_title" msgid="5712723402213090102">"ಮೊಬೈಲ್ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> - <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸಿ"</string> - <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string> - <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"ಅಪ್ಲಿಕೇಶನ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string> + <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸಿ"</string> + <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string> + <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"ಆ್ಯಪ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"ಹೊಸ ಸಿಮ್ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"ಇದನ್ನು ಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"ಸಮಯವನ್ನು ಹೊಂದಿಸಿ"</string> @@ -1502,7 +1502,7 @@ <string name="permlab_requestDeletePackages" msgid="2541172829260106795">"ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ಅಳಿಸಲು ವಿನಂತಿ"</string> <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ಅಳಿಸುವುದಕ್ಕಾಗಿ ವಿನಂತಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳನ್ನು ಕಡೆಗಣಿಸಲು ಕೇಳಿ"</string> - <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"ಈ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳನ್ನು ಕಡೆಗಣಿಸುವುದಕ್ಕೆ ಅನುಮತಿಯನ್ನು ಕೇಳಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"ಈ ಆ್ಯಪ್ಗೆ ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳನ್ನು ಕಡೆಗಣಿಸುವುದಕ್ಕೆ ಅನುಮತಿಯನ್ನು ಕೇಳಲು ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_queryAllPackages" msgid="2928450604653281650">"ಎಲ್ಲಾ ಪ್ಯಾಕೇಜ್ಗಳ ಕುರಿತಾದ ಮಾಹಿತಿಯನ್ನು ಕೇಳಿ"</string> <string name="permdesc_queryAllPackages" msgid="5339069855520996010">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ಎಲ್ಲಾ ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"ಝೂಮ್ ನಿಯಂತ್ರಿಸಲು ಎರಡು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -1524,8 +1524,8 @@ <string name="permission_request_notification_title" msgid="1810025922441048273">"ಅನುಮತಿ ವಿನಂತಿಸಲಾಗಿದೆ"</string> <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> ಖಾತೆಗಾಗಿ\n ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string> <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ಖಾತೆಗಾಗಿ \n <xliff:g id="APP">%1$s</xliff:g> ನಿಂದ ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string> - <string name="forward_intent_to_owner" msgid="4620359037192871015">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನ ಹೊರಗೆ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string> - <string name="forward_intent_to_work" msgid="3620262405636021151">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string> + <string name="forward_intent_to_owner" msgid="4620359037192871015">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನ ಹೊರಗೆ ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string> + <string name="forward_intent_to_work" msgid="3620262405636021151">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string> <string name="input_method_binding_label" msgid="1166731601721983656">"ಇನ್ಪುಟ್ ವಿಧಾನ"</string> <string name="sync_binding_label" msgid="469249309424662147">"ಸಿಂಕ್ ಮಾಡು"</string> <string name="accessibility_binding_label" msgid="1974602776545801715">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ"</string> @@ -1548,8 +1548,8 @@ <string name="no_file_chosen" msgid="4146295695162318057">"ಯಾವುದೇ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string> <string name="reset" msgid="3865826612628171429">"ಮರುಹೊಂದಿಸು"</string> <string name="submit" msgid="862795280643405865">"ಸಲ್ಲಿಸು"</string> - <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ಡ್ರೈವಿಂಗ್ ಅಪ್ಲಿಕೇಶನ್ ಚಾಲನೆಯಲ್ಲಿದೆ"</string> - <string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ಡ್ರೈವಿಂಗ್ ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> + <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ಡ್ರೈವಿಂಗ್ ಆ್ಯಪ್ ಚಾಲನೆಯಲ್ಲಿದೆ"</string> + <string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ಡ್ರೈವಿಂಗ್ ಆ್ಯಪ್ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="back_button_label" msgid="4078224038025043387">"ಹಿಂದೆ"</string> <string name="next_button_label" msgid="6040209156399907780">"ಮುಂದಿನದು"</string> <string name="skip_button_label" msgid="3566599811326688389">"ಸ್ಕಿಪ್"</string> @@ -2000,8 +2000,8 @@ <string name="language_picker_section_all" msgid="1985809075777564284">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string> <string name="region_picker_section_all" msgid="756441309928774155">"ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು"</string> <string name="locale_search_menu" msgid="6258090710176422934">"ಹುಡುಕಿ"</string> - <string name="app_suspended_title" msgid="888873445010322650">"ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ"</string> - <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಸದ್ಯಕ್ಕೆ ಲಭ್ಯವಿಲ್ಲ. ಇದನ್ನು <xliff:g id="APP_NAME_1">%2$s</xliff:g> ನಲ್ಲಿ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ."</string> + <string name="app_suspended_title" msgid="888873445010322650">"ಆ್ಯಪ್ ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ಆ್ಯಪ್ ಸದ್ಯಕ್ಕೆ ಲಭ್ಯವಿಲ್ಲ. ಇದನ್ನು <xliff:g id="APP_NAME_1">%2$s</xliff:g> ನಲ್ಲಿ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ಆ್ಯಪ್ ವಿರಾಮ ನಿಲ್ಲಿಸಿ"</string> <string name="work_mode_off_title" msgid="6367463960165135829">"ಕೆಲಸದ ಆ್ಯಪ್ ವಿರಾಮ ರದ್ದುಮಾಡಬೇಕೇ"</string> @@ -2038,7 +2038,7 @@ <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ಅಪ್ಡೇಟ್ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string> <string name="deprecated_abi_message" msgid="6820548011196218091">"ಈ ಆ್ಯಪ್ Android ನ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯ ಜೊತೆಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಅಪ್ಡೇಟ್ಗಾಗಿ ಪರಿಶೀಲಿಸಿ ಅಥವಾ ಆ್ಯಪ್ ಡೆವಲಪರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <string name="new_sms_notification_title" msgid="6528758221319927107">"ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ"</string> - <string name="new_sms_notification_content" msgid="3197949934153460639">"ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string> + <string name="new_sms_notification_content" msgid="3197949934153460639">"ವೀಕ್ಷಿಸಲು SMS ಆ್ಯಪ್ ತೆರೆಯಿರಿ"</string> <string name="profile_encrypted_title" msgid="9001208667521266472">"ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆ ಸೀಮಿತವಾಗಿರಬಹುದು"</string> <string name="profile_encrypted_detail" msgid="5279730442756849055">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="profile_encrypted_message" msgid="1128512616293157802">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -2116,14 +2116,14 @@ <string name="mmcc_illegal_me_msim_template" msgid="4802735138861422802">"<xliff:g id="SIMNUMBER">%d</xliff:g> ಸಿಮ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string> <string name="popup_window_default_title" msgid="6907717596694826919">"ಪಾಪ್ಅಪ್ ವಿಂಡೋ"</string> <string name="slice_more_content" msgid="3377367737876888459">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="9206301954024286063">"ಅಪ್ಲಿಕೇಶನ್ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್ಗ್ರೇಡ್ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್ಕಟ್ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string> - <string name="shortcut_restore_not_supported" msgid="4763198938588468400">"ಅಪ್ಲಿಕೇಶನ್ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> - <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"ಅಪ್ಲಿಕೇಶನ್ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> + <string name="shortcut_restored_on_lower_version" msgid="9206301954024286063">"ಆ್ಯಪ್ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್ಗ್ರೇಡ್ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್ಕಟ್ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string> + <string name="shortcut_restore_not_supported" msgid="4763198938588468400">"ಆ್ಯಪ್ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> + <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"ಆ್ಯಪ್ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="shortcut_restore_unknown_issue" msgid="2478146134395982154">"ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃ ಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="shortcut_disabled_reason_unknown" msgid="753074793553599166">"ಶಾರ್ಟ್ಕಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ಹೇಗಿದ್ದರೂ ತೆರೆಯಿರಿ"</string> - <string name="harmful_app_warning_title" msgid="8794823880881113856">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string> + <string name="harmful_app_warning_title" msgid="8794823880881113856">"ಅಪಾಯಕಾರಿ ಆ್ಯಪ್ ಕಂಡುಬಂದಿದೆ"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string> <string name="screenshot_edit" msgid="7408934887203689207">"ಎಡಿಟ್"</string> <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ವೈಬ್ರೇಟ್ ಆಗುತ್ತವೆ"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 514b9cfb380f..14e1064a9aec 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -656,8 +656,8 @@ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Улантуу үчүн экрандын кулпусун киргизиңиз"</string> <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Сенсорду катуу басыңыз"</string> <string name="fingerprint_acquired_insufficient" msgid="2410176550915730974">"Манжа изи таанылган жок. Кайра аракет кылыңыз."</string> - <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Манжа изинин сенсорун тазалап, кайра аракет кылыңыз"</string> - <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Сенсорду тазалап, кайра аракет кылыңыз"</string> + <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Манжа изинин сенсорун тазалап, кайталап көрүңүз"</string> + <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Сенсорду тазалап, кайталап көрүңүз"</string> <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Сенсорду катуу басыңыз"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Манжа өтө жай жылды. Кайталап көрүңүз."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Башка манжа изин байкап көрүңүз"</string> @@ -2390,7 +2390,7 @@ <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофон жеткиликтүү"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофон бөгөттөлгөн"</string> <string name="connected_display_unavailable_notification_title" msgid="5265409360902073556">"Башка экранга чыгаруу мүмкүн эмес"</string> - <string name="connected_display_unavailable_notification_content" msgid="3845903313751217516">"Башка кабелди колдонуп, кайра аракет кылыңыз"</string> + <string name="connected_display_unavailable_notification_content" msgid="3845903313751217516">"Башка кабелди колдонуп, кайталап көрүңүз"</string> <string name="connected_display_thermally_unavailable_notification_content" msgid="9205758199439955949">"Түзмөгүңүз өтө ысып кетти жана ал муздамайынча башка экранга чыгара албайт"</string> <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Кош экран"</string> <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen күйүк"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 83a1d56716cd..57f1472b6f34 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1735,7 +1735,7 @@ <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"HIDUP"</string> <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"MATI"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Benarkan <xliff:g id="SERVICE">%1$s</xliff:g> mempunyai kawalan penuh atas peranti anda?"</string> - <string name="accessibility_service_warning_description" msgid="291674995220940133">"Kawalan penuh sesuai untuk apl yang membantu anda berkaitan dengan keperluan kebolehaksesan tetapi bukan untuk kebanyakan apl."</string> + <string name="accessibility_service_warning_description" msgid="291674995220940133">"Kawalan penuh sesuai untuk apl yang berkaitan dengan keperluan kebolehaksesan anda tetapi bukan untuk kebanyakan apl."</string> <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Melihat dan mengawal skrin"</string> <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Ciri ini boleh membaca semua kandungan pada skrin dan memaparkan kandungan di atas apl lain."</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Melihat dan melaksanakan tindakan"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index e4e75c1e3d2f..f568d7112cc0 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -797,7 +797,7 @@ <string name="permlab_accessNotifications" msgid="7130360248191984741">"သတိပေးချက်များအား အသုံးပြုခွင့်"</string> <string name="permdesc_accessNotifications" msgid="761730149268789668">"အပလီကေးရှင်းကို အကြောင်းကြားချက်များအား ထုတ်လုပ်ရန်၊ လေ့လာရန်၊ ဖျက်ရန် ခွင့်ပြုခြင်း။ တခြား အပလီကေးရှင်းများမှ သတိပေးချက်များလည်း ပါဝင်ပါသည်"</string> <string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"သတိပေးချက် နားထောင်ခြင်း ဆားဗစ် နှင့် ပူးပေါင်းခြင်း"</string> - <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"ဖုန်းကိုင်ထားသူနှင့် အကြောင်းကြားချက် နားစွင့်သော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးခြင်း။ ပုံမှန် အက်ပ်များအတွက် ဘယ်တော့မှ မလိုအပ်ပါ"</string> + <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"ဖုန်းကိုင်ထားသူနှင့် အကြောင်းကြားချက် နားစွင့်သော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးသည်။ ပုံမှန် အက်ပ်များအတွက် ဘယ်တော့မှ မလိုအပ်ပါ။"</string> <string name="permlab_bindConditionProviderService" msgid="5245421224814878483">"အခြေအနေ စီမံပေးရေး ဝန်ဆောင်မှု တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string> <string name="permdesc_bindConditionProviderService" msgid="6106018791256120258">"စွဲကိုင်ထားသူအား အခြေအနေကို စီမံပေးသူ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် အက်ပ်များ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string> <string name="permlab_bindDreamService" msgid="4776175992848982706">"အိပ်မက် ဝန်ဆောင်မှုသို့ ပေါင်းစည်းမည်"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 133429b2fcf7..914c04c65495 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -2410,7 +2410,7 @@ <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"किबोर्डहरू हेर्न ट्याप गर्नुहोस्"</string> <string name="profile_label_private" msgid="6463418670715290696">"निजी"</string> <string name="profile_label_clone" msgid="769106052210954285">"क्लोन"</string> - <string name="profile_label_work" msgid="3495359133038584618">"कार्य प्रोफाइल"</string> + <string name="profile_label_work" msgid="3495359133038584618">"कार्य"</string> <string name="profile_label_work_2" msgid="4691533661598632135">"कार्य प्रोफाइल २"</string> <string name="profile_label_work_3" msgid="4834572253956798917">"कार्य प्रोफाइल ३"</string> <string name="profile_label_test" msgid="9168641926186071947">"परीक्षण"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index ff07066e186b..99ef60484276 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2150,11 +2150,11 @@ <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string> <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string> <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações avançadas"</string> - <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As Notificações adaptáveis do Android não estão mais disponíveis."</string> + <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As notificações adaptativas do Android não estão mais disponíveis."</string> <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string> - <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptativas. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string> <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Economia de bateria ativada"</string> <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduzindo o uso da bateria para prolongar a duração dela"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index ff07066e186b..99ef60484276 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2150,11 +2150,11 @@ <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string> <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string> <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações avançadas"</string> - <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As Notificações adaptáveis do Android não estão mais disponíveis."</string> + <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As notificações adaptativas do Android não estão mais disponíveis."</string> <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string> - <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptativas. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string> <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Economia de bateria ativada"</string> <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduzindo o uso da bateria para prolongar a duração dela"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 8d69834eaed9..c002866aa6ad 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1338,7 +1338,7 @@ <string name="network_available_sign_in" msgid="1520342291829283114">"Ingia katika mtandao"</string> <!-- no translation found for network_available_sign_in_detailed (7520423801613396556) --> <skip /> - <string name="wifi_no_internet" msgid="1386911698276448061">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> haina uwezo wa kufikia intaneti"</string> + <string name="wifi_no_internet" msgid="1386911698276448061">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> haina intaneti"</string> <string name="wifi_no_internet_detailed" msgid="634938444133558942">"Gusa ili upate chaguo"</string> <string name="mobile_no_internet" msgid="4014455157529909781">"Mtandao wa simu hauna uwezo wa kufikia intaneti"</string> <string name="other_networks_no_internet" msgid="6698711684200067033">"Mtandao hauna uwezo wa kufikia intaneti"</string> @@ -2408,9 +2408,9 @@ <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Muundo wa kibodi umewekwa kuwa <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Gusa ili ubadilishe."</string> <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Mipangilio ya kibodi halisi imewekwa"</string> <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Gusa ili uangalie kibodi"</string> - <string name="profile_label_private" msgid="6463418670715290696">"Wa faragha"</string> + <string name="profile_label_private" msgid="6463418670715290696">"Faragha"</string> <string name="profile_label_clone" msgid="769106052210954285">"Nakala"</string> - <string name="profile_label_work" msgid="3495359133038584618">"Wa kazini"</string> + <string name="profile_label_work" msgid="3495359133038584618">"Kazini"</string> <string name="profile_label_work_2" msgid="4691533661598632135">"Wa 2 wa Kazini"</string> <string name="profile_label_work_3" msgid="4834572253956798917">"Wa 3 wa Kazini"</string> <string name="profile_label_test" msgid="9168641926186071947">"Jaribio"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 51bb90f71d2b..5ee187fa8a41 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1735,7 +1735,7 @@ <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"เปิด"</string> <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ปิด"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"อนุญาตให้ <xliff:g id="SERVICE">%1$s</xliff:g> ควบคุมอุปกรณ์อย่างเต็มที่ไหม"</string> - <string name="accessibility_service_warning_description" msgid="291674995220940133">"การควบคุมอย่างเต็มที่เหมาะสำหรับแอปเกี่ยวกับความช่วยเหลือพิเศษ แต่ไม่เหมาะสำหรับแอปส่วนใหญ่"</string> + <string name="accessibility_service_warning_description" msgid="291674995220940133">"การควบคุมอย่างเต็มรูปแบบเหมาะสำหรับแอปเกี่ยวกับความช่วยเหลือพิเศษ แต่ไม่เหมาะสำหรับแอปส่วนใหญ่"</string> <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"ดูและควบคุมหน้าจอ"</string> <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"การควบคุมนี้สามารถอ่านเนื้อหาทั้งหมดบนหน้าจอและแสดงเนื้อหาทับแอปอื่นๆ"</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"ดูและดำเนินการ"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 92c390656da5..5c0dca2104af 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -6183,6 +6183,10 @@ is enabled and activity is connected to the camera in fullscreen. --> <bool name="config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled">false</bool> + <!-- Which aspect ratio to use when camera compat treatment is enabled and an activity eligible + for treatment is connected to the camera. --> + <item name="config_windowManagerCameraCompatAspectRatio" format="float" type="dimen">1.0</item> + <!-- Docking is a uiMode configuration change and will cause activities to relaunch if it's not handled. If true, the configuration change will be sent but activities will not be relaunched upon docking. Apps with desk resources will behave like normal, since they may diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index b74b41c666c8..81215453b3ef 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -118,6 +118,9 @@ <public name="languageSettingsActivity"/> <!-- @FlaggedApi("android.service.controls.flags.Flags.FLAG_HOME_PANEL_DREAM") --> <public name="dreamCategory"/> + <!-- @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled") + @hide @SystemApi --> + <public name="backgroundPermission"/> </staging-public-group> <staging-public-group type="id" first-id="0x01b60000"> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 5f40a6c7eba4..807df1be7fb5 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4778,6 +4778,7 @@ <java-symbol type="bool" name="config_isCompatFakeFocusEnabled" /> <java-symbol type="bool" name="config_isWindowManagerCameraCompatTreatmentEnabled" /> <java-symbol type="bool" name="config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled" /> + <java-symbol type="dimen" name="config_windowManagerCameraCompatAspectRatio" /> <java-symbol type="bool" name="config_skipActivityRelaunchWhenDocking" /> <java-symbol type="bool" name="config_hideDisplayCutoutWithDisplayArea" /> diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index edcea241e620..e9b137cd5477 100644 --- a/core/tests/coretests/src/android/app/NotificationTest.java +++ b/core/tests/coretests/src/android/app/NotificationTest.java @@ -439,6 +439,27 @@ public class NotificationTest { } @Test + @EnableFlags({Flags.FLAG_UI_RICH_ONGOING, Flags.FLAG_API_RICH_ONGOING}) + public void testHasPromotableStyle_progress() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setStyle(new Notification.ProgressStyle()) + .build(); + assertThat(n.hasPromotableStyle()).isTrue(); + } + + @Test + @EnableFlags({Flags.FLAG_UI_RICH_ONGOING}) + public void testHasPromotableStyle_unknownStyle() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setStyle(new NotAPlatformStyle()) + .build(); + + assertThat(n.hasPromotableStyle()).isTrue(); + } + + @Test @EnableFlags(Flags.FLAG_UI_RICH_ONGOING) public void testHasPromotableCharacteristics() { Notification n = new Notification.Builder(mContext, "test") diff --git a/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java b/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java index d9e90fa001c5..a37000a40508 100644 --- a/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java +++ b/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java @@ -24,6 +24,7 @@ import android.content.res.ApkAssets; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.TypedArray; import android.os.FileUtils; import android.util.DisplayMetrics; import android.view.LayoutInflater; @@ -151,6 +152,27 @@ public class ResourceFlaggingTest { mResources.getDrawable(R.drawable.removedpng); } + @Test + public void testDisabledStyleDoesntOverride() { + TypedArray ta = mResources.newTheme().obtainStyledAttributes( + R.style.style1, new int[] { android.R.attr.windowIsTranslucent}); + assertThat(ta.getBoolean(0, false)).isTrue(); + } + + @Test + public void testEnabledStyleDoesOverride() { + TypedArray ta = mResources.newTheme().obtainStyledAttributes( + R.style.style2, new int[] { android.R.attr.windowIsTranslucent}); + assertThat(ta.getBoolean(0, false)).isTrue(); + } + + @Test + public void testEnabledStyleItemDoesOverride() { + TypedArray ta = mResources.newTheme().obtainStyledAttributes( + R.style.style3, new int[] { android.R.attr.windowIsTranslucent}); + assertThat(ta.getBoolean(0, false)).isTrue(); + } + private LayoutInflater getLayoutInflater() { ContextWrapper c = new ContextWrapper(mContext) { private LayoutInflater mInflater; diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index b385d285350b..f5e94da56055 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управление на прозорците"</string> <string name="close_text" msgid="4986518933445178928">"Затваряне"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Затваряне на менюто"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отваряне на менюто"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Увеличаване на екрана"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Прилепване на екрана"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Това приложение не може да бъде преоразмерено"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увеличаване"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прилепване наляво"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прилепване надясно"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index 56fcf7f4fff5..5d6374403662 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"উইন্ডো ম্যানেজ করুন"</string> <string name="close_text" msgid="4986518933445178928">"বন্ধ করুন"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"\'মেনু\' বন্ধ করুন"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"মেনু খুলুন"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্রিন বড় করুন"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্রিনে অ্যাপ মানানসই হিসেবে ছোট বড় করুন"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই অ্যাপ ছোট বড় করা যাবে না"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"বড় করুন"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাঁদিকে স্ন্যাপ করুন"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ডানদিকে স্ন্যাপ করুন"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index 3aae52e4808a..716491020c65 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Spravovat okna"</string> <string name="close_text" msgid="4986518933445178928">"Zavřít"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zavřít nabídku"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otevřít nabídku"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovat obrazovku"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Rozpůlit obrazovku"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikost aplikace nelze změnit"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximalizovat"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Přichytit vlevo"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Přichytit vpravo"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml index e4ece9386a3f..766852d4b1f0 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml index 14fe60b3e3cb..aa3a484079f8 100644 --- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximize"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml index e4ece9386a3f..766852d4b1f0 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml index e4ece9386a3f..766852d4b1f0 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml index dda97abf7b03..bda5132156cd 100644 --- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximize"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fa/strings_tv.xml b/libs/WindowManager/Shell/res/values-fa/strings_tv.xml index 55394cbdc31a..7b0c8c6c923d 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings_tv.xml @@ -18,7 +18,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"تصویر در تصویر"</string> - <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(برنامه بدون عنوان)"</string> + <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(برنامه بیعنوان)"</string> <string name="pip_close" msgid="2955969519031223530">"بستن"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"تمام صفحه"</string> <string name="pip_move" msgid="158770205886688553">"انتقال"</string> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index d6fc85b6cdcc..37608207b721 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"विंडो मैनेज करें"</string> <string name="close_text" msgid="4986518933445178928">"बंद करें"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"मेन्यू बंद करें"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेन्यू खोलें"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन को बड़ा करें"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्नैप स्क्रीन"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"इस ऐप्लिकेशन का साइज़ नहीं बदला जा सकता"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"बड़ा करें"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बाईं ओर स्नैप करें"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दाईं ओर स्नैप करें"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index aaa4e2654f39..fb44cd855a7b 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Ablakok kezelése"</string> <string name="close_text" msgid="4986518933445178928">"Bezárás"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menü bezárása"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menü megnyitása"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Képernyő méretének maximalizálása"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Igazodás a képernyő adott részéhez"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezt az alkalmazást nem lehet átméretezni"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Teljes méret"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Balra igazítás"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Jobbra igazítás"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 5d8dc5e85462..1225b62c96d9 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ウィンドウを管理する"</string> <string name="close_text" msgid="4986518933445178928">"閉じる"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"メニューを閉じる"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"メニューを開く"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"画面の最大化"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"画面のスナップ"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"このアプリはサイズ変更できません"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"左にスナップ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"右にスナップ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index de08b9ca2d7e..3e1f726ca0ef 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ფანჯრების მართვა"</string> <string name="close_text" msgid="4986518933445178928">"დახურვა"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"მენიუს დახურვა"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"მენიუს გახსნა"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"აპლიკაციის გაშლა სრულ ეკრანზე"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"აპლიკაციის დაპატარავება ეკრანზე"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"აპის ზომის შეცვლა შეუძლებელია"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"მაქსიმალურად გაშლა"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"მარცხნივ გადატანა"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"მარჯვნივ გადატანა"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index 5bc5316494b3..4e10621c719b 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ຈັດການໜ້າຈໍ"</string> <string name="close_text" msgid="4986518933445178928">"ປິດ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ປິດເມນູ"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ເປີດເມນູ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ປັບຈໍໃຫຍ່ສຸດ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ສະແນັບໜ້າຈໍ"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ບໍ່ສາມາດປັບຂະໜາດແອັບນີ້ໄດ້"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ຂະຫຍາຍໃຫຍ່ສຸດ"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ແນບຊ້າຍ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ແນບຂວາ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index 01a72ee4cced..6d3c58cf01bb 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Tvarkyti langus"</string> <string name="close_text" msgid="4986518933445178928">"Uždaryti"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Uždaryti meniu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Atidaryti meniu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Išskleisti ekraną"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Sutraukti ekraną"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Negalima keisti šios programos dydžio"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Padidinti"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pritraukti kairėje"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pritraukti dešinėje"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index d51c3fb70a9e..a48df0b71b1b 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"വിൻഡോകൾ മാനേജ് ചെയ്യുക"</string> <string name="close_text" msgid="4986518933445178928">"അടയ്ക്കുക"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"മെനു അടയ്ക്കുക"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"മെനു തുറക്കുക"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"സ്ക്രീൻ വലുതാക്കുക"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"സ്ക്രീൻ സ്നാപ്പ് ചെയ്യുക"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ഈ ആപ്പിന്റെ വലുപ്പം മാറ്റാനാകില്ല"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"വലുതാക്കുക"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ഇടതുവശത്തേക്ക് സ്നാപ്പ് ചെയ്യുക"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"വലതുവശത്തേക്ക് സ്നാപ്പ് ചെയ്യുക"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index e510d723f1e5..15ccfbbad39f 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Urus Tetingkap"</string> <string name="close_text" msgid="4986518933445178928">"Tutup"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buka Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimumkan Skrin"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tangkap Skrin"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Apl ini tidak boleh diubah saiz"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimumkan"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Autojajar ke kiri"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Autojajar ke kanan"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index 5a4e61a2303b..e11cc1c1f76d 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="close_text" msgid="4986518933445178928">"ਬੰਦ ਕਰੋ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ਮੀਨੂ ਬੰਦ ਕਰੋ"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ਮੀਨੂ ਖੋਲ੍ਹੋ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ਸਕ੍ਰੀਨ ਦਾ ਆਕਾਰ ਵਧਾਓ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ਸਕ੍ਰੀਨ ਨੂੰ ਸਨੈਪ ਕਰੋ"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ਇਸ ਐਪ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ਵੱਡਾ ਕਰੋ"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ਖੱਬੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ਸੱਜੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index a14bb99286f8..2640c0f368a8 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Zarządzaj oknami"</string> <string name="close_text" msgid="4986518933445178928">"Zamknij"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zamknij menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otwórz menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksymalizuj ekran"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Przyciągnij ekran"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nie można zmienić rozmiaru tej aplikacji"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksymalizuj"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Przyciągnij do lewej"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Przyciągnij do prawej"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index 1d31d0d92309..46f8b38dd621 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Faça a gestão das janelas"</string> <string name="close_text" msgid="4986518933445178928">"Fechar"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar ecrã"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar ecrã"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar esta app"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Encaixar à esquerda"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Encaixar à direita"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index a6c20adc4c2e..affd0cb0853a 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управление окнами"</string> <string name="close_text" msgid="4986518933445178928">"Закрыть"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыть меню"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Открыть меню"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Развернуть на весь экран"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Свернуть"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Изменить размер приложения нельзя."</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Развернуть"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Привязать слева"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Привязать справа"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index fe08e04b21a3..280346d0559a 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje oken"</string> <string name="close_text" msgid="4986518933445178928">"Zapri"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zapri meni"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Odpri meni"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiraj zaslon"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Pripni zaslon"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikosti te aplikacije ni mogoče spremeniti"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiraj"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pripni levo"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pripni desno"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index c43f5dfa7b02..aa74bdef0140 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Hantera fönster"</string> <string name="close_text" msgid="4986518933445178928">"Stäng"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Stäng menyn"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Öppna menyn"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximera skärmen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fäst skärmen"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Det går inte att ändra storlek på appen"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Utöka"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fäst till vänster"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fäst till höger"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 8754629df761..cd0ca82ff563 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -126,15 +126,11 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Oynalarni boshqarish"</string> <string name="close_text" msgid="4986518933445178928">"Yopish"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menyuni yopish"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menyuni ochish"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranni yoyish"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranni biriktirish"</string> <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu ilova hajmini oʻzgartirish imkonsiz"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> - <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> - <skip /> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Yoyish"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chapga tortish"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Oʻngga tortish"</string> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt index 7070ce99b24c..b3491baa629d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt @@ -22,6 +22,7 @@ import android.app.WindowConfiguration import android.content.ComponentName import android.content.Context import android.content.pm.PackageManager +import android.graphics.PointF import android.graphics.Rect import android.os.RemoteException import android.util.DisplayMetrics @@ -29,10 +30,13 @@ import android.util.Log import android.util.Pair import android.util.TypedValue import android.window.TaskSnapshot +import android.window.TransitionInfo import com.android.internal.protolog.ProtoLog import com.android.wm.shell.Flags import com.android.wm.shell.protolog.ShellProtoLogGroup import kotlin.math.abs +import kotlin.math.ceil +import kotlin.math.floor import kotlin.math.roundToInt /** A class that includes convenience methods. */ @@ -163,6 +167,84 @@ object PipUtils { return Rect(left, top, left + width, top + height) } + /** + * Temporary rounding "outward" (ie. -1.2 -> -2) used for crop since it is an int. We lean + * outward since, usually, child surfaces are, themselves, cropped, so we'd prefer to avoid + * inadvertently cutting out content that would otherwise be visible. + */ + private fun roundOut(`val`: Float): Int { + return (if (`val` >= 0f) ceil(`val`) else floor(`val`)).toInt() + } + + /** + * Calculates the transform and crop to apply on a Task surface in order for the config-at-end + * activity inside it (original-size activity transformed to match it's hint rect to the final + * Task bounds) to occupy the same world-space position/dimensions as it had before the + * transition. + * + * Usage example: + * calcStartTransform(pipChange, scale, pos, crop); + * t.setScale(pipChange.getLeash(), scale.x, scale.y); + * t.setPosition(pipChange.getLeash(), pos.x, pos.y); + * t.setCrop(pipChange.getLeash(), crop); + */ + @JvmStatic + fun calcStartTransform(pipChange: TransitionInfo.Change, outScale: PointF, + outPos: PointF, outCrop: Rect) { + val startBounds = pipChange.startAbsBounds + val taskEndBounds = pipChange.endAbsBounds + // For now, pip activity bounds always matches task bounds. If this ever changes, we'll + // need to get the activity offset. + val endBounds = taskEndBounds + var hintRect = pipChange.taskInfo?.pictureInPictureParams?.sourceRectHint + if (hintRect == null) { + hintRect = Rect(startBounds) + hintRect.offsetTo(0, 0) + } + + // FA = final activity bounds (absolute) + // FT = final task bounds (absolute) + // SA = start activity bounds (absolute) + // H = source hint (relative to start activity bounds) + // We want to transform the activity so that when the task is at FT, H overlaps with FA + + // The scaling which takes the hint rect (H) in SA and matches it to FA + val hintToEndScaleX = (endBounds.width().toFloat()) / (hintRect.width().toFloat()) + val hintToEndScaleY = (endBounds.height().toFloat()) / (hintRect.height().toFloat()) + + // We want to set the transform on the END TASK surface to put the start activity + // back to where it was. + // First do backwards scale (which takes FA back to H) + val endToHintScaleX = 1f / hintToEndScaleX + val endToHintScaleY = 1f / hintToEndScaleY + // Then top-left needs to place FA (relative to the FT) at H (relative to SA): + // so -(FA.tl - FT.tl) + SA.tl + H.tl + // but we have scaled up the task, so anything that was "within" the task needs to + // be scaled: + // so -(FA.tl - FT.tl)*endToHint + SA.tl + H.tl + val endTaskPosForStartX = (-(endBounds.left - taskEndBounds.left) * endToHintScaleX + + startBounds.left + hintRect.left) + val endTaskPosForStartY = (-(endBounds.top - taskEndBounds.top) * endToHintScaleY + + startBounds.top + hintRect.top) + outScale[endToHintScaleX] = endToHintScaleY + outPos[endTaskPosForStartX] = endTaskPosForStartY + + // now need to set crop to reveal the non-hint stuff. Again, hintrect is relative, so + // we must apply outsets to reveal the *activity* content which is *inside* the task + // and thus is scaled (ie. if activity is scaled down, each task-level pixel exposes + // >1 activity-level pixels) + // For example, the topleft crop would be: + // (FA.tl - FT.tl) - H.tl * hintToEnd + // ^ activity within task + // bottomright can just use scaled activity size + // tl + scale(SA.size, hintToEnd) + outCrop.left = roundOut((endBounds.left - taskEndBounds.left) + - hintRect.left * hintToEndScaleX) + outCrop.top = roundOut((endBounds.top - taskEndBounds.top) - hintRect.top * hintToEndScaleY) + outCrop.right = roundOut(outCrop.left + startBounds.width() * hintToEndScaleX) + outCrop.bottom = roundOut(outCrop.top + startBounds.height() * hintToEndScaleY) + } + private var isPip2ExperimentEnabled: Boolean? = null /** @@ -181,4 +263,4 @@ object PipUtils { } return isPip2ExperimentEnabled as Boolean } -}
\ No newline at end of file +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index af6844262771..7f6118689dad 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -592,8 +592,9 @@ public class PipController implements PipTransitionController.PipTransitionCallb public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, - "onActivityRestartAttempt: %s", task.topActivity); - if (task.getWindowingMode() != WINDOWING_MODE_PINNED) { + "onActivityRestartAttempt: topActivity=%s, wasVisible=%b", + task.topActivity, wasVisible); + if (task.getWindowingMode() != WINDOWING_MODE_PINNED || !wasVisible) { return; } if (mPipTaskOrganizer.isLaunchToSplit(task)) { diff --git a/libs/appfunctions/api/current.txt b/libs/appfunctions/api/current.txt index 3ed33db2222e..bb0fc41acd30 100644 --- a/libs/appfunctions/api/current.txt +++ b/libs/appfunctions/api/current.txt @@ -5,6 +5,11 @@ package com.google.android.appfunctions.sidecar { ctor public AppFunctionManager(android.content.Context); method public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>); method @Deprecated public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>); + method public void isAppFunctionEnabled(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,java.lang.Exception>); + method public void setAppFunctionEnabled(@NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,java.lang.Exception>); + field public static final int APP_FUNCTION_STATE_DEFAULT = 0; // 0x0 + field public static final int APP_FUNCTION_STATE_DISABLED = 2; // 0x2 + field public static final int APP_FUNCTION_STATE_ENABLED = 1; // 0x1 } public abstract class AppFunctionService extends android.app.Service { @@ -41,6 +46,7 @@ package com.google.android.appfunctions.sidecar { field public static final String PROPERTY_RETURN_VALUE = "returnValue"; field public static final int RESULT_APP_UNKNOWN_ERROR = 2; // 0x2 field public static final int RESULT_DENIED = 1; // 0x1 + field public static final int RESULT_DISABLED = 6; // 0x6 field public static final int RESULT_INTERNAL_ERROR = 3; // 0x3 field public static final int RESULT_INVALID_ARGUMENT = 4; // 0x4 field public static final int RESULT_OK = 0; // 0x0 diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java index 815fe05cc3ab..d660926575d1 100644 --- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java +++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java @@ -16,11 +16,18 @@ package com.google.android.appfunctions.sidecar; +import android.Manifest; import android.annotation.CallbackExecutor; +import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.SuppressLint; +import android.annotation.UserHandleAware; import android.content.Context; import android.os.CancellationSignal; +import android.os.OutcomeReceiver; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -37,6 +44,39 @@ import java.util.function.Consumer; // TODO(b/357551503): Implement get and set enabled app function APIs. // TODO(b/367329899): Add sidecar library to Android B builds. public final class AppFunctionManager { + /** + * The default state of the app function. Call {@link #setAppFunctionEnabled} with this to reset + * enabled state to the default value. + */ + public static final int APP_FUNCTION_STATE_DEFAULT = 0; + + /** + * The app function is enabled. To enable an app function, call {@link #setAppFunctionEnabled} + * with this value. + */ + public static final int APP_FUNCTION_STATE_ENABLED = 1; + + /** + * The app function is disabled. To disable an app function, call {@link #setAppFunctionEnabled} + * with this value. + */ + public static final int APP_FUNCTION_STATE_DISABLED = 2; + + /** + * The enabled state of the app function. + * + * @hide + */ + @IntDef( + prefix = {"APP_FUNCTION_STATE_"}, + value = { + APP_FUNCTION_STATE_DEFAULT, + APP_FUNCTION_STATE_ENABLED, + APP_FUNCTION_STATE_DISABLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface EnabledState {} + private final android.app.appfunctions.AppFunctionManager mManager; private final Context mContext; @@ -111,4 +151,64 @@ public final class AppFunctionManager { new CancellationSignal(), callback); } + + /** + * Returns a boolean through a callback, indicating whether the app function is enabled. + * + * <p>* This method can only check app functions owned by the caller, or those where the caller + * has visibility to the owner package and holds either the {@link + * Manifest.permission#EXECUTE_APP_FUNCTIONS} or {@link + * Manifest.permission#EXECUTE_APP_FUNCTIONS_TRUSTED} permission. + * + * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors: + * + * <ul> + * <li>{@link IllegalArgumentException}, if the function is not found or the caller does not + * have access to it. + * </ul> + * + * @param functionIdentifier the identifier of the app function to check (unique within the + * target package) and in most cases, these are automatically generated by the AppFunctions + * SDK + * @param targetPackage the package name of the app function's owner + * @param executor the executor to run the request + * @param callback the callback to receive the function enabled check result + */ + public void isAppFunctionEnabled( + @NonNull String functionIdentifier, + @NonNull String targetPackage, + @NonNull Executor executor, + @NonNull OutcomeReceiver<Boolean, Exception> callback) { + mManager.isAppFunctionEnabled(functionIdentifier, targetPackage, executor, callback); + } + + /** + * Sets the enabled state of the app function owned by the calling package. + * + * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors: + * + * <ul> + * <li>{@link IllegalArgumentException}, if the function is not found or the caller does not + * have access to it. + * </ul> + * + * @param functionIdentifier the identifier of the app function to enable (unique within the + * calling package). In most cases, identifiers are automatically generated by the + * AppFunctions SDK + * @param newEnabledState the new state of the app function + * @param executor the executor to run the callback + * @param callback the callback to receive the result of the function enablement. The call was + * successful if no exception was thrown. + */ + // Constants in @EnabledState should always mirror those in + // android.app.appfunctions.AppFunctionManager. + @SuppressLint("WrongConstant") + @UserHandleAware + public void setAppFunctionEnabled( + @NonNull String functionIdentifier, + @EnabledState int newEnabledState, + @NonNull Executor executor, + @NonNull OutcomeReceiver<Void, Exception> callback) { + mManager.setAppFunctionEnabled(functionIdentifier, newEnabledState, executor, callback); + } } diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java index 60c25fae58d1..c7ce95bab7a5 100644 --- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java +++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java @@ -76,6 +76,9 @@ public final class ExecuteAppFunctionResponse { /** The operation was timed out. */ public static final int RESULT_TIMED_OUT = 5; + /** The caller tried to execute a disabled app function. */ + public static final int RESULT_DISABLED = 6; + /** The result code of the app function execution. */ @ResultCode private final int mResultCode; @@ -234,6 +237,7 @@ public final class ExecuteAppFunctionResponse { RESULT_INTERNAL_ERROR, RESULT_INVALID_ARGUMENT, RESULT_TIMED_OUT, + RESULT_DISABLED }) @Retention(RetentionPolicy.SOURCE) public @interface ResultCode {} diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 9e825fb350d6..7c150862a422 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -619,8 +619,11 @@ bool SkiaCanvas::useGainmapShader(Bitmap& bitmap) { // If it's an unknown colortype then it's not a bitmap-backed canvas if (info.colorType() == SkColorType::kUnknown_SkColorType) return true; + auto colorSpace = info.colorSpace(); + // If we don't have a colorspace, we can't apply a gainmap + if (!colorSpace) return false; skcms_TransferFunction tfn; - info.colorSpace()->transferFn(&tfn); + colorSpace->transferFn(&tfn); auto transferType = skcms_TransferFunction_getType(&tfn); switch (transferType) { diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt index d17a9b62d02d..94231b0facdb 100644 --- a/nfc/api/system-current.txt +++ b/nfc/api/system-current.txt @@ -58,10 +58,15 @@ package android.nfc { @FlaggedApi("android.nfc.nfc_oem_extension") public final class NfcOemExtension { method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void clearPreference(); method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public java.util.List<java.lang.String> getActiveNfceeList(); + method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean hasUserEnabledNfc(); + method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isTagPresent(); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void maybeTriggerFirmwareUpdate(); + method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void pausePolling(int); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void registerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.nfc.NfcOemExtension.Callback); + method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void resumePolling(); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public void setControllerAlwaysOnMode(int); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void synchronizeScreenState(); + method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void triggerInitialization(); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void unregisterCallback(@NonNull android.nfc.NfcOemExtension.Callback); field @FlaggedApi("android.nfc.nfc_oem_extension") public static final int DISABLE = 0; // 0x0 field @FlaggedApi("android.nfc.nfc_oem_extension") public static final int ENABLE_DEFAULT = 1; // 0x1 diff --git a/nfc/java/android/nfc/INfcAdapter.aidl b/nfc/java/android/nfc/INfcAdapter.aidl index 246efc7ca557..a166b283f55b 100644 --- a/nfc/java/android/nfc/INfcAdapter.aidl +++ b/nfc/java/android/nfc/INfcAdapter.aidl @@ -114,4 +114,7 @@ interface INfcAdapter void setScreenState(); void checkFirmware(); List<String> fetchActiveNfceeList(); + void triggerInitialization(); + boolean getSettingStatus(); + boolean isTagPresent(); } diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java index 011c60b080f8..6d5c069bca3a 100644 --- a/nfc/java/android/nfc/NfcOemExtension.java +++ b/nfc/java/android/nfc/NfcOemExtension.java @@ -471,6 +471,58 @@ public final class NfcOemExtension { NfcAdapter.callService(() -> NfcAdapter.sService.setControllerAlwaysOn(mode)); } + /** + * Triggers NFC initialization. If OEM extension is registered + * (indicated via `enable_oem_extension` NFC overlay), the NFC stack initialization at bootup + * is delayed until the OEM extension app triggers the initialization via this call. + */ + @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public void triggerInitialization() { + NfcAdapter.callService(() -> NfcAdapter.sService.triggerInitialization()); + } + + /** + * Gets the last user toggle status. + * @return true if NFC is set to ON, false otherwise + */ + @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public boolean hasUserEnabledNfc() { + return NfcAdapter.callServiceReturn(() -> NfcAdapter.sService.getSettingStatus(), false); + } + + /** + * Checks if the tag is present or not. + * @return true if the tag is present, false otherwise + */ + @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public boolean isTagPresent() { + return NfcAdapter.callServiceReturn(() -> NfcAdapter.sService.isTagPresent(), false); + } + + /** + * Pauses NFC tag reader mode polling for a {@code timeoutInMs} millisecond. If polling must be + * resumed before timeout, use {@link #resumePolling()}. + * @param timeoutInMs the pause polling duration in millisecond + */ + @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public void pausePolling(int timeoutInMs) { + NfcAdapter.callService(() -> NfcAdapter.sService.pausePolling(timeoutInMs)); + } + + /** + * Resumes default NFC tag reader mode polling for the current device state if polling is + * paused. Calling this while polling is not paused is a no-op. + */ + @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public void resumePolling() { + NfcAdapter.callService(() -> NfcAdapter.sService.resumePolling()); + } + private final class NfcOemExtensionCallback extends INfcOemExtensionCallback.Stub { @Override diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 06f471e91d1d..cee7d8f9a428 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -39,6 +39,7 @@ android_library { "SettingsLibDisplayUtils", "SettingsLibEmergencyNumber", "SettingsLibEntityHeaderWidgets", + "SettingsLibExpandablePreference", "SettingsLibFooterPreference", "SettingsLibHelpUtils", "SettingsLibIllustrationPreference", @@ -52,6 +53,7 @@ android_library { "SettingsLibSelectorWithWidgetPreference", "SettingsLibSettingsSpinner", "SettingsLibSettingsTransition", + "SettingsLibSliderPreference", "SettingsLibTopIntroPreference", "SettingsLibTwoTargetPreference", "SettingsLibUsageProgressBarPreference", diff --git a/packages/SettingsLib/ExpandablePreference/Android.bp b/packages/SettingsLib/ExpandablePreference/Android.bp new file mode 100644 index 000000000000..e6de3f196cd5 --- /dev/null +++ b/packages/SettingsLib/ExpandablePreference/Android.bp @@ -0,0 +1,33 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +android_library { + name: "SettingsLibExpandablePreference", + use_resource_processor: true, + defaults: [ + "SettingsLintDefaults", + ], + + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], + resource_dirs: ["res"], + + static_libs: [ + "androidx.annotation_annotation", + "androidx.preference_preference", + "SettingsLibSettingsTheme", + ], + sdk_version: "system_current", + min_sdk_version: "21", + apex_available: [ + "//apex_available:platform", + ], +} diff --git a/packages/SettingsLib/ExpandablePreference/AndroidManifest.xml b/packages/SettingsLib/ExpandablePreference/AndroidManifest.xml new file mode 100644 index 000000000000..7bfa19b1009c --- /dev/null +++ b/packages/SettingsLib/ExpandablePreference/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.settingslib.widget.preference.expandable"> + + <uses-sdk android:minSdkVersion="21" /> + +</manifest> diff --git a/packages/SettingsLib/ExpandablePreference/res/drawable/settingslib_ic_expand.xml b/packages/SettingsLib/ExpandablePreference/res/drawable/settingslib_ic_expand.xml new file mode 100644 index 000000000000..450231108b7a --- /dev/null +++ b/packages/SettingsLib/ExpandablePreference/res/drawable/settingslib_ic_expand.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape + android:shape="oval"> + <size android:width="32dp" android:height="40dp"/> + <solid android:color="@color/settingslib_materialColorSurfaceContainer"/> + </shape> + </item> + <item> + <vector + android:width="32dp" + android:height="40dp" + android:viewportWidth="32" + android:viewportHeight="40"> + <path + android:pathData="M16,23.063L11,18.063L12.063,17L16,20.938L19.938,17L21,18.063L16,23.063Z" + android:fillColor="@color/settingslib_materialColorOnSurface"/> + </vector> + </item> +</layer-list>
\ No newline at end of file diff --git a/packages/SettingsLib/ExpandablePreference/res/layout/settingslib_widget_expandable_icon.xml b/packages/SettingsLib/ExpandablePreference/res/layout/settingslib_widget_expandable_icon.xml new file mode 100644 index 000000000000..f7fefef36b27 --- /dev/null +++ b/packages/SettingsLib/ExpandablePreference/res/layout/settingslib_widget_expandable_icon.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <ImageView + android:id="@+id/expand_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/settingslib_ic_expand"/> +</LinearLayout>
\ No newline at end of file diff --git a/packages/SettingsLib/ExpandablePreference/src/com/android/settingslib/widget/ExpandablePreference.kt b/packages/SettingsLib/ExpandablePreference/src/com/android/settingslib/widget/ExpandablePreference.kt new file mode 100644 index 000000000000..1b93ebecb3be --- /dev/null +++ b/packages/SettingsLib/ExpandablePreference/src/com/android/settingslib/widget/ExpandablePreference.kt @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.widget + +import android.content.Context +import android.util.AttributeSet +import android.widget.ImageView +import androidx.preference.Preference +import androidx.preference.PreferenceGroup +import androidx.preference.PreferenceViewHolder +import com.android.settingslib.widget.preference.expandable.R + +class ExpandablePreference @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : PreferenceGroup(context, attrs, defStyleAttr, defStyleRes), Expandable { + + private var isExpanded = false + private var expandIcon: ImageView? = null + private var isDirty = true // Flag to track changes + + init { + layoutResource = com.android.settingslib.widget.theme.R.layout.settingslib_expressive_preference + widgetLayoutResource = R.layout.settingslib_widget_expandable_icon + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + + holder.isDividerAllowedAbove = false + holder.isDividerAllowedBelow = false + + expandIcon = holder.findViewById(R.id.expand_icon) as ImageView? + + updateExpandedState() + + holder.itemView.setOnClickListener { toggleExpansion() } + } + + override fun addPreference(preference: Preference): Boolean { + preference.isVisible = isExpanded + return super.addPreference(preference) + } + + override fun onPrepareAddPreference(preference: Preference): Boolean { + preference.isVisible = isExpanded + return super.onPrepareAddPreference(preference) + } + + override fun isExpanded(): Boolean { + return isExpanded + } + + private fun toggleExpansion() { + isExpanded = !isExpanded + isDirty = true // Mark as dirty when expansion state changes + updateExpandedState() + notifyChanged() + } + + private fun updateExpandedState() { + expandIcon?.rotation = when (isExpanded) { + true -> ROTATION_EXPANDED + false -> ROTATION_COLLAPSED + } + + if (isDirty) { + (0 until preferenceCount).forEach { i -> + getPreference(i).isVisible = isExpanded + } + isDirty = false + } + } + + companion object { + private const val ROTATION_EXPANDED = 180f + private const val ROTATION_COLLAPSED = 0f + } +}
\ No newline at end of file diff --git a/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml b/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml index 99a9b05b9a62..13a7b5c951db 100644 --- a/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Cari tetapan"</string> + <string name="search_menu" msgid="1914043873178389845">"Cari dalam tetapan"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml index 245d3682636b..4cc3c89dadb5 100644 --- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml +++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml @@ -41,9 +41,20 @@ android:ellipsize="end" android:textAppearance="@style/TextAppearance.TopIntroText"/> + <com.android.settingslib.widget.LinkableTextView + android:id="@+id/settingslib_expressive_learn_more" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@android:id/title" + app:layout_constraintStart_toStartOf="parent" + android:textAlignment="viewStart" + android:clickable="true" + android:visibility="gone" + style="@style/SettingslibTextAppearance.LinkableTextStyle.Expressive"/> + <com.google.android.material.button.MaterialButton android:id="@+id/collapse_button" - app:layout_constraintTop_toBottomOf="@android:id/title" + app:layout_constraintTop_toBottomOf="@id/settingslib_expressive_learn_more" app:layout_constraintStart_toStartOf="parent" android:text="@string/settingslib_expressive_text_expand" app:icon="@drawable/settingslib_expressive_icon_expand" diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml index 9c659050b15e..88f7eb8737a2 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml @@ -329,4 +329,10 @@ <item name="android:textDirection">locale</item> <item name="android:textAppearance">@style/TextAppearance.EntityHeaderTitle</item> </style> + + <style name="SettingslibTextAppearance.LinkableTextStyle.Expressive" + parent="@android:style/TextAppearance.DeviceDefault.WindowTitle"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">?android:attr/colorAccent</item> + </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt index 127f21a540ab..7797a0d6dcde 100644 --- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt +++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt @@ -18,6 +18,9 @@ package com.android.settingslib.widget import android.content.Context import android.graphics.drawable.Drawable +import android.text.SpannableString +import android.text.TextUtils +import android.text.style.URLSpan import android.util.AttributeSet import android.view.Gravity import android.view.LayoutInflater @@ -40,12 +43,18 @@ class CollapsableTextView @JvmOverloads constructor( private val titleTextView: TextView private val collapseButton: MaterialButton private val collapseButtonResources: CollapseButtonResources + private var learnMoreListener: View.OnClickListener? = null + private var learnMoreText: CharSequence? = null + private var learnMoreSpan: LearnMoreSpan? = null + val learnMoreTextView: LinkableTextView + var isLearnMoreEnabled: Boolean = false init { LayoutInflater.from(context) .inflate(R.layout.settingslib_expressive_collapsable_textview, this) titleTextView = findViewById(android.R.id.title) collapseButton = findViewById(R.id.collapse_button) + learnMoreTextView = findViewById(R.id.settingslib_expressive_learn_more) collapseButtonResources = CollapseButtonResources( context.getDrawable(R.drawable.settingslib_expressive_icon_collapse)!!, @@ -111,6 +120,45 @@ class CollapsableTextView @JvmOverloads constructor( updateView() } + /** + * Sets the action when clicking on the learn more view. + * @param listener The click listener for learn more. + */ + fun setLearnMoreAction(listener: View.OnClickListener?) { + if (learnMoreListener != listener) { + learnMoreListener = listener + formatLearnMoreText() + } + } + + /** + * Sets the text of learn more view. + * @param text The text of learn more. + */ + fun setLearnMoreText(text: CharSequence?) { + if (!TextUtils.equals(learnMoreText, text)) { + learnMoreText = text + formatLearnMoreText() + } + } + + private fun formatLearnMoreText() { + if (learnMoreListener == null || TextUtils.isEmpty(learnMoreText)) { + learnMoreTextView.visibility = GONE + isLearnMoreEnabled = false + return + } + val spannableLearnMoreText = SpannableString(learnMoreText) + if (learnMoreSpan != null) { + spannableLearnMoreText.removeSpan(learnMoreSpan) + } + learnMoreSpan = LearnMoreSpan(clickListener = learnMoreListener!!) + spannableLearnMoreText.setSpan(learnMoreSpan, 0, learnMoreText!!.length, 0) + learnMoreTextView.setText(spannableLearnMoreText) + learnMoreTextView.visibility = VISIBLE + isLearnMoreEnabled = true + } + private fun updateView() { when { isCollapsed -> { @@ -130,6 +178,7 @@ class CollapsableTextView @JvmOverloads constructor( } } collapseButton.visibility = if (isCollapsable) VISIBLE else GONE + learnMoreTextView.visibility = if (isLearnMoreEnabled && !isCollapsed) VISIBLE else GONE } private data class CollapseButtonResources( @@ -148,3 +197,12 @@ class CollapsableTextView @JvmOverloads constructor( } } +internal class LearnMoreSpan( + val url: String = "", + val clickListener: View.OnClickListener) : URLSpan(url) { + override fun onClick(widget: View) { + if (clickListener != null) { + clickListener.onClick(widget) + } + } +} diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/Expandable.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/Expandable.kt new file mode 100644 index 000000000000..1f84118d877b --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/Expandable.kt @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.widget + +interface Expandable { + fun isExpanded(): Boolean +}
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt new file mode 100644 index 000000000000..94a2d448bc6e --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt @@ -0,0 +1,41 @@ +/* +* Copyright (C) 2024 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.android.settingslib.widget + +import android.content.Context +import android.text.Spanned +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.util.AttributeSet +import android.widget.TextView + +class LinkableTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : TextView(context, attrs, defStyleAttr) { + + override fun setText(text: CharSequence, type: BufferType?) { + super.setText(text, type) + if (text is Spanned) { + val spans = text.getSpans(0, text.length, ClickableSpan::class.java) + if (spans.size > 0) { + movementMethod = LinkMovementMethod.getInstance() + } + } + } +}
\ No newline at end of file diff --git a/packages/SettingsLib/SliderPreference/Android.bp b/packages/SettingsLib/SliderPreference/Android.bp new file mode 100644 index 000000000000..46528c1a584f --- /dev/null +++ b/packages/SettingsLib/SliderPreference/Android.bp @@ -0,0 +1,31 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +android_library { + name: "SettingsLibSliderPreference", + use_resource_processor: true, + defaults: [ + "SettingsLintDefaults", + ], + + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + + static_libs: [ + "androidx.annotation_annotation", + "androidx.preference_preference", + "SettingsLibSettingsTheme", + ], + + sdk_version: "system_current", + min_sdk_version: "23", + apex_available: [ + "//apex_available:platform", + ], +} diff --git a/packages/SettingsLib/SliderPreference/AndroidManifest.xml b/packages/SettingsLib/SliderPreference/AndroidManifest.xml new file mode 100644 index 000000000000..04a67524124d --- /dev/null +++ b/packages/SettingsLib/SliderPreference/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.settingslib.widget.preference.slider"> + + <uses-sdk android:minSdkVersion="23" /> + +</manifest> diff --git a/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_layout_slider.xml b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_layout_slider.xml new file mode 100644 index 000000000000..a9cc2c405f8d --- /dev/null +++ b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_layout_slider.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipChildren="false" + android:gravity="center_vertical"> + + <FrameLayout + android:id="@+id/icon_start_frame" + android:layout_width="@dimen/settingslib_expressive_space_medium4" + android:layout_height="@dimen/settingslib_expressive_space_medium4" + android:clipChildren="false" + android:focusable="true" + android:visibility="gone"> + + <ImageView + android:id="@+id/icon_start" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:adjustViewBounds="true" + android:focusable="false" + android:tint="?android:attr/textColorPrimary" + android:tintMode="src_in" /> + </FrameLayout> + + <com.google.android.material.slider.Slider + android:id="@+id/slider" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:theme="@style/Theme.MaterialComponents.DayNight" /> + + <FrameLayout + android:id="@+id/icon_end_frame" + android:layout_width="@dimen/settingslib_expressive_space_medium4" + android:layout_height="@dimen/settingslib_expressive_space_medium4" + android:clipChildren="false" + android:focusable="true" + android:visibility="gone"> + + <ImageView + android:id="@+id/icon_end" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:adjustViewBounds="true" + android:focusable="false" + android:tint="?android:attr/textColorPrimary" + android:tintMode="src_in" /> + </FrameLayout> +</LinearLayout> diff --git a/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_preference_slider.xml b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_preference_slider.xml new file mode 100644 index 000000000000..27720919b5e6 --- /dev/null +++ b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_preference_slider.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_vertical" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:orientation="horizontal" + android:background="?android:attr/selectableItemBackground" + android:clipToPadding="false" + android:baselineAligned="false"> + + <include layout="@layout/settingslib_icon_frame"/> + + <RelativeLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:paddingVertical="@dimen/settingslib_expressive_space_small1"> + + <TextView + android:id="@android:id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="start" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceListItem" + android:maxLines="2" + android:ellipsize="marquee"/> + + <TextView + android:id="@android:id/summary" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@android:id/title" + android:layout_alignLeft="@android:id/title" + android:layout_alignStart="@android:id/title" + android:layout_gravity="start" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceListItemSecondary" + android:textColor="?android:attr/textColorSecondary" + android:maxLines="10"/> + + <include + layout="@layout/settingslib_expressive_layout_slider" + android:id="@+id/slider_frame" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignStart="@android:id/summary" + android:layout_below="@android:id/summary" /> + + <LinearLayout + android:id="@+id/label_frame" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/slider_frame" + android:orientation="horizontal" + android:visibility="gone"> + + <TextView + android:id="@android:id/text1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="start|top" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorSecondary" + android:gravity="start" + android:layout_weight="1"/> + + <TextView + android:id="@android:id/text2" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="end|top" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorSecondary" + android:gravity="end" + android:layout_weight="1"/> + </LinearLayout> + + </RelativeLayout> +</LinearLayout>
\ No newline at end of file diff --git a/packages/SettingsLib/SliderPreference/res/values/attrs_expressive.xml b/packages/SettingsLib/SliderPreference/res/values/attrs_expressive.xml new file mode 100644 index 000000000000..59464099e228 --- /dev/null +++ b/packages/SettingsLib/SliderPreference/res/values/attrs_expressive.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <!-- For SliderPreference --> + <declare-styleable name="SliderPreference"> + <attr name="textStart" format="reference" /> + <attr name="textEnd" format="reference" /> + <attr name="iconStart" format="reference" /> + <attr name="iconEnd" format="reference" /> + <attr name="iconStartContentDescription" format="reference" /> + <attr name="iconEndContentDescription" format="reference" /> + </declare-styleable> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SliderPreference/res/values/colors_expressive.xml b/packages/SettingsLib/SliderPreference/res/values/colors_expressive.xml new file mode 100644 index 000000000000..803b7a41cffe --- /dev/null +++ b/packages/SettingsLib/SliderPreference/res/values/colors_expressive.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + <color name="settingslib_expressive_color_slider_track_active">@color/settingslib_materialColorPrimary</color> + <color name="settingslib_expressive_color_slider_track_inactive">@color/settingslib_materialColorSurfaceContainerHighest</color> + <color name="settingslib_expressive_color_slider_thumb">@color/settingslib_materialColorPrimary</color> + <color name="settingslib_expressive_color_slider_halo">@android:color/transparent</color> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SliderPreference/res/values/dimens_expressive.xml b/packages/SettingsLib/SliderPreference/res/values/dimens_expressive.xml new file mode 100644 index 000000000000..faae8bcf7e59 --- /dev/null +++ b/packages/SettingsLib/SliderPreference/res/values/dimens_expressive.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<resources> + <dimen name="settingslib_expressive_slider_track_height">@dimen/settingslib_expressive_space_small1</dimen> + <dimen name="settingslib_expressive_slider_track_inside_corner_size">@dimen/settingslib_expressive_space_extrasmall1</dimen> + <dimen name="settingslib_expressive_slider_track_stop_indicator_size">@dimen/settingslib_expressive_space_extrasmall2</dimen> + <dimen name="settingslib_expressive_slider_thumb_width">@dimen/settingslib_expressive_space_extrasmall2</dimen> + <dimen name="settingslib_expressive_slider_thumb_height">44dp</dimen> + <dimen name="settingslib_expressive_slider_thumb_elevation">@dimen/settingslib_expressive_space_none</dimen> + <dimen name="settingslib_expressive_slider_thumb_stroke_width">@dimen/settingslib_expressive_space_extrasmall2</dimen> + <dimen name="settingslib_expressive_slider_thumb_track_gap_size">@dimen/settingslib_expressive_space_extrasmall3</dimen> + <dimen name="settingslib_expressive_slider_tick_radius">@dimen/settingslib_expressive_radius_extrasmall1</dimen> + +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java new file mode 100644 index 000000000000..1815d040bb18 --- /dev/null +++ b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java @@ -0,0 +1,668 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +import com.android.settingslib.widget.preference.slider.R; + +import com.google.android.material.slider.LabelFormatter; +import com.google.android.material.slider.Slider; + +/** + * A {@link Preference} that displays a {@link Slider}. + */ +public class SliderPreference extends Preference { + private static final String TAG = "SliderPreference"; + + private final int mTextStartId; + private final int mTextEndId; + private final int mIconStartId; + private final int mIconEndId; + private final int mIconStartContentDescriptionId; + private final int mIconEndContentDescriptionId; + private final ColorStateList mTrackActiveColor; + private final ColorStateList mTrackInactiveColor; + private final ColorStateList mThumbColor; + private final ColorStateList mHaloColor; + private final int mTrackHeight; + private final int mTrackInsideCornerSize; + private final int mTrackStopIndicatorSize; + private final int mThumbWidth; + private final int mThumbHeight; + private final int mThumbElevation; + private final int mThumbStrokeWidth; + private final int mThumbTrackGapSize; + private final int mTickRadius; + @Nullable private Slider mSlider; + private int mSliderValue; + private int mMin; + private int mMax; + private int mSliderIncrement; + private boolean mAdjustable; + private boolean mTrackingTouch; + + /** + * Listener reacting to the user pressing DPAD left/right keys if {@code + * adjustable} attribute is set to true; it transfers the key presses to the {@link Slider} + * to be handled accordingly. + */ + private final View.OnKeyListener mSliderKeyListener = new View.OnKeyListener() { + @Override + public boolean onKey(@NonNull View v, int keyCode, @NonNull KeyEvent event) { + if (event.getAction() != KeyEvent.ACTION_DOWN) { + return false; + } + + if (!mAdjustable && (keyCode == KeyEvent.KEYCODE_DPAD_LEFT + || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)) { + // Right or left keys are pressed when in non-adjustable mode; Skip the keys. + return false; + } + + // We don't want to propagate the click keys down to the Slider since it will + // create the ripple effect for the thumb. + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { + return false; + } + + if (mSlider == null) { + Log.e(TAG, "Slider view is null and hence cannot be adjusted."); + return false; + } + return mSlider.onKeyDown(keyCode, event); + } + }; + /** + * Listener reacting to the {@link Slider} touch event by the user + */ + private final Slider.OnSliderTouchListener mTouchListener = new Slider.OnSliderTouchListener() { + @Override + public void onStopTrackingTouch(@NonNull Slider slider) { + mTrackingTouch = false; + if ((int) slider.getValue() != mSliderValue) { + syncValueInternal(slider); + } + } + + @Override + public void onStartTrackingTouch(@NonNull Slider slider) { + mTrackingTouch = true; + } + }; + private LabelFormatter mLabelFormater; + // Whether the SliderPreference should continuously save the Slider value while it is being + // dragged. + private boolean mUpdatesContinuously; + /** + * Listener reacting to the {@link Slider} changing value by the user + */ + private final Slider.OnChangeListener mChangeListener = new Slider.OnChangeListener() { + @Override + public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { + if (fromUser && (mUpdatesContinuously || !mTrackingTouch)) { + syncValueInternal(slider); + } + } + }; + // Whether to show the Slider value TextView next to the bar + private boolean mShowSliderValue; + + public SliderPreference(@NonNull Context context, + @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + setLayoutResource(R.layout.settingslib_expressive_preference_slider); + + TypedArray a = context.obtainStyledAttributes( + attrs, androidx.preference.R.styleable.SeekBarPreference, defStyleAttr, + 0 /*defStyleRes*/); + + // The ordering of these two statements are important. If we want to set max first, we need + // to perform the same steps by changing min/max to max/min as following: + // mMax = a.getInt(...) and setMin(...). + mMin = a.getInt(androidx.preference.R.styleable.SeekBarPreference_min, 0); + setMax(a.getInt(androidx.preference.R.styleable.SeekBarPreference_android_max, 100)); + setSliderIncrement( + a.getInt(androidx.preference.R.styleable.SeekBarPreference_seekBarIncrement, 0)); + mAdjustable = a.getBoolean(androidx.preference.R.styleable.SeekBarPreference_adjustable, + true); + mShowSliderValue = a.getBoolean( + androidx.preference.R.styleable.SeekBarPreference_showSeekBarValue, false); + mUpdatesContinuously = a.getBoolean( + androidx.preference.R.styleable.SeekBarPreference_updatesContinuously, + false); + a.recycle(); + + a = context.obtainStyledAttributes(attrs, + R.styleable.SliderPreference); + mTextStartId = a.getResourceId( + R.styleable.SliderPreference_textStart, /* defValue= */ 0); + mTextEndId = a.getResourceId( + R.styleable.SliderPreference_textEnd, /* defValue= */ 0); + mIconStartId = a.getResourceId( + R.styleable.SliderPreference_iconStart, /* defValue= */ 0); + mIconEndId = a.getResourceId( + R.styleable.SliderPreference_iconEnd, /* defValue= */ 0); + + mIconStartContentDescriptionId = a.getResourceId( + R.styleable.SliderPreference_iconStartContentDescription, + /* defValue= */ 0); + + mIconEndContentDescriptionId = a.getResourceId( + R.styleable.SliderPreference_iconEndContentDescription, + /* defValue= */ 0); + a.recycle(); + + mTrackActiveColor = context.getColorStateList( + R.color.settingslib_expressive_color_slider_track_active); + mTrackInactiveColor = context.getColorStateList( + R.color.settingslib_expressive_color_slider_track_inactive); + mThumbColor = context.getColorStateList( + R.color.settingslib_expressive_color_slider_thumb); + mHaloColor = context.getColorStateList(R.color.settingslib_expressive_color_slider_halo); + + Resources res = context.getResources(); + mTrackHeight = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_track_height); + mTrackInsideCornerSize = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_track_inside_corner_size); + mTrackStopIndicatorSize = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_track_stop_indicator_size); + mThumbWidth = res.getDimensionPixelSize(R.dimen.settingslib_expressive_slider_thumb_width); + mThumbHeight = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_thumb_height); + mThumbElevation = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_thumb_elevation); + mThumbStrokeWidth = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_thumb_stroke_width); + mThumbTrackGapSize = res.getDimensionPixelSize( + R.dimen.settingslib_expressive_slider_thumb_track_gap_size); + mTickRadius = res.getDimensionPixelSize(R.dimen.settingslib_expressive_slider_tick_radius); + } + + /** + * Constructor that is called when inflating a preference from XML. This is called when a + * preference is being constructed from an XML file, supplying attributes that were specified + * in the XML file. This version uses a default style of 0, so the only attribute values + * applied are those in the Context's Theme and the given AttributeSet. + * + * @param context The Context this is associated with, through which it can access the + * current theme, resources, etc. + * @param attrs The attributes of the XML tag that is inflating the preference + */ + public SliderPreference(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0 /* defStyleAttr */); + } + + /** + * Constructor to create a slider preference. + * + * @param context The Context this is associated with, through which it can access the + * current theme, resources, etc. + */ + public SliderPreference(@NonNull Context context) { + this(context, null); + } + + private static void setIconViewAndFrameEnabled(View iconView, ViewGroup iconFrame, + boolean enabled) { + iconView.setEnabled(enabled); + iconFrame.setEnabled(enabled); + } + + @Override + public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + holder.itemView.setOnKeyListener(mSliderKeyListener); + mSlider = (Slider) holder.findViewById(R.id.slider); + + if (mSlider == null) { + Log.e(TAG, "Slider is null in onBindViewHolder."); + return; + } + + if (mShowSliderValue) { + mSlider.setLabelBehavior(LabelFormatter.LABEL_FLOATING); + } else { + mSlider.setLabelBehavior(LabelFormatter.LABEL_GONE); + } + if (mLabelFormater != null) { + mSlider.setLabelFormatter(mLabelFormater); + } + if (mSliderIncrement != 0) { + mSlider.setStepSize(mSliderIncrement); + } else { + mSliderIncrement = (int) (mSlider.getStepSize()); + } + mSlider.setValueFrom(mMin); + mSlider.setValueTo(mMax); + mSlider.setValue(mSliderValue); + mSlider.addOnSliderTouchListener(mTouchListener); + mSlider.addOnChangeListener(mChangeListener); + mSlider.setEnabled(isEnabled()); + + // Set up slider color + mSlider.setTrackActiveTintList(mTrackActiveColor); + mSlider.setTrackInactiveTintList(mTrackInactiveColor); + mSlider.setThumbTintList(mThumbColor); + mSlider.setHaloTintList(mHaloColor); + mSlider.setTickActiveTintList(mTrackInactiveColor); + mSlider.setTickInactiveTintList(mTrackActiveColor); + + // Set up slider size + if (SettingsThemeHelper.isExpressiveTheme(getContext())) { + mSlider.setTrackHeight(mTrackHeight); + // need to drop 1.12.0 to Android + mSlider.setTrackInsideCornerSize(mTrackInsideCornerSize); + mSlider.setTrackStopIndicatorSize(mTrackStopIndicatorSize); + mSlider.setThumbWidth(mThumbWidth); + mSlider.setThumbHeight(mThumbHeight); + mSlider.setThumbElevation(mThumbElevation); + mSlider.setThumbStrokeWidth(mThumbStrokeWidth); + mSlider.setThumbTrackGapSize(mThumbTrackGapSize); + mSlider.setTickActiveRadius(mTickRadius); + mSlider.setTickInactiveRadius(mTickRadius); + } + + TextView startText = (TextView) holder.findViewById(android.R.id.text1); + if (mTextStartId > 0 && startText != null) { + startText.setText(mTextStartId); + } + + TextView endText = (TextView) holder.findViewById(android.R.id.text2); + if (mTextEndId > 0 && endText != null) { + endText.setText(mTextEndId); + } + + View labelFrame = holder.findViewById(R.id.label_frame); + if (labelFrame != null) { + boolean isValidTextResIdExist = mTextStartId > 0 || mTextEndId > 0; + labelFrame.setVisibility(isValidTextResIdExist ? View.VISIBLE : View.GONE); + } + + ImageView iconStartView = (ImageView) holder.findViewById(R.id.icon_start); + updateIconStartIfNeeded(iconStartView); + + ImageView iconEndView = (ImageView) holder.findViewById(R.id.icon_end); + updateIconEndIfNeeded(iconEndView); + } + + /** + * Gets the lower bound set on the {@link Slider}. + * + * @return The lower bound set + */ + public int getMin() { + return mMin; + } + + /** + * Sets the lower bound on the {@link Slider}. + * + * @param min The lower bound to set + */ + public void setMin(int min) { + if (min > mMax) { + min = mMax; + } + if (min != mMin) { + mMin = min; + notifyChanged(); + } + } + + /** + * Gets the upper bound set on the {@link Slider}. + * + * @return The upper bound set + */ + public int getMax() { + return mMax; + } + + /** + * Sets the upper bound on the {@link Slider}. + * + * @param max The upper bound to set + */ + public final void setMax(int max) { + if (max < mMin) { + max = mMin; + } + if (max != mMax) { + mMax = max; + notifyChanged(); + } + } + + public final int getSliderIncrement() { + return mSliderIncrement; + } + + /** + * Sets the increment amount on the {@link Slider} for each arrow key press. + * + * @param sliderIncrement The amount to increment or decrement when the user presses an + * arrow key. + */ + public final void setSliderIncrement(int sliderIncrement) { + if (sliderIncrement != mSliderIncrement) { + mSliderIncrement = Math.min(mMax - mMin, Math.abs(sliderIncrement)); + notifyChanged(); + } + } + + /** + * Gets whether the {@link Slider} should respond to the left/right keys. + * + * @return Whether the {@link Slider} should respond to the left/right keys + */ + public boolean isAdjustable() { + return mAdjustable; + } + + /** + * Sets whether the {@link Slider} should respond to the left/right keys. + * + * @param adjustable Whether the {@link Slider} should respond to the left/right keys + */ + public void setAdjustable(boolean adjustable) { + mAdjustable = adjustable; + } + + /** + * Gets whether the {@link SliderPreference} should continuously save the {@link Slider} value + * while it is being dragged. Note that when the value is true, + * {@link Preference.OnPreferenceChangeListener} will be called continuously as well. + * + * @return Whether the {@link SliderPreference} should continuously save the {@link Slider} + * value while it is being dragged + * @see #setUpdatesContinuously(boolean) + */ + public boolean getUpdatesContinuously() { + return mUpdatesContinuously; + } + + /** + * Sets whether the {@link SliderPreference} should continuously save the {@link Slider} value + * while it is being dragged. + * + * @param updatesContinuously Whether the {@link SliderPreference} should continuously save + * the {@link Slider} value while it is being dragged + * @see #getUpdatesContinuously() + */ + public void setUpdatesContinuously(boolean updatesContinuously) { + mUpdatesContinuously = updatesContinuously; + } + + /** + * Gets whether the current {@link Slider} value is displayed to the user. + * + * @return Whether the current {@link Slider} value is displayed to the user + * @see #setShowSliderValue(boolean) + */ + public boolean getShowSliderValue() { + return mShowSliderValue; + } + + /** + * Sets whether the current {@link Slider} value is displayed to the user. + * + * @param showSliderValue Whether the current {@link Slider} value is displayed to the user + * @see #getShowSliderValue() + */ + public void setShowSliderValue(boolean showSliderValue) { + mShowSliderValue = showSliderValue; + notifyChanged(); + } + + public void setLabelFormater(@Nullable LabelFormatter formater) { + mLabelFormater = formater; + } + + /** + * Gets the current progress of the {@link Slider}. + * + * @return The current progress of the {@link Slider} + */ + public int getValue() { + return mSliderValue; + } + + /** + * Sets the current progress of the {@link Slider}. + * + * @param sliderValue The current progress of the {@link Slider} + */ + public void setValue(int sliderValue) { + setValueInternal(sliderValue, true); + } + + @Override + protected void onSetInitialValue(@Nullable Object defaultValue) { + if (defaultValue == null) { + defaultValue = 0; + } + setValue(getPersistedInt((Integer) defaultValue)); + } + + @Override + protected @Nullable Object onGetDefaultValue(@NonNull TypedArray a, int index) { + return a.getInt(index, 0); + } + + /** + * Persist the {@link Slider}'s Slider value if callChangeListener returns true, otherwise + * set the {@link Slider}'s value to the stored value. + */ + void syncValueInternal(@NonNull Slider slider) { + int sliderValue = mMin + (int) slider.getValue(); + if (sliderValue != mSliderValue) { + if (callChangeListener(sliderValue)) { + setValueInternal(sliderValue, false); + // TODO: mHapticFeedbackMode + } else { + slider.setValue(mSliderValue); + } + } + } + + private void setValueInternal(int sliderValue, boolean notifyChanged) { + if (sliderValue < mMin) { + sliderValue = mMin; + } + if (sliderValue > mMax) { + sliderValue = mMax; + } + + if (sliderValue != mSliderValue) { + mSliderValue = sliderValue; + persistInt(sliderValue); + if (notifyChanged) { + notifyChanged(); + } + } + } + + @Nullable + @Override + protected Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + if (isPersistent()) { + // No need to save instance state since it's persistent + return superState; + } + + // Save the instance state + SavedState myState = new SavedState(superState); + myState.mSliderValue = mSliderValue; + myState.mMin = mMin; + myState.mMax = mMax; + return myState; + } + + @Override + protected void onRestoreInstanceState(@Nullable Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + // Didn't save state for us in onSaveInstanceState + super.onRestoreInstanceState(state); + return; + } + + // Restore the instance state + SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + mSliderValue = myState.mSliderValue; + mMin = myState.mMin; + mMax = myState.mMax; + notifyChanged(); + } + + private void updateIconStartIfNeeded(ImageView icon) { + if (icon == null) { + return; + } + ViewGroup iconFrame = (ViewGroup) icon.getParent(); + if (iconFrame == null) { + return; + } + + if (mIconStartId == 0 || mSliderIncrement == 0) { + iconFrame.setVisibility(View.GONE); + return; + } + + if (icon.getDrawable() == null) { + icon.setImageResource(mIconStartId); + } + + if (mIconStartContentDescriptionId != 0) { + String contentDescription = + iconFrame.getContext().getString(mIconStartContentDescriptionId); + iconFrame.setContentDescription(contentDescription); + } + + iconFrame.setOnClickListener((view) -> { + if (mSliderValue > 0) { + setValue(mSliderValue - mSliderIncrement); + } + }); + + iconFrame.setVisibility(View.VISIBLE); + setIconViewAndFrameEnabled(icon, iconFrame, mSliderValue > mMin); + } + + private void updateIconEndIfNeeded(ImageView icon) { + if (icon == null) { + return; + } + ViewGroup iconFrame = (ViewGroup) icon.getParent(); + if (iconFrame == null) { + return; + } + + if (mIconEndId == 0 || mSliderIncrement == 0) { + iconFrame.setVisibility(View.GONE); + return; + } + + if (icon.getDrawable() == null) { + icon.setImageResource(mIconEndId); + } + + if (mIconEndContentDescriptionId != 0) { + String contentDescription = + iconFrame.getContext().getString(mIconEndContentDescriptionId); + iconFrame.setContentDescription(contentDescription); + } + + iconFrame.setOnClickListener((view) -> { + if (mSliderValue < mMax) { + setValue(mSliderValue + mSliderIncrement); + } + }); + + iconFrame.setVisibility(View.VISIBLE); + setIconViewAndFrameEnabled(icon, iconFrame, mSliderValue < mMax); + } + + /** + * SavedState, a subclass of {@link BaseSavedState}, will store the state of this preference. + * + * <p>It is important to always call through to super methods. + */ + private static class SavedState extends BaseSavedState { + public static final Parcelable.Creator<SavedState> CREATOR = + new Parcelable.Creator<>() { + @Override + @NonNull + public SavedState createFromParcel(@NonNull Parcel in) { + return new SavedState(in); + } + + @Override + @NonNull + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + + int mSliderValue; + int mMin; + int mMax; + + SavedState(Parcel source) { + super(source); + + // Restore the click counter + mSliderValue = source.readInt(); + mMin = source.readInt(); + mMax = source.readInt(); + } + + SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + super.writeToParcel(dest, flags); + + // Save the click counter + dest.writeInt(mSliderValue); + dest.writeInt(mMin); + dest.writeInt(mMax); + } + } +} diff --git a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt index afced0c8d638..1c5cd2aeaeb6 100644 --- a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt +++ b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt @@ -18,7 +18,9 @@ package com.android.settingslib.widget import android.content.Context import android.os.Build +import android.text.TextUtils import android.util.AttributeSet +import android.view.View import androidx.annotation.RequiresApi import androidx.preference.Preference import androidx.preference.PreferenceViewHolder @@ -33,6 +35,8 @@ open class TopIntroPreference @JvmOverloads constructor( private var isCollapsable: Boolean = false private var minLines: Int = 2 + private var learnMoreListener: View.OnClickListener? = null + private var learnMoreText: CharSequence? = null init { if (SettingsThemeHelper.isExpressiveTheme(context)) { @@ -71,6 +75,10 @@ open class TopIntroPreference @JvmOverloads constructor( setCollapsable(isCollapsable) setMinLines(minLines) setText(title.toString()) + if (learnMoreListener != null) { + setLearnMoreText(learnMoreText) + setLearnMoreAction(learnMoreListener) + } } } @@ -94,6 +102,30 @@ open class TopIntroPreference @JvmOverloads constructor( notifyChanged() } + /** + * Sets the action when clicking on the learn more view. + * @param listener The click listener for learn more. + */ + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) + fun setLearnMoreAction(listener: View.OnClickListener) { + if (learnMoreListener != listener) { + learnMoreListener = listener + notifyChanged() + } + } + + /** + * Sets the text of learn more view. + * @param text The text of learn more. + */ + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) + fun setLearnMoreText(text: CharSequence) { + if (!TextUtils.equals(learnMoreText, text)) { + learnMoreText = text + notifyChanged() + } + } + companion object { private const val DEFAULT_MAX_LINES = 10 private const val DEFAULT_MIN_LINES = 2 diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index de728e27beac..0a507d12a5cb 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Sopas"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Hierdie foon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Hierdie tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Hierdie rekenaar (intern)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofoon (intern)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Gedeaktiveer"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Geaktiveer"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Jou toestel moet herselflaai om hierdie verandering toe te pas. Herselflaai nou of kanselleer."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Bedrade oorfoon"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Oorfoon"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-luidspreker"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofoonsok"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofoon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aan"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 4715109b8f45..057d49249cc7 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"İndicə"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Bu planşet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Bu kompüter (daxili)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (daxili)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Deaktiv"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiv"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bu dəyişikliyin tətbiq edilməsi üçün cihaz yenidən başladılmalıdır. İndi yenidən başladın və ya ləğv edin."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Naqilli qulaqlıq"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Qulaqlıq"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB spikeri"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon yuvası"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktiv"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 2adcc43a885b..a262901b7992 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Толькі што"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Гэты тэлефон"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Гэты планшэт"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Гэты камп’ютар (унутраны)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Мікрафон (унутраны)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Выключана"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Уключана"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Перазагрузіце прыладу, каб прымяніць гэта змяненне. Перазагрузіце ці скасуйце."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Правадныя навушнікі"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Навушнікі"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-дынамік"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Раздым для мікрафона"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Мікрафон USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Уключана"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index df5051f175a8..244a090aa594 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Току-що"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Този телефон"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Този таблет"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Този компютър (вграден)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (вътрешен)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Деактивирано"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Активирано"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"За да бъде приложена тази промяна, устройството ви трябва да бъде рестартирано. Рестартирайте сега или анулирайте."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Слушалки с кабел"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Слушалки"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Високоговорител с USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Жак за микрофон"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Микрофон с USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Включване"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index e7b97236a246..907cee10d23f 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"এখনই"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফোন"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"এই ট্যাবলেট"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"এই কম্পিউটার (ইন্টার্নাল)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"মাইক্রোফোন (ইন্টার্নাল)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"বন্ধ করা আছে"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"চালু করা আছে"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"এই পরিবর্তনটি প্রয়োগ করার জন্য আপনার ডিভাইসটি অবশ্যই রিবুট করতে হবে। এখনই রিবুট করুন বা বাতিল করুন।"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"তারযুক্ত হেডফোন"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"হেডফোন"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB স্পিকার"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"মাইকের জ্যাক"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB মাইক"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"চালু আছে"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index e8d4a7c807cc..6b09b51a2f68 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -582,7 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ovaj tablet"</string> - <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovo računalo (interno)"</string> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovaj računar (interno)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interni)"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index d75e3142a8f9..305772989db9 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -692,7 +692,7 @@ <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Connector per al micròfon"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micròfon USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activa"</string> - <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactiva"</string> + <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactivat"</string> <string name="carrier_network_change_mode" msgid="4257621815706644026">"S\'està canviant la xarxa de l\'operador de telefonia mòbil"</string> <string name="data_connection_3g" msgid="931852552688157407">"3G"</string> <string name="data_connection_edge" msgid="4625509456544797637">"EDGE"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index e77505017842..d274e850c0f0 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Právě teď"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tento tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Tento počítač (interní)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interní)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Vypnuto"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Zapnuto"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Aby se tato změna projevila, je třeba zařízení restartovat. Restartujte zařízení nebo zrušte akci."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kabelová sluchátka"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Sluchátka"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB reproduktor"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Konektor mikrofonu"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Zapnout"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index a85bc291afa2..ef37c658ffeb 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Lige nu"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Denne tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Denne computer (intern)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (indbygget)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Deaktiveret"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiveret"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Din enhed skal genstartes for at anvende denne ændring. Genstart nu, eller annuller."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Høretelefoner med ledning"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Høretelefoner"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-højttaler"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Stik til mikrofon"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Til"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 9ba5b50982bf..44f7329bc8db 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Gerade eben"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Dieses Smartphone"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Dieses Tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Dieser Computer (intern)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (intern)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Deaktiviert"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiviert"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Damit diese Änderung übernommen wird, musst du dein Gerät neu starten. Du kannst es jetzt neu starten oder den Vorgang abbrechen."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kabelgebundene Kopfhörer"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kopfhörer"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-Lautsprecher"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonanschluss"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB‑Mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"An"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index ce045a9cb275..9cfceb56751c 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -287,7 +287,7 @@ <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Να επιτρέπεται το ξεκλείδωμα λειτουργίας εκκίνησης"</string> <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Να επιτρέπεται το ξεκλείδωμα OEM;"</string> <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Οι λειτουργίες προστασίας συσκευής δεν θα λειτουργούν σε αυτήν τη συσκευή, όταν είναι ενεργοποιημένη αυτή η ρύθμιση."</string> - <string name="mock_location_app" msgid="6269380172542248304">"Επιλογή εφ/γής τεχνητής τοπ/σίας"</string> + <string name="mock_location_app" msgid="6269380172542248304">"Επιλογή εφαρμ. τεχνητής τοποθ."</string> <string name="mock_location_app_not_set" msgid="6972032787262831155">"Δεν ορίστηκε εφαρμογή τεχνητής τοποθεσίας"</string> <string name="mock_location_app_set" msgid="4706722469342913843">"Εφαρμογή τεχνητής τοποθεσίας: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="6829757985772659599">"Δικτύωση"</string> @@ -329,7 +329,7 @@ <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Όταν ενεργοποιηθεί αυτή η λειτουργία, η διεύθυνση MAC αυτής της συσκευής μπορεί να αλλάζει κάθε φορά που συνδέεται σε ένα δίκτυο όπου έχει ενεργοποιηθεί η τυχαία σειρά διευθύνσεων MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Μέτρηση με βάση τη χρήση"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Χωρίς μέτρηση με βάση τη χρήση"</string> - <string name="select_logd_size_title" msgid="1604578195914595173">"Μέγεθος προσωρινής μνήμης για τη λειτουργία καταγραφής"</string> + <string name="select_logd_size_title" msgid="1604578195914595173">"Μέγεθος προσωρινής μνήμης για τη λειτ. καταγραφής"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Μέγεθος αρχείων κατ/φής ανά προ/νή μνήμη αρχείου κατ/φής"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Εκκαθάριση αποθηκευτικού χώρου μόνιμων αρχείων καταγραφής;"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Όταν δεν γίνεται πλέον παρακολούθηση με μόνιμο αρχείο καταγραφής, θα πρέπει να διαγραφούν τα δεδομένα του αρχείου καταγραφής στη συσκευή σας."</string> @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Μόλις τώρα"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Αυτό το τηλέφωνο"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Αυτό το tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Αυτός ο υπολογιστής (εσωτερ.)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Μικρόφωνο (εσωτερικό)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ανενεργή"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ενεργή"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Για να εφαρμοστεί αυτή η αλλαγή, θα πρέπει να επανεκκινήσετε τη συσκευή σας. Επανεκκίνηση τώρα ή ακύρωση."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Ενσύρματα ακουστικά"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Ακουστικά"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Ηχείο USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Υποδοχή μικροφώνου"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Μικρόφωνο USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ενεργό"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index b0d360d582f6..d6222ac07660 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Recién"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Esta computadora (interna)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Inhabilitado"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Habilitado"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Debes reiniciar el dispositivo para que se aplique el cambio. Reinícialo ahora o cancela la acción."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculares con cable"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculares"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Bocina USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector para micrófono"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activar"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 716713a6fb6a..d88634e2e72e 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"justo ahora"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este ordenador (interno)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Inhabilitado"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Habilitado"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Es necesario reiniciar tu dispositivo para que se apliquen los cambios. Reinicia ahora o cancela la acción."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculares con cable"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculares"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altavoz USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector jack para micrófono"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activado"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index f1975fa4c402..e3020be848ab 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Äsja"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"See telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"See tahvelarvuti"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"See arvuti (sisemine)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (sisemine)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Keelatud"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Lubatud"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Selle muudatuse rakendamiseks tuleb seade taaskäivitada. Taaskäivitage kohe või tühistage."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Juhtmega kõrvaklapid"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kõrvaklapid"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB kõlar"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofoni pistikupesa"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Sees"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index fc4157c5e560..da47004793bc 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefono hau"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tableta hau"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ordenagailu hau (barnekoa)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofonoa (barnekoa)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desgaituta"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Gaituta"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Aldaketa aplikatzeko, berrabiarazi egin behar da gailua. Berrabiaraz ezazu orain, edo utzi bertan behera."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Entzungailu kableduna"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Entzungailua"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB bidezko bozgorailua"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonoaren konektorea"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB bidezko mikrofonoa"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktibatu"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 3dc0e8573a95..5996efb9a9a7 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -239,10 +239,10 @@ <string name="category_work" msgid="4014193632325996115">"کاری"</string> <string name="category_private" msgid="4244892185452788977">"خصوصی"</string> <string name="category_clone" msgid="1554511758987195974">"همسانهسازی"</string> - <string name="development_settings_title" msgid="140296922921597393">"گزینههای برنامهنویسان"</string> - <string name="development_settings_enable" msgid="4285094651288242183">"فعال کردن گزینههای برنامهنویس"</string> + <string name="development_settings_title" msgid="140296922921597393">"گزینههای توسعهدهندگان"</string> + <string name="development_settings_enable" msgid="4285094651288242183">"فعال کردن گزینههای توسعهدهندگان"</string> <string name="development_settings_summary" msgid="8718917813868735095">"تنظیم گزینههای مربوط به طراحی برنامه"</string> - <string name="development_settings_not_available" msgid="355070198089140951">"گزینههای برنامهنویس برای این کاربر موجود نیست"</string> + <string name="development_settings_not_available" msgid="355070198089140951">"گزینههای توسعهدهندگان برای این کاربر موجود نیست"</string> <string name="vpn_settings_not_available" msgid="2894137119965668920">"تنظیمات VPN برای این کاربر در دسترس نیست"</string> <string name="tethering_settings_not_available" msgid="266821736434699780">"تنظیمات اشتراکگذاری اینترنت برای این کاربر در دسترس نیست"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"تنظیمات نام تقطه دسترسی برای این کاربر در دسترس نیست"</string> @@ -287,8 +287,8 @@ <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"اجازه دهید قفل بوتلودر باز شود"</string> <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"بازکردن سازنده تجهیزات اصلی مجاز (OEM) است؟"</string> <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"اخطار: قابلیتهای حفاظتی دستگاه وقتی این تنظیم روشن است در این دستگاه کار نمیکند."</string> - <string name="mock_location_app" msgid="6269380172542248304">"انتخاب برنامه موقعیت مکانی ساختگی"</string> - <string name="mock_location_app_not_set" msgid="6972032787262831155">"هیچ برنامه موقعیت مکانی ساختگی تنظیم نشده است"</string> + <string name="mock_location_app" msgid="6269380172542248304">"انتخاب برنامه مکان ساختگی"</string> + <string name="mock_location_app_not_set" msgid="6972032787262831155">"برنامه مکان ساختگی تنظیم نشده است"</string> <string name="mock_location_app_set" msgid="4706722469342913843">"برنامه موقعیت مکانی ساختگی: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="6829757985772659599">"شبکه"</string> <string name="wifi_display_certification" msgid="1805579519992520381">"گواهینامه نمایش بیسیم"</string> @@ -376,7 +376,7 @@ <string name="strict_mode_summary" msgid="1838248687233554654">"چشمک زدن صفحه هنگام انجام عملیات طولانی توسط برنامهها در رشته اصلی"</string> <string name="pointer_location" msgid="7516929526199520173">"محل اشارهگر"</string> <string name="pointer_location_summary" msgid="957120116989798464">"همپوشانی صفحهنمایش با نمایش داده لمسی فعلی"</string> - <string name="show_touches" msgid="8437666942161289025">"نمایش ضربهها"</string> + <string name="show_touches" msgid="8437666942161289025">"نمایش تکضربها"</string> <string name="show_touches_summary" msgid="3692861665994502193">"نمایش بازخورد تصویری برای ضربهها"</string> <string name="show_key_presses" msgid="6360141722735900214">"نمایش فشار کلیدها"</string> <string name="show_key_presses_summary" msgid="725387457373015024">"نمایش بازخورد بصری برای فشار دادن کلیدهای فیزیکی"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index b92616bc8f1f..6877d75de324 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tämä puhelin"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tämä tabletti"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Tämä tietokone (sisäinen)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofoni (sisäinen)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ei käytössä"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Käytössä"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Laitteesi on käynnistettävä uudelleen, jotta muutos tulee voimaan. Käynnistä uudelleen nyt tai peru."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Langalliset kuulokkeet"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kuulokkeet"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-kaiutin"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofoniliitäntä"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofoni"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Päällä"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index bf9adbae0622..b3946ce23688 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Cette tablette"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Cet ordinateur (interne)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (interne)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Désactivé"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activé"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Votre appareil doit être redémarré pour que ce changement prenne effet. Redémarrez-le maintenant ou annulez la modification."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Écouteurs filaires"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Écouteurs"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Haut-parleur à port USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Prise du microphone"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microphone USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activé"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 0df9489dc60e..13d57ed6ce2d 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Cette tablette"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Cet ordinateur (interne)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micro (interne)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Désactivé"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activé"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Vous devez redémarrer l\'appareil pour que cette modification soit appliquée. Redémarrez maintenant ou annulez l\'opération."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Casque filaire"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Casque audio"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Haut-parleur USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Connecteur micro"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micro USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Allumé"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 98a1401f3568..d95e676961b0 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tableta"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este ordenador (interno)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desactivado"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activado"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necesario reiniciar o teu dispositivo para aplicar este cambio. Reiníciao agora ou cancela o cambio."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculares con cable"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculares"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altofalante USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector do micrófono"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activada"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 62f4777c2337..6cb447ee192d 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Az imént"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ez a telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ez a táblagép"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ez a számítógép (belső)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (belső)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Letiltva"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Engedélyezve"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Az eszközt újra kell indítani, hogy a módosítás megtörténjen. Indítsa újra most, vagy vesse el a módosítást."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Vezetékes fejhallgató"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fejhallgató"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-hangszóró"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon jack csatlakozója"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Be"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index ba4e2043827f..0e25b7904548 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Այս հեռախոսը"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Այս պլանշետը"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Այս համակարգիչը (ներքին)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Խոսափող (ներքին)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Անջատված է"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Միացված է"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Սարքն անհրաժեշտ է վերագործարկել, որպեսզի փոփոխությունը կիրառվի։ Վերագործարկեք հիմա կամ չեղարկեք փոփոխությունը։"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Լարով ականջակալ"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Ականջակալ"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB բարձրախոս"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Խոսափողի հարակցիչ"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB խոսափող"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Միացնել"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 89d82f002fa9..ceb948daa72c 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Baru saja"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ponsel ini"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tablet ini"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Komputer ini (internal)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (internal)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Nonaktif"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktif"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Perangkat Anda harus di-reboot agar perubahan ini diterapkan. Reboot sekarang atau batalkan."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Headphone berkabel"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Speaker USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Colokan mikrofon"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktif"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index b5d1831ad27a..fd31a6f99c6e 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Rétt í þessu"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Þessi sími"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Þessi spjaldtölva"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Þessi tölva (innbyggður)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Hljóðnemi (innbyggður)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Slökkt"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Virkt"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Endurræsa þarf tækið til að þessi breyting taki gildi. Endurræstu núna eða hættu við."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Heyrnartól með snúru"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Heyrnartól"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-hátalari"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Hljóðnematengi"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-hljóðnemi"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Kveikt"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 1436c1733ebd..c2931fc2d257 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Questo smartphone"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Questo tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Questo computer (interno)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfono (interno)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Non attivo"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Attivo"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Per applicare questa modifica, devi riavviare il dispositivo. Riavvia ora o annulla."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Cuffie con cavo"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Cuffie"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altoparlante USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Jack per microfono"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfono USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 986fcb978ae4..bcf7e92ae375 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"הרגע"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"הטלפון הזה"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"הטאבלט הזה"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"המחשב הזה (פנימי)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"מיקרופון (פנימי)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"מושבת"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"מופעל"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"צריך להפעיל מחדש את המכשיר כדי להחיל את השינוי. יש להפעיל מחדש עכשיו או לבטל."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"אוזניות חוטיות"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"אוזניות"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"רמקול ב-USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"שקע למיקרופון"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"מיקרופון USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"פועלת"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 6789f409fc2e..4f64bb9cf5d9 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Дәл қазір"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Осы телефон"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Осы планшет"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Осы компьютер (ішкі)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (ішкі)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Өшірулі"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Қосулы"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Бұл өзгеріс күшіне енуі үшін, құрылғыны қайта жүктеу керек. Қазір қайта жүктеңіз не бас тартыңыз."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Сымды құлақаспап"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Құлақаспап"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB динамик"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофон ұяшығы"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофоны"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Қосу"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 29417d600dc3..016f8b9d4003 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"ಇದೀಗ"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ಈ ಫೋನ್"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ಈ ಟ್ಯಾಬ್ಲೆಟ್"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ಈ ಕಂಪ್ಯೂಟರ್ (ಆಂತರಿಕ)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"ಮೈಕ್ರೊಫೋನ್ (ಆಂತರಿಕ)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ಈ ಬದಲಾವಣೆ ಅನ್ವಯವಾಗಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡಬೇಕು. ಇದೀಗ ರೀಬೂಟ್ ಮಾಡಿ ಅಥವಾ ರದ್ದುಗೊಳಿಸಿ."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ವೈಯರ್ ಹೊಂದಿರುವ ಹೆಡ್ಫೋನ್"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ಹೆಡ್ಫೋನ್"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ಸ್ಪೀಕರ್"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ಮೈಕ್ ಜ್ಯಾಕ್"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ಮೈಕ್"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ಆನ್ ಆಗಿದೆ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 4b0cfb4802d7..0af77dd660c0 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"조금 전"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"이 휴대전화"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"이 태블릿"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"이 컴퓨터(내부)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"마이크(내부)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"사용 중지됨"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"사용 설정됨"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"변경사항을 적용하려면 기기를 재부팅해야 합니다. 지금 재부팅하거나 취소하세요."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"유선 헤드폰"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"헤드폰"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB 스피커"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"마이크 잭"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 마이크"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"사용"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 17b55c4ef97a..a3ff033ac0f4 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Жаңы эле"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ушул телефон"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ушул планшет"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Бул компьютер (ички)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (ички)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Өчүк"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Күйүк"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Бул өзгөрүү күчүнө кириши үчүн, түзмөктү өчүрүп күйгүзүңүз. Азыр же кийинчерээк өчүрүп күйгүзсөңүз болот."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Зымдуу гарнитура"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Гарнитура"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB динамиги"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофондун оюкчасы"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофон"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Күйгүзүү"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index e6e8ef89fb74..1d89e3e5e68f 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"ຕອນນີ້"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ໂທລະສັບນີ້"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ແທັບເລັດນີ້"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ຄອມພິວເຕີນີ້ (ພາຍໃນ)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"ໄມໂຄຣໂຟນ (ພາຍໃນ)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ປິດການນຳໃຊ້ແລ້ວ"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ເປີດການນຳໃຊ້ແລ້ວ"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ທ່ານຕ້ອງປິດເປີດອຸປະກອນຄືນໃໝ່ເພື່ອນຳໃຊ້ການປ່ຽນແປງນີ້. ປິດເປີດໃໝ່ດຽວນີ້ ຫຼື ຍົກເລີກ."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ຫູຟັງແບບມີສາຍ"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ຫູຟັງ"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"ລຳໂພງ USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ຊ່ອງສຽງໄມ"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ໄມ USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ເປີດ"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 5945e2a38a7c..265eb9aa0618 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Ką tik"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis telefonas"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Šis planšetinis kompiuteris"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Šis kompiuteris (vidinis)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofonas (vidinis)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Išjungta"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Įgalinta"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Kad pakeitimas būtų pritaikytas, įrenginį reikia paleisti iš naujo. Dabar paleiskite iš naujo arba atšaukite."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Laidinės ausinės"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Ausinės"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB garsiakalbis"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofono jungtis"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofonas"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Įjungta"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 34f6c4c2c120..c24dafbaf278 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Tikko"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis tālrunis"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Šis planšetdators"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Šī datora iekšējais skaļrunis"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofons (iebūvētais)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Atspējots"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Iespējots"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Lai šīs izmaiņas tiktu piemērotas, nepieciešama ierīces atkārtota palaišana. Atkārtoti palaidiet to tūlīt vai atceliet izmaiņas."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Vadu austiņas"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Austiņas"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB skaļrunis"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofona ligzda"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofons"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ieslēgts"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index bc953d374a91..9fdbdc693dc8 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Дөнгөж сая"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Энэ утас"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Энэ таблет"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Энэ компьютер (дотоод)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (дотоод)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Идэвхгүй болгосон"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Идэвхжүүлсэн"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Энэ өөрчлөлтийг хэрэгжүүлэхийн тулд таны төхөөрөмжийг дахин асаах ёстой. Одоо дахин асаах эсвэл цуцлана уу."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Утастай чихэвч"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Чихэвч"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB чанга яригч"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофоны чихэвчний оролт"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофон"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Асаах"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 063fc9c1f268..8fbc8bdc867e 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"ယခုလေးတင်"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ဤဖုန်း"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ဤတက်ဘလက်"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ဤကွန်ပျူတာ (စက်တွင်း)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"မိုက်ခရိုဖုန်း (စက်တွင်း)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ပိတ်ထားသည်"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ဖွင့်ထားသည်"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ဤအပြောင်းအလဲ ထည့်သွင်းရန် သင့်စက်ကို ပြန်လည်စတင်ရမည်။ ယခု ပြန်လည်စတင်ပါ သို့မဟုတ် ပယ်ဖျက်ပါ။"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ကြိုးတပ်နားကြပ်"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"နားကြပ်"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB စပီကာ"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"မိုက်ဂျက်ပင်"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB မိုက်"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ဖွင့်"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 9036c8c80158..569b900bd524 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Nå nettopp"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefonen"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Dette nettbrettet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Denne datamaskinen (intern)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (intern)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Slått av"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Slått på"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Enheten din må startes på nytt for at denne endringen skal tre i kraft. Start på nytt nå eller avbryt."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Hodetelefoner med kabel"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Hodetelefoner"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-høyttaler"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonkontakt"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"På"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 1b2e4217fa5f..c2439f9c304a 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"ଏହିକ୍ଷଣି"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ଏହି ଫୋନ"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ଏହି ଟାବଲେଟ"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ଏହି କମ୍ପ୍ୟୁଟର (ଇଣ୍ଟର୍ନଲ)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"ମାଇକ୍ରୋଫୋନ (ଇଣ୍ଟର୍ନଲ)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ସକ୍ଷମ କରାଯାଇଛି"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ଏହି ପରିବର୍ତ୍ତନ ଲାଗୁ କରିବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିଶ୍ଚିତ ରୂପେ ରିବୁଟ୍ କରାଯିବା ଆବଶ୍ୟକ। ବର୍ତ୍ତମାନ ରିବୁଟ୍ କରନ୍ତୁ କିମ୍ବା ବାତିଲ କରନ୍ତୁ।"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ତାରଯୁକ୍ତ ହେଡଫୋନ"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ହେଡଫୋନ"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ସ୍ପିକର"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ମାଇକ ଜେକ"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ମାଇକ"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ଚାଲୁ ଅଛି"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index c668e1256009..4a4f9248daba 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"ਹੁਣੇ ਹੀ"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ਇਹ ਫ਼ੋਨ"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ਇਹ ਟੈਬਲੈੱਟ"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ਇਸ ਕੰਪਿਊਟਰ \'ਤੇ (ਅੰਦਰੂਨੀ)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ (ਅੰਦਰੂਨੀ)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਰੀਬੂਟ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ। ਹੁਣੇ ਰੀਬੂਟ ਕਰੋ ਜਾਂ ਰੱਦ ਕਰੋ।"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ਤਾਰ ਵਾਲੇ ਹੈੱਡਫ਼ੋਨ"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ਹੈੱਡਫ਼ੋਨ"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ਸਪੀਕਰ"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ਮਾਈਕ ਜੈਕ"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ਮਾਈਕ"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ਚਾਲੂ"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 92ab714d75b0..f489d916fbf0 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este telemóvel"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Este tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este computador (interno)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfone (interno)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativada"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativada"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reiniciar o dispositivo para aplicar esta alteração. Reinicie agora ou cancele."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auscultadores com fios"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auscultadores"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altifalante USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Entrada para microfone"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfone USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ligado"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index e71063464921..f79c2e1e0634 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Chiar acum"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Acest telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Această tabletă"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Acest computer (intern)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfon (intern)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Dezactivat"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activat"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Pentru ca modificarea să se aplice, trebuie să repornești dispozitivul. Repornește-l acum sau anulează."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Căști cu fir"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Căști"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Difuzor USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mufă pentru microfon"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfon USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activat"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index ddb35d6f2119..b1726498b8ce 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Teraz"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefón"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tento tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Tento počítač (interný)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofón (vnútorný)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Vypnuté"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Zapnuté"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Zmena sa prejaví až po reštarte zariadenia. Môžete ho teraz reštartovať alebo akciu zrušiť."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Slúchadlá s káblom"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slúchadlá"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Reproduktor s rozhraním USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Konektor mikrofónu"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofón USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Zapnúť"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index d99f2c8f8ef1..7c210637c360 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Pikërisht tani"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ky telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ky tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ky kompjuter (i brendshëm)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofoni (i brendshëm)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Joaktiv"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiv"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Pajisja jote duhet të riniset që ky ndryshim të zbatohet. Rinise tani ose anuloje."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kufje me tela"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kufje"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altoparlant me USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Fisha e mikrofonit"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofoni me USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktive"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 6b76f879d04f..c553c1d30125 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Nyss"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Den här telefonen"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Den här surfplattan"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Den här datorn (intern)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (inbyggd)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Inaktiverat"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiverat"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Enheten måste startas om för att ändringen ska börja gälla. Starta om nu eller avbryt."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Hörlur med kabel"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Hörlur"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-högtalare"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonuttag"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"På"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index f113e6220b51..6890d550f133 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Sasa hivi"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Simu hii"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Kishikwambi hiki"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Kompyuta hii (spika ya ndani)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Maikrofoni (ya ndani)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Imezimwa"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Imewashwa"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Ni lazima uwashe tena kifaa chako ili mabadiliko haya yatekelezwe. Washa tena sasa au ughairi."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kipokea sauti cha kichwani chenye waya"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kipokea sauti cha kichwani"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Spika ya USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Pini ya maikrofoni"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Maikrofoni ya USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Umewashwa"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index beca7380b007..5664290b0061 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"சற்றுமுன்"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"இந்த மொபைல்"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"இந்த டேப்லெட்"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"இந்தக் கம்ப்யூட்டர் (அகம்)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"மைக்ரோஃபோன் (அகம்)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"முடக்கப்பட்டது"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"இயக்கப்பட்டது"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"இந்த மாற்றங்கள் செயல்படுத்தப்பட உங்கள் சாதனத்தை மறுபடி தொடங்க வேண்டும். இப்போதே மறுபடி தொடங்கவும் அல்லது ரத்துசெய்யவும்."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"வயர்டு ஹெட்ஃபோன்"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ஹெட்ஃபோன்"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ஸ்பீக்கர்"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"மைக் ஜாக்"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB மைக்"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ஆன்"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index d7ad6b1a3184..14c2108a134f 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Az önce"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Bu tablet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Bu bilgisayar (dahili)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (dahili)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Devre dışı"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Etkin"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bu değişikliğin geçerli olması için cihazınızın yeniden başlatılması gerekir. Şimdi yeniden başlatın veya iptal edin."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kablolu kulaklık"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kulaklık"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB hoparlör"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon jakı"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Açık"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 3ccbcf2d4205..25475d573352 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Щойно"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Цей телефон"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Цей планшет"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Цей комп’ютер (внутрішній)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Мікрофон (внутрішній)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Вимкнено"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Увімкнено"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Щоб застосувати ці зміни, потрібний перезапуск. Перезапустіть пристрій або скасуйте зміни."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Дротові навушники"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Навушники"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-динамік"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Гніздо для мікрофона"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-мікрофон"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Увімкнено"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 40d1d10f234b..71fdae2a7714 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Hozir"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Shu telefon"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Shu planshet"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Bu kompyuter (ichki)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (ichki)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Oʻchiq"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Yoniq"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Oʻzgarishlar kuchga kirishi uchun qurilmani oʻchirib yoqing. Buni hozir yoki keyinroq bajarishingiz mumkin."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Simli quloqlik"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Quloqlik"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB karnay"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon ulagichi"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mik"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Yoniq"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 874aa18dc701..f53e8166c1e1 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Vừa xong"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Điện thoại này"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Máy tính bảng này"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Máy tính này (nội bộ)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrô (bên trong)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Đã tắt"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Đã bật"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bạn phải khởi động lại thiết bị để áp dụng sự thay đổi này. Hãy khởi động lại ngay hoặc hủy."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Tai nghe có dây"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Tai nghe"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Loa USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Giắc cắm micrô"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrô có cổng USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Đang bật"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 8edc656b4614..9275f1beed73 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"刚刚"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"这部手机"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"这部平板电脑"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"此计算机(内部)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"麦克风(内部)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"已停用"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"已启用"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"设备必须重新启动才能应用此更改。您可以立即重新启动或取消。"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有线耳机"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"头戴式耳机"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB 音箱"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"麦克风插孔"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 麦克风"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"开启"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 736a30d0d169..4acc52ddc7b9 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"此手機"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"此平板電腦"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"此電腦 (內置)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"麥克風 (內置)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"已停用"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"已啟用"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"你的裝置必須重新開機,才能套用此變更。請立即重新開機或取消。"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有線耳機"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"耳機"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB 喇叭"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"麥克風插孔"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 麥克風"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"開啟"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 692b6e106b23..8ded5d08edce 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"這支手機"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"這台平板電腦"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"這部電腦 (內部)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"麥克風 (內部)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"已停用"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"已啟用"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"裝置必須重新啟動才能套用這項變更。請立即重新啟動或取消變更。"</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有線耳機"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"耳機"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB 喇叭"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"麥克風插孔"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 麥克風"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"開啟"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 4f0acbd292f6..972eed7be319 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -582,8 +582,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Khona manje"</string> <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Le foni"</string> <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Le thebhulethi"</string> - <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) --> - <skip /> + <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Le khompyutha (ngaphakathi)"</string> <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) --> <skip /> <string name="media_transfer_internal_mic" msgid="797333824290228595">"Imakrofoni (okwangaphakathi)"</string> @@ -687,12 +686,9 @@ <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ikhutshaziwe"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Inikwe amandla"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Kufanele idivayisi yakho iqaliswe ukuze lolu shintsho lusebenze. Qalisa manje noma khansela."</string> - <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) --> - <skip /> - <!-- no translation found for media_transfer_headphone_name (1131962659136578852) --> - <skip /> - <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) --> - <skip /> + <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Amahedifoni anentambo"</string> + <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Amahedifoni"</string> + <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Isipikha se-USB"</string> <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Umgodi we-earphone ye-mic"</string> <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"I-mic ye-USB"</string> <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Vuliwe"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index efc98dbf7102..8b9ec389e3fd 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1409,12 +1409,10 @@ <string name="media_transfer_this_device_name">This phone</string> <!-- Name of the tablet device. [CHAR LIMIT=30] --> <string name="media_transfer_this_device_name_tablet">This tablet</string> - <!-- Name of the internal speaker. [CHAR LIMIT=30] --> + <!-- Name of the internal speaker and mic. [CHAR LIMIT=30] --> <string name="media_transfer_this_device_name_desktop">This computer (internal)</string> <!-- Name of the default media output of the TV. [CHAR LIMIT=30] --> <string name="media_transfer_this_device_name_tv">@string/tv_media_transfer_default</string> - <!-- Name of the internal mic. [CHAR LIMIT=30] --> - <string name="media_transfer_internal_mic">Microphone (internal)</string> <!-- Name of the dock device. [CHAR LIMIT=30] --> <string name="media_transfer_dock_speaker_device_name">Dock speaker</string> <!-- Default name of the external device. [CHAR LIMIT=30] --> diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedInterface.kt b/packages/SettingsLib/src/com/android/settingslib/RestrictedInterface.kt new file mode 100644 index 000000000000..14f9a19ee753 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedInterface.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib + +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin + +interface RestrictedInterface { + fun useAdminDisabledSummary(useSummary: Boolean) + + fun checkRestrictionAndSetDisabled(userRestriction: String) + + fun checkRestrictionAndSetDisabled(userRestriction: String, userId: Int) + + /** + * Checks if the given setting is subject to Enhanced Confirmation Mode restrictions for this + * package. Marks the preference as disabled if so. + * + * @param settingIdentifier The key identifying the setting + * @param packageName the package to check the settingIdentifier for + */ + fun checkEcmRestrictionAndSetDisabled( + settingIdentifier: String, + packageName: String + ) + + val isDisabledByAdmin: Boolean + + fun setDisabledByAdmin(admin: EnforcedAdmin?) + + val isDisabledByEcm: Boolean + + val uid: Int + + val packageName: String? +} diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSliderPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSliderPreference.java new file mode 100644 index 000000000000..1dc5281c266c --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSliderPreference.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Process; +import android.os.UserHandle; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.res.TypedArrayUtils; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceViewHolder; + +import com.android.settingslib.widget.SliderPreference; + +/** + * Slide Preference that supports being disabled by a user restriction + * set by a device admin. + */ +public class RestrictedSliderPreference extends SliderPreference implements RestrictedInterface { + RestrictedPreferenceHelper mHelper; + + public RestrictedSliderPreference(@NonNull Context context, @Nullable AttributeSet attrs, + int defStyleAttr, @Nullable String packageName, int uid) { + super(context, attrs, defStyleAttr); + mHelper = new RestrictedPreferenceHelper(context, this, attrs, packageName, uid); + } + + public RestrictedSliderPreference(@NonNull Context context, + @Nullable AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, null, Process.INVALID_UID); + } + + @SuppressLint("RestrictedApi") + public RestrictedSliderPreference(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle, + android.R.attr.preferenceStyle)); + } + + public RestrictedSliderPreference(@NonNull Context context) { + this(context, null); + } + + @SuppressLint("RestrictedApi") + public RestrictedSliderPreference(@NonNull Context context, @Nullable String packageName, + int uid) { + this(context, null, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle, + android.R.attr.preferenceStyle), packageName, uid); + } + + @Override + public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + mHelper.onBindViewHolder(holder); + } + + @SuppressLint("RestrictedApi") + @Override + public void performClick() { + if (!mHelper.performClick()) { + super.performClick(); + } + } + + @Override + public void setEnabled(boolean enabled) { + if (enabled && isDisabledByAdmin()) { + mHelper.setDisabledByAdmin(null); + return; + } + + if (enabled && isDisabledByEcm()) { + mHelper.setDisabledByEcm(null); + return; + } + + super.setEnabled(enabled); + } + + @Override + public void useAdminDisabledSummary(boolean useSummary) { + mHelper.useAdminDisabledSummary(useSummary); + } + + @Override + public void checkRestrictionAndSetDisabled(@NonNull String userRestriction) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); + } + + @Override + public void checkRestrictionAndSetDisabled(@NonNull String userRestriction, int userId) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, userId); + } + + @Override + public void checkEcmRestrictionAndSetDisabled(@NonNull String settingIdentifier, + @NonNull String packageName) { + mHelper.checkEcmRestrictionAndSetDisabled(settingIdentifier, packageName); + } + + @Override + public void setDisabledByAdmin(@Nullable RestrictedLockUtils.EnforcedAdmin admin) { + if (mHelper.setDisabledByAdmin(admin)) { + notifyChanged(); + } + } + + @Override + public boolean isDisabledByAdmin() { + return mHelper.isDisabledByAdmin(); + } + + @Override + public boolean isDisabledByEcm() { + return mHelper.isDisabledByEcm(); + } + + @Override + public int getUid() { + return mHelper != null ? mHelper.uid : Process.INVALID_UID; + } + + @Override + @Nullable + public String getPackageName() { + return mHelper != null ? mHelper.packageName : null; + } + + @Override + protected void onAttachedToHierarchy(@NonNull PreferenceManager preferenceManager) { + mHelper.onAttachedToHierarchy(); + super.onAttachedToHierarchy(preferenceManager); + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java index dae69e64934c..e44a13491758 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java @@ -98,14 +98,13 @@ public class InputMediaDevice extends MediaDevice { @Override public @NonNull String getName() { - CharSequence name = - switch (mAudioDeviceInfoType) { - case TYPE_WIRED_HEADSET -> - mContext.getString(R.string.media_transfer_wired_device_mic_name); - case TYPE_USB_DEVICE, TYPE_USB_HEADSET, TYPE_USB_ACCESSORY -> - mContext.getString(R.string.media_transfer_usb_device_mic_name); - default -> mContext.getString(R.string.media_transfer_internal_mic); - }; + CharSequence name = switch (mAudioDeviceInfoType) { + case TYPE_WIRED_HEADSET -> mContext.getString( + R.string.media_transfer_wired_device_mic_name); + case TYPE_USB_DEVICE, TYPE_USB_HEADSET, TYPE_USB_ACCESSORY -> mContext.getString( + R.string.media_transfer_usb_device_mic_name); + default -> mContext.getString(R.string.media_transfer_this_device_name_desktop); + }; return name.toString(); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java index 088d554326e7..2f0aa1cf0cb9 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java @@ -76,7 +76,7 @@ public class InputMediaDeviceTest { IS_VOLUME_FIXED); assertThat(builtinMediaDevice).isNotNull(); assertThat(builtinMediaDevice.getName()) - .isEqualTo(mContext.getString(R.string.media_transfer_internal_mic)); + .isEqualTo(mContext.getString(R.string.media_transfer_this_device_name_desktop)); } @Test diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt index e41a7df39c21..a88ad946d95b 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt @@ -21,11 +21,10 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope -import com.android.compose.animation.scene.Swipe -import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.systemui.communal.shared.model.CommunalBackgroundType +import com.android.systemui.communal.ui.viewmodel.CommunalUserActionsViewModel import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.communal.util.CommunalColors import com.android.systemui.dagger.SysUISingleton @@ -33,38 +32,32 @@ import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.Scene import javax.inject.Inject -import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow /** The communal scene shows glanceable hub when the device is locked and docked. */ @SysUISingleton class CommunalScene @Inject constructor( - private val viewModel: CommunalViewModel, + private val contentViewModel: CommunalViewModel, + actionsViewModelFactory: CommunalUserActionsViewModel.Factory, private val communalColors: CommunalColors, private val communalContent: CommunalContent, ) : ExclusiveActivatable(), Scene { override val key = Scenes.Communal - override val userActions: Flow<Map<UserAction, UserActionResult>> = - MutableStateFlow( - mapOf( - Swipe(SwipeDirection.End) to Scenes.Lockscreen, - ) - ) - .asStateFlow() + private val actionsViewModel: CommunalUserActionsViewModel = actionsViewModelFactory.create() + + override val userActions: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions override suspend fun onActivated(): Nothing { - awaitCancellation() + actionsViewModel.activate() } @Composable override fun SceneScope.Content(modifier: Modifier) { val backgroundType by - viewModel.communalBackground.collectAsStateWithLifecycle( + contentViewModel.communalBackground.collectAsStateWithLifecycle( initialValue = CommunalBackgroundType.ANIMATED ) @@ -72,7 +65,7 @@ constructor( backgroundType = backgroundType, colors = communalColors, content = communalContent, - viewModel = viewModel, + viewModel = contentViewModel, modifier = modifier.horizontalNestedScrollToScene(), ) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt index 2066c9314bc7..2745f6ea6bb4 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt @@ -259,6 +259,7 @@ fun SceneScope.ConstrainedNotificationStack( HeadsUpNotificationSpace( stackScrollView = stackScrollView, viewModel = viewModel, + useHunBounds = { shouldUseLockscreenHunBounds(layoutState.transitionState) }, modifier = Modifier.align(Alignment.TopCenter), ) NotificationStackCutoffGuideline( @@ -541,6 +542,7 @@ fun SceneScope.NotificationScrollingStack( HeadsUpNotificationSpace( stackScrollView = stackScrollView, viewModel = viewModel, + useHunBounds = { !shouldUseLockscreenHunBounds(layoutState.transitionState) }, modifier = Modifier.padding(top = topPadding), ) } @@ -675,6 +677,14 @@ private fun shouldUseLockscreenStackBounds(state: TransitionState): Boolean { return state is TransitionState.Idle && state.currentScene == Scenes.Lockscreen } +private fun shouldUseLockscreenHunBounds(state: TransitionState): Boolean { + return when (state) { + is TransitionState.Idle -> state.currentScene == Scenes.Lockscreen + is TransitionState.Transition -> + state.isTransitioning(from = Scenes.QuickSettings, to = Scenes.Lockscreen) + } +} + private fun shouldAnimateScrimCornerRadius( state: SceneTransitionLayoutState, shouldPunchHoleBehindScrim: Boolean, diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt index 303a6f0d942a..ac58ab5296f6 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt @@ -85,6 +85,7 @@ val SceneContainerTransitions = transitions { from(Scenes.Shade, to = Scenes.Lockscreen) { reversed { lockscreenToShadeTransition() } sharedElement(Notifications.Elements.NotificationStackPlaceholder, enabled = false) + sharedElement(Notifications.Elements.HeadsUpNotificationPlaceholder, enabled = false) } // Overlay transitions diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt index 4162891c0e0b..6f1349f20e4d 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt @@ -18,7 +18,6 @@ package com.android.systemui.shade.ui.composable -import android.view.HapticFeedbackConstants import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -40,20 +39,17 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.platform.LocalView import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.LowestZIndexContentPicker import com.android.compose.animation.scene.SceneScope import com.android.compose.windowsizeclass.LocalWindowSizeClass -import com.android.systemui.scene.shared.model.Scenes /** Renders a lightweight shade UI container, as an overlay. */ @Composable @@ -62,13 +58,6 @@ fun SceneScope.OverlayShade( modifier: Modifier = Modifier, content: @Composable () -> Unit, ) { - val view = LocalView.current - LaunchedEffect(Unit) { - if (layoutState.currentTransition?.fromContent == Scenes.Gone) { - view.performHapticFeedback(HapticFeedbackConstants.GESTURE_START) - } - } - Box(modifier) { Scrim(onClicked = onScrimClicked) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt index db0fe3e3f79d..ef415b151200 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt @@ -16,7 +16,6 @@ package com.android.systemui.shade.ui.composable -import android.view.HapticFeedbackConstants import android.view.ViewGroup import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateFloatAsState @@ -60,7 +59,6 @@ import androidx.compose.ui.layout.layoutId import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLifecycleOwner -import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.dp @@ -226,12 +224,6 @@ private fun SceneScope.ShadeScene( shadeSession: SaveableSession, usingCollapsedLandscapeMedia: Boolean, ) { - val view = LocalView.current - LaunchedEffect(Unit) { - if (layoutState.currentTransition?.fromContent == Scenes.Gone) { - view.performHapticFeedback(HapticFeedbackConstants.GESTURE_START) - } - } val shadeMode by viewModel.shadeMode.collectAsStateWithLifecycle() when (shadeMode) { diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt index 9891025ad7d3..367faed7b7f7 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt @@ -188,38 +188,47 @@ internal class DraggableHandlerImpl( return createSwipeAnimation(layoutImpl, result, isUpOrLeft, orientation) } - private fun computeSwipes(startedPosition: Offset?, pointersDown: Int): Swipes { - val fromSource = - startedPosition?.let { position -> - layoutImpl.swipeSourceDetector.source( - layoutImpl.lastSize, - position.round(), - layoutImpl.density, - orientation, - ) - } + private fun resolveSwipeSource(startedPosition: Offset?): SwipeSource.Resolved? { + if (startedPosition == null) return null + return layoutImpl.swipeSourceDetector.source( + layoutSize = layoutImpl.lastSize, + position = startedPosition.round(), + density = layoutImpl.density, + orientation = orientation, + ) + } - val upOrLeft = - Swipe.Resolved( - direction = - when (orientation) { - Orientation.Horizontal -> SwipeDirection.Resolved.Left - Orientation.Vertical -> SwipeDirection.Resolved.Up - }, - pointerCount = pointersDown, - fromSource = fromSource, - ) + private fun resolveSwipe( + pointersDown: Int, + fromSource: SwipeSource.Resolved?, + isUpOrLeft: Boolean, + ): Swipe.Resolved { + return Swipe.Resolved( + direction = + when (orientation) { + Orientation.Horizontal -> + if (isUpOrLeft) { + SwipeDirection.Resolved.Left + } else { + SwipeDirection.Resolved.Right + } - val downOrRight = - Swipe.Resolved( - direction = - when (orientation) { - Orientation.Horizontal -> SwipeDirection.Resolved.Right - Orientation.Vertical -> SwipeDirection.Resolved.Down - }, - pointerCount = pointersDown, - fromSource = fromSource, - ) + Orientation.Vertical -> + if (isUpOrLeft) { + SwipeDirection.Resolved.Up + } else { + SwipeDirection.Resolved.Down + } + }, + pointerCount = pointersDown, + fromSource = fromSource, + ) + } + + private fun computeSwipes(startedPosition: Offset?, pointersDown: Int): Swipes { + val fromSource = resolveSwipeSource(startedPosition) + val upOrLeft = resolveSwipe(pointersDown, fromSource, isUpOrLeft = true) + val downOrRight = resolveSwipe(pointersDown, fromSource, isUpOrLeft = false) return if (fromSource == null) { Swipes( diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java index 4bb01ec1e1df..fbed7cd48ba2 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java @@ -25,7 +25,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.os.SystemClock; @@ -168,8 +168,8 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase { verify(mAbsKeyInputView).setKeyDownListener(onKeyDownListenerArgumentCaptor.capture()); onKeyDownListenerArgumentCaptor.getValue().onKeyDown( KeyEvent.KEYCODE_UNKNOWN, mock(KeyEvent.class)); - verifyZeroInteractions(mKeyguardSecurityCallback); - verifyZeroInteractions(mKeyguardMessageAreaController); + verifyNoMoreInteractions(mKeyguardSecurityCallback); + verifyNoMoreInteractions(mKeyguardMessageAreaController); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelTest.kt new file mode 100644 index 000000000000..58b59ffd8894 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelTest.kt @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalCoroutinesApi::class) + +package com.android.systemui.communal.ui.viewmodel + +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.compose.animation.scene.Swipe +import com.android.compose.animation.scene.UserActionResult +import com.android.systemui.SysuiTestCase +import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository +import com.android.systemui.authentication.shared.model.AuthenticationMethodModel +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor +import com.android.systemui.flags.EnableSceneContainer +import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository +import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus +import com.android.systemui.kosmos.testScope +import com.android.systemui.lifecycle.activateIn +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.powerInteractor +import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.shared.model.Overlays +import com.android.systemui.scene.shared.model.SceneFamilies +import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade +import com.android.systemui.shade.data.repository.fakeShadeRepository +import com.android.systemui.shade.shared.flag.DualShade +import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlin.test.Test +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +@EnableSceneContainer +class CommunalUserActionsViewModelTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + + private lateinit var underTest: CommunalUserActionsViewModel + + @Before + fun setUp() { + underTest = kosmos.communalUserActionsViewModel + underTest.activateIn(testScope) + } + + @Test + @DisableFlags(DualShade.FLAG_NAME) + fun actions_singleShade() = + testScope.runTest { + val actions by collectLastValue(underTest.actions) + + setUpState( + isShadeTouchable = true, + isDeviceUnlocked = false, + shadeMode = ShadeMode.Single, + ) + assertThat(actions).isNotEmpty() + assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home)) + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Bouncer)) + assertThat(actions?.get(Swipe.Down)).isEqualTo(UserActionResult(Scenes.Shade)) + + setUpState( + isShadeTouchable = false, + isDeviceUnlocked = false, + shadeMode = ShadeMode.Single, + ) + assertThat(actions).isEmpty() + + setUpState( + isShadeTouchable = true, + isDeviceUnlocked = true, + shadeMode = ShadeMode.Single, + ) + assertThat(actions).isNotEmpty() + assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home)) + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Gone)) + assertThat(actions?.get(Swipe.Down)).isEqualTo(UserActionResult(Scenes.Shade)) + } + + @Test + @DisableFlags(DualShade.FLAG_NAME) + fun actions_splitShade() = + testScope.runTest { + val actions by collectLastValue(underTest.actions) + + setUpState( + isShadeTouchable = true, + isDeviceUnlocked = false, + shadeMode = ShadeMode.Split, + ) + assertThat(actions).isNotEmpty() + assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home)) + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Bouncer)) + assertThat(actions?.get(Swipe.Down)) + .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade)) + + setUpState( + isShadeTouchable = false, + isDeviceUnlocked = false, + shadeMode = ShadeMode.Split, + ) + assertThat(actions).isEmpty() + + setUpState( + isShadeTouchable = true, + isDeviceUnlocked = true, + shadeMode = ShadeMode.Split, + ) + assertThat(actions).isNotEmpty() + assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home)) + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Gone)) + assertThat(actions?.get(Swipe.Down)) + .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade)) + } + + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun actions_dualShade() = + testScope.runTest { + val actions by collectLastValue(underTest.actions) + + setUpState( + isShadeTouchable = true, + isDeviceUnlocked = false, + shadeMode = ShadeMode.Dual, + ) + assertThat(actions).isNotEmpty() + assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home)) + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Bouncer)) + assertThat(actions?.get(Swipe.Down)) + .isEqualTo(UserActionResult(Overlays.NotificationsShade)) + + setUpState( + isShadeTouchable = false, + isDeviceUnlocked = false, + shadeMode = ShadeMode.Dual, + ) + assertThat(actions).isEmpty() + + setUpState(isShadeTouchable = true, isDeviceUnlocked = true, shadeMode = ShadeMode.Dual) + assertThat(actions).isNotEmpty() + assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home)) + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Gone)) + assertThat(actions?.get(Swipe.Down)) + .isEqualTo(UserActionResult(Overlays.NotificationsShade)) + } + + private fun TestScope.setUpState( + isShadeTouchable: Boolean, + isDeviceUnlocked: Boolean, + shadeMode: ShadeMode, + ) { + if (isShadeTouchable) { + kosmos.powerInteractor.setAwakeForTest() + } else { + kosmos.powerInteractor.setAsleepForTest() + } + + if (isDeviceUnlocked) { + unlockDevice() + } else { + lockDevice() + } + + if (shadeMode == ShadeMode.Dual) { + assertThat(DualShade.isEnabled).isTrue() + } else { + assertThat(DualShade.isEnabled).isFalse() + kosmos.fakeShadeRepository.setShadeLayoutWide(shadeMode == ShadeMode.Split) + } + runCurrent() + } + + private fun TestScope.lockDevice() { + val deviceUnlockStatus by + collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus) + + kosmos.fakeAuthenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Pin) + assertThat(deviceUnlockStatus?.isUnlocked).isFalse() + kosmos.sceneInteractor.changeScene(Scenes.Lockscreen, "reason") + runCurrent() + } + + private fun TestScope.unlockDevice() { + val deviceUnlockStatus by + collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus) + + kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus( + SuccessFingerprintAuthenticationStatus(0, true) + ) + assertThat(deviceUnlockStatus?.isUnlocked).isTrue() + kosmos.sceneInteractor.changeScene(Scenes.Gone, "reason") + runCurrent() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/start/ControlsStartableTest.kt index 9e8914a1119f..0d8312e7f264 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/start/ControlsStartableTest.kt @@ -69,7 +69,7 @@ import org.mockito.Mockito.doAnswer import org.mockito.Mockito.doReturn import org.mockito.Mockito.never import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @@ -109,7 +109,7 @@ class ControlsStartableTest : SysuiTestCase() { onBootCompleted() } - verifyZeroInteractions(controlsController, controlsListingController, userTracker) + verifyNoMoreInteractions(controlsController, controlsListingController, userTracker) } @Test @@ -119,7 +119,7 @@ class ControlsStartableTest : SysuiTestCase() { fakeExecutor.advanceClockToLast() fakeExecutor.runAllReady() - verifyZeroInteractions(controlsController, controlsListingController, userTracker) + verifyNoMoreInteractions(controlsController, controlsListingController, userTracker) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt index a09d34579e2f..2e9d993c99a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt @@ -32,7 +32,6 @@ import org.mockito.Mock import org.mockito.Mockito.anyFloat import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations @SmallTest @@ -84,7 +83,7 @@ class SliderStateTrackerTest : SysuiTestCase() { // THEN The state is idle and the listener is not called to play haptics assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) - verifyZeroInteractions(sliderStateListener) + verifyNoMoreInteractions(sliderStateListener) } @Test @@ -97,7 +96,7 @@ class SliderStateTrackerTest : SysuiTestCase() { // THEN the tracker moves to the wait state and the timer job begins assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT) - verifyZeroInteractions(sliderStateListener) + verifyNoMoreInteractions(sliderStateListener) assertThat(mSliderStateTracker.isWaiting).isTrue() } @@ -591,7 +590,7 @@ class SliderStateTrackerTest : SysuiTestCase() { // THEN the tracker moves back to IDLE and there are no haptics assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) - verifyZeroInteractions(sliderStateListener) + verifyNoMoreInteractions(sliderStateListener) } @Test @@ -608,7 +607,7 @@ class SliderStateTrackerTest : SysuiTestCase() { // haptics assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT) assertThat(mSliderStateTracker.isWaiting).isTrue() - verifyZeroInteractions(sliderStateListener) + verifyNoMoreInteractions(sliderStateListener) } @Test @@ -644,7 +643,7 @@ class SliderStateTrackerTest : SysuiTestCase() { // THEN the tracker moves to IDLE and no haptics are played assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) - verifyZeroInteractions(sliderStateListener) + verifyNoMoreInteractions(sliderStateListener) } @Test @@ -660,7 +659,7 @@ class SliderStateTrackerTest : SysuiTestCase() { // THEN the tracker moves to WAIT and the wait job starts. assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT) assertThat(mSliderStateTracker.isWaiting).isTrue() - verifyZeroInteractions(sliderStateListener) + verifyNoMoreInteractions(sliderStateListener) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt index 9a721fa26df3..727481e0637d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt @@ -38,7 +38,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -75,7 +75,7 @@ class StickyKeysIndicatorCoordinatorTest : SysuiTestCase() { @Test fun dialogIsShownWhenStickyKeysAreEmitted() { testScope.run { - verifyZeroInteractions(dialog) + verifyNoMoreInteractions(dialog) stickyKeysRepository.setStickyKeys(linkedMapOf(SHIFT to Locked(true))) runCurrent() @@ -87,7 +87,7 @@ class StickyKeysIndicatorCoordinatorTest : SysuiTestCase() { @Test fun dialogDisappearsWhenStickyKeysAreEmpty() { testScope.run { - verifyZeroInteractions(dialog) + verifyNoMoreInteractions(dialog) stickyKeysRepository.setStickyKeys(linkedMapOf(SHIFT to Locked(true))) runCurrent() diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt index 3ccb989dc65a..26ce67da10b3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt @@ -52,7 +52,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -98,7 +98,7 @@ class StickyKeysIndicatorViewModelTest : SysuiTestCase() { keyboardRepository.setIsAnyKeyboardConnected(true) runCurrent() - verifyZeroInteractions(inputManager) + verifyNoMoreInteractions(inputManager) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt index 23fd997c02e1..6b49d3a095d8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt @@ -32,7 +32,6 @@ import org.mockito.Mock import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @@ -72,7 +71,7 @@ class ResourceTrimmerTest : SysuiTestCase() { testScope.runTest { powerInteractor.setAsleepForTest() testScope.runCurrent() - verifyZeroInteractions(globalWindowManager) + verifyNoMoreInteractions(globalWindowManager) } @Test @@ -82,7 +81,7 @@ class ResourceTrimmerTest : SysuiTestCase() { keyguardRepository.setDozeAmount(1f) powerInteractor.setAsleepForTest() testScope.runCurrent() - verifyZeroInteractions(globalWindowManager) + verifyNoMoreInteractions(globalWindowManager) } @Test @@ -92,7 +91,7 @@ class ResourceTrimmerTest : SysuiTestCase() { keyguardRepository.setDozeAmount(0f) powerInteractor.setAsleepForTest() testScope.runCurrent() - verifyZeroInteractions(globalWindowManager) + verifyNoMoreInteractions(globalWindowManager) } @Test @@ -103,7 +102,7 @@ class ResourceTrimmerTest : SysuiTestCase() { powerInteractor.setAsleepForTest() testScope.runCurrent() - verifyZeroInteractions(globalWindowManager) + verifyNoMoreInteractions(globalWindowManager) generateSequence(0f) { it + 0.1f } .takeWhile { it < 0.8f } @@ -111,7 +110,7 @@ class ResourceTrimmerTest : SysuiTestCase() { keyguardRepository.setDozeAmount(it) testScope.runCurrent() } - verifyZeroInteractions(globalWindowManager) + verifyNoMoreInteractions(globalWindowManager) generateSequence(0.8f) { it - 0.1f } .takeWhile { it >= 0f } @@ -122,7 +121,7 @@ class ResourceTrimmerTest : SysuiTestCase() { keyguardRepository.setDozeAmount(0f) testScope.runCurrent() - verifyZeroInteractions(globalWindowManager) + verifyNoMoreInteractions(globalWindowManager) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt index 5fa194d95e28..42b3463c052e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt @@ -48,7 +48,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @@ -122,7 +122,7 @@ class MuteQuickAffordanceCoreStartableTest : SysuiTestCase() { observerCaptor.value.onChanged(AudioManager.RINGER_MODE_SILENT) //then - verifyZeroInteractions(userFileManager) + verifyNoMoreInteractions(userFileManager) coroutineContext.cancelChildren() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt index e3bdcd707823..eef4c3de4b19 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt @@ -72,7 +72,7 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.ArgumentMatchers.same import org.mockito.Mock import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations import platform.test.runner.parameterized.Parameter import platform.test.runner.parameterized.ParameterizedAndroidJunit4 @@ -388,7 +388,7 @@ class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() { ) } } else { - verifyZeroInteractions(activityStarter) + verifyNoMoreInteractions(activityStarter) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt index 591ce1aee09b..1184a76d54ff 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt @@ -72,7 +72,7 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.ArgumentMatchers.same import org.mockito.Mock import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations import platform.test.runner.parameterized.Parameter import platform.test.runner.parameterized.ParameterizedAndroidJunit4 @@ -388,7 +388,7 @@ class KeyguardQuickAffordanceInteractorSceneContainerTest : SysuiTestCase() { ) } } else { - verifyZeroInteractions(activityStarter) + verifyNoMoreInteractions(activityStarter) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt index 1929cd172750..e1845a17a767 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt @@ -84,7 +84,7 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations import platform.test.runner.parameterized.ParameterizedAndroidJunit4 import platform.test.runner.parameterized.Parameters @@ -735,7 +735,7 @@ class KeyguardBottomAreaViewModelTest(flags: FlagsParameterization) : SysuiTestC if (testConfig.intent != null) { assertThat(Mockito.mockingDetails(activityStarter).invocations).hasSize(1) } else { - verifyZeroInteractions(activityStarter) + verifyNoMoreInteractions(activityStarter) } } else { assertThat(viewModel.isVisible).isFalse() diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt index 720f2e197aea..5b216620ec2b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt @@ -862,7 +862,7 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() { if (testConfig.intent != null) { Truth.assertThat(Mockito.mockingDetails(activityStarter).invocations).hasSize(1) } else { - Mockito.verifyZeroInteractions(activityStarter) + Mockito.verifyNoMoreInteractions(activityStarter) } } else { Truth.assertThat(viewModel.isVisible).isFalse() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt index a330cf01624f..fb1bf281715d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt @@ -147,7 +147,7 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { } } - private fun expectedLeftDestination( + private fun expectedStartDestination( isCommunalAvailable: Boolean, isShadeTouchable: Boolean, ): SceneKey? { @@ -246,17 +246,17 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { ) ) - val leftScene by + val startScene by collectLastValue( - (userActions?.get(Swipe.Left) as? UserActionResult.ChangeScene)?.toScene?.let { - scene -> - kosmos.sceneInteractor.resolveSceneFamily(scene) - } ?: flowOf(null) + (userActions?.get(Swipe.Start) as? UserActionResult.ChangeScene) + ?.toScene + ?.let { scene -> kosmos.sceneInteractor.resolveSceneFamily(scene) } + ?: flowOf(null) ) - assertThat(leftScene) + assertThat(startScene) .isEqualTo( - expectedLeftDestination( + expectedStartDestination( isCommunalAvailable = isCommunalAvailable, isShadeTouchable = isShadeTouchable, ) @@ -341,17 +341,17 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { ) ) - val leftScene by + val startScene by collectLastValue( - (userActions?.get(Swipe.Left) as? UserActionResult.ChangeScene)?.toScene?.let { - scene -> - kosmos.sceneInteractor.resolveSceneFamily(scene) - } ?: flowOf(null) + (userActions?.get(Swipe.Start) as? UserActionResult.ChangeScene) + ?.toScene + ?.let { scene -> kosmos.sceneInteractor.resolveSceneFamily(scene) } + ?: flowOf(null) ) - assertThat(leftScene) + assertThat(startScene) .isEqualTo( - expectedLeftDestination( + expectedStartDestination( isCommunalAvailable = isCommunalAvailable, isShadeTouchable = isShadeTouchable, ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt index 8fe8878c6918..82fc0b58097c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt @@ -25,7 +25,7 @@ import com.android.systemui.util.mockito.mock import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions @RunWith(AndroidJUnit4::class) @SmallTest @@ -51,6 +51,6 @@ class MediaProjectionTaskSwitcherCoreStartableTest : SysuiTestCase() { coreStartable.start() - verifyZeroInteractions(coordinator) + verifyNoMoreInteractions(coordinator) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSFooterViewControllerTest.java index fb58b90d43f1..93dede5a3dae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSFooterViewControllerTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.content.ClipData; @@ -125,7 +125,7 @@ public class QSFooterViewControllerTest extends LeakCheckedTest { mEditButton.performClick(); verify(mQSPanelController, never()).showEdit(any()); - verifyZeroInteractions(mActivityStarter); + verifyNoMoreInteractions(mActivityStarter); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSImplTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSImplTest.java index 4ce2d7c6d78b..fe1b963f6801 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSImplTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSImplTest.java @@ -36,7 +36,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.content.Context; @@ -532,7 +532,7 @@ public class QSImplTest extends SysuiTestCase { other.onComponentCreated(mQsComponent, null); assertThat((View) other.getView().findViewById(R.id.qs_footer_actions)).isNull(); - verifyZeroInteractions(mFooterActionsViewModel, mFooterActionsViewModelFactory); + verifyNoMoreInteractions(mFooterActionsViewModel, mFooterActionsViewModelFactory); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt index 57a9377cea9e..acd69af2736a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt @@ -82,11 +82,11 @@ class QSFragmentComposeViewModelForceQSTest(private val testData: TestData) : (0u..31u).map { bitfield -> TestData( statusBarState, - expanded = (bitfield or 1u) == 1u, - stackScrollerOverScrolling = (bitfield or 2u) == 1u, - bypassEnabled = (bitfield or 4u) == 1u, - transitioningToFullShade = (bitfield or 8u) == 1u, - inSplitShade = (bitfield or 16u) == 1u, + expanded = (bitfield and 1u) == 1u, + stackScrollerOverScrolling = (bitfield and 2u) == 2u, + bypassEnabled = (bitfield and 4u) == 4u, + transitioningToFullShade = (bitfield and 8u) == 8u, + inSplitShade = (bitfield and 16u) == 16u, ) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt index 418d126ce3cf..940da9967a68 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt @@ -64,7 +64,7 @@ import org.mockito.Mockito.doNothing import org.mockito.Mockito.nullable import org.mockito.Mockito.spy import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import java.util.Optional @@ -320,7 +320,7 @@ class DeviceControlsTileTest : SysuiTestCase() { tile.click(null /* view */) testableLooper.processAllMessages() - verifyZeroInteractions(activityStarter) + verifyNoMoreInteractions(activityStarter) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java index 914bd0e13dc6..0729e2fcd35f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java @@ -33,7 +33,7 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.PendingIntent; @@ -462,7 +462,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { public void testHandleSetListening_notListening_notQueryCards() { mTile.handleSetListening(false); - verifyZeroInteractions(mQuickAccessWalletClient); + verifyNoMoreInteractions(mQuickAccessWalletClient); } private WalletCard createWalletCardWithType(Context context, int cardType) { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index c9e958dd1cc0..d2bf9b888ef0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -50,9 +50,7 @@ import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.se import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor -import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver import com.android.systemui.scene.domain.startable.sceneContainerStartable -import com.android.systemui.scene.shared.model.SceneFamilies import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.fakeSceneDataSource import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel @@ -185,7 +183,6 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { fun swipeUpOnShadeScene_withAuthMethodSwipe_lockscreenNotDismissed_goesToLockscreen() = testScope.runTest { val actions by collectLastValue(kosmos.shadeUserActionsViewModel.actions) - val homeScene by collectLastValue(kosmos.homeSceneFamilyResolver.resolvedScene) kosmos.setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = true) kosmos.assertCurrentScene(Scenes.Lockscreen) @@ -195,9 +192,8 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { val upDestinationSceneKey = (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene - assertThat(upDestinationSceneKey).isEqualTo(SceneFamilies.Home) - assertThat(homeScene).isEqualTo(Scenes.Lockscreen) - kosmos.emulateUserDrivenTransition(to = homeScene) + assertThat(upDestinationSceneKey).isEqualTo(Scenes.Lockscreen) + kosmos.emulateUserDrivenTransition(to = Scenes.Lockscreen) } @Test @@ -205,7 +201,6 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { testScope.runTest { val actions by collectLastValue(kosmos.shadeUserActionsViewModel.actions) val canSwipeToEnter by collectLastValue(kosmos.deviceEntryInteractor.canSwipeToEnter) - val homeScene by collectLastValue(kosmos.homeSceneFamilyResolver.resolvedScene) kosmos.setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = true) @@ -222,9 +217,8 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { val upDestinationSceneKey = (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene - assertThat(upDestinationSceneKey).isEqualTo(SceneFamilies.Home) - assertThat(homeScene).isEqualTo(Scenes.Gone) - kosmos.emulateUserDrivenTransition(to = homeScene) + assertThat(upDestinationSceneKey).isEqualTo(Scenes.Gone) + kosmos.emulateUserDrivenTransition(to = Scenes.Gone) } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModelTest.kt new file mode 100644 index 000000000000..664315d19494 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModelTest.kt @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.scene.ui.viewmodel + +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.view.HapticFeedbackConstants +import android.view.View +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.compose.animation.scene.ContentKey +import com.android.compose.animation.scene.ObservableTransitionState +import com.android.compose.animation.scene.ObservableTransitionState.Transition.ShowOrHideOverlay +import com.android.compose.animation.scene.OverlayKey +import com.android.compose.animation.scene.SceneKey +import com.android.systemui.Flags +import com.android.systemui.SysuiTestCase +import com.android.systemui.flags.EnableSceneContainer +import com.android.systemui.haptics.msdl.fakeMSDLPlayer +import com.android.systemui.kosmos.testScope +import com.android.systemui.lifecycle.activateIn +import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.sceneContainerHapticsViewModelFactory +import com.android.systemui.scene.shared.model.Overlays +import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.testKosmos +import com.google.android.msdl.data.model.MSDLToken +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyZeroInteractions + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +@EnableSceneContainer +class SceneContainerHapticsViewModelTest() : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val sceneInteractor by lazy { kosmos.sceneInteractor } + private val msdlPlayer = kosmos.fakeMSDLPlayer + private val view = mock<View>() + + private lateinit var underTest: SceneContainerHapticsViewModel + + @Before + fun setup() { + underTest = kosmos.sceneContainerHapticsViewModelFactory.create(view) + underTest.activateIn(testScope) + } + + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + @DisableFlags(Flags.FLAG_DUAL_SHADE) + @Test + fun onValidSceneTransition_withMSDL_playsMSDLShadePullHaptics() = + testScope.runTest { + // GIVEN a valid scene transition to play haptics + val validTransition = createTransitionState(from = Scenes.Gone, to = Scenes.Shade) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(validTransition)) + runCurrent() + + // THEN the expected token plays without interaction properties + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR) + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + @DisableFlags(Flags.FLAG_DUAL_SHADE) + @Test + fun onInValidSceneTransition_withMSDL_doesNotPlayMSDLShadePullHaptics() = + testScope.runTest { + // GIVEN an invalid scene transition to play haptics + val invalidTransition = createTransitionState(from = Scenes.Shade, to = Scenes.Gone) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition)) + runCurrent() + + // THEN the no token plays with no interaction properties + assertThat(msdlPlayer.latestTokenPlayed).isNull() + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @DisableFlags(Flags.FLAG_DUAL_SHADE, Flags.FLAG_MSDL_FEEDBACK) + @Test + fun onValidSceneTransition_withoutMSDL_playsHapticConstantForShadePullHaptics() = + testScope.runTest { + // GIVEN a valid scene transition to play haptics + val validTransition = createTransitionState(from = Scenes.Gone, to = Scenes.Shade) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(validTransition)) + runCurrent() + + // THEN the expected haptic feedback constant plays + verify(view).performHapticFeedback(eq(HapticFeedbackConstants.GESTURE_START)) + } + + @DisableFlags(Flags.FLAG_DUAL_SHADE, Flags.FLAG_MSDL_FEEDBACK) + @Test + fun onInValidSceneTransition_withoutMSDL_doesNotPlayHapticConstantForShadePullHaptics() = + testScope.runTest { + // GIVEN an invalid scene transition to play haptics + val invalidTransition = createTransitionState(from = Scenes.Shade, to = Scenes.Gone) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition)) + runCurrent() + + // THEN the view does not play a haptic feedback constant + verifyZeroInteractions(view) + } + + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK, Flags.FLAG_DUAL_SHADE) + @Test + fun onValidOverlayTransition_withMSDL_playsMSDLShadePullHaptics() = + testScope.runTest { + // GIVEN a valid scene transition to play haptics + val validTransition = + createTransitionState(from = Scenes.Gone, to = Overlays.NotificationsShade) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(validTransition)) + runCurrent() + + // THEN the expected token plays without interaction properties + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR) + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK, Flags.FLAG_DUAL_SHADE) + @Test + fun onInValidOverlayTransition_withMSDL_doesNotPlayMSDLShadePullHaptics() = + testScope.runTest { + // GIVEN an invalid scene transition to play haptics + val invalidTransition = + createTransitionState(from = Scenes.Bouncer, to = Overlays.NotificationsShade) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition)) + runCurrent() + + // THEN the no token plays with no interaction properties + assertThat(msdlPlayer.latestTokenPlayed).isNull() + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @EnableFlags(Flags.FLAG_DUAL_SHADE) + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) + @Test + fun onValidOverlayTransition_withoutMSDL_playsHapticConstantForShadePullHaptics() = + testScope.runTest { + // GIVEN a valid scene transition to play haptics + val validTransition = + createTransitionState(from = Scenes.Gone, to = Overlays.NotificationsShade) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(validTransition)) + runCurrent() + + // THEN the expected haptic feedback constant plays + verify(view).performHapticFeedback(eq(HapticFeedbackConstants.GESTURE_START)) + } + + @EnableFlags(Flags.FLAG_DUAL_SHADE) + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) + @Test + fun onInValidOverlayTransition_withoutMSDL_doesNotPlayHapticConstantForShadePullHaptics() = + testScope.runTest { + // GIVEN an invalid scene transition to play haptics + val invalidTransition = + createTransitionState(from = Scenes.Bouncer, to = Overlays.NotificationsShade) + + // WHEN the transition occurs + sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition)) + runCurrent() + + // THEN the view does not play a haptic feedback constant + verifyZeroInteractions(view) + } + + private fun createTransitionState(from: SceneKey, to: ContentKey) = + when (to) { + is SceneKey -> + ObservableTransitionState.Transition( + fromScene = from, + toScene = to, + currentScene = flowOf(from), + progress = MutableStateFlow(0.2f), + isInitiatedByUserInput = true, + isUserInputOngoing = flowOf(true), + ) + is OverlayKey -> + ShowOrHideOverlay( + overlay = to, + fromContent = from, + toContent = to, + currentScene = from, + currentOverlays = sceneInteractor.currentOverlays, + progress = MutableStateFlow(0.2f), + isInitiatedByUserInput = true, + isUserInputOngoing = flowOf(true), + previewProgress = flowOf(0f), + isInPreviewStage = flowOf(false), + ) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt index e60e742e9917..a37f511cef69 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt @@ -21,23 +21,21 @@ package com.android.systemui.scene.ui.viewmodel import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.view.MotionEvent +import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.compose.animation.scene.DefaultEdgeDetector import com.android.systemui.SysuiTestCase -import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.classifier.fakeFalsingManager import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.power.data.repository.fakePowerRepository -import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.fakeOverlaysByKeys import com.android.systemui.scene.sceneContainerConfig -import com.android.systemui.scene.sceneContainerGestureFilterFactory -import com.android.systemui.scene.shared.logger.sceneLogger +import com.android.systemui.scene.sceneContainerViewModelFactory import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.fakeSceneDataSource @@ -72,6 +70,7 @@ class SceneContainerViewModelTest : SysuiTestCase() { private val fakeShadeRepository by lazy { kosmos.fakeShadeRepository } private val sceneContainerConfig by lazy { kosmos.sceneContainerConfig } private val falsingManager by lazy { kosmos.fakeFalsingManager } + private val view = mock<View>() private lateinit var underTest: SceneContainerViewModel @@ -81,16 +80,10 @@ class SceneContainerViewModelTest : SysuiTestCase() { @Before fun setUp() { underTest = - SceneContainerViewModel( - sceneInteractor = sceneInteractor, - falsingInteractor = kosmos.falsingInteractor, - powerInteractor = kosmos.powerInteractor, - shadeInteractor = kosmos.shadeInteractor, - splitEdgeDetector = kosmos.splitEdgeDetector, - logger = kosmos.sceneLogger, - gestureFilterFactory = kosmos.sceneContainerGestureFilterFactory, - displayId = kosmos.displayTracker.defaultDisplayId, - motionEventHandlerReceiver = { motionEventHandler -> + kosmos.sceneContainerViewModelFactory.create( + view, + kosmos.displayTracker.defaultDisplayId, + { motionEventHandler -> this@SceneContainerViewModelTest.motionEventHandler = motionEventHandler }, ) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt index 9f3e126ed1e8..15d68813808c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt @@ -41,6 +41,7 @@ import com.android.systemui.qs.ui.adapter.fakeQSSceneAdapter import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver +import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.scene.shared.model.SceneFamilies import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade @@ -76,6 +77,7 @@ class ShadeUserActionsViewModelTest : SysuiTestCase() { @Before fun setUp() { + kosmos.sceneContainerStartable.start() underTest.activateIn(testScope) } @@ -232,6 +234,20 @@ class ShadeUserActionsViewModelTest : SysuiTestCase() { .isEmpty() } + @Test + fun upTransitionSceneKey_backToCommunal() = + testScope.runTest { + val actions by collectLastValue(underTest.actions) + val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene) + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + kosmos.sceneInteractor.changeScene(Scenes.Communal, "") + assertThat(currentScene).isEqualTo(Scenes.Communal) + kosmos.sceneInteractor.changeScene(Scenes.Shade, "") + assertThat(currentScene).isEqualTo(Scenes.Shade) + + assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Communal)) + } + private fun TestScope.setDeviceEntered(isEntered: Boolean) { if (isEntered) { // Unlock the device marking the device has entered. diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt index 593f87382b52..173055364018 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt @@ -45,7 +45,7 @@ import org.junit.Before import org.junit.runner.RunWith import org.mockito.Mockito.verify import org.mockito.kotlin.clearInvocations -import org.mockito.kotlin.verifyZeroInteractions +import org.mockito.kotlin.verifyNoMoreInteractions import kotlin.test.Test @OptIn(ExperimentalCoroutinesApi::class) @@ -112,11 +112,11 @@ class StatusBarSignalPolicyTest : SysuiTestCase() { // flag is enabled. underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, "")) runCurrent() - verifyZeroInteractions(statusBarIconController) + verifyNoMoreInteractions(statusBarIconController) underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, "")) runCurrent() - verifyZeroInteractions(statusBarIconController) + verifyNoMoreInteractions(statusBarIconController) } @Test @@ -126,7 +126,7 @@ class StatusBarSignalPolicyTest : SysuiTestCase() { // Make sure StatusBarSignalPolicy.init does no initialization when // the refactor flag is disabled. underTest.init() - verifyZeroInteractions(securityController, networkController, tunerService) + verifyNoMoreInteractions(securityController, networkController, tunerService) } @Test @@ -154,11 +154,11 @@ class StatusBarSignalPolicyTest : SysuiTestCase() { // if the StatusBarSignalPolicyRefactor is not enabled. airplaneModeInteractor.setIsAirplaneMode(true) runCurrent() - verifyZeroInteractions(statusBarIconController) + verifyNoMoreInteractions(statusBarIconController) airplaneModeInteractor.setIsAirplaneMode(false) runCurrent() - verifyZeroInteractions(statusBarIconController) + verifyNoMoreInteractions(statusBarIconController) } @Test @@ -168,6 +168,6 @@ class StatusBarSignalPolicyTest : SysuiTestCase() { // Make sure StatusBarSignalPolicy.start does no initialization when // the refactor flag is disabled. underTest.start() - verifyZeroInteractions(securityController, networkController, tunerService) + verifyNoMoreInteractions(securityController, networkController, tunerService) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt index aefbc6b3b646..db274cc311dd 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt @@ -19,6 +19,8 @@ package com.android.systemui.statusbar import android.animation.ObjectAnimator +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.FlagsParameterization import android.testing.TestableLooper import androidx.test.filters.SmallTest @@ -47,8 +49,10 @@ import com.android.systemui.scene.data.repository.setTransition import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.domain.interactor.shadeInteractor +import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor import com.android.systemui.testKosmos import com.android.systemui.util.kotlin.JavaAdapter @@ -79,6 +83,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest private val kosmos = testKosmos() private val testScope = kosmos.testScope + private val sceneInteractor = kosmos.sceneInteractor private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository private val mockDarkAnimator = mock<ObjectAnimator>() @@ -229,14 +234,15 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest @Test fun testSetDreamState_getterReturnsCurrentState() { underTest.setIsDreaming(true) - assertTrue(underTest.isDreaming()) + assertTrue(underTest.isDreaming) underTest.setIsDreaming(false) - assertFalse(underTest.isDreaming()) + assertFalse(underTest.isDreaming) } @Test @EnableSceneContainer + @DisableFlags(DualShade.FLAG_NAME) fun start_hydratesStatusBarState_whileLocked() = testScope.runTest { var statusBarState = underTest.state @@ -248,7 +254,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest } underTest.addCallback(listener) - val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene) + val currentScene by collectLastValue(sceneInteractor.currentScene) val deviceUnlockStatus by collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus) @@ -258,45 +264,107 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest runCurrent() assertThat(deviceUnlockStatus!!.isUnlocked).isFalse() - kosmos.sceneInteractor.changeScene( - toScene = Scenes.Lockscreen, - loggingReason = "reason" - ) + sceneInteractor.changeScene(toScene = Scenes.Lockscreen, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Lockscreen) // Call start to begin hydrating based on the scene framework: underTest.start() - kosmos.sceneInteractor.changeScene(toScene = Scenes.Bouncer, loggingReason = "reason") + sceneInteractor.changeScene(toScene = Scenes.Bouncer, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Bouncer) assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) - kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason") + sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Shade) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED) - kosmos.sceneInteractor.changeScene( - toScene = Scenes.QuickSettings, - loggingReason = "reason" - ) + sceneInteractor.changeScene(toScene = Scenes.QuickSettings, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.QuickSettings) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED) - kosmos.sceneInteractor.changeScene(toScene = Scenes.Communal, loggingReason = "reason") + sceneInteractor.changeScene(toScene = Scenes.Communal, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Communal) assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) - kosmos.sceneInteractor.changeScene( - toScene = Scenes.Lockscreen, - loggingReason = "reason" + sceneInteractor.changeScene(toScene = Scenes.Lockscreen, loggingReason = "reason") + runCurrent() + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) + } + + @Test + @EnableSceneContainer + @EnableFlags(DualShade.FLAG_NAME) + fun start_hydratesStatusBarState_dualShade_whileLocked() = + testScope.runTest { + var statusBarState = underTest.state + val listener = + object : StatusBarStateController.StateListener { + override fun onStateChanged(newState: Int) { + statusBarState = newState + } + } + underTest.addCallback(listener) + + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + val deviceUnlockStatus by + collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus) + + kosmos.fakeAuthenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password ) runCurrent() + assertThat(deviceUnlockStatus!!.isUnlocked).isFalse() + + sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "reason") + runCurrent() assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + + // Call start to begin hydrating based on the scene framework: + underTest.start() + + sceneInteractor.changeScene(Scenes.Bouncer, loggingReason = "reason") + runCurrent() + assertThat(currentScene).isEqualTo(Scenes.Bouncer) + assertThat(currentOverlays).isEmpty() + assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) + + sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "reason") + runCurrent() + + sceneInteractor.showOverlay(Overlays.NotificationsShade, loggingReason = "reason") + runCurrent() + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(currentOverlays).containsExactly(Overlays.NotificationsShade) + assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED) + + sceneInteractor.replaceOverlay( + from = Overlays.NotificationsShade, + to = Overlays.QuickSettingsShade, + loggingReason = "reason", + ) + runCurrent() + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(currentOverlays).containsExactly(Overlays.QuickSettingsShade) + assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED) + + sceneInteractor.hideOverlay(Overlays.QuickSettingsShade, loggingReason = "reason") + sceneInteractor.changeScene(Scenes.Communal, loggingReason = "reason") + runCurrent() + assertThat(currentScene).isEqualTo(Scenes.Communal) + assertThat(currentOverlays).isEmpty() + assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) + + sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "reason") + runCurrent() + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(currentOverlays).isEmpty() assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) } @@ -313,7 +381,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest } underTest.addCallback(listener) - val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene) + val currentScene by collectLastValue(sceneInteractor.currentScene) val deviceUnlockStatus by collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus) kosmos.fakeAuthenticationRepository.setAuthenticationMethod( @@ -326,10 +394,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest assertThat(deviceUnlockStatus!!.isUnlocked).isTrue() - kosmos.sceneInteractor.changeScene( - toScene = Scenes.Lockscreen, - loggingReason = "reason" - ) + sceneInteractor.changeScene(toScene = Scenes.Lockscreen, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Lockscreen) @@ -339,20 +404,17 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD) - kosmos.sceneInteractor.changeScene(toScene = Scenes.Gone, loggingReason = "reason") + sceneInteractor.changeScene(toScene = Scenes.Gone, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Gone) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE) - kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason") + sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Shade) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE) - kosmos.sceneInteractor.changeScene( - toScene = Scenes.QuickSettings, - loggingReason = "reason" - ) + sceneInteractor.changeScene(toScene = Scenes.QuickSettings, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.QuickSettings) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE) @@ -371,7 +433,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest } underTest.addCallback(listener) - val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene) + val currentScene by collectLastValue(sceneInteractor.currentScene) assertThat(currentScene).isEqualTo(Scenes.Lockscreen) val isOccluded by collectLastValue(kosmos.sceneContainerOcclusionInteractor.invisibleDueToOcclusion) @@ -385,15 +447,12 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest // Call start to begin hydrating based on the scene framework: underTest.start() - kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason") + sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.Shade) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE) - kosmos.sceneInteractor.changeScene( - toScene = Scenes.QuickSettings, - loggingReason = "reason" - ) + sceneInteractor.changeScene(toScene = Scenes.QuickSettings, loggingReason = "reason") runCurrent() assertThat(currentScene).isEqualTo(Scenes.QuickSettings) assertThat(statusBarState).isEqualTo(StatusBarState.SHADE) @@ -415,10 +474,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest kosmos.setTransition( sceneTransition = Idle(Scenes.Gone), stateTransition = - TransitionStep( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GONE, - ) + TransitionStep(from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE), ) assertThat(underTest.leaveOpenOnKeyguardHide()).isEqualTo(false) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt index 2ad3c9e1c21a..22906b8724b5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt @@ -40,7 +40,7 @@ import org.mockito.Mockito.anyInt import org.mockito.Mockito.anyString import org.mockito.Mockito.eq import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever private const val SDK_VERSION = 33 @@ -80,7 +80,7 @@ class TargetSdkResolverTest : SysuiTestCase() { notifListener.onEntryBind(entry, sbn) assertEquals(SDK_VERSION, entry.targetSdk) - verifyZeroInteractions(packageManager) + verifyNoMoreInteractions(packageManager) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt index fda5cd286074..da488336c7c3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt @@ -42,7 +42,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions private const val FREE_IMAGE_DELAY_MS = 4000L private const val MAX_IMAGE_SIZE = 512 // size of the test drawables in pixels @@ -160,7 +160,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { assertIsPlaceHolder(drawableCaptor.value) assertSize(drawableCaptor.value) // AND nothing happens on the old consumer - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -182,7 +182,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { assertIsFullImage(drawableCaptor.value) assertSize(drawableCaptor.value) // AND nothing happens on the old consumer - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -332,7 +332,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -347,7 +347,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -362,7 +362,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -382,7 +382,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -399,7 +399,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -416,7 +416,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -436,7 +436,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN nothing happens - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } @Test @@ -457,7 +457,7 @@ class BigPictureIconManagerTest : SysuiTestCase() { runCurrent() // THEN no more updates are happening - verifyZeroInteractions(mockConsumer) + verifyNoMoreInteractions(mockConsumer) } private fun overrideMaxImageSizes() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt index 310fa67a3c6b..1c7a8361980f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt @@ -50,7 +50,6 @@ import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations @SmallTest @@ -139,7 +138,7 @@ class NotificationSettingsControllerTest : SysuiTestCase() { @Test fun addCallback_onlyFirstForUriRegistersObserver() { controller.addCallback(settingUri1, Mockito.mock(Listener::class.java)) - verifyZeroInteractions(secureSettings) + verifyNoMoreInteractions(secureSettings) testableLooper.processAllMessages() verify(secureSettings) .registerContentObserverForUserSync( @@ -157,7 +156,7 @@ class NotificationSettingsControllerTest : SysuiTestCase() { @Test fun addCallback_secondUriRegistersObserver() { controller.addCallback(settingUri1, Mockito.mock(Listener::class.java)) - verifyZeroInteractions(secureSettings) + verifyNoMoreInteractions(secureSettings) testableLooper.processAllMessages() verify(secureSettings) .registerContentObserverForUserSync( @@ -185,7 +184,7 @@ class NotificationSettingsControllerTest : SysuiTestCase() { val listenerSetting1: Listener = mock() val listenerSetting2: Listener = mock() controller.addCallback(settingUri1, listenerSetting1) - verifyZeroInteractions(secureSettings) + verifyNoMoreInteractions(secureSettings) testableLooper.processAllMessages() verify(secureSettings) .registerContentObserverForUserSync( @@ -229,7 +228,7 @@ class NotificationSettingsControllerTest : SysuiTestCase() { controller.addCallback(settingUri1, listenerSetting1b) controller.addCallback(settingUri2, listenerSetting2) - verifyZeroInteractions(secureSettings) + verifyNoMoreInteractions(secureSettings) testableLooper.processAllMessages() verify(listenerSetting1a) @@ -251,7 +250,7 @@ class NotificationSettingsControllerTest : SysuiTestCase() { // First, register controller.addCallback(settingUri1, listenerSetting1a) controller.addCallback(settingUri1, listenerSetting1b) - verifyZeroInteractions(secureSettings) + verifyNoMoreInteractions(secureSettings) testableLooper.processAllMessages() verify(secureSettings) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt index c61756c42895..13280f2caec7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt @@ -40,7 +40,7 @@ import org.junit.runner.RunWith import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.spy import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -115,7 +115,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { // THEN visibility changes are reported verify(mockStatusBarService) .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture()) - verifyZeroInteractions(mockNotificationListenerService) + verifyNoMoreInteractions(mockNotificationListenerService) val noLongerVisible = visibilityArrayCaptor.value assertThat(noLongerVisible).hasLength(2) assertThat(noLongerVisible[0]).apply { @@ -152,7 +152,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { // THEN visibility changes are reported verify(mockStatusBarService) .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture()) - verifyZeroInteractions(mockNotificationListenerService) + verifyNoMoreInteractions(mockNotificationListenerService) val noLongerVisible = visibilityArrayCaptor.value assertThat(noLongerVisible).hasLength(2) assertThat(noLongerVisible[0]).apply { @@ -186,7 +186,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { runCurrent() // THEN no visibility changes are reported - verifyZeroInteractions(mockStatusBarService, mockNotificationListenerService) + verifyNoMoreInteractions(mockStatusBarService, mockNotificationListenerService) } @Test @@ -205,7 +205,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { runCurrent() // THEN we call the new Callable - verifyZeroInteractions(callable) + verifyNoMoreInteractions(callable) verify(otherCallable).call() } @@ -226,7 +226,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { // THEN visibility changes are reported verify(mockStatusBarService) .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture()) - verifyZeroInteractions(mockNotificationListenerService) + verifyNoMoreInteractions(mockNotificationListenerService) val noLongerVisible = visibilityArrayCaptor.value assertThat(noLongerVisible).hasLength(2) assertThat(noLongerVisible[0]).apply { @@ -325,7 +325,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { runCurrent() // THEN the Expand event is not reported again - verifyZeroInteractions(mockStatusBarService) + verifyNoMoreInteractions(mockStatusBarService) } @Test @@ -341,7 +341,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { runCurrent() // No events are reported - verifyZeroInteractions(mockStatusBarService) + verifyNoMoreInteractions(mockStatusBarService) } @Test @@ -424,7 +424,7 @@ class NotificationStatsLoggerTest : SysuiTestCase() { // THEN no events are reported, because we consider the Notification initially // collapsed, so only expanded is logged in the first time. - verifyZeroInteractions(mockStatusBarService) + verifyNoMoreInteractions(mockStatusBarService) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt index 81f095041fbc..799e957656dc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt @@ -34,7 +34,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations @SmallTest @@ -70,6 +70,6 @@ class SensitiveNotificationProtectionControllerFlagDisabledTest : SysuiTestCase( @Test fun init_noRegisterMediaProjectionManagerCallback() { - verifyZeroInteractions(mediaProjectionManager) + verifyNoMoreInteractions(mediaProjectionManager) } } diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index d7c13598644f..a9f9fafd505f 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vee alle stil kennisgewings uit"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kennisgewings onderbreek deur Moenie Steur Nie"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Begin nou"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Geen kennisgewings nie"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Geen nuwe kennisgewings nie"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Luidsprekers en skerms"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Voorgestelde toestelle"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Invoer"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Uitvoer"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop jou gedeelde sessie om media na ’n ander toestel toe te skuif"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Hoe uitsaai werk"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Vou ikoon in"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vou ikoon uit"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Sleephandvatsel"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeer met jou sleutelbord"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Leer kortpadsleutels"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeer met jou raakpaneel"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 388601bc157d..704bdcaa108a 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ሁሉንም ጸጥ ያሉ ማሳወቂያዎችን ያጽዱ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"አሁን ጀምር"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ምንም ማሳወቂያ የለም"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ምንም አዲስ ማሳወቂያዎች የሉም"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"መሰብሰቢያ አዶ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"መዘርጊያ አዶ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ወይም"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"መያዣ ይጎትቱ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"የቁልፍ ሰሌዳዎን በመጠቀም ያስሱ"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"የቁልፍ ሰሌዳ አቋራጮችን ይወቁ"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"የመዳሰሻ ሰሌዳዎን በመጠቀም ያስሱ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 53b1dfb920fa..8ed225df457b 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"المحادثات"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"محو جميع الإشعارات الصامتة"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"عدم الإزعاج\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ما مِن إشعارات"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ما مِن إشعارات جديدة"</string> @@ -772,7 +774,7 @@ <string name="feedback_prompt" msgid="3656728972307896379">"أخبِر مطوِّر البرامج برأيك. هل كان هذا صحيحًا؟"</string> <string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"تم فتح عناصر التحكم في الإشعارات لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="notification_channel_controls_closed_accessibility" msgid="1561909368876911701">"تم إغلاق عناصر التحكم في الإشعارات لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <string name="notification_more_settings" msgid="4936228656989201793">"المزيد من الإعدادات"</string> + <string name="notification_more_settings" msgid="4936228656989201793">"إعدادات إضافية"</string> <string name="notification_app_settings" msgid="8963648463858039377">"تخصيص"</string> <string name="notification_conversation_bubble" msgid="2242180995373949022">"إظهار فقاعة تفسيرية"</string> <string name="notification_conversation_unbubble" msgid="6908427185031099868">"إزالة فقاعات المحادثات"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"رمز التصغير"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"رمز التوسيع"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"أو"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"مقبض السحب"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"التنقّل باستخدام لوحة المفاتيح"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"تعرَّف على اختصارات لوحة المفاتيح"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"التنقّل باستخدام لوحة اللمس"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 04cb99cb7157..07c6f73c8975 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"আটাইবোৰ নীৰৱ জাননী মচক"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"অসুবিধা নিদিব-ই জাননী পজ কৰিছে"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"এতিয়াই আৰম্ভ কৰক"</string> <string name="empty_shade_text" msgid="8935967157319717412">"কোনো জাননী নাই"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"কোনো নতুন জাননী নাই"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"সংকোচন কৰাৰ চিহ্ন"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"বিস্তাৰ কৰাৰ চিহ্ন"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ড্ৰেগ হেণ্ডেল"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"কীব’ৰ্ড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"কীব’ৰ্ডৰ শ্বৰ্টকাটসমূহৰ বিষয়ে জানক"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 85aa42f13a23..551ec5cd436b 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Səssiz bildirişlərin hamısını silin"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"İndi başlayın"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Heç bir bildiriş yoxdur"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Yeni bildiriş yoxdur"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Dinamiklər & Displeylər"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Təklif olunan Cihazlar"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Daxiletmə"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Nəticə"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Medianı başqa cihaza köçürmək üçün paylaşılan sessiyanı dayandırın"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Dayandırın"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Yayım necə işləyir"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"İkonanı yığcamlaşdırın"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"İkonanı genişləndirin"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"və ya"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Dəstəyi çəkin"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klaviaturadan istifadə edərək hərəkət edin"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Klaviatura qısayolları haqqında öyrənin"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Taçpeddən istifadə edərək hərəkət edin"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index b838f7c445b5..20dee4603e7b 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obrišite sva nečujna obaveštenja"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obaveštenja su pauzirana režimom Ne uznemiravaj"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Započni"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nema obaveštenja"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obaveštenja"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za skupljanje"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Marker za prevlačenje"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tastature"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o tasterskim prečicama"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću tačpeda"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 038732c45559..ba0a8b422474 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Выдаліць усе апавяшчэнні без гуку"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Пачаць зараз"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Апавяшчэнняў няма"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Няма новых апавяшчэнняў"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Дынамікі і дысплэі"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Прылады, якія падтрымліваюцца"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Увод"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Вывад"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Каб перамясціць медыяфайлы на іншую прыладу, спыніце абагулены сеанс"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Спыніць"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Як адбываецца трансляцыя"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Згарнуць\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Разгарнуць\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер перацягвання"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігацыя з дапамогай клавіятуры"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Азнаёмцеся са спалучэннямі клавіш"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігацыя з дапамогай сэнсарнай панэлі"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 17a8ed520618..bf558eb42708 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Изчистване на всички беззвучни известия"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известията са поставени на пауза от режима „Не безпокойте“"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Стартиране сега"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Няма известия"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Няма нови известия"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Високоговорители и екрани"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Предложени устройства"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Вход"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Изход"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Спиране на споделената ви сесия с цел преместване на мултимедията на друго устройство"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Спиране"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Как работи предаването"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за свиване"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за разгъване"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Манипулатор за преместване с плъзгане"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навигирайте посредством клавиатурата си"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Научете за клавишните комбинации"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навигирайте посредством сензорния панел"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index ebec6522d049..cf55feb343e8 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সব নীরব বিজ্ঞপ্তি মুছুন"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'বিরক্ত করবে না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"এখন শুরু করুন"</string> <string name="empty_shade_text" msgid="8935967157319717412">"কোনও বিজ্ঞপ্তি নেই"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"নতুন কোনও বিজ্ঞপ্তি নেই"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"স্পিকার ও ডিসপ্লে"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"সাজেস্ট করা ডিভাইস"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"ইনপুট"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"আউটপুট"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"অন্য ডিভাইসে মিডিয়া সরাতে আপনার শেয়ার করা সেশন বন্ধ করুন"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"বন্ধ করুন"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ব্রডকাস্ট কীভাবে কাজ করে"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"আইকন আড়াল করুন"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"আইকন বড় করুন"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"টেনে আনার হ্যান্ডেল"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"আপনার কীবোর্ড ব্যবহার করে নেভিগেট করুন"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"কীবোর্ড শর্টকাট সম্পর্কে জানুন"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"আপনার টাচপ্যাড ব্যবহার করে নেভিগেট করুন"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 34e3d805ba35..679becec2b15 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obriši sva nečujna obavještenja"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nema obavještenja"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obavještenja"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sužavanja"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona proširivanja"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ručica za prevlačenje"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tastature"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o prečicama tastature"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću dodirne podloge"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 27f704d6c4d5..a0c0bf9defc8 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Esborra totes les notificacions silencioses"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No hi ha cap notificació"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No hi ha cap notificació nova"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Replega la icona"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Desplega la icona"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ansa per arrossegar"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega amb el teclat"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprèn les tecles de drecera"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega amb el ratolí tàctil"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index c824837a73cd..107bac6b01a4 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazat všechna tichá oznámení"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Oznámení jsou pozastavena režimem Nerušit"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Spustit"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Žádná oznámení"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Žádná nová oznámení"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Reproduktory a displeje"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Navrhovaná zařízení"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Vstup"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Výstup"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ukončí sdílenou relaci a bude možné přesunout médium do jiného zařízení"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Zastavit"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jak vysílání funguje"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sbalení"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalení"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"nebo"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Úchyt pro přetažení"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigujte pomocí klávesnice"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte se klávesové zkratky"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigujte pomocí touchpadu"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index feac02dc0ac7..1ac75260f58d 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ryd alle lydløse notifikationer"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikationer er sat på pause af Forstyr ikke"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Start nu"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ingen notifikationer"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Ingen nye notifikationer"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Højttalere og skærme"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Foreslåede enheder"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop din delte session for at flytte medier til en anden enhed"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Sådan fungerer udsendelser"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon for Skjul"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon for Udvid"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Håndtag"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviger ved hjælp af dit tastatur"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Se tastaturgenveje"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviger ved hjælp af din touchplade"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 3235c3ad8b79..8f5a705bc196 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle lautlosen Benachrichtigungen löschen"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Benachrichtigungen durch „Bitte nicht stören“ pausiert"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Jetzt starten"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Keine Benachrichtigungen"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Keine neuen Benachrichtigungen"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Lautsprecher & Displays"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Vorgeschlagene Geräte"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Eingabe"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Ausgabe"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Beende die Freigabesitzung zur Übertragung von Medien auf das andere Gerät"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Beenden"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Funktionsweise von Nachrichten an alle"</string> @@ -1293,8 +1293,7 @@ <string name="add" msgid="81036585205287996">"Hinzufügen"</string> <string name="manage_users" msgid="1823875311934643849">"Nutzer verwalten"</string> <string name="drag_split_not_supported" msgid="7173481676120546121">"Diese Benachrichtigung lässt sich nicht auf einen Splitscreen ziehen"</string> - <!-- no translation found for dream_overlay_location_active (6484763493158166618) --> - <skip /> + <string name="dream_overlay_location_active" msgid="6484763493158166618">"Standortermittlung aktiv"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN nicht verfügbar"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritätsmodus"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wecker gestellt"</string> @@ -1351,8 +1350,7 @@ <string name="lock_screen_settings" msgid="6152703934761402399">"Sperrbildschirm personalisieren"</string> <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Zum Anpassen des Sperrbildschirms entsperren"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Kein WLAN verfügbar"</string> - <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) --> - <skip /> + <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Standortermittlung aktiv"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera blockiert"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera und Mikrofon blockiert"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon blockiert"</string> @@ -1400,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Symbol „Minimieren“"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Symbol „Maximieren“"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oder"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ziehpunkt"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigation mit der Tastatur"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Informationen zu Tastenkombinationen"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigation mit dem Touchpad"</string> @@ -1410,8 +1407,7 @@ <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Informationen zu Touchpad-Gesten, Tastenkombinationen und mehr"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Touch-Geste „Zurück“"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Touch-Geste „Startbildschirm“"</string> - <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) --> - <skip /> + <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Letzte Apps aufrufen"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fertig"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zurück"</string> <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Wenn du zurückgehen möchtest, wische an einer beliebigen Stelle des Touchpads mit drei Fingern nach links oder rechts.\n\nDu kannst stattdessen auch die Tastenkombination „Aktion“ + „ESC“ verwenden."</string> @@ -1421,14 +1417,10 @@ <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Du kannst jederzeit zum Startbildschirm gehen, indem du mit drei Fingern vom unteren Displayrand nach oben wischst."</string> <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Sehr gut!"</string> <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du hast den Schritt für die „Startbildschirm“-Geste abgeschlossen."</string> - <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) --> - <skip /> - <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) --> - <skip /> - <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) --> - <skip /> - <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) --> - <skip /> + <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Letzte Apps aufrufen"</string> + <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Wische mit 3 Fingern nach oben und halte das Touchpad gedrückt."</string> + <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Gut gemacht!"</string> + <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du hast das Tutorial für die Touch-Geste zum Aufrufen der zuletzt verwendeten Apps abgeschlossen."</string> <string name="tutorial_action_key_title" msgid="2659466586996495447">"Aktionstaste"</string> <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Wenn du auf deine Apps zugreifen möchtest, drücke auf der Tastatur die Aktionstaste."</string> <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Glückwunsch!"</string> @@ -1452,14 +1444,10 @@ <string name="overview_edu_notification_content" msgid="3578204677648432500">"Wische mit 3 Fingern nach oben und halte das Touchpad gedrückt. Tippe für mehr Infos zu Touch-Gesten."</string> <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Über die Tastatur alle Apps aufrufen"</string> <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Du kannst jederzeit die Aktionstaste drücken. Tippe für mehr Infos zu Touch-Gesten."</string> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) --> - <skip /> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) --> - <skip /> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) --> - <skip /> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) --> - <skip /> + <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"„Extradunkel“ jetzt Teil des Schiebereglers für die Helligkeit"</string> + <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Du kannst das Display jetzt extradunkel machen, indem du die Helligkeit noch weiter senkst.\n\nDa diese Funktion jetzt Teil des Schiebereglers für die Helligkeit ist, werden die „Extradunkel“-Kurzbefehle entfernt."</string> + <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"„Extradunkel“-Kurzbefehle entfernen"</string> + <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Kurzbefehle für „Extradunkel“ entfernt"</string> <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Konnektivität"</string> <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Bedienungshilfen"</string> <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Dienstprogramme"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 2187a172a4aa..183249bc3e16 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Συζητήσεις"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Διαγραφή όλων των ειδοποιήσεων σε σίγαση"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Έναρξη τώρα"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Δεν υπάρχουν ειδοποιήσεις"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Δεν υπάρχουν νέες ειδοποιήσεις"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Ηχεία και οθόνες"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Προτεινόμενες συσκευές"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Είσοδος"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Έξοδος"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Διακόψτε την κοινόχρηστη περίοδο λειτουργίας για να μεταφέρετε μέσα σε άλλη συσκευή"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Διακοπή"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Πώς λειτουργεί η μετάδοση"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Εικονίδιο σύμπτυξης"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Εικονίδιο ανάπτυξης"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ή"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Λαβή μεταφοράς"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Πλοήγηση με το πληκτρολόγιο"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Μάθετε συντομεύσεις πληκτρολογίου"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Πλοήγηση με την επιφάνεια αφής"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 3a961e2aeeb2..9b7ae5da01ed 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index ba71ccfd4256..4fcc7a4eb550 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -573,6 +573,7 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> + <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 3a961e2aeeb2..9b7ae5da01ed 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 3a961e2aeeb2..9b7ae5da01ed 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index eb76a7edcb87..3c22ed163d31 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -573,6 +573,7 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string> + <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index b1d0c23761ff..88cedcf8f1d1 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo \"No interrumpir\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Comenzar ahora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No hay notificaciones nuevas"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Bocinas y pantallas"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos sugeridos"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Salida"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Detiene la sesión de uso compartido para transferir contenido multimedia a otro dispositivo"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Detener"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cómo funciona la transmisión"</string> @@ -1293,8 +1293,7 @@ <string name="add" msgid="81036585205287996">"Agregar"</string> <string name="manage_users" msgid="1823875311934643849">"Administrar usuarios"</string> <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificación no admite arrastrar entre pantallas divididas"</string> - <!-- no translation found for dream_overlay_location_active (6484763493158166618) --> - <skip /> + <string name="dream_overlay_location_active" msgid="6484763493158166618">"Ubicación activa"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"La red Wi-Fi no está disponible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo prioridad"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Se estableció la alarma"</string> @@ -1351,8 +1350,7 @@ <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar pantalla de bloqueo"</string> <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloquea para personalizar la pantalla de bloqueo"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi no disponible"</string> - <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) --> - <skip /> + <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Ubicación activa"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"La cámara está bloqueada"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La cámara y el micrófono están bloqueados"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micrófono está bloqueado"</string> @@ -1400,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícono de contraer"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícono de expandir"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega con el teclado"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende combinaciones de teclas"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega con el panel táctil"</string> @@ -1410,8 +1407,7 @@ <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprende sobre los gestos del panel táctil, las combinaciones de teclas y mucho más"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto atrás"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto para ir a la pantalla principal"</string> - <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) --> - <skip /> + <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver apps recientes"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Listo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string> <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para volver, desliza tres dedos hacia la derecha o la izquierda en cualquier lugar del panel táctil.\n\nPara completar esta acción, también puedes usar la combinación de teclas Action + ESC."</string> @@ -1421,14 +1417,10 @@ <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para ir a la pantalla principal en cualquier momento, desliza hacia arriba desde la parte inferior de la pantalla con tres dedos."</string> <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"¡Muy bien!"</string> <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Completaste el gesto para ir al inicio."</string> - <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) --> - <skip /> - <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) --> - <skip /> - <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) --> - <skip /> - <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) --> - <skip /> + <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver apps recientes"</string> + <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Desliza hacia arriba con tres dedos en el panel táctil y mantenlos presionados."</string> + <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"¡Bien hecho!"</string> + <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Completaste el gesto para ver las apps recientes."</string> <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de acción"</string> <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acceder a las apps, presiona la tecla de acción en el teclado."</string> <string name="tutorial_action_key_success_title" msgid="466467860120112933">"¡Felicitaciones!"</string> @@ -1452,14 +1444,10 @@ <string name="overview_edu_notification_content" msgid="3578204677648432500">"Desliza hacia arriba con tres dedos y mantenlos presionados. Presiona para aprender más gestos."</string> <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Usa el teclado para ver todas las apps"</string> <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Presiona la tecla de acción en cualquier momento. Presiona para aprender más gestos."</string> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) --> - <skip /> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) --> - <skip /> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) --> - <skip /> - <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) --> - <skip /> + <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"La atenuación extra ahora es parte del control deslizante de brillo"</string> + <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ahora puedes bajar el nivel del brillo de la pantalla para atenuarla aún más.\n\nComo esta función ahora es parte del control deslizante de brillo, se quitaron los accesos directos de atenuación extra."</string> + <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Quitar accesos directos a la atenuación extra"</string> + <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Se quitaron los accesos directos a la atenuación extra"</string> <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectividad"</string> <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accesibilidad"</string> <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilidades"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 21b42ad2bfb0..63f4ae11a7f6 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Empezar ahora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"No hay notificaciones nuevas"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altavoces y pantallas"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos sugeridos"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Salida"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Detén tu sesión compartida para transferir el contenido multimedia a otro dispositivo"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Detener"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cómo funciona la emisión"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icono de contraer"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icono de desplegar"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Desplázate con el teclado"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende combinaciones de teclas"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Desplázate con el panel táctil"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index c1807ad7d208..35d40120c802 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kustuta kõik hääletud märguanded"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Režiim Mitte segada peatas märguanded"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Alusta kohe"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Märguandeid pole"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Uusi märguandeid ei ole"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Kõlarid ja ekraanid"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Soovitatud seadmed"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Sisend"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Väljund"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Peatage jagatud seanss, et meedia teise seadmesse teisaldada"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Peata"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kuidas ülekandmine toimib?"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ahendamisikoon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laiendamisikoon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"või"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Lohistamispide"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeerige klaviatuuri abil"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Õppige klaviatuuri otseteid"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeerige puuteplaadi abil"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 50a55f921347..7e0f203d0b0b 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Elkarrizketak"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Garbitu soinurik gabeko jakinarazpen guztiak"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ez molestatzeko moduak pausatu egin ditu jakinarazpenak"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Hasi"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ez dago jakinarazpenik"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Ez dago jakinarazpen berririk"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%% <xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Bozgorailuak eta pantailak"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Iradokitako gailuak"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Sarrera"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Irteera"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Gelditu partekatutako saioa multimedia-edukia beste gailu batera eramateko"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Gelditu"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Nola funtzionatzen dute iragarpenek?"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tolesteko ikonoa"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Zabaltzeko ikonoa"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"edo"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Arrastatzeko kontrol-puntua"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Nabigatu teklatua erabilita"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ikasi lasterbideak"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Nabigatu ukipen-panela erabilita"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 8f413c8f859d..e70d2bb1ba95 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمهها"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"پاک کردن همه اعلانهای بیصدا"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلانها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"اکنون شروع کنید"</string> <string name="empty_shade_text" msgid="8935967157319717412">"اعلانی موجود نیست"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"اعلان جدیدی وجود ندارد"</string> @@ -1022,7 +1024,7 @@ <string name="privacy_type_location" msgid="7991481648444066703">"مکان"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"میکروفون"</string> <string name="privacy_type_media_projection" msgid="8136723828804251547">"ضبط صفحهنمایش"</string> - <string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string> + <string name="music_controls_no_title" msgid="4166497066552290938">"بیعنوان"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string> <string name="font_scaling_dialog_title" msgid="6273107303850248375">"اندازه قلم"</string> <string name="font_scaling_smaller" msgid="1012032217622008232">"کوچکتر کردن"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"نماد جمع کردن"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"نماد ازهم بازکردن"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"دستگیره کشاندن"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"پیمایش کردن بااستفاده از صفحهکلید"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"آشنایی با میانبرهای صفحهکلید"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"پیمایش کردن بااستفاده از صفحه لمسی"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index f8fa57d72d27..f6d43c1a91d1 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Tyhjennä kaikki hiljaiset ilmoitukset"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Älä häiritse ‑tila keskeytti ilmoitukset"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Aloita nyt"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ei ilmoituksia"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Ei uusia ilmoituksia"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Kaiuttimet ja näytöt"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Ehdotetut laitteet"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Sisääntulo"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Ulostulo"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Lopeta jaettu istunto, jotta voit siirtyä mediaan toisella laitteella"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Lopeta"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Miten lähetys toimii"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tiivistyskuvake"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laajennuskuvake"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"tai"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Vetokahva"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Siirry käyttämällä näppäimistöä"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Opettele pikanäppäimiä"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Siirry käyttämällä kosketuslevyä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 106af39f6d1b..1f6de9f6a4b1 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Les notifications sont suspendues par le mode Ne pas déranger"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Aucune nouvelle notification"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Haut-parleurs et écrans"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Appareils suggérés"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Entrer"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Sortie"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Arrêtez votre session partagée pour déplacer des contenus multimédias vers un autre appareil"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Arrêter"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Fonctionnement de la diffusion"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Poignée de déplacement"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviguer à l\'aide de votre clavier"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Apprenez à utiliser les raccourcis-clavier"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviguer à l\'aide de votre pavé tactile"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index ad7a87595cab..fbf5a6c7aced 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Aucune nouvelle notification"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Enceintes et écrans"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Appareils suggérés"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Entrée"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Sortie"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Arrêter votre session partagée pour déplacer des contenus multimédias vers un autre appareil"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Arrêter"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Fonctionnement des annonces"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Poignée de déplacement"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviguer à l\'aide du clavier"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Découvrir les raccourcis clavier"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviguer à l\'aide de votre pavé tactile"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index bfe5b58d7f17..b9d0891b99fa 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas as notificacións silenciadas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"O modo Non molestar puxo en pausa as notificacións"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Non hai notificacións"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Non hai notificacións novas"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altofalantes e pantallas"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos suxeridos"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Saída"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Detén a sesión de uso compartido para mover contido multimedia a outro dispositivo"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Deter"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funcionan as difusións?"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona de contraer"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona de despregar"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega co teclado"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende a usar os atallos de teclado"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega co panel táctil"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 5d952ac1f4cd..e9998e448595 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"બધા સાઇલન્ટ નોટિફિકેશન સાફ કરો"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"હવે શરૂ કરો"</string> <string name="empty_shade_text" msgid="8935967157319717412">"કોઈ નોટિફિકેશન નથી"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"કોઈ નવું નોટિફિકેશન નથી"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\'નાનું કરો\'નું આઇકન"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\'મોટું કરો\'નું આઇકન"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"અથવા"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ઑબ્જેક્ટ ખેંચવાનું હૅન્ડલ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"તમારા કીબોર્ડ વડે નૅવિગેટ કરો"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"કીબોર્ડ શૉર્ટકર્ટ જાણો"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"તમારા ટચપૅડ વડે નૅવિગેટ કરો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 03028b14b7d1..534da68f0286 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -573,10 +573,12 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string> <string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं है"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"कोई नई सूचना नहीं है"</string> - <string name="adaptive_notification_edu_hun_title" msgid="7790738150177329960">"नोटिफ़िकेशन कूलडाउन की सेटिंग चालू है"</string> + <string name="adaptive_notification_edu_hun_title" msgid="7790738150177329960">"लगातार सूचनाएं आने पर आवाज़ कम करने की सेटिंग चालू है"</string> <string name="adaptive_notification_edu_hun_text" msgid="7743367744129536610">"एक साथ कई सूचनाएं मिलने पर, डिवाइस में सूचनाओं से होने वाली आवाज़ और सूचनाएं, दो मिनट के लिए अपने-आप कम हो जाएंगी."</string> <string name="go_to_adaptive_notification_settings" msgid="2423690125178298479">"बंद करें"</string> <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"पुरानी सूचाएं देखने के लिए अनलॉक करें"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 4055e7441675..0d226b1db920 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Pokreni"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nema obavijesti"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obavijesti"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za sažimanje"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Marker za povlačenje"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tipkovnice"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o tipkovnim prečacima"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću dodirne podloge"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 685e21930378..6c26cd5f817e 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Az összes néma értesítés törlése"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ne zavarjanak funkcióval szüneteltetett értesítések"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Indítás most"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nincs értesítés"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nincsenek új értesítések"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Hangfalak és kijelzők"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Javasolt eszközök"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Bemenet"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Kimenet"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Állítsa le a megosztott munkamenetet, ha át szeretné helyezni a médiát egy másik eszközre"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Leállítás"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"A közvetítés működése"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 36d3e42791fe..c0e7c309fef2 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Զրույցներ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ջնջել բոլոր անձայն ծանուցումները"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ծանուցումներ չկան"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Նոր ծանուցումներ չկան"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Բարձրախոսներ և էկրաններ"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Առաջարկվող սարքեր"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Ներածում"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Արտածում"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Կանգնեցրեք ընդհանուր աշխատաշրջանը՝ մուլտիմեդիա բովանդակությունն այլ սարք տեղափոխելու համար"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Կանգնեցնել"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ինչպես է աշխատում հեռարձակումը"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ծալել պատկերակը"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ծավալել պատկերակը"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"կամ"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Տեղափոխման նշիչ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Կողմնորոշվեք ձեր ստեղնաշարի օգնությամբ"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Սովորեք օգտագործել ստեղնային դյուրանցումները"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Կողմնորոշվեք ձեր հպահարթակի օգնությամբ"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a5317258498c..906fde458d82 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hapus semua notifikasi senyap"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikasi dijeda oleh mode Jangan Ganggu"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Mulai sekarang"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Tidak ada notifikasi"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Tidak ada notifikasi baru"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speaker & Layar"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Perangkat yang Disarankan"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Menghentikan sesi berbagi Anda untuk memindahkan media ke perangkat lain"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Berhenti"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cara kerja siaran"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon ciutkan"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon luaskan"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handel geser"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Menavigasi menggunakan keyboard"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Pelajari pintasan keyboard"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Menavigasi menggunakan touchpad"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index c2ada41cc902..68f2c23e4a19 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hreinsa allar þöglar tilkynningar"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Byrja núna"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Engar tilkynningar"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Engar nýjar tilkynningar"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Hátalarar og skjáir"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Tillögur að tækjum"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Inntak"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Úttak"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stöðvaðu sameiginlega lotu til að flytja efni yfir í annað tæki"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stöðva"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Svona virkar útsending"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Minnka tákn"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Stækka tákn"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eða"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Dragkló"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Flettu með því að nota lyklaborðið"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Kynntu þér flýtilykla"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Flettu með því að nota snertiflötinn"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 4ff2eda198fe..4f8015ce31a2 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Cancella tutte le notifiche silenziose"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifiche messe in pausa in base alla modalità Non disturbare"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Avvia adesso"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nessuna notifica"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nessuna nuova notifica"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speaker e display"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivi consigliati"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Interrompi la sessione condivisa per spostare i contenuti multimediali su un altro dispositivo"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Interrompi"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Come funziona la trasmissione"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona Comprimi"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona Espandi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oppure"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Punto di trascinamento"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviga usando la tastiera"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Informazioni sulle scorciatoie da tastiera"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviga usando il touchpad"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 1c212e12a0ea..3d7a25c0e3ea 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ניקוי כל ההתראות השקטות"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"התראות הושהו על ידי מצב \'נא לא להפריע\'"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"כן, אפשר להתחיל"</string> <string name="empty_shade_text" msgid="8935967157319717412">"אין התראות"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"אין התראות חדשות"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"רמקולים ומסכים"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"הצעות למכשירים"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"קלט"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"פלט"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"עצירת הסשן המשותף כדי להעביר מדיה למכשיר אחר"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"עצירה"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"הסבר על שידורים"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"סמל הכיווץ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"סמל ההרחבה"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"או"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"נקודת האחיזה לגרירה"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ניווט באמצעות המקלדת"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"מידע על מקשי קיצור"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ניווט באמצעות לוח המגע"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index eda727f21232..3e29ed62fa7c 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"サイレント通知がすべて消去されます"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"サイレント モードにより通知は一時停止中です"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"今すぐ開始"</string> <string name="empty_shade_text" msgid="8935967157319717412">"通知はありません"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"新しい通知はありません"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"閉じるアイコン"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"開くアイコン"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"または"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ドラッグ ハンドル"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"キーボードを使用して移動する"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"キーボード ショートカットの詳細"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"タッチパッドを使用して移動する"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 836bd44b52bd..539c186011e3 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"საუბრები"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ყველა ჩუმი შეტყობინების გასუფთავება"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"დაწყება ახლავე"</string> <string name="empty_shade_text" msgid="8935967157319717412">"შეტყობინებები არ არის."</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ახალი შეტყობინებები არ არის"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ხატულის ჩაკეცვა"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ხატულის გაფართოება"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ან"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"სახელური ჩავლებისთვის"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ნავიგაცია კლავიატურის გამოყენებით"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"კლავიატურის მალსახმობების სწავლა"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ნავიგაცია სენსორული პანელის გამოყენებით"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index dc2a618fc396..7343fa1440d6 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Әңгімелер"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Барлық үнсіз хабарландыруларды өшіру"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Хабарландырулар Мазаламау режимінде кідіртілді"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Қазір бастау"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Хабарландырулар жоқ"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Жаңа хабарландырулар жоқ"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Динамиктер мен дисплейлер"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Ұсынылған құрылғылар"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Кіріс"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Шығыс"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Мультимедиа файлын басқа құрылғыға жылжыту үшін ортақ сеансты тоқтатыңыз."</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Тоқтату"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Тарату қалай жүзеге асады"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жию белгішесі"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жаю белгішесі"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"немесе"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Сүйрейтін тетік"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Пернетақтамен жұмыс істеңіз"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Перне тіркесімдерін үйреніңіз."</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Сенсорлық тақтамен жұмыс істеңіз"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 6c15c79fc53e..117463564fd3 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"សម្អាតការជូនដំណឹងស្ងាត់ទាំងអស់"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ការជូនដំណឹងបានផ្អាកដោយមុខងារកុំរំខាន"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ចាប់ផ្ដើមឥឡូវ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"គ្មានការជូនដំណឹង"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"គ្មានការជូនដំណឹងថ្មីៗទេ"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"រូបតំណាង \"បង្រួម\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"រូបតំណាង \"ពង្រីក\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ឬ"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ដងអូស"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"រុករកដោយប្រើក្ដារចុចរបស់អ្នក"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ស្វែងយល់អំពីផ្លូវកាត់ក្ដារចុច"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"រុករកដោយប្រើផ្ទាំងប៉ះរបស់អ្នក"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index a16f110d0230..52daecb89c63 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -83,7 +83,7 @@ <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸುವ ಮೊದಲು ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಬೇಕು"</string> <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಪುನಃ ತೆಗೆದುಕೊಳ್ಳಲು ಪ್ರಯತ್ನಿಸಿ"</string> <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string> + <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಆ್ಯಪ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string> <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದನ್ನು ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂಭಾಷಣೆಗಳು"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ಎಲ್ಲಾ ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ಯಾವುದೇ ಹೊಸ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string> @@ -963,7 +965,7 @@ <string name="tuner_left" msgid="5758862558405684490">"ಎಡ"</string> <string name="tuner_right" msgid="8247571132790812149">"ಬಲ"</string> <string name="tuner_menu" msgid="363690665924769420">"ಮೆನು"</string> - <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್"</string> + <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> ಆ್ಯಪ್"</string> <string name="notification_channel_alerts" msgid="3385787053375150046">"ಅಲರ್ಟ್ಗಳು"</string> <string name="notification_channel_battery" msgid="9219995638046695106">"ಬ್ಯಾಟರಿ"</string> <string name="notification_channel_screenshot" msgid="7665814998932211997">"ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳು"</string> @@ -986,8 +988,8 @@ <string name="dnd_is_off" msgid="3185706903793094463">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆಫ್ ಆಗಿದೆ"</string> <string name="dnd_is_on" msgid="7009368176361546279">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string> <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"(<xliff:g id="ID_1">%s</xliff:g>) ಸ್ವಯಂಚಾಲಿತ ನಿಯಮದ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> - <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"(<xliff:g id="ID_1">%s</xliff:g>) ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> - <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ಸ್ವಯಂಚಾಲಿತ ನಿಯಮ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> + <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"(<xliff:g id="ID_1">%s</xliff:g>) ಆ್ಯಪ್ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> + <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ಸ್ವಯಂಚಾಲಿತ ನಿಯಮ ಅಥವಾ ಆ್ಯಪ್ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿವೆ"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string> @@ -997,7 +999,7 @@ <string name="auto_data_switch_disable_message" msgid="5885533647399535852">"ಲಭ್ಯತೆಯ ಆಧಾರದ ಮೇಲೆ ಮೊಬೈಲ್ ಡೇಟಾ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬದಲಾಗುವುದಿಲ್ಲ"</string> <string name="auto_data_switch_dialog_negative_button" msgid="2370876875999891444">"ಬೇಡ, ಧನ್ಯವಾದಗಳು"</string> <string name="auto_data_switch_dialog_positive_button" msgid="8531782041263087564">"ಹೌದು, ಬದಲಿಸಿ"</string> - <string name="touch_filtered_warning" msgid="8119511393338714836">"ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> + <string name="touch_filtered_warning" msgid="8119511393338714836">"ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಆ್ಯಪ್ ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್ಗಳನ್ನು ತೋರಿಸಲು <xliff:g id="APP_0">%1$s</xliff:g> ಅನ್ನು ಅನುಮತಿಸುವುದೇ?"</string> <string name="slice_permission_text_1" msgid="6675965177075443714">"- ಇದು <xliff:g id="APP">%1$s</xliff:g> ನಿಂದ ಮಾಹಿತಿಯನ್ನು ಓದಬಹುದು"</string> <string name="slice_permission_text_2" msgid="6758906940360746983">"- ಇದು <xliff:g id="APP">%1$s</xliff:g> ಒಳಗಡೆ ಕ್ರಿಯೆಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ಸ್ಪೀಕರ್ಗಳು ಮತ್ತು ಡಿಸ್ಪ್ಲೇಗಳು"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ಸೂಚಿಸಿದ ಸಾಧನಗಳು"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"ಇನ್ಪುಟ್"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"ಔಟ್ಪುಟ್"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ಮೀಡಿಯಾವನ್ನು ಮತ್ತೊಂದು ಸಾಧನಕ್ಕೆ ಸರಿಸಲು ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸೆಶನ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ನಿಲ್ಲಿಸಿ"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ಪ್ರಸಾರವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ಕುಗ್ಗಿಸುವ ಐಕಾನ್"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ವಿಸ್ತೃತಗೊಳಿಸುವ ಐಕಾನ್"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ಅಥವಾ"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ಡ್ರ್ಯಾಗ್ ಹ್ಯಾಂಡಲ್"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಕಲಿಯಿರಿ"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 622f0fb127b2..9a9f3ebe71a8 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 알림이 일시중지됨"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string> <string name="empty_shade_text" msgid="8935967157319717412">"알림 없음"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"새로운 알림 없음"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"스피커 및 디스플레이"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"추천 기기"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"입력"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"출력"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"미디어를 다른 기기로 이동하려면 공유 세션을 중지하세요."</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"중지"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"브로드캐스팅 작동 원리"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"접기 아이콘"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"확장 아이콘"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"또는"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"드래그 핸들"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"키보드를 사용하여 이동"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"단축키 알아보기"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"터치패드를 사용하여 이동"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 0edb3f82735a..33ebf6df3c11 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Сүйлөшүүлөр"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бардык үнсүз билдирмелерди өчүрүү"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Азыр баштоо"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Билдирме жок"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Жаңы билдирмелер жок"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Динамиктер жана дисплейлер"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Сунушталган түзмөктөр"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Киргизүү"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Чыккан маалымат"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Медиафайлдарды башка түзмөккө жылдыруу үчүн жалпы сеансыңызды токтотуңуз"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Токтотуу"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Кабарлоо кантип иштейт"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жыйыштыруу сүрөтчөсү"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жайып көрсөтүү сүрөтчөсү"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"же"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Cүйрөө маркери"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Нерселерге баскычтоп аркылуу өтүңүз"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ыкчам баскычтар тууралуу билип алыңыз"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Нерселерге сенсордук такта аркылуу өтүңүз"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 242d766a7543..410f7d5a506f 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"ການສົນທະນາ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ລຶບລ້າງການແຈ້ງເຕືອນແບບງຽບທັງໝົດ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ເລີ່ມດຽວນີ້"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ບໍ່ມີການແຈ້ງເຕືອນ"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ບໍ່ມີການແຈ້ງເຕືອນໃໝ່"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ລຳໂພງ ແລະ ຈໍສະແດງຜົນ"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ອຸປະກອນທີ່ແນະນຳ"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"ອິນພຸດ"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"ເອົ້າພຸດ"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ຢຸດເຊດຊັນທີ່ແບ່ງປັນຂອງທ່ານເພື່ອຍ້າຍມີເດຍໄປຫາອຸປະກອນອື່ນ"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ຢຸດ"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ການອອກອາກາດເຮັດວຽກແນວໃດ"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ໄອຄອນຫຍໍ້ລົງ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ໄອຄອນຂະຫຍາຍ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ຫຼື"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ບ່ອນຈັບລາກ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ນຳທາງໂດຍໃຊ້ແປ້ນພິມຂອງທ່ານ"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ສຶກສາຄີລັດ"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ນຳທາງໂດຍໃຊ້ແຜ່ນສຳຜັດຂອງທ່ານ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index fd625995c44d..67ead2399a38 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Išvalyti visus tylius pranešimus"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Pradėti dabar"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nėra įspėjimų"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Naujų pranešimų nėra"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Garsiakalbiai ir ekranai"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Siūlomi įrenginiai"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Įvestis"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Išvestis"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Sustabdyti bendrinamą seansą norint perkelti mediją į kitą įrenginį"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Sustabdyti"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kaip veikia transliacija"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sutraukimo piktograma"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Išskleidimo piktograma"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"arba"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Vilkimo rankenėlė"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naršykite naudodamiesi klaviatūra"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Sužinokite apie sparčiuosius klavišus"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naršykite naudodamiesi jutikline dalimi"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index a6b7570a77e9..53e0baabcd28 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Notīrīt visus klusos paziņojumus"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Sākt tūlīt"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nav paziņojumu"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nav jaunu paziņojumu"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Skaļruņi un displeji"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Ieteiktās ierīces"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Ievade"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Izvade"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Pārtrauciet savu kopīgoto sesiju, lai pārvietotu multivides saturu uz citu ierīci."</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Pārtraukt"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kā darbojas apraide"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sakļaušanas ikona"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Izvēršanas ikona"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vai"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Vilkšanas turis"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Pārvietošanās, izmantojot tastatūru"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Uzziniet par īsinājumtaustiņiem."</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Pārvietošanās, izmantojot skārienpaliktni"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 1773e3612771..86c93acada52 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Избриши ги сите бесчујни известувања"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известувањата се паузирани од „Не вознемирувај“"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Започни сега"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Нема известувања"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Нема нови известувања"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за собирање"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширување"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Рачка за влечење"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Движете се со користење на тастатурата"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Научете кратенки од тастатурата"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Движете се со користење на допирната подлога"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 05b76d3a3ef9..6958679712e6 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"എല്ലാ നിശബ്ദ അറിയിപ്പുകളും മായ്ക്കുക"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ഇപ്പോൾ ആരംഭിക്കുക"</string> <string name="empty_shade_text" msgid="8935967157319717412">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"പുതിയ അറിയിപ്പുകളൊന്നുമില്ല"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ചുരുക്കൽ ഐക്കൺ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"വികസിപ്പിക്കൽ ഐക്കൺ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"അല്ലെങ്കിൽ"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"വലിച്ചിടുന്നതിനുള്ള ഹാൻഡിൽ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"നിങ്ങളുടെ കീബോർഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"കീബോർഡ് കുറുക്കുവഴികൾ മനസ്സിലാക്കുക"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"നിങ്ങളുടെ ടച്ച്പാഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 7a9a38b8e4d7..95ff970ed0f4 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бүх чимээгүй мэдэгдлийг арилгах"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Бүү саад бол горимын түр зогсоосон мэдэгдэл"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Одоо эхлүүлэх"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Мэдэгдэл байхгүй"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Шинэ мэдэгдэл алга"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Чанга яригч ба дэлгэц"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Санал болгосон төхөөрөмжүүд"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Оролт"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Гаралт"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Өөр төхөөрөмж рүү медиа зөөхийн тулд хуваалцсан харилцан үйлдлээ зогсооно уу"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Зогсоох"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Нэвтрүүлэлт хэрхэн ажилладаг вэ?"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Хураах дүрс тэмдэг"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Дэлгэх дүрс тэмдэг"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"эсвэл"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Чирэх бариул"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Гараа ашиглан шилжих"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Товчлуурын шууд холбоосыг мэдэж аваарай"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Мэдрэгч самбараа ашиглан шилжээрэй"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index e4063f629619..14739299f2ff 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सर्व सायलंट सूचना साफ करा"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"आता सुरू करा"</string> <string name="empty_shade_text" msgid="8935967157319717412">"सूचना नाहीत"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"नवीन सूचना नाहीत"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"कोलॅप्स करा आयकन"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"विस्तार करा आयकन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"किंवा"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ड्रॅग हॅंडल"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"तुमचा कीबोर्ड वापरून नेव्हिगेट करा"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"कीबोर्ड शॉर्टकट जाणून घ्या"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"तुमचा टचपॅड वापरून नेव्हिगेट करा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 710d342f6ed6..ed3a0bc3d737 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kosongkan semua pemberitahuan senyap"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pemberitahuan dijeda oleh Jangan Ganggu"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Mulakan sekarang"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Tiada pemberitahuan"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Tiada pemberitahuan baharu"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kuncupkan ikon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kembangkan ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Pemegang seret"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigasi menggunakan papan kekunci anda"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ketahui pintasan papan kekunci"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigasi menggunakan pad sentuh anda"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 0c9bbe6b9eda..ea10ec267512 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"အသံတိတ် အကြောင်းကြားချက်များအားလုံးကို ရှင်းလင်းရန်"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"အကြောင်းကြားချက်များကို \'မနှောင့်ယှက်ရ\' က ခေတ္တရပ်ထားသည်"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ယခု စတင်ပါ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"အကြောင်းကြားချက် မရှိပါ"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"အကြောင်းကြားချက်သစ် မရှိပါ"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"စပီကာနှင့် ဖန်သားပြင်များ"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"အကြံပြုထားသော စက်ပစ္စည်းများ"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"ထည့်သွင်းချက်"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"ထုတ်လုပ်ချက်"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"အခြားစက်သို့ မီဒီယာရွှေ့ပြောင်းရန် သင်၏မျှဝေထားသောစက်ရှင်ကို ရပ်ပါ"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ရပ်ရန်"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ထုတ်လွှင့်မှုဆောင်ရွက်ပုံ"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"လျှော့ပြရန် သင်္ကေတ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ပိုပြရန် သင်္ကေတ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"သို့မဟုတ်"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ဖိဆွဲအထိန်း"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"သင့်ကီးဘုတ်ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"လက်ကွက်ဖြတ်လမ်းများကို လေ့လာပါ"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"သင့်တာ့ချ်ပက်ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index a097505043dc..6ce048e4b673 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Fjern alle lydløse varsler"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Varsler er satt på pause av «Ikke forstyrr»"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Start nå"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ingen varsler"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Ingen nye varsler"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Høyttalere og skjermer"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Foreslåtte enheter"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Inngang"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Utgang"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stopp den delte økten for å flytte medieinnholdet til en annen enhet"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stopp"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Slik fungerer kringkasting"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Skjul-ikon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vis-ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Håndtak"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviger med tastaturet"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Lær deg hurtigtaster"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviger med styreflaten"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index e2ae7b9717ca..01419b45a82e 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सबै मौन सूचनाहरू हटाउनुहोस्"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"अहिले न"</string> <string name="empty_shade_text" msgid="8935967157319717412">"कुनै सूचनाहरू छैनन्"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"कुनै पनि नयाँ सूचना छैन"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\"कोल्याप्स गर्नुहोस्\" आइकन"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\"एक्स्पान्ड गर्नुहोस्\" आइकन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"वा"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ड्र्याग ह्यान्डल"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"किबोर्ड प्रयोग गरी नेभिगेट गर्नुहोस्"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"किबोर्डका सर्टकटहरू प्रयोग गर्न सिक्नुहोस्"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"टचप्याड प्रयोग गरी नेभिगेट गर्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 9681f1e94c95..325e361686c5 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekken"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle stille meldingen wissen"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Meldingen onderbroken door \'Niet storen\'"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Nu starten"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Geen meldingen"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Geen nieuwe meldingen"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icoon voor samenvouwen"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icoon voor uitvouwen"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handgreep voor slepen"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeren met je toetsenbord"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Leer sneltoetsen die je kunt gebruiken"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeren met je touchpad"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 14e84901a081..e0349999acde 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ସମସ୍ତ ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍ ହୋଇଛି"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"କୌଣସି ନୂଆ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ନାହିଁ"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ସ୍ପିକର ଏବଂ ଡିସପ୍ଲେଗୁଡ଼ିକ"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ପ୍ରସ୍ତାବିତ ଡିଭାଇସଗୁଡ଼ିକ"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"ଇନପୁଟ"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"ଆଉଟପୁଟ"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ଅନ୍ୟ ଏକ ଡିଭାଇସକୁ ମିଡିଆ ମୁଭ କରିବା ପାଇଁ ଆପଣଙ୍କ ସେୟାର କରାଯାଇଥିବା ସେସନକୁ ବନ୍ଦ କରନ୍ତୁ"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ବ୍ରଡକାଷ୍ଟିଂ କିପରି କାମ କରେ"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ଆଇକନକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ଆଇକନକୁ ବିସ୍ତାର କରନ୍ତୁ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"କିମ୍ବା"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ଡ୍ରାଗ ହେଣ୍ଡେଲ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ଆପଣଙ୍କ କୀବୋର୍ଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"କୀବୋର୍ଡ ସର୍ଟକଟଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ଆପଣଙ୍କ ଟଚପେଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 8e7ed22ec4f5..9659930f23c9 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣੇ ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾ ਨਹੀਂ"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ਕੋਈ ਨਵੀਂ ਸੂਚਨਾ ਨਹੀਂ ਹੈ"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ਸਪੀਕਰ ਅਤੇ ਡਿਸਪਲੇਆਂ"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ਸੁਝਾਏ ਗਏ ਡੀਵਾਈਸ"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"ਇਨਪੁੱਟ"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"ਆਊਟਪੁੱਟ"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ਮੀਡੀਆ ਨੂੰ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ \'ਤੇ ਲਿਜਾਉਣ ਲਈ ਆਪਣੇ ਸਾਂਝੇ ਕੀਤੇ ਸੈਸ਼ਨ ਨੂੰ ਬੰਦ ਕਰੋ"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ਬੰਦ ਕਰੋ"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ਪ੍ਰਸਾਰਨ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ਪ੍ਰਤੀਕ ਨੂੰ ਸਮੇਟੋ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ਪ੍ਰਤੀਕ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ਜਾਂ"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ਘਸੀਟਣ ਵਾਲਾ ਹੈਂਡਲ"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ਆਪਣੇ ਕੀ-ਬੋਰਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਾਰੇ ਜਾਣੋ"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 287ecd37fdf5..9c97423fccc7 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Usuń wszystkie ciche powiadomienia"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Rozpocznij teraz"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Brak powiadomień"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Brak nowych powiadomień"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zwijania"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozwijania"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"lub"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Uchwyt do przeciągania"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Nawiguj za pomocą klawiatury"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Dowiedz się więcej o skrótach klawiszowych"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Nawiguj za pomocą touchpada"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 408ffcbac092..5c9679d73d41 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nenhuma notificação nova"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Alça de arrastar"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue usando o teclado"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos do teclado"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue usando o touchpad"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 2e0bb56ab230..e87564d915fc 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Limpar todas as notificações silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações colocadas em pausa pelo modo Não incomodar."</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Começar agora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Não existem novas notificações"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altifalantes e ecrãs"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos sugeridos"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Saída"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Pare a sua sessão partilhada para mover conteúdos multimédia para outro dispositivo"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Parar"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 408ffcbac092..5c9679d73d41 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nenhuma notificação nova"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Alça de arrastar"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue usando o teclado"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos do teclado"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue usando o touchpad"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 443d28aa04ed..8c764910f638 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Șterge toate notificările silențioase"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificări întrerupte prin „Nu deranja”"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Începe acum"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nicio notificare"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nicio notificare nouă"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Difuzoare și ecrane"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispozitive sugerate"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Intrare"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Ieșire"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Oprește sesiunea comună ca să muți elementul media pe alt dispozitiv"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Oprește"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cum funcționează transmisia"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Pictograma de restrângere"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Pictograma de extindere"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"sau"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ghidaj de tragere"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navighează folosind tastatura"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Învață comenzile rapide de la tastatură"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navighează folosind touchpadul"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 66d78087d792..c5b6479a9b15 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговоры"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Отклонить все беззвучные уведомления"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Начать"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Нет уведомлений."</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Новых уведомлений нет"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Свернуть\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Развернуть\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер перемещения"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навигация с помощью клавиатуры"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Узнайте о сочетаниях клавиш."</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навигация с помощью сенсорной панели"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 7dd43a95ebf1..ff0c28dbbf26 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"සියලු නිහඬ දැනුම්දීම් හිස් කරන්න"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"දැන් අරඹන්න"</string> <string name="empty_shade_text" msgid="8935967157319717412">"දැනුම්දීම් නැත"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"නව දැනුම්දීම් නැත"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"හැකුළුම් නිරූපකය"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"දිගහැරීම් නිරූපකය"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"හෝ"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ඇදීම් හැඬලය"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ඔබේ යතුරු පුවරුව භාවිතයෙන් සංචාලනය කරන්න"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"යතුරුපුවරු කෙටිමං ඉගෙන ගන්න"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ඔබේ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index a13a1b45f0af..16af11a26b94 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -152,12 +152,12 @@ <string name="cast_to_other_device_stop_dialog_message_generic" msgid="4100272100480415076">"Momentálne prenášate do zariadenia v okolí"</string> <string name="cast_to_other_device_stop_dialog_button" msgid="6420183747435521834">"Zastaviť prenos"</string> <string name="close_dialog_button" msgid="4749497706540104133">"Zavrieť"</string> - <string name="issuerecord_title" msgid="286627115110121849">"Nástroj na zaznamenávanie problémov"</string> + <string name="issuerecord_title" msgid="286627115110121849">"Nahrávanie problémov"</string> <string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Záznam problému sa spracúva"</string> <string name="issuerecord_channel_description" msgid="6142326363431474632">"Upozornenie na prebiehajúcu aktivitu týkajúcu sa relácie zhromažďovania problémov"</string> - <string name="issuerecord_ongoing_screen_only" msgid="6248206059935015722">"Problém sa zaznamenáva"</string> + <string name="issuerecord_ongoing_screen_only" msgid="6248206059935015722">"Problém sa nahráva"</string> <string name="issuerecord_share_label" msgid="3992657993619876199">"Zdieľať"</string> - <string name="issuerecord_save_title" msgid="4161043023696751591">"Záznam problému bol uložený"</string> + <string name="issuerecord_save_title" msgid="4161043023696751591">"Nahrávka problému bola uložená"</string> <string name="issuerecord_save_text" msgid="1205985304551521495">"Zobrazíte ho klepnutím"</string> <string name="issuerecord_save_error" msgid="6913040083446722726">"Pri ukladaní záznamu problému sa vyskytla chyba"</string> <string name="issuerecord_start_error" msgid="3402782952722871190">"Pri spúšťaní záznamu problému sa vyskytla chyba"</string> @@ -380,16 +380,16 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je deaktivované"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je aktivované"</string> - <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Rekordér obrazovky"</string> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Nahrávanie obrazovky"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Začať"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončiť"</string> - <string name="qs_record_issue_label" msgid="8166290137285529059">"Zaznamenať problém"</string> + <string name="qs_record_issue_label" msgid="8166290137285529059">"Nahrať problém"</string> <string name="qs_record_issue_start" msgid="2979831312582567056">"Začať"</string> <string name="qs_record_issue_stop" msgid="3531747965741982657">"Zastavte"</string> <string name="qs_record_issue_bug_report" msgid="8229031766918650079">"Hlásenie chyby"</string> <string name="qs_record_issue_dropdown_header" msgid="5995983175678658329">"Čo v zariadení bolo ovplyvnené?"</string> <string name="qs_record_issue_dropdown_prompt" msgid="2526949919167046219">"Vyberte typ problému"</string> - <string name="qs_record_issue_dropdown_screenrecord" msgid="6396141928484257626">"Rekordér obrazovky"</string> + <string name="qs_record_issue_dropdown_screenrecord" msgid="6396141928484257626">"Nahrávanie obrazovky"</string> <string name="performance" msgid="6552785217174378320">"Výkon"</string> <string name="user_interface" msgid="3712869377953950887">"Používateľské rozhranie"</string> <string name="thermal" msgid="6758074791325414831">"Teplota"</string> @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazať všetky tiché upozornenia"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Upozornenia sú pozastavené režimom bez vyrušení"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Spustiť"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Žiadne upozornenia"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Žiadne nové upozornenia"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Reproduktory a obrazovky"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Navrhované zariadenia"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Vstup"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Výstup"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ak chcete preniesť médiá do iného zariadenia, ukončite zdieľanú reláciu"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Ukončiť"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ako vysielanie funguje"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zbalenia"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalenia"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"alebo"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Presúvadlo"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Prechádzajte pomocou klávesnice"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte sa klávesové skratky"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Prechádzajte pomocou touchpadu"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 653bb586200d..e664810b82c0 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Pogovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Brisanje vseh tihih obvestil"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Začni zdaj"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ni obvestil"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Ni novih obvestil"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 00484a7b737d..e70629f20cc9 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Bisedat"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Pastro të gjitha njoftimet në heshtje"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Fillo tani"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Asnjë njoftim"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nuk ka njoftime të reja"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altoparlantët dhe ekranet"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Pajisjet e sugjeruara"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Hyrja"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Dalja"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ndalo sesionin e ndarë për ta zhvendosur median në një pajisje tjetër"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Ndalo"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Si funksionon transmetimi"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona e palosjes"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona e zgjerimit"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ose"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Doreza e zvarritjes"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigo duke përdorur tastierën tënde"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Mëso shkurtoret e tastierës"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigo duke përdorur bllokun me prekje"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 3a940c1155f6..164b4aa246a9 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Обришите сва нечујна обавештења"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Обавештења су паузирана режимом Не узнемиравај"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Започни"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Нема обавештења"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Нема нових обавештења"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за скупљање"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширивање"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер за превлачење"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Крећите се помоћу тастатуре"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Сазнајте више о тастерским пречицама"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Крећите се помоћу тачпеда"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 23f476ddad93..3016e83464fd 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konversationer"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Rensa alla ljudlösa aviseringar"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Aviseringar har pausats via Stör ej"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Starta nu"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Inga aviseringar"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Det finns inga nya aviseringar"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Högtalare och skärmar"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Förslag på enheter"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Ingång"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Utgång"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stoppa din delade session för att flytta media till en annan enhet"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stoppa"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Så fungerar utsändning"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikonen Komprimera"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikonen Utöka"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handtag"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigera med tangentbordet"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Lär dig kortkommandon"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigera med styrplattan"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index dee6a5f49879..45095dfcc0bc 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Futa arifa zote zisizo na sauti"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Anza sasa"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Hakuna arifa"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Hakuna arifa mpya"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Spika na Skrini"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Vifaa Vilivyopendekezwa"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Vifaa vya kuingiza data"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Vifaa vya kutoa maudhui"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Simamisha kipindi unachoshiriki ili uhamishie maudhui kwenye kifaa kingine"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Simamisha"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jinsi utangazaji unavyofanya kazi"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kunja aikoni"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Panua aikoni"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"au"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Aikoni ya buruta"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Kusogeza kwa kutumia kibodi yako"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Jifunze kuhusu mikato ya kibodi"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Kusogeza kwa kutumia padi yako ya kugusa"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 92da9089a8f4..3dd0c73170fd 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"சைலன்ட் அறிவிப்புகள் அனைத்தையும் அழிக்கும்"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"இப்போது தொடங்கு"</string> <string name="empty_shade_text" msgid="8935967157319717412">"அறிவிப்புகள் இல்லை"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"புதிய அறிவிப்புகள் இல்லை"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ஸ்பீக்கர்கள் & டிஸ்ப்ளேக்கள்"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"பரிந்துரைக்கப்படும் சாதனங்கள்"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"உள்ளீடு"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"வெளியீடு"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"மீடியாவை வேறொரு சாதனத்திற்கு மாற்ற \'பகிரப்படும் அமர்வை\' நிறுத்தவும்"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"நிறுத்து"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"பிராட்காஸ்ட் எவ்வாறு செயல்படுகிறது?"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"சுருக்குவதற்கான ஐகான்"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"விரிவாக்குவதற்கான ஐகான்"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"அல்லது"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"இழுப்பதற்கான ஹேண்டில்"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"கீபோர்டைப் பயன்படுத்திச் செல்லுதல்"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"கீபோர்டு ஷார்ட்கட்கள் குறித்துத் தெரிந்துகொள்ளுங்கள்"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"டச்பேடைப் பயன்படுத்திச் செல்லுதல்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 16500ed9d415..65de840488f6 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -369,7 +369,7 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"సూర్యోదయం వరకు"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g>కి"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string> - <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"ముదురు రంగు రూపం"</string> + <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"డార్క్ థీమ్"</string> <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"బ్యాటరీ సేవర్"</string> <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"సూర్యాస్తమయానికి"</string> <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"సూర్యోదయం వరకు"</string> @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"అన్ని నిశ్శబ్ద నోటిఫికేషన్లను క్లియర్ చేస్తుంది"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్లు పాజ్ చేయబడ్డాయి"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ఇప్పుడే ప్రారంభించండి"</string> <string name="empty_shade_text" msgid="8935967157319717412">"నోటిఫికేషన్లు లేవు"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"కొత్త నోటిఫికేషన్లు ఏవీ లేవు"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"కుదించండి చిహ్నం"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"విస్తరించండి చిహ్నం"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"లేదా"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"లాగే హ్యాండిల్"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"మీ కీబోర్డ్ ఉపయోగించి నావిగేట్ చేయండి"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"కీబోర్డ్ షార్ట్కట్ల గురించి తెలుసుకోండి"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"మీ టచ్ప్యాడ్ని ఉపయోగించి నావిగేట్ చేయండి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 6bfc9f9be3d1..b8a385a12fec 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\""</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"เริ่มเลย"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ไม่มีการแจ้งเตือน"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"ไม่มีการแจ้งเตือนใหม่"</string> @@ -965,7 +967,7 @@ <string name="tuner_menu" msgid="363690665924769420">"เมนู"</string> <string name="tuner_app" msgid="6949280415826686972">"แอป <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="3385787053375150046">"การแจ้งเตือน"</string> - <string name="notification_channel_battery" msgid="9219995638046695106">"แบตเตอรี"</string> + <string name="notification_channel_battery" msgid="9219995638046695106">"แบตเตอรี่"</string> <string name="notification_channel_screenshot" msgid="7665814998932211997">"ภาพหน้าจอ"</string> <string name="notification_channel_instant" msgid="7556135423486752680">"Instant Apps"</string> <string name="notification_channel_setup" msgid="7660580986090760350">"ตั้งค่า"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 4f3819b161ee..f2cecf97b7b1 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"I-clear ang lahat ng silent na notification"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Mga notification na na-pause ng Huwag Istorbohin"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Magsimula ngayon"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Walang mga notification"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Walang bagong notification"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"I-collapse ang icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"I-expand ang icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handle sa pag-drag"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Mag-navigate gamit ang iyong keyboard"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Matuto ng mga keyboard shortcut"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Mag-navigate gamit ang iyong touchpad"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 19fad73cf2c9..570657d4494a 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Görüşmeler"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sessiz bildirimlerin tümünü temizle"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Şimdi başlat"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Bildirim yok"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Yeni bildirim yok"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Hoparlörler ve Ekranlar"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Önerilen Cihazlar"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Giriş"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Çıkış"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Medyayı başka bir cihaza taşımak için paylaşılan oturumunuzu durdurun"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Durdur"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Yayınlamanın işleyiş şekli"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Daralt simgesi"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Genişlet simgesi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"veya"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Sürükleme tutamacı"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klavyenizi kullanarak gezinin"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Klavye kısayollarını öğrenin"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Dokunmatik alanınızı kullanarak gezinin"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 453ce4a9bb58..65b1b39cccd2 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Розмови"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Очистити всі беззвучні сповіщення"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Режим \"Не турбувати\" призупинив сповіщення"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Почати зараз"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Сповіщень немає"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Немає нових сповіщень"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Колонки й екрани"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Пропоновані пристрої"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Введення"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Виведення"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Зупиніть сеанс спільного доступу, щоб перенести медіаконтент на інший пристрій"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Зупинити"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Як працює трансляція"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок згортання"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок розгортання"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер переміщення"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігація за допомогою клавіатури"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Комбінації клавіш: докладніше"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігація за допомогою сенсорної панелі"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 9865c8de6290..e65fd98e7dbf 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"سبھی خاموش اطلاعات کو صاف کریں"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"ابھی شروع کریں"</string> <string name="empty_shade_text" msgid="8935967157319717412">"کوئی اطلاعات نہیں ہیں"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"کوئی نئی اطلاعات نہیں"</string> @@ -1396,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"آئیکن سکیڑیں"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"آئیکن پھیلائیں"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"گھسیٹنے کا ہینڈل"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"اپنے کی بورڈ کا استعمال کر کے نیویگیٹ کریں"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"کی بورڈ شارٹ کٹس جانیں"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"اپنے ٹچ پیڈ کا استعمال کر کے نیویگیٹ کریں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index cd4cc0dc9681..0f2db3799438 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Barcha sokin bildirishnomalarni tozalash"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Boshlash"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Bildirishnomalar yo‘q"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Yangi bildirishoma yoʻq"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Karnaylar va displeylar"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Taklif qilingan qurilmalar"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Kiritish qurilmasi"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Chiqarish qurilmasi"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Mediani boshqa qurilmaga koʻchirish uchun umumiy seansingizni toʻxtating"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Toʻxtatish"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Translatsiya qanday ishlaydi"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Yigʻish belgisi"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Yoyish belgisi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"yoki"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Surish dastagi"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klaviatura yordamida kezing"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Tezkor tugmalar haqida"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Sensorli panel yordamida kezing"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 28a6900c1a5e..a37a7cd31343 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Xóa tất cả thông báo im lặng"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Bắt đầu ngay"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Không có thông báo nào"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Không có thông báo mới"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Loa và màn hình"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Thiết bị được đề xuất"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Đầu vào"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Đầu ra"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Dừng phiên chia sẻ của bạn để chuyển nội dung nghe nhìn sang thiết bị khác"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Dừng"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cách tính năng truyền hoạt động"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Biểu tượng Thu gọn"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Biểu tượng Mở rộng"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"hoặc"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Nút kéo"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Di chuyển bằng bàn phím"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Tìm hiểu về phím tắt"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Di chuyển bằng bàn di chuột"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 267f3923fac5..0d270beb0bf9 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -98,7 +98,7 @@ <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"左侧边界百分之 <xliff:g id="PERCENT">%1$d</xliff:g>"</string> <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"右侧边界百分之 <xliff:g id="PERCENT">%1$d</xliff:g>"</string> <string name="screenshot_work_profile_notification" msgid="203041724052970693">"已保存到工作资料名下的 <xliff:g id="APP">%1$s</xliff:g>中"</string> - <string name="screenshot_private_profile_notification" msgid="1704440899154243171">"已保存在私密个人资料中的<xliff:g id="APP">%1$s</xliff:g>内"</string> + <string name="screenshot_private_profile_notification" msgid="1704440899154243171">"已保存在私密资料中的“<xliff:g id="APP">%1$s</xliff:g>”内"</string> <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"文件"</string> <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> 检测到此屏幕截图。"</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> 及其他打开的应用检测到此屏幕截图。"</string> @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有静音通知"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string> <string name="empty_shade_text" msgid="8935967157319717412">"没有通知"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"没有新通知"</string> @@ -620,7 +622,7 @@ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"您的个人应用已通过“<xliff:g id="VPN_APP">%1$s</xliff:g>”连接到互联网。您的 VPN 提供商可以查看您的网络活动,包括电子邮件和浏览数据。"</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"打开 VPN 设置"</string> - <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此设备由您的家长管理。您的家长可以查看和管理相关信息,例如您使用的应用、您的位置信息和设备使用时间。"</string> + <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此设备由您的家长管理。您的家长可以查看和管理相关信息,例如您使用的应用、您的位置信息和屏幕使用时间。"</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"由 TrustAgent 保持解锁状态"</string> <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"尝试验证身份的次数过多,设备已锁定"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"音箱和显示屏"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建议的设备"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"输入"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"输出"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"停止共享的会话,即可将媒体移到其他设备"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"广播的运作方式"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收起图标"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展开图标"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"拖动手柄"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用键盘导航"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"了解键盘快捷键"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用触控板导航"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml index 0446a1bc538b..7748251b9430 100644 --- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml @@ -128,8 +128,8 @@ </string-array> <string-array name="tile_states_record_issue"> <item msgid="1727196795383575383">"不可用"</item> - <item msgid="9061144428113385092">"已停用"</item> - <item msgid="2984256114867200368">"已启用"</item> + <item msgid="9061144428113385092">"已关闭"</item> + <item msgid="2984256114867200368">"已开启"</item> </string-array> <string-array name="tile_states_reverse"> <item msgid="3574611556622963971">"不可用"</item> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index c08835a38c60..d9a0877ec4aa 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「請勿騷擾」模式已將通知暫停"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string> <string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"沒有新通知"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"喇叭和螢幕"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建議的裝置"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"輸入"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"輸出"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"停止共享工作階段以移動媒體至其他裝置"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播運作方式"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"拖曳控點"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用鍵盤導覽"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"瞭解鍵盤快速鍵"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用觸控板導覽"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 787698ca8912..83b456bab0b4 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「零打擾」模式已將通知設為暫停"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string> <string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"沒有新通知"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"喇叭和螢幕"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建議的裝置"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"輸入"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"輸出"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"停止共用的工作階段,即可將媒體移至其他裝置"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播功能的運作方式"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"拖曳控點"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用鍵盤操作"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"學習鍵盤快速鍵"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用觸控板操作"</string> @@ -1421,7 +1420,7 @@ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"在觸控板上用三指向上滑動並按住。"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string> - <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string> + <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢教學課程。"</string> <string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作鍵"</string> <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要存取應用程式,請按下鍵盤上的快捷操作鍵。"</string> <string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string> @@ -1446,7 +1445,7 @@ <string name="all_apps_edu_notification_title" msgid="372262997265569063">"使用鍵盤查看所有應用程式"</string> <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"你隨時可以按下快捷操作鍵。輕觸即可進一步瞭解手勢。"</string> <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"「超暗」已併入亮度滑桿"</string> - <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"現在只要將亮度調得更低,螢幕就會變得更暗。\n\n這項功能已併入亮度滑桿,因此系統將移除「超暗」捷徑。"</string> + <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"現在你可以將亮度調得比以往更低,把螢幕變得更暗。\n\n超暗功能現已併入亮度滑桿,因此系統將移除功能捷徑。"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"移除「超暗」捷徑"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"「超暗」捷徑已移除"</string> <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"連線"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 3205b0ea6c64..34f368388d0e 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -573,6 +573,8 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"Izingxoxo"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sula zonke izaziso ezithulile"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Izaziso zimiswe okwesikhashana ukungaphazamisi"</string> + <!-- no translation found for modes_suppressing_shade_text (6037581130837903239) --> + <skip /> <string name="media_projection_action_text" msgid="3634906766918186440">"Qala manje"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Azikho izaziso"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Azikho izaziso ezintsha"</string> @@ -1179,10 +1181,8 @@ <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Izipikha Neziboniso"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Amadivayisi Aphakanyisiwe"</string> - <!-- no translation found for media_input_group_title (2057057473860783021) --> - <skip /> - <!-- no translation found for media_output_group_title (6789001895863332576) --> - <skip /> + <string name="media_input_group_title" msgid="2057057473860783021">"Okufakwayo"</string> + <string name="media_output_group_title" msgid="6789001895863332576">"Umphumela"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Misa iseshini yakho eyabiwe ukuze uhambise imidiya kwenye idivayisi"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Misa"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Indlela ukusakaza okusebenza ngayo"</string> @@ -1398,8 +1398,7 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Goqa isithonjana"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Nweba isithonjana"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"noma"</string> - <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) --> - <skip /> + <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Hudula isibambi"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Funa usebenzisa ikhibhodi yakho"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Funda izinqamuleli zamakhibhodi"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Funa usebenzisa iphedi yokuthinta"</string> diff --git a/packages/SystemUI/src/com/android/systemui/CoreStartable.java b/packages/SystemUI/src/com/android/systemui/CoreStartable.java index 55ccaa68c855..92bc95af5931 100644 --- a/packages/SystemUI/src/com/android/systemui/CoreStartable.java +++ b/packages/SystemUI/src/com/android/systemui/CoreStartable.java @@ -70,4 +70,12 @@ public interface CoreStartable extends Dumpable { * {@link #onBootCompleted()} will never be called before {@link #start()}. */ default void onBootCompleted() { } + + /** No op implementation that can be used when feature flagging on the Dagger Module level. */ + CoreStartable NOP = new Nop(); + + class Nop implements CoreStartable { + @Override + public void start() {} + } } diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModel.kt new file mode 100644 index 000000000000..e35fdfe9087c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModel.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.ui.viewmodel + +import com.android.compose.animation.scene.Swipe +import com.android.compose.animation.scene.UserAction +import com.android.compose.animation.scene.UserActionResult +import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor +import com.android.systemui.scene.shared.model.SceneFamilies +import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.shade.ui.viewmodel.dualShadeActions +import com.android.systemui.shade.ui.viewmodel.singleShadeActions +import com.android.systemui.shade.ui.viewmodel.splitShadeActions +import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map + +/** Provides scene container user actions and results. */ +class CommunalUserActionsViewModel +@AssistedInject +constructor( + private val deviceUnlockedInteractor: DeviceUnlockedInteractor, + private val shadeInteractor: ShadeInteractor, +) : UserActionsViewModel() { + + override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) { + shadeInteractor.isShadeTouchable + .flatMapLatestConflated { isShadeTouchable -> + if (!isShadeTouchable) { + flowOf(emptyMap()) + } else { + combine( + deviceUnlockedInteractor.deviceUnlockStatus.map { it.isUnlocked }, + shadeInteractor.shadeMode, + ) { isDeviceUnlocked, shadeMode -> + buildList { + val bouncerOrGone = + if (isDeviceUnlocked) Scenes.Gone else Scenes.Bouncer + add(Swipe.Up to bouncerOrGone) + + // "Home" is either Lockscreen, or Gone - if the device is entered. + add(Swipe.End to SceneFamilies.Home) + + addAll( + when (shadeMode) { + ShadeMode.Single -> singleShadeActions() + ShadeMode.Split -> splitShadeActions() + ShadeMode.Dual -> dualShadeActions() + } + ) + } + .associate { it } + } + } + } + .collect { setActions(it) } + } + + @AssistedFactory + interface Factory { + fun create(): CommunalUserActionsViewModel + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt index 3b266f945aab..6f29004d4f3f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt @@ -18,20 +18,18 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.Swipe -import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor -import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes -import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade -import com.android.systemui.scene.ui.viewmodel.SceneContainerEdge import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.shade.ui.viewmodel.dualShadeActions +import com.android.systemui.shade.ui.viewmodel.singleShadeActions +import com.android.systemui.shade.ui.viewmodel.splitShadeActions import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -62,7 +60,7 @@ constructor( ) { isDeviceUnlocked, isCommunalAvailable, shadeMode -> buildList { if (isCommunalAvailable) { - add(Swipe.Left to Scenes.Communal) + add(Swipe.Start to Scenes.Communal) } add(Swipe.Up to if (isDeviceUnlocked) Scenes.Gone else Scenes.Bouncer) @@ -81,45 +79,6 @@ constructor( .collect { setActions(it) } } - private fun singleShadeActions(): Array<Pair<UserAction, UserActionResult>> { - return arrayOf( - // Swiping down, not from the edge, always goes to shade. - Swipe.Down to Scenes.Shade, - swipeDown(pointerCount = 2) to Scenes.Shade, - // Swiping down from the top edge goes to QS. - swipeDownFromTop(pointerCount = 1) to Scenes.QuickSettings, - swipeDownFromTop(pointerCount = 2) to Scenes.QuickSettings, - ) - } - - private fun splitShadeActions(): Array<Pair<UserAction, UserActionResult>> { - val splitShadeSceneKey = UserActionResult(Scenes.Shade, ToSplitShade) - return arrayOf( - // Swiping down, not from the edge, always goes to shade. - Swipe.Down to splitShadeSceneKey, - swipeDown(pointerCount = 2) to splitShadeSceneKey, - // Swiping down from the top edge goes to QS. - swipeDownFromTop(pointerCount = 1) to splitShadeSceneKey, - swipeDownFromTop(pointerCount = 2) to splitShadeSceneKey, - ) - } - - private fun dualShadeActions(): Array<Pair<UserAction, UserActionResult>> { - return arrayOf( - Swipe.Down to Overlays.NotificationsShade, - Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to - Overlays.QuickSettingsShade, - ) - } - - private fun swipeDownFromTop(pointerCount: Int): Swipe { - return Swipe(SwipeDirection.Down, fromSource = Edge.Top, pointerCount = pointerCount) - } - - private fun swipeDown(pointerCount: Int): Swipe { - return Swipe(SwipeDirection.Down, pointerCount = pointerCount) - } - @AssistedFactory interface Factory { fun create(): LockscreenUserActionsViewModel diff --git a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt index 0d748a1cf077..0bf4c7e8d9f9 100644 --- a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt +++ b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt @@ -84,7 +84,10 @@ constructor( */ val EvaluatorByFlag = mapOf<Long, (SceneContainerPluginState) -> Boolean>( - SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to { it.scene != Scenes.Gone }, + SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to + { + it.scene != Scenes.Gone || it.overlays.isNotEmpty() + }, SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to { when { diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt index bf4c113e3ae9..9ec5a82a18d7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt @@ -35,6 +35,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -176,15 +177,17 @@ fun SmallTileContent( } else if (icon is Icon.Resource) { val image = AnimatedImageVector.animatedVectorResource(id = icon.res) val painter = - if (animateToEnd) { - rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = true) - } else { - var atEnd by remember(icon.res) { mutableStateOf(false) } - LaunchedEffect(key1 = icon.res) { - delay(350) - atEnd = true + key(icon) { + if (animateToEnd) { + rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = true) + } else { + var atEnd by remember(icon.res) { mutableStateOf(false) } + LaunchedEffect(key1 = icon.res) { + delay(350) + atEnd = true + } + rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = atEnd) } - rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = atEnd) } Image( painter = painter, diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt b/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt index 323bb3ddd63a..6479e577eb00 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt @@ -21,10 +21,6 @@ import com.android.compose.animation.scene.SceneKey /** An immutable stack of [SceneKey]s backed by a singly-linked list. */ sealed interface SceneStack -private data object EmptyStack : SceneStack - -private data class StackedNodes(val head: SceneKey, val tail: SceneStack) : SceneStack - /** Returns the scene at the head of the stack, or `null` if empty. O(1) */ fun SceneStack.peek(): SceneKey? = when (this) { @@ -69,3 +65,14 @@ fun sceneStackOf(vararg scenes: SceneKey): SceneStack { } return result } + +private data object EmptyStack : SceneStack { + override fun toString() = sceneStackToString() +} + +private data class StackedNodes(val head: SceneKey, val tail: SceneStack) : SceneStack { + override fun toString() = sceneStackToString() +} + +private fun SceneStack.sceneStackToString(): String = + asIterable().joinToString { it.testTag }.let { "SceneStack([$it])" } diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt index afb72f03b28d..bebd398ac972 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt @@ -19,7 +19,6 @@ package com.android.systemui.scene.domain.interactor import com.android.compose.animation.scene.SceneKey import com.android.systemui.dagger.SysUISingleton import com.android.systemui.scene.data.model.SceneStack -import com.android.systemui.scene.data.model.asIterable import com.android.systemui.scene.data.model.peek import com.android.systemui.scene.data.model.pop import com.android.systemui.scene.data.model.push @@ -68,13 +67,13 @@ constructor( checkNotNull(stack.pop()) { "Cannot pop ${from.debugName} when stack is empty" } } } - logger.logSceneBackStack(backStack.value.asIterable()) + logger.logSceneBackStack(backStack.value) } /** Applies the given [transform] to the back stack. */ fun updateBackStack(transform: (SceneStack) -> SceneStack) { _backStack.update { stack -> transform(stack) } - logger.logSceneBackStack(backStack.value.asIterable()) + logger.logSceneBackStack(backStack.value) } private fun stackOperation(from: SceneKey, to: SceneKey, stack: SceneStack): StackOperation? { diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt index fb53ddb0ee7a..16c2ef556de8 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt @@ -22,6 +22,7 @@ import com.android.compose.animation.scene.SceneKey import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.SceneFrameworkLog +import com.android.systemui.scene.data.model.SceneStack import javax.inject.Inject class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: LogBuffer) { @@ -40,16 +41,11 @@ class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: }, messagePrinter = { "Scene framework is ${asWord(bool1)}${if (str1 != null) " $str1" else ""}" - } + }, ) } - fun logSceneChanged( - from: SceneKey, - to: SceneKey, - reason: String, - isInstant: Boolean, - ) { + fun logSceneChanged(from: SceneKey, to: SceneKey, reason: String, isInstant: Boolean) { logBuffer.log( tag = TAG, level = LogLevel.INFO, @@ -123,11 +119,7 @@ class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: ) } - fun logVisibilityChange( - from: Boolean, - to: Boolean, - reason: String, - ) { + fun logVisibilityChange(from: Boolean, to: Boolean, reason: String) { fun asWord(isVisible: Boolean): String { return if (isVisible) "visible" else "invisible" } @@ -144,9 +136,7 @@ class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: ) } - fun logRemoteUserInputStarted( - reason: String, - ) { + fun logRemoteUserInputStarted(reason: String) { logBuffer.log( tag = TAG, level = LogLevel.INFO, @@ -164,11 +154,11 @@ class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: ) } - fun logSceneBackStack(backStack: Iterable<SceneKey>) { + fun logSceneBackStack(backStack: SceneStack) { logBuffer.log( tag = TAG, level = LogLevel.INFO, - messageInitializer = { str1 = backStack.joinToString(", ") { it.debugName } }, + messageInitializer = { str1 = backStack.toString() }, messagePrinter = { "back stack: $str1" }, ) } diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt index a7e7d8bb34dc..a8be5804d04a 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt @@ -108,7 +108,11 @@ object SceneWindowRootViewBinder { traceName = "SceneWindowRootViewBinder", minWindowLifecycleState = WindowLifecycleState.ATTACHED, factory = { - viewModelFactory.create(view.context.displayId, motionEventHandlerReceiver) + viewModelFactory.create( + view, + view.context.displayId, + motionEventHandlerReceiver, + ) }, ) { viewModel -> try { diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt index 5ff507a45d2e..fc172e8ca1d8 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt @@ -16,16 +16,13 @@ package com.android.systemui.scene.ui.viewmodel -import com.android.compose.animation.scene.Edge -import com.android.compose.animation.scene.Swipe -import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult -import com.android.systemui.scene.shared.model.Overlays -import com.android.systemui.scene.shared.model.Scenes -import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.shade.ui.viewmodel.dualShadeActions +import com.android.systemui.shade.ui.viewmodel.singleShadeActions +import com.android.systemui.shade.ui.viewmodel.splitShadeActions import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -36,41 +33,21 @@ constructor(private val shadeInteractor: ShadeInteractor) : UserActionsViewModel override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) { shadeInteractor.shadeMode.collect { shadeMode -> setActions( - when (shadeMode) { - ShadeMode.Single -> singleShadeActions() - ShadeMode.Split -> splitShadeActions() - ShadeMode.Dual -> dualShadeActions() - } + buildList { + addAll( + when (shadeMode) { + ShadeMode.Single -> + singleShadeActions(requireTwoPointersForTopEdgeForQs = true) + ShadeMode.Split -> splitShadeActions() + ShadeMode.Dual -> dualShadeActions() + } + ) + } + .associate { it } ) } } - private fun singleShadeActions(): Map<UserAction, UserActionResult> { - return mapOf( - Swipe.Down to Scenes.Shade, - swipeDownFromTopWithTwoFingers() to Scenes.QuickSettings, - ) - } - - private fun splitShadeActions(): Map<UserAction, UserActionResult> { - return mapOf( - Swipe.Down to UserActionResult(Scenes.Shade, ToSplitShade), - swipeDownFromTopWithTwoFingers() to UserActionResult(Scenes.Shade, ToSplitShade), - ) - } - - private fun dualShadeActions(): Map<UserAction, UserActionResult> { - return mapOf( - Swipe.Down to Overlays.NotificationsShade, - Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to - Overlays.QuickSettingsShade, - ) - } - - private fun swipeDownFromTopWithTwoFingers(): UserAction { - return Swipe(direction = SwipeDirection.Down, pointerCount = 2, fromSource = Edge.Top) - } - @AssistedFactory interface Factory { fun create(): GoneUserActionsViewModel diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModel.kt new file mode 100644 index 000000000000..4ef8e0fc3167 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModel.kt @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.scene.ui.viewmodel + +import android.view.HapticFeedbackConstants +import android.view.View +import com.android.compose.animation.scene.ObservableTransitionState +import com.android.systemui.Flags +import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.scene.domain.interactor.SceneInteractor +import com.android.systemui.scene.shared.model.Overlays +import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.google.android.msdl.data.model.MSDLToken +import com.google.android.msdl.domain.MSDLPlayer +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged + +/** + * Models haptics UI state for the scene container. + * + * This model gets a [View] to play haptics using the [View.performHapticFeedback] API. This should + * be the only purpose of this reference. + */ +class SceneContainerHapticsViewModel +@AssistedInject +constructor( + @Assisted private val view: View, + sceneInteractor: SceneInteractor, + shadeInteractor: ShadeInteractor, + private val msdlPlayer: MSDLPlayer, +) : ExclusiveActivatable() { + + /** Should haptics be played by pulling down the shade */ + private val isShadePullHapticsRequired: Flow<Boolean> = + combine(shadeInteractor.isUserInteracting, sceneInteractor.transitionState) { + interacting, + transitionState -> + interacting && transitionState.isValidForShadePullHaptics() + } + .distinctUntilChanged() + + override suspend fun onActivated(): Nothing { + isShadePullHapticsRequired.collect { playShadePullHaptics -> + if (!playShadePullHaptics) return@collect + + if (Flags.msdlFeedback()) { + msdlPlayer.playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR) + } else { + view.performHapticFeedback(HapticFeedbackConstants.GESTURE_START) + } + } + awaitCancellation() + } + + private fun ObservableTransitionState.isValidForShadePullHaptics(): Boolean { + val validOrigin = + isTransitioning(from = Scenes.Gone) || isTransitioning(from = Scenes.Lockscreen) + val validDestination = + isTransitioning(to = Scenes.Shade) || + isTransitioning(to = Scenes.QuickSettings) || + isTransitioning(to = Overlays.QuickSettingsShade) || + isTransitioning(to = Overlays.NotificationsShade) + return validOrigin && validDestination + } + + @AssistedFactory + interface Factory { + fun create(view: View): SceneContainerHapticsViewModel + } +} diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt index 0bf2d499721b..f5053853846c 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt @@ -17,8 +17,10 @@ package com.android.systemui.scene.ui.viewmodel import android.view.MotionEvent +import android.view.View import androidx.compose.runtime.getValue import androidx.compose.ui.geometry.Offset +import com.android.app.tracing.coroutines.launch import com.android.compose.animation.scene.ContentKey import com.android.compose.animation.scene.DefaultEdgeDetector import com.android.compose.animation.scene.ObservableTransitionState @@ -60,6 +62,8 @@ constructor( private val splitEdgeDetector: SplitEdgeDetector, private val logger: SceneLogger, gestureFilterFactory: SceneContainerGestureFilter.Factory, + hapticsViewModelFactory: SceneContainerHapticsViewModel.Factory, + @Assisted view: View, @Assisted displayId: Int, @Assisted private val motionEventHandlerReceiver: (MotionEventHandler?) -> Unit, ) : ExclusiveActivatable() { @@ -72,6 +76,8 @@ constructor( /** Whether the container is visible. */ val isVisible: Boolean by hydrator.hydratedStateOf("isVisible", sceneInteractor.isVisible) + private val hapticsViewModel = hapticsViewModelFactory.create(view) + /** * The [SwipeSourceDetector] to use for defining which edges of the screen can be defined in the * [UserAction]s for this container. @@ -107,6 +113,7 @@ constructor( coroutineScope { launch { hydrator.activate() } launch { gestureFilter.activate() } + launch("SceneContainerHapticsViewModel") { hapticsViewModel.activate() } } awaitCancellation() } finally { @@ -281,6 +288,7 @@ constructor( @AssistedFactory interface Factory { fun create( + view: View, displayId: Int, motionEventHandlerReceiver: (MotionEventHandler?) -> Unit, ): SceneContainerViewModel diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 0c05dbde6117..5896659e9898 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -23,6 +23,7 @@ import static com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE; import static com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE; import static com.android.keyguard.KeyguardClockSwitch.LARGE; import static com.android.keyguard.KeyguardClockSwitch.SMALL; +import static com.android.systemui.Flags.msdlFeedback; import static com.android.systemui.Flags.predictiveBackAnimateShade; import static com.android.systemui.Flags.smartspaceRelocateToBottom; import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK; @@ -236,6 +237,9 @@ import com.android.wm.shell.animation.FlingAnimationUtils; import dalvik.annotation.optimization.NeverCompile; +import com.google.android.msdl.data.model.MSDLToken; +import com.google.android.msdl.domain.MSDLPlayer; + import kotlin.Unit; import kotlinx.coroutines.CoroutineDispatcher; @@ -312,6 +316,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final StatusBarStateListener mStatusBarStateListener = new StatusBarStateListener(); private final NotificationPanelView mView; private final VibratorHelper mVibratorHelper; + private final MSDLPlayer mMSDLPlayer; private final MetricsLogger mMetricsLogger; private final ConfigurationController mConfigurationController; private final Provider<FlingAnimationUtils.Builder> mFlingAnimationUtilsBuilder; @@ -777,7 +782,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump SplitShadeStateController splitShadeStateController, PowerInteractor powerInteractor, KeyguardClockPositionAlgorithm keyguardClockPositionAlgorithm, - NaturalScrollingSettingObserver naturalScrollingSettingObserver) { + NaturalScrollingSettingObserver naturalScrollingSettingObserver, + MSDLPlayer msdlPlayer) { SceneContainerFlag.assertInLegacyMode(); keyguardStateController.addCallback(new KeyguardStateController.Callback() { @Override @@ -855,6 +861,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mNotificationsDragEnabled = mResources.getBoolean( R.bool.config_enableNotificationShadeDrag); mVibratorHelper = vibratorHelper; + mMSDLPlayer = msdlPlayer; mVibrateOnOpening = mResources.getBoolean(R.bool.config_vibrateOnIconAnimation); mStatusBarTouchableRegionManager = statusBarTouchableRegionManager; mSystemClock = systemClock; @@ -2911,7 +2918,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } if (!mStatusBarStateController.isDozing()) { - mVibratorHelper.performHapticFeedback(mView, HapticFeedbackConstants.REJECT); + performHapticFeedback(HapticFeedbackConstants.REJECT); } } @@ -3279,7 +3286,20 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } public void performHapticFeedback(int constant) { - mVibratorHelper.performHapticFeedback(mView, constant); + if (msdlFeedback()) { + MSDLToken token; + switch (constant) { + case HapticFeedbackConstants.GESTURE_START -> + token = MSDLToken.SWIPE_THRESHOLD_INDICATOR; + case HapticFeedbackConstants.REJECT -> token = MSDLToken.FAILURE; + default -> token = null; + } + if (token != null) { + mMSDLPlayer.playToken(token, null); + } + } else { + mVibratorHelper.performHapticFeedback(mView, constant); + } } private class ShadeHeadsUpTrackerImpl implements ShadeHeadsUpTracker { @@ -3736,10 +3756,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private void maybeVibrateOnOpening(boolean openingWithTouch) { if (mVibrateOnOpening && mBarState != KEYGUARD && mBarState != SHADE_LOCKED) { if (!openingWithTouch || !mHasVibratedOnOpen) { - mVibratorHelper.performHapticFeedback( - mView, - HapticFeedbackConstants.GESTURE_START - ); + performHapticFeedback(HapticFeedbackConstants.GESTURE_START); mHasVibratedOnOpen = true; mShadeLog.v("Vibrating on opening, mHasVibratedOnOpen=true"); } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActions.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActions.kt new file mode 100644 index 000000000000..65b6231705d4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActions.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.shade.ui.viewmodel + +import com.android.compose.animation.scene.Edge +import com.android.compose.animation.scene.Swipe +import com.android.compose.animation.scene.SwipeDirection +import com.android.compose.animation.scene.UserAction +import com.android.compose.animation.scene.UserActionResult +import com.android.systemui.scene.shared.model.Overlays +import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade +import com.android.systemui.scene.ui.viewmodel.SceneContainerEdge + +/** Returns collection of [UserAction] to [UserActionResult] pairs for opening the single shade. */ +fun singleShadeActions( + requireTwoPointersForTopEdgeForQs: Boolean = false +): Array<Pair<UserAction, UserActionResult>> { + return arrayOf( + // Swiping down, not from the edge, always goes to shade. + Swipe.Down to Scenes.Shade, + swipeDown(pointerCount = 2) to Scenes.Shade, + + // Swiping down from the top edge. + swipeDownFromTop(pointerCount = 1) to + if (requireTwoPointersForTopEdgeForQs) { + Scenes.Shade + } else { + Scenes.QuickSettings + }, + swipeDownFromTop(pointerCount = 2) to Scenes.QuickSettings, + ) +} + +/** Returns collection of [UserAction] to [UserActionResult] pairs for opening the split shade. */ +fun splitShadeActions(): Array<Pair<UserAction, UserActionResult>> { + val splitShadeSceneKey = UserActionResult(Scenes.Shade, ToSplitShade) + return arrayOf( + // Swiping down, not from the edge, always goes to shade. + Swipe.Down to splitShadeSceneKey, + swipeDown(pointerCount = 2) to splitShadeSceneKey, + // Swiping down from the top edge goes to QS. + swipeDownFromTop(pointerCount = 1) to splitShadeSceneKey, + swipeDownFromTop(pointerCount = 2) to splitShadeSceneKey, + ) +} + +/** Returns collection of [UserAction] to [UserActionResult] pairs for opening the dual shade. */ +fun dualShadeActions(): Array<Pair<UserAction, UserActionResult>> { + return arrayOf( + Swipe.Down to Overlays.NotificationsShade, + Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to + Overlays.QuickSettingsShade, + ) +} + +private fun swipeDownFromTop(pointerCount: Int): Swipe { + return Swipe(SwipeDirection.Down, fromSource = Edge.Top, pointerCount = pointerCount) +} + +private fun swipeDown(pointerCount: Int): Swipe { + return Swipe(SwipeDirection.Down, pointerCount = pointerCount) +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt index f8a850a357f1..cc6e8c246ff7 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt @@ -16,11 +16,13 @@ package com.android.systemui.shade.ui.viewmodel +import com.android.app.tracing.coroutines.flow.map import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.systemui.qs.ui.adapter.QSSceneAdapter +import com.android.systemui.scene.domain.interactor.SceneBackInteractor import com.android.systemui.scene.shared.model.SceneFamilies import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade @@ -41,21 +43,23 @@ class ShadeUserActionsViewModel constructor( private val qsSceneAdapter: QSSceneAdapter, private val shadeInteractor: ShadeInteractor, + private val sceneBackInteractor: SceneBackInteractor, ) : UserActionsViewModel() { override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) { combine( shadeInteractor.shadeMode, qsSceneAdapter.isCustomizerShowing, - ) { shadeMode, isCustomizerShowing -> + sceneBackInteractor.backScene.map { it ?: SceneFamilies.Home }, + ) { shadeMode, isCustomizerShowing, backScene -> buildMap<UserAction, UserActionResult> { if (!isCustomizerShowing) { set( Swipe(SwipeDirection.Up), UserActionResult( - SceneFamilies.Home, - ToSplitShade.takeIf { shadeMode is ShadeMode.Split } - ) + backScene, + ToSplitShade.takeIf { shadeMode is ShadeMode.Split }, + ), ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index 8a6ec2aa27c9..5d14be8c974c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -37,6 +37,7 @@ import android.view.animation.Interpolator; import androidx.annotation.NonNull; import com.android.app.animation.Interpolators; +import com.android.compose.animation.scene.OverlayKey; import com.android.compose.animation.scene.SceneKey; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -60,6 +61,7 @@ import com.android.systemui.scene.domain.interactor.SceneBackInteractor; import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor; import com.android.systemui.scene.domain.interactor.SceneInteractor; import com.android.systemui.scene.shared.flag.SceneContainerFlag; +import com.android.systemui.scene.shared.model.Overlays; import com.android.systemui.scene.shared.model.Scenes; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; @@ -67,14 +69,12 @@ import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.util.Compile; import com.android.systemui.util.kotlin.JavaAdapter; -import com.google.common.base.Preconditions; - import dagger.Lazy; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Comparator; -import java.util.Map; +import java.util.Set; import javax.inject.Inject; @@ -230,6 +230,7 @@ public class StatusBarStateControllerImpl implements combineFlows( mDeviceUnlockedInteractorLazy.get().getDeviceUnlockStatus(), mSceneInteractorLazy.get().getCurrentScene(), + mSceneInteractorLazy.get().getCurrentOverlays(), mSceneBackInteractorLazy.get().getBackStack(), mSceneContainerOcclusionInteractorLazy.get().getInvisibleDueToOcclusion(), this::calculateStateFromSceneFramework), @@ -690,19 +691,79 @@ public class StatusBarStateControllerImpl implements private int calculateStateFromSceneFramework( DeviceUnlockStatus deviceUnlockStatus, SceneKey currentScene, + Set<OverlayKey> currentOverlays, SceneStack backStack, boolean isOccluded) { SceneContainerFlag.isUnexpectedlyInLegacyMode(); - if (currentScene.equals(Scenes.Lockscreen)) { - return StatusBarState.KEYGUARD; - } else if (currentScene.equals(Scenes.Shade) - && SceneStackKt.contains(backStack, Scenes.Lockscreen)) { - return StatusBarState.SHADE_LOCKED; - } else if (deviceUnlockStatus.isUnlocked() || isOccluded) { - return StatusBarState.SHADE; + + final boolean onBouncer = currentScene.equals(Scenes.Bouncer); + final boolean onCommunal = currentScene.equals(Scenes.Communal); + final boolean onGone = currentScene.equals(Scenes.Gone); + final boolean onLockscreen = currentScene.equals(Scenes.Lockscreen); + final boolean onQuickSettings = currentScene.equals(Scenes.QuickSettings); + final boolean onShade = currentScene.equals(Scenes.Shade); + + final boolean overCommunal = SceneStackKt.contains(backStack, Scenes.Communal); + final boolean overLockscreen = SceneStackKt.contains(backStack, Scenes.Lockscreen); + final boolean overShade = SceneStackKt.contains(backStack, Scenes.Shade); + + final boolean overlaidShade = currentOverlays.contains(Overlays.NotificationsShade); + final boolean overlaidQuickSettings = currentOverlays.contains(Overlays.QuickSettingsShade); + + final boolean isUnlocked = deviceUnlockStatus.isUnlocked(); + + final String inputLogString = "currentScene=" + currentScene.getTestTag() + + " currentOverlays=" + currentOverlays + " backStack=" + backStack + + " isUnlocked=" + isUnlocked + " isOccluded=" + isOccluded; + + int newState; + + // When the device unlocks, several things happen 'at once': + // 1. deviceUnlockStatus.isUnlocked changes from false to true. + // 2. Lockscreen changes to Gone, either in currentScene or in backStack. + // 3. Bouncer is removed from currentScene or backStack, if it was present. + // + // From this function's perspective, though, deviceUnlockStatus, currentScene, and backStack + // each update separately, and the relative order of those updates is not well-defined. This + // doesn't work well for clients of this class (like remote input) that expect the device to + // be fully and properly unlocked when the state changes to SHADE. + // + // Therefore, we calculate the device to be in a locked-ish state (KEYGUARD or SHADE_LOCKED, + // but not SHADE) if *any* of these are still true: + // 1. deviceUnlockStatus.isUnlocked is false. + // 2. We are on (currentScene equals) a locked-ish scene (Lockscreen, Bouncer, or Communal). + // 3. We are over (backStack contains) a locked-ish scene (Lockscreen or Communal). + + if (isOccluded) { + // Occlusion is special; even though the device is still technically on the lockscreen, + // the UI behaves as if it is unlocked. + newState = StatusBarState.SHADE; + } else if (onLockscreen || onBouncer || onCommunal || overLockscreen || overCommunal) { + // We get here if we are on or over a locked-ish scene, even if isUnlocked is true; we + // want to return SHADE_LOCKED or KEYGUARD until we are also neither on nor over a + // locked-ish scene. + if (onShade || onQuickSettings || overShade || overlaidShade || overlaidQuickSettings) { + newState = StatusBarState.SHADE_LOCKED; + } else { + newState = StatusBarState.KEYGUARD; + } + } else if (isUnlocked || onGone) { + newState = StatusBarState.SHADE; + } else if (onShade || onQuickSettings) { + // We get here if deviceUnlockStatus.isUnlocked is false but we are no longer on or over + // a locked-ish scene; we want to return SHADE_LOCKED until isUnlocked is also true. + newState = StatusBarState.SHADE_LOCKED; } else { - return Preconditions.checkNotNull(sStatusBarStateByLockedSceneKey.get(currentScene)); + throw new IllegalArgumentException( + "unhandled input to calculateStateFromSceneFramework: " + inputLogString); } + + if (Compile.IS_DEBUG) { + Log.v(TAG, "calculateStateFromSceneFramework: " + + inputLogString + " -> " + StatusBarState.toString(newState)); + } + + return newState; } /** Notifies that the {@link StatusBarState} has changed to the given new state. */ @@ -716,15 +777,6 @@ public class StatusBarStateControllerImpl implements updateStateAndNotifyListeners(newState); } - private static final Map<SceneKey, Integer> sStatusBarStateByLockedSceneKey = Map.of( - Scenes.Lockscreen, StatusBarState.KEYGUARD, - Scenes.Bouncer, StatusBarState.KEYGUARD, - Scenes.Communal, StatusBarState.KEYGUARD, - Scenes.Shade, StatusBarState.SHADE_LOCKED, - Scenes.QuickSettings, StatusBarState.SHADE_LOCKED, - Scenes.Gone, StatusBarState.SHADE - ); - /** * For keeping track of our previous state to help with debugging */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt new file mode 100644 index 000000000000..57c8bc6133e6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import android.app.StatusBarManager +import android.content.Context +import android.os.Binder +import android.os.RemoteException +import android.view.WindowInsets +import com.android.internal.statusbar.IStatusBarService +import com.android.internal.statusbar.RegisterStatusBarResult +import com.android.systemui.CoreStartable +import com.android.systemui.InitController +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.navigationbar.NavigationBarController +import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore +import dagger.Lazy +import javax.inject.Inject + +@SysUISingleton +class CommandQueueInitializer +@Inject +constructor( + private val context: Context, + private val commandQueue: CommandQueue, + private val commandQueueCallbacksLazy: Lazy<CommandQueue.Callbacks>, + private val statusBarModeRepository: StatusBarModeRepositoryStore, + private val initController: InitController, + private val barService: IStatusBarService, + private val navigationBarController: NavigationBarController, +) : CoreStartable { + + override fun start() { + StatusBarSimpleFragment.assertInNewMode() + val result: RegisterStatusBarResult = + try { + barService.registerStatusBar(commandQueue) + } catch (ex: RemoteException) { + ex.rethrowFromSystemServer() + return + } + + createNavigationBar(result) + + if ((result.mTransientBarTypes and WindowInsets.Type.statusBars()) != 0) { + statusBarModeRepository.defaultDisplay.showTransient() + } + val displayId = context.display.displayId + val commandQueueCallbacks = commandQueueCallbacksLazy.get() + commandQueueCallbacks.onSystemBarAttributesChanged( + displayId, + result.mAppearance, + result.mAppearanceRegions, + result.mNavbarColorManagedByIme, + result.mBehavior, + result.mRequestedVisibleTypes, + result.mPackageName, + result.mLetterboxDetails, + ) + + // StatusBarManagerService has a back up of IME token and it's restored here. + commandQueueCallbacks.setImeWindowStatus( + displayId, + result.mImeWindowVis, + result.mImeBackDisposition, + result.mShowImeSwitcher, + ) + + // Set up the initial icon state + val numIcons: Int = result.mIcons.size + for (i in 0 until numIcons) { + commandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i)) + } + + // set the initial view visibility + val disabledFlags1 = result.mDisabledFlags1 + val disabledFlags2 = result.mDisabledFlags2 + initController.addPostInitTask { + commandQueue.disable(displayId, disabledFlags1, disabledFlags2, /* animate= */ false) + try { + // NOTE(b/262059863): Force-update the disable flags after applying the flags + // returned from registerStatusBar(). The result's disabled flags may be stale + // if StatusBarManager's disabled flags are updated between registering the bar + // and this handling this post-init task. We force an update in this case, and use a + // new token to not conflict with any other disabled flags already requested by + // SysUI + val token = Binder() + barService.disable(StatusBarManager.DISABLE_HOME, token, context.packageName) + barService.disable(0, token, context.packageName) + } catch (ex: RemoteException) { + ex.rethrowFromSystemServer() + } + } + } + + private fun createNavigationBar(result: RegisterStatusBarResult) { + navigationBarController.createNavigationBars(/* includeDefaultDisplay= */ true, result) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt new file mode 100644 index 000000000000..8bd990b83a63 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import android.view.View +import com.android.systemui.CoreStartable +import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.demomode.DemoModeController +import com.android.systemui.plugins.DarkIconDispatcher +import com.android.systemui.plugins.PluginDependencyProvider +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.shade.NotificationShadeWindowViewController +import com.android.systemui.shade.ShadeSurface +import com.android.systemui.statusbar.AutoHideUiElement +import com.android.systemui.statusbar.NotificationRemoteInputManager +import com.android.systemui.statusbar.data.model.StatusBarMode +import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore +import com.android.systemui.statusbar.phone.AutoHideController +import com.android.systemui.statusbar.phone.CentralSurfaces +import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions +import com.android.systemui.statusbar.phone.PhoneStatusBarViewController +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.statusbar.window.data.model.StatusBarWindowState +import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStore +import com.android.wm.shell.bubbles.Bubbles +import dagger.Lazy +import java.io.PrintWriter +import java.util.Optional +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChangedBy +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.launch + +/** + * Class responsible for managing the lifecycle and state of the status bar. + * + * It is a temporary class, created to pull status bar related logic out of CentralSurfacesImpl. The + * plan is break it out into individual classes. + */ +@SysUISingleton +class StatusBarOrchestrator +@Inject +constructor( + @Application private val applicationScope: CoroutineScope, + private val statusBarInitializer: StatusBarInitializer, + private val statusBarWindowController: StatusBarWindowController, + private val statusBarModeRepository: StatusBarModeRepositoryStore, + private val demoModeController: DemoModeController, + private val pluginDependencyProvider: PluginDependencyProvider, + private val autoHideController: AutoHideController, + private val remoteInputManager: NotificationRemoteInputManager, + private val notificationShadeWindowViewControllerLazy: + Lazy<NotificationShadeWindowViewController>, + private val shadeSurface: ShadeSurface, + private val bubblesOptional: Optional<Bubbles>, + private val statusBarWindowStateRepositoryStore: StatusBarWindowStateRepositoryStore, + powerInteractor: PowerInteractor, + primaryBouncerInteractor: PrimaryBouncerInteractor, +) : CoreStartable { + + private val phoneStatusBarViewController = + MutableStateFlow<PhoneStatusBarViewController?>(value = null) + + private val phoneStatusBarTransitions = + MutableStateFlow<PhoneStatusBarTransitions?>(value = null) + + private val shouldAnimateNextBarModeChange = + combine( + statusBarModeRepository.defaultDisplay.isTransientShown, + powerInteractor.isAwake, + statusBarWindowStateRepositoryStore.defaultDisplay.windowState, + ) { isTransientShown, isDeviceAwake, statusBarWindowState -> + !isTransientShown && + isDeviceAwake && + statusBarWindowState != StatusBarWindowState.Hidden + } + + private val controllerAndBouncerShowing = + combine( + phoneStatusBarViewController.filterNotNull(), + primaryBouncerInteractor.isShowing, + ::Pair, + ) + + private val barTransitionsAndDeviceAsleep = + combine(phoneStatusBarTransitions.filterNotNull(), powerInteractor.isAsleep, ::Pair) + + private val statusBarVisible = + combine( + statusBarModeRepository.defaultDisplay.statusBarMode, + statusBarWindowStateRepositoryStore.defaultDisplay.windowState, + ) { mode, statusBarWindowState -> + mode != StatusBarMode.LIGHTS_OUT && + mode != StatusBarMode.LIGHTS_OUT_TRANSPARENT && + statusBarWindowState != StatusBarWindowState.Hidden + } + + private val barModeUpdate = + combine( + shouldAnimateNextBarModeChange, + phoneStatusBarTransitions.filterNotNull(), + statusBarModeRepository.defaultDisplay.statusBarMode, + ::Triple, + ) + .distinctUntilChangedBy { (_, barTransitions, statusBarMode) -> + // We only want to collect when either bar transitions or status bar mode + // changed. + Pair(barTransitions, statusBarMode) + } + + override fun start() { + StatusBarSimpleFragment.assertInNewMode() + applicationScope.launch { + launch { + controllerAndBouncerShowing.collect { (controller, bouncerShowing) -> + setBouncerShowingForStatusBarComponents(controller, bouncerShowing) + } + } + launch { + barTransitionsAndDeviceAsleep.collect { (barTransitions, deviceAsleep) -> + if (deviceAsleep) { + barTransitions.finishAnimations() + } + } + } + launch { statusBarVisible.collect { updateBubblesVisibility(it) } } + launch { + barModeUpdate.collect { (animate, barTransitions, statusBarMode) -> + updateBarMode(animate, barTransitions, statusBarMode) + } + } + } + createAndAddWindow() + setupPluginDependencies() + setUpAutoHide() + } + + private fun createAndAddWindow() { + initializeStatusBarFragment() + statusBarWindowController.attach() + } + + private fun initializeStatusBarFragment() { + statusBarInitializer.statusBarViewUpdatedListener = + object : StatusBarInitializer.OnStatusBarViewUpdatedListener { + override fun onStatusBarViewUpdated( + statusBarViewController: PhoneStatusBarViewController, + statusBarTransitions: PhoneStatusBarTransitions, + ) { + phoneStatusBarViewController.value = statusBarViewController + phoneStatusBarTransitions.value = statusBarTransitions + + notificationShadeWindowViewControllerLazy + .get() + .setStatusBarViewController(statusBarViewController) + // Ensure we re-propagate panel expansion values to the panel controller and + // any listeners it may have, such as PanelBar. This will also ensure we + // re-display the notification panel if necessary (for example, if + // a heads-up notification was being displayed and should continue being + // displayed). + shadeSurface.updateExpansionAndVisibility() + } + } + } + + private fun setupPluginDependencies() { + pluginDependencyProvider.allowPluginDependency(DarkIconDispatcher::class.java) + pluginDependencyProvider.allowPluginDependency(StatusBarStateController::class.java) + } + + private fun setUpAutoHide() { + autoHideController.setStatusBar( + object : AutoHideUiElement { + override fun synchronizeState() {} + + override fun shouldHideOnTouch(): Boolean { + return !remoteInputManager.isRemoteInputActive + } + + override fun isVisible(): Boolean { + return statusBarModeRepository.defaultDisplay.isTransientShown.value + } + + override fun hide() { + statusBarModeRepository.defaultDisplay.clearTransient() + } + }) + } + + private fun updateBarMode( + animate: Boolean, + barTransitions: PhoneStatusBarTransitions, + barMode: StatusBarMode, + ) { + if (!demoModeController.isInDemoMode) { + barTransitions.transitionTo(barMode.toTransitionModeInt(), animate) + } + autoHideController.touchAutoHide() + } + + private fun updateBubblesVisibility(statusBarVisible: Boolean) { + bubblesOptional.ifPresent { bubbles: Bubbles -> + bubbles.onStatusBarVisibilityChanged(statusBarVisible) + } + } + + private fun setBouncerShowingForStatusBarComponents( + controller: PhoneStatusBarViewController, + bouncerShowing: Boolean, + ) { + val importance = + if (bouncerShowing) { + View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS + } else { + View.IMPORTANT_FOR_ACCESSIBILITY_AUTO + } + controller.setImportantForAccessibility(importance) + } + + override fun dump(pw: PrintWriter, args: Array<out String>) { + pw.println(statusBarWindowStateRepositoryStore.defaultDisplay.windowState.value) + CentralSurfaces.dumpBarTransitions( + pw, + "PhoneStatusBarTransitions", + phoneStatusBarTransitions.value, + ) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt index 3903ff3c2b9b..cf238d553225 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt @@ -46,6 +46,7 @@ import dagger.multibindings.IntoMap */ @Module(includes = [StatusBarDataLayerModule::class, SystemBarUtilsProxyImpl.Module::class]) abstract class StatusBarModule { + @Binds @IntoMap @ClassKey(OngoingCallController::class) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index e0b0ccd9e840..109f0ae41d76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -148,22 +148,29 @@ public class StackScrollAlgorithm { if (isHunGoingToShade) { // Keep 100% opacity for heads up notification going to shade. viewState.setAlpha(1f); - } else if ((!SceneContainerFlag.isEnabled() && ambientState.isOnKeyguard()) - || ambientState.isShowingStackOnLockscreen()) { + } else if (!SceneContainerFlag.isEnabled() && ambientState.isOnKeyguard()) { // Adjust alpha for wakeup to lockscreen. if (view.isHeadsUpState()) { - // Pulsing HUN should be visible on AOD and stay visible during + // Pulsing HUN should be visible on AOD and stay visible during // AOD=>lockscreen transition viewState.setAlpha(1f - ambientState.getHideAmount()); - } else if (SceneContainerFlag.isEnabled()) { + } else { + // Normal notifications are hidden on AOD and should fade in during + // AOD=>lockscreen transition + viewState.setAlpha(1f - ambientState.getDozeAmount()); + } + } else if (SceneContainerFlag.isEnabled() + && ambientState.isShowingStackOnLockscreen()) { + // Adjust alpha for wakeup to lockscreen. + if (view.isHeadsUpState()) { + // Pulsing HUN should be visible on AOD and stay visible during + // AOD=>lockscreen transition + viewState.setAlpha(1f - ambientState.getHideAmount()); + } else { // Take into account scene container-specific Lockscreen fade-in progress float fadeAlpha = ambientState.getLockscreenStackFadeInProgress(); float dozeAlpha = 1f - ambientState.getDozeAmount(); viewState.setAlpha(Math.min(dozeAlpha, fadeAlpha)); - } else { - // Normal notifications are hidden on AOD and should fade in during - // AOD=>lockscreen transition - viewState.setAlpha(1f - ambientState.getDozeAmount()); } } else if (ambientState.isExpansionChanging()) { // Adjust alpha for shade open & close. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 1d3f0e1f6dc3..5f4f72f293a6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -241,10 +241,10 @@ import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.startingsurface.SplashscreenContentDrawer; import com.android.wm.shell.startingsurface.StartingSurface; -import dagger.Lazy; - import dalvik.annotation.optimization.NeverCompile; +import dagger.Lazy; + import java.io.PrintWriter; import java.io.StringWriter; import java.util.Map; @@ -304,6 +304,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { }; void onStatusBarWindowStateChanged(@WindowVisibleState int state) { + StatusBarSimpleFragment.assertInLegacyMode(); mStatusBarWindowState = state; updateBubblesVisibility(); } @@ -813,8 +814,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStartingSurfaceOptional = startingSurfaceOptional; mDreamManager = dreamManager; lockscreenShadeTransitionController.setCentralSurfaces(this); - statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged); - + if (!StatusBarSimpleFragment.isEnabled()) { + statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged); + } mScreenOffAnimationController = screenOffAnimationController; ShadeExpansionListener shadeExpansionListener = this::onPanelExpansionChanged; @@ -901,10 +903,12 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mWallpaperSupported = mWallpaperManager.isWallpaperSupported(); RegisterStatusBarResult result = null; - try { - result = mBarService.registerStatusBar(mCommandQueue); - } catch (RemoteException ex) { - ex.rethrowFromSystemServer(); + if (!StatusBarSimpleFragment.isEnabled()) { + try { + result = mBarService.registerStatusBar(mCommandQueue); + } catch (RemoteException ex) { + ex.rethrowFromSystemServer(); + } } createAndAddWindows(result); @@ -912,30 +916,45 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // Set up the initial notification state. This needs to happen before CommandQueue.disable() setUpPresenter(); - if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) { - mStatusBarModeRepository.getDefaultDisplay().showTransient(); - } - mCommandQueueCallbacks.onSystemBarAttributesChanged(mDisplayId, result.mAppearance, - result.mAppearanceRegions, result.mNavbarColorManagedByIme, result.mBehavior, - result.mRequestedVisibleTypes, result.mPackageName, result.mLetterboxDetails); - - // StatusBarManagerService has a back up of IME token and it's restored here. - mCommandQueueCallbacks.setImeWindowStatus(mDisplayId, result.mImeWindowVis, - result.mImeBackDisposition, result.mShowImeSwitcher); - - // Set up the initial icon state - int numIcons = result.mIcons.size(); - for (int i = 0; i < numIcons; i++) { - mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i)); - } - - if (DEBUG) { - Log.d(TAG, String.format( - "init: icons=%d disabled=0x%08x lights=0x%08x imeButton=0x%08x", - numIcons, - result.mDisabledFlags1, + // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // StatusBarOrchestrator + if (!StatusBarSimpleFragment.isEnabled()) { + if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) { + mStatusBarModeRepository.getDefaultDisplay().showTransient(); + } + mCommandQueueCallbacks.onSystemBarAttributesChanged( + mDisplayId, result.mAppearance, - result.mImeWindowVis)); + result.mAppearanceRegions, + result.mNavbarColorManagedByIme, + result.mBehavior, + result.mRequestedVisibleTypes, + result.mPackageName, + result.mLetterboxDetails); + + // StatusBarManagerService has a back up of IME token and it's restored here. + mCommandQueueCallbacks.setImeWindowStatus( + mDisplayId, + result.mImeWindowVis, + result.mImeBackDisposition, + result.mShowImeSwitcher); + + // Set up the initial icon state + int numIcons = result.mIcons.size(); + for (int i = 0; i < numIcons; i++) { + mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i)); + } + + if (DEBUG) { + Log.d( + TAG, + String.format( + "init: icons=%d disabled=0x%08x lights=0x%08x imeButton=0x%08x", + numIcons, + result.mDisabledFlags1, + result.mAppearance, + result.mImeWindowVis)); + } } IntentFilter internalFilter = new IntentFilter(); @@ -1005,24 +1024,30 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mAccessibilityFloatingMenuController.init(); - // set the initial view visibility - int disabledFlags1 = result.mDisabledFlags1; - int disabledFlags2 = result.mDisabledFlags2; - mInitController.addPostInitTask(() -> { - setUpDisableFlags(disabledFlags1, disabledFlags2); - try { - // NOTE(b/262059863): Force-update the disable flags after applying the flags - // returned from registerStatusBar(). The result's disabled flags may be stale - // if StatusBarManager's disabled flags are updated between registering the bar and - // this handling this post-init task. We force an update in this case, and use a new - // token to not conflict with any other disabled flags already requested by SysUI - Binder token = new Binder(); - mBarService.disable(DISABLE_HOME, token, mContext.getPackageName()); - mBarService.disable(0, token, mContext.getPackageName()); - } catch (RemoteException ex) { - ex.rethrowFromSystemServer(); - } - }); + // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // StatusBarOrchestrator + if (!StatusBarSimpleFragment.isEnabled()) { + // set the initial view visibility + int disabledFlags1 = result.mDisabledFlags1; + int disabledFlags2 = result.mDisabledFlags2; + mInitController.addPostInitTask( + () -> { + setUpDisableFlags(disabledFlags1, disabledFlags2); + try { + // NOTE(b/262059863): Force-update the disable flags after applying the + // flags returned from registerStatusBar(). The result's disabled flags + // may be stale if StatusBarManager's disabled flags are updated between + // registering the bar and this handling this post-init task. We force + // an update in this case, and use a new token to not conflict with any + // other disabled flags already requested by SysUI + Binder token = new Binder(); + mBarService.disable(DISABLE_HOME, token, mContext.getPackageName()); + mBarService.disable(0, token, mContext.getPackageName()); + } catch (RemoteException ex) { + ex.rethrowFromSystemServer(); + } + }); + } registerCallbacks(); @@ -1101,7 +1126,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { /** * @deprecated use {@link - * WindowRootViewVisibilityInteractor.isLockscreenOrShadeVisible} instead. + * WindowRootViewVisibilityInteractor#isLockscreenOrShadeVisible()} instead. */ @VisibleForTesting @Deprecated void initShadeVisibilityListener() { @@ -1168,13 +1193,16 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mWallpaperController.setRootView(getNotificationShadeWindowView()); mDemoModeController.addCallback(mDemoModeCallback); - mJavaAdapter.alwaysCollectFlow( - mStatusBarModeRepository.getDefaultDisplay().isTransientShown(), - this::onTransientShownChanged); - mJavaAdapter.alwaysCollectFlow( - mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode(), - this::updateBarMode); - + // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // StatusBarOrchestrator. + if (!StatusBarSimpleFragment.isEnabled()) { + mJavaAdapter.alwaysCollectFlow( + mStatusBarModeRepository.getDefaultDisplay().isTransientShown(), + this::onTransientShownChanged); + mJavaAdapter.alwaysCollectFlow( + mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode(), + this::updateBarMode); + } mCommandQueueCallbacks = mCommandQueueCallbacksLazy.get(); mCommandQueue.addCallback(mCommandQueueCallbacks); @@ -1184,59 +1212,70 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mShadeExpansionStateManager.addExpansionListener(mWakeUpCoordinator); mWakeUpCoordinator.onPanelExpansionChanged(currentState); - // Allow plugins to reference DarkIconDispatcher and StatusBarStateController - mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class); - mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class); - - // Set up CollapsedStatusBarFragment and PhoneStatusBarView - mStatusBarInitializer.setStatusBarViewUpdatedListener( - (statusBarViewController, statusBarTransitions) -> { - mPhoneStatusBarViewController = statusBarViewController; - mStatusBarTransitions = statusBarTransitions; - getNotificationShadeWindowViewController() - .setStatusBarViewController(mPhoneStatusBarViewController); - // Ensure we re-propagate panel expansion values to the panel controller and - // any listeners it may have, such as PanelBar. This will also ensure we - // re-display the notification panel if necessary (for example, if - // a heads-up notification was being displayed and should continue being - // displayed). - mShadeSurface.updateExpansionAndVisibility(); - setBouncerShowingForStatusBarComponents(mBouncerShowing); - checkBarModes(); - }); - // When the flag is on, we register the fragment as a core startable and this is not needed + // When the StatusBarSimpleFragment flag is enabled, all this logic will be done in + // StatusBarOrchestrator. if (!StatusBarSimpleFragment.isEnabled()) { + // Allow plugins to reference DarkIconDispatcher and StatusBarStateController + mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class); + mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class); + + // Set up CollapsedStatusBarFragment and PhoneStatusBarView + mStatusBarInitializer.setStatusBarViewUpdatedListener( + (statusBarViewController, statusBarTransitions) -> { + + mPhoneStatusBarViewController = statusBarViewController; + mStatusBarTransitions = statusBarTransitions; + getNotificationShadeWindowViewController() + .setStatusBarViewController(mPhoneStatusBarViewController); + // Ensure we re-propagate panel expansion values to the panel controller and + // any listeners it may have, such as PanelBar. This will also ensure we + // re-display the notification panel if necessary (for example, if + // a heads-up notification was being displayed and should continue being + // displayed). + mShadeSurface.updateExpansionAndVisibility(); + setBouncerShowingForStatusBarComponents(mBouncerShowing); + checkBarModes(); + }); + // When the flag is on, we register the fragment as a core startable and this is not + // needed mStatusBarInitializer.initializeStatusBar(); } mStatusBarTouchableRegionManager.setup(getNotificationShadeWindowView()); - createNavigationBar(result); + if (!StatusBarSimpleFragment.isEnabled()) { + createNavigationBar(result); + } mAmbientIndicationContainer = getNotificationShadeWindowView().findViewById( R.id.ambient_indication_container); - mAutoHideController.setStatusBar(new AutoHideUiElement() { - @Override - public void synchronizeState() { - checkBarModes(); - } + // When the StatusBarSimpleFragment flag is enabled, all this logic will be done in + // StatusBarOrchestrator. + if (!StatusBarSimpleFragment.isEnabled()) { + mAutoHideController.setStatusBar( + new AutoHideUiElement() { + @Override + public void synchronizeState() { + checkBarModes(); + } - @Override - public boolean shouldHideOnTouch() { - return !mRemoteInputManager.isRemoteInputActive(); - } + @Override + public boolean shouldHideOnTouch() { + return !mRemoteInputManager.isRemoteInputActive(); + } - @Override - public boolean isVisible() { - return isTransientShown(); - } + @Override + public boolean isVisible() { + return isTransientShown(); + } - @Override - public void hide() { - mStatusBarModeRepository.getDefaultDisplay().clearTransient(); - } - }); + @Override + public void hide() { + mStatusBarModeRepository.getDefaultDisplay().clearTransient(); + } + }); + } ScrimView scrimBehind = getNotificationShadeWindowView().findViewById(R.id.scrim_behind); ScrimView notificationsScrim = getNotificationShadeWindowView() @@ -1479,12 +1518,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { * @param state2 disable2 flags */ protected void setUpDisableFlags(int state1, int state2) { + StatusBarSimpleFragment.assertInLegacyMode(); mCommandQueue.disable(mDisplayId, state1, state2, false /* animate */); } // TODO(b/117478341): This was left such that CarStatusBar can override this method. // Try to remove this. protected void createNavigationBar(@Nullable RegisterStatusBarResult result) { + StatusBarSimpleFragment.assertInLegacyMode(); mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result); } @@ -1697,14 +1738,16 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @Override public void checkBarModes() { if (mDemoModeController.isInDemoMode()) return; - if (mStatusBarTransitions != null) { + // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // StatusBarOrchestrator. + if (!StatusBarSimpleFragment.isEnabled() && mStatusBarTransitions != null) { checkBarMode( mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode().getValue(), mStatusBarWindowState, mStatusBarTransitions); + mNoAnimationOnNextBarModeChange = false; } mNavigationBarController.checkNavBarModes(mDisplayId); - mNoAnimationOnNextBarModeChange = false; } /** Temporarily hides Bubbles if the status bar is hidden. */ @@ -1728,7 +1771,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } private void finishBarAnimations() { - if (mStatusBarTransitions != null) { + // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // StatusBarOrchestrator. + if (!StatusBarSimpleFragment.isEnabled() && mStatusBarTransitions != null) { mStatusBarTransitions.finishAnimations(); } mNavigationBarController.finishBarAnimations(mDisplayId); @@ -1770,14 +1815,17 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } pw.print(" mInteractingWindows="); pw.println(mInteractingWindows); - pw.print(" mStatusBarWindowState="); - pw.println(windowStateToString(mStatusBarWindowState)); + if (!StatusBarSimpleFragment.isEnabled()) { + pw.print(" mStatusBarWindowState="); + pw.println(windowStateToString(mStatusBarWindowState)); + } pw.print(" mDozing="); pw.println(mDozing); pw.print(" mWallpaperSupported= "); pw.println(mWallpaperSupported); - CentralSurfaces.dumpBarTransitions( - pw, "PhoneStatusBarTransitions", mStatusBarTransitions); - + if (!StatusBarSimpleFragment.isEnabled()) { + CentralSurfaces.dumpBarTransitions( + pw, "PhoneStatusBarTransitions", mStatusBarTransitions); + } pw.println(" mMediaManager: "); if (mMediaManager != null) { mMediaManager.dump(pw, args); @@ -1850,7 +1898,11 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private void createAndAddWindows(@Nullable RegisterStatusBarResult result) { makeStatusBarView(result); mNotificationShadeWindowController.attach(); - mStatusBarWindowController.attach(); + // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // StatusBarOrchestrator + if (!StatusBarSimpleFragment.isEnabled()) { + mStatusBarWindowController.attach(); + } } // called by makeStatusbar and also by PhoneStatusBarView @@ -2475,7 +2527,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { int importance = bouncerShowing ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS : IMPORTANT_FOR_ACCESSIBILITY_AUTO; - if (mPhoneStatusBarViewController != null) { + if (!StatusBarSimpleFragment.isEnabled() && mPhoneStatusBarViewController != null) { mPhoneStatusBarViewController.setImportantForAccessibility(importance); } mShadeSurface.setImportantForAccessibility(importance); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt index 13b651e8c0be..5b0319883b5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt @@ -16,10 +16,20 @@ package com.android.systemui.statusbar.phone.dagger import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.statusbar.core.CommandQueueInitializer import com.android.systemui.statusbar.core.StatusBarInitializer import com.android.systemui.statusbar.core.StatusBarInitializerImpl +import com.android.systemui.statusbar.core.StatusBarOrchestrator +import com.android.systemui.statusbar.core.StatusBarSimpleFragment +import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks +import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStore +import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStoreImpl import dagger.Binds +import dagger.Lazy import dagger.Module +import dagger.Provides import dagger.multibindings.ClassKey import dagger.multibindings.IntoMap @@ -27,6 +37,16 @@ import dagger.multibindings.IntoMap @Module interface StatusBarPhoneModule { + @Binds + abstract fun windowStateRepoStore( + impl: StatusBarWindowStateRepositoryStoreImpl + ): StatusBarWindowStateRepositoryStore + + @Binds + abstract fun commandQCallbacks( + impl: CentralSurfacesCommandQueueCallbacks + ): CommandQueue.Callbacks + /** Binds {@link StatusBarInitializer} as a {@link CoreStartable}. */ @Binds @IntoMap @@ -34,4 +54,34 @@ interface StatusBarPhoneModule { fun bindStatusBarInitializer(impl: StatusBarInitializerImpl): CoreStartable @Binds fun statusBarInitializer(impl: StatusBarInitializerImpl): StatusBarInitializer + + companion object { + @Provides + @SysUISingleton + @IntoMap + @ClassKey(StatusBarOrchestrator::class) + fun orchestratorCoreStartable( + orchestratorLazy: Lazy<StatusBarOrchestrator> + ): CoreStartable { + return if (StatusBarSimpleFragment.isEnabled) { + orchestratorLazy.get() + } else { + CoreStartable.NOP + } + } + + @Provides + @SysUISingleton + @IntoMap + @ClassKey(CommandQueueInitializer::class) + fun commandQueueInitializerCoreStartable( + initializerLazy: Lazy<CommandQueueInitializer> + ): CoreStartable { + return if (StatusBarSimpleFragment.isEnabled) { + initializerLazy.get() + } else { + CoreStartable.NOP + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt index 64e056da97d4..7c055c8876ae 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt @@ -39,11 +39,7 @@ import kotlinx.coroutines.launch /** A class allowing Java classes to collect on Kotlin flows. */ @SysUISingleton -class JavaAdapter -@Inject -constructor( - @Application private val scope: CoroutineScope, -) { +class JavaAdapter @Inject constructor(@Application private val scope: CoroutineScope) { /** * Collect information for the given [flow], calling [consumer] for each emitted event. * @@ -55,10 +51,7 @@ constructor( * Do *not* call this method in a class's constructor. Instead, call it in * [com.android.systemui.CoreStartable.start] or similar method. */ - fun <T> alwaysCollectFlow( - flow: Flow<T>, - consumer: Consumer<T>, - ): Job { + fun <T> alwaysCollectFlow(flow: Flow<T>, consumer: Consumer<T>): Job { return scope.launch { flow.collect { consumer.accept(it) } } } @@ -66,7 +59,7 @@ constructor( fun <T> stateInApp( flow: Flow<T>, initialValue: T, - started: SharingStarted = SharingStarted.Eagerly + started: SharingStarted = SharingStarted.Eagerly, ): StateFlow<T> { return flow.stateIn(scope, started, initialValue) } @@ -117,7 +110,7 @@ fun <A, B, C, R> combineFlows( flow1: Flow<A>, flow2: Flow<B>, flow3: Flow<C>, - trifunction: (A, B, C) -> R + trifunction: (A, B, C) -> R, ): Flow<R> { return combine(flow1, flow2, flow3, trifunction) } @@ -127,7 +120,18 @@ fun <T1, T2, T3, T4, R> combineFlows( flow2: Flow<T2>, flow3: Flow<T3>, flow4: Flow<T4>, - transform: (T1, T2, T3, T4) -> R + transform: (T1, T2, T3, T4) -> R, ): Flow<R> { return combine(flow, flow2, flow3, flow4, transform) } + +fun <T1, T2, T3, T4, T5, R> combineFlows( + flow: Flow<T1>, + flow2: Flow<T2>, + flow3: Flow<T3>, + flow4: Flow<T4>, + flow5: Flow<T5>, + transform: (T1, T2, T3, T4, T5) -> R, +): Flow<R> { + return combine(flow, flow2, flow3, flow4, flow5, transform) +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt index 3c50c7b4a212..09b1f45f179b 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt @@ -1,6 +1,7 @@ package com.android.systemui.wallet.controller import android.content.Intent +import android.os.DeadObjectException import android.os.IBinder import android.util.Log import androidx.annotation.VisibleForTesting @@ -47,7 +48,11 @@ constructor( controller.allWalletCards.collect { cards -> val cardsSize = cards.size Log.i(TAG, "Number of cards registered $cardsSize") - listener?.registerNewWalletCards(cards) + try { + listener?.registerNewWalletCards(cards) + } catch (e: DeadObjectException) { + Log.e(TAG, "Failed to register wallet cards because IWalletCardsUpdatedListener is dead") + } } } } else { @@ -55,7 +60,11 @@ constructor( controller.allWalletCards.collect { cards -> val cardsSize = cards.size Log.i(TAG, "Number of cards registered $cardsSize") - listener?.registerNewWalletCards(cards) + try { + listener?.registerNewWalletCards(cards) + } catch (e: DeadObjectException) { + Log.e(TAG, "Failed to register wallet cards because IWalletCardsUpdatedListener is dead") + } } } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java index 1ceac78af1a2..1ceac78af1a2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java index 2d5e3a6788cc..dddaabb66022 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java @@ -23,10 +23,10 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import android.graphics.PointF; -import android.testing.AndroidTestingRunner; + import android.testing.TestableLooper; import android.view.View; import android.view.ViewPropertyAnimator; @@ -37,6 +37,7 @@ import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.FlingAnimation; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.systemui.Prefs; @@ -57,7 +58,7 @@ import org.mockito.junit.MockitoRule; import java.util.Optional; /** Tests for {@link MenuAnimationController}. */ -@RunWith(AndroidTestingRunner.class) +@RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest public class MenuAnimationControllerTest extends SysuiTestCase { @@ -172,7 +173,7 @@ public class MenuAnimationControllerTest extends SysuiTestCase { mMenuAnimationController.mPositionAnimations.values().stream().findAny(); anyAnimation.ifPresent(this::skipAnimationToEnd); - verifyZeroInteractions(onSpringAnimationsEndCallback); + verifyNoMoreInteractions(onSpringAnimationsEndCallback); } @Test @@ -224,7 +225,7 @@ public class MenuAnimationControllerTest extends SysuiTestCase { .filter(animation -> animation instanceof SpringAnimation) .forEach(this::skipAnimationToEnd); - verifyZeroInteractions(onSpringAnimationsEndCallback); + verifyNoMoreInteractions(onSpringAnimationsEndCallback); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt index 9fbe09619ff1..9fbe09619ff1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt index 5cc64547aa6b..0d369a3ea80c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt @@ -19,6 +19,7 @@ package com.android.systemui.bouncer.ui.composable import android.app.AlertDialog import android.platform.test.annotations.MotionTest import android.testing.TestableLooper.RunWithLooper +import android.view.View import androidx.activity.BackEventCompat import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween @@ -52,27 +53,21 @@ import com.android.systemui.bouncer.ui.BouncerDialogFactory import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel import com.android.systemui.bouncer.ui.viewmodel.bouncerSceneContentViewModel -import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.motion.createSysUiComposeMotionTestRule -import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.domain.startable.sceneContainerStartable -import com.android.systemui.scene.sceneContainerGestureFilterFactory -import com.android.systemui.scene.shared.logger.sceneLogger +import com.android.systemui.scene.sceneContainerViewModelFactory import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.sceneDataSourceDelegator import com.android.systemui.scene.ui.composable.Scene import com.android.systemui.scene.ui.composable.SceneContainer -import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel -import com.android.systemui.scene.ui.viewmodel.splitEdgeDetector import com.android.systemui.settings.displayTracker -import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.testKosmos import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.awaitCancellation @@ -85,6 +80,7 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.MockitoAnnotations +import org.mockito.kotlin.mock import platform.test.motion.compose.ComposeFeatureCaptures.positionInRoot import platform.test.motion.compose.ComposeRecordingSpec import platform.test.motion.compose.MotionControl @@ -121,24 +117,17 @@ class BouncerPredictiveBackTest : SysuiTestCase() { val navigationDistances = mapOf(Scenes.Lockscreen to 1, Scenes.Bouncer to 0) SceneContainerConfig(sceneKeys, initialSceneKey, emptyList(), navigationDistances) } + private val view = mock<View>() private val transitionState by lazy { MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Idle(kosmos.sceneContainerConfig.initialSceneKey) ) } + private val sceneContainerViewModel by lazy { - SceneContainerViewModel( - sceneInteractor = kosmos.sceneInteractor, - falsingInteractor = kosmos.falsingInteractor, - powerInteractor = kosmos.powerInteractor, - shadeInteractor = kosmos.shadeInteractor, - splitEdgeDetector = kosmos.splitEdgeDetector, - logger = kosmos.sceneLogger, - gestureFilterFactory = kosmos.sceneContainerGestureFilterFactory, - displayId = kosmos.displayTracker.defaultDisplayId, - motionEventHandlerReceiver = {}, - ) + kosmos.sceneContainerViewModelFactory + .create(view, kosmos.displayTracker.defaultDisplayId, {}) .apply { setTransitionState(transitionState) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java index 5a4799cecae5..5a4799cecae5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/FalsingDataProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java index d72b72c3d21e..ccdaa45513bd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java @@ -24,7 +24,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.KeyguardManager; @@ -121,7 +121,7 @@ public class ClipboardListenerTest extends SysuiTestCase { public void test_initialization() { mClipboardListener.start(); verify(mClipboardManager).addPrimaryClipChangedListener(any()); - verifyZeroInteractions(mUiEventLogger); + verifyNoMoreInteractions(mUiEventLogger); } @Test @@ -204,7 +204,7 @@ public class ClipboardListenerTest extends SysuiTestCase { verify(mUiEventLogger, times(1)).log( ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource); verify(mClipboardToast, times(1)).showCopiedToast(); - verifyZeroInteractions(mOverlayControllerProvider); + verifyNoMoreInteractions(mOverlayControllerProvider); } @Test @@ -218,7 +218,7 @@ public class ClipboardListenerTest extends SysuiTestCase { verify(mUiEventLogger, times(1)).log( ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource); verify(mClipboardToast, times(1)).showCopiedToast(); - verifyZeroInteractions(mOverlayControllerProvider); + verifyNoMoreInteractions(mOverlayControllerProvider); } @Test @@ -232,7 +232,7 @@ public class ClipboardListenerTest extends SysuiTestCase { verify(mUiEventLogger, times(1)).log( ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ENTERED, 0, mSampleSource); verify(mOverlayController).setClipData(mSampleClipData, mSampleSource); - verifyZeroInteractions(mClipboardToast); + verifyNoMoreInteractions(mClipboardToast); } @Test @@ -242,9 +242,9 @@ public class ClipboardListenerTest extends SysuiTestCase { mClipboardListener.start(); mClipboardListener.onPrimaryClipChanged(); - verifyZeroInteractions(mUiEventLogger); - verifyZeroInteractions(mClipboardToast); - verifyZeroInteractions(mOverlayControllerProvider); + verifyNoMoreInteractions(mUiEventLogger); + verifyNoMoreInteractions(mClipboardToast); + verifyNoMoreInteractions(mOverlayControllerProvider); } @Test @@ -259,6 +259,6 @@ public class ClipboardListenerTest extends SysuiTestCase { verify(mUiEventLogger, times(1)).log( ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource); verify(mClipboardToast, times(1)).showCopiedToast(); - verifyZeroInteractions(mOverlayControllerProvider); + verifyNoMoreInteractions(mOverlayControllerProvider); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java index c4f5d621cb6c..07e48b9da153 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java @@ -30,7 +30,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.KeyguardManager; @@ -313,7 +313,7 @@ public class MediaSwitchingControllerTest extends SysuiTestCase { mMediaSwitchingController.start(mCb); verify(mSessionMediaController, never()).registerCallback(any()); - verifyZeroInteractions(mMediaSessionManager); + verifyNoMoreInteractions(mMediaSessionManager); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt index 80a9e4ce991b..d7084898a4a4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt @@ -83,7 +83,7 @@ import org.mockito.Mockito.doNothing import org.mockito.Mockito.never import org.mockito.Mockito.spy import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations import org.mockito.kotlin.whenever @@ -177,7 +177,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { ) verify(eventLogger).logNoteTaskOpened(expectedInfo) - verifyZeroInteractions(bubbles, keyguardManager, userManager) + verifyNoMoreInteractions(bubbles, keyguardManager, userManager) } @Test @@ -192,7 +192,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { ) verify(eventLogger).logNoteTaskClosed(expectedInfo) - verifyZeroInteractions(bubbles, keyguardManager, userManager) + verifyNoMoreInteractions(bubbles, keyguardManager, userManager) } @Test @@ -206,7 +206,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { key = Bubble.getAppBubbleKeyForApp(expectedInfo.packageName, expectedInfo.user), ) - verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger) + verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger) } @Test @@ -220,7 +220,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { key = Bubble.getAppBubbleKeyForApp(expectedInfo.packageName, expectedInfo.user), ) - verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger) + verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger) } @Test @@ -231,7 +231,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { key = "any other key", ) - verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger) + verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger) } @Test @@ -242,7 +242,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { key = Bubble.getAppBubbleKeyForApp(NOTE_TASK_INFO.packageName, NOTE_TASK_INFO.user), ) - verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger) + verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger) } // endregion @@ -275,7 +275,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } assertThat(userCaptor.value).isEqualTo(user10) verify(eventLogger).logNoteTaskOpened(expectedInfo) - verifyZeroInteractions(bubbles) + verifyNoMoreInteractions(bubbles) } @Test @@ -299,7 +299,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } assertThat(userCaptor.value).isEqualTo(userTracker.userHandle) verify(eventLogger).logNoteTaskOpened(expectedInfo) - verifyZeroInteractions(bubbles) + verifyNoMoreInteractions(bubbles) } @Test @@ -322,7 +322,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } assertThat(userCaptor.value).isEqualTo(userTracker.userHandle) verify(eventLogger).logNoteTaskClosed(expectedInfo) - verifyZeroInteractions(bubbles) + verifyNoMoreInteractions(bubbles) } @Test @@ -336,7 +336,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { // Context package name used to create bubble icon from drawable resource id verify(context, atLeastOnce()).packageName verifyNoteTaskOpenInBubbleInUser(userTracker.userHandle) - verifyZeroInteractions(eventLogger) + verifyNoMoreInteractions(eventLogger) } @Test @@ -352,7 +352,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { // Context package name used to create bubble icon from drawable resource id verify(context, atLeastOnce()).packageName verifyNoteTaskOpenInBubbleInUser(userTracker.userHandle) - verifyZeroInteractions(eventLogger) + verifyNoMoreInteractions(eventLogger) } @Test @@ -393,14 +393,14 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } assertThat(userCaptor.value).isEqualTo(user10) verify(eventLogger).logNoteTaskOpened(expectedInfo) - verifyZeroInteractions(bubbles) + verifyNoMoreInteractions(bubbles) } @Test fun showNoteTask_bubblesIsNull_shouldDoNothing() { createNoteTaskController(bubbles = null).showNoteTask(entryPoint = TAIL_BUTTON) - verifyZeroInteractions(bubbles, eventLogger) + verifyNoMoreInteractions(bubbles, eventLogger) } @Test @@ -412,14 +412,14 @@ internal class NoteTaskControllerTest : SysuiTestCase() { noteTaskController.showNoteTask(entryPoint = TAIL_BUTTON) verify(noteTaskController).showNoDefaultNotesAppToast() - verifyZeroInteractions(bubbles, eventLogger) + verifyNoMoreInteractions(bubbles, eventLogger) } @Test fun showNoteTask_flagDisabled_shouldDoNothing() { createNoteTaskController(isEnabled = false).showNoteTask(entryPoint = TAIL_BUTTON) - verifyZeroInteractions(bubbles, eventLogger) + verifyNoMoreInteractions(bubbles, eventLogger) } @Test @@ -428,7 +428,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { createNoteTaskController().showNoteTask(entryPoint = TAIL_BUTTON) - verifyZeroInteractions(bubbles, eventLogger) + verifyNoMoreInteractions(bubbles, eventLogger) } @Test @@ -453,7 +453,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } assertThat(userCaptor.value).isEqualTo(userTracker.userHandle) verify(eventLogger).logNoteTaskOpened(expectedInfo) - verifyZeroInteractions(bubbles) + verifyNoMoreInteractions(bubbles) } // endregion @@ -550,7 +550,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { createNoteTaskController().showNoteTask(entryPoint = QUICK_AFFORDANCE) - verifyZeroInteractions(bubbles, eventLogger) + verifyNoMoreInteractions(bubbles, eventLogger) } @Test @@ -566,7 +566,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { createNoteTaskController().showNoteTask(entryPoint = QUICK_AFFORDANCE) - verifyZeroInteractions(bubbles, eventLogger) + verifyNoMoreInteractions(bubbles, eventLogger) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt index ab846f143caf..d88b75896a58 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt @@ -56,7 +56,7 @@ import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.times import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations.initMocks /** atest SystemUITests:NoteTaskInitializerTest */ @@ -135,7 +135,7 @@ internal class NoteTaskInitializerTest : SysuiTestCase() { underTest.initialize() - verifyZeroInteractions( + verifyNoMoreInteractions( commandQueue, bubbles, controller, @@ -151,7 +151,7 @@ internal class NoteTaskInitializerTest : SysuiTestCase() { underTest.initialize() - verifyZeroInteractions( + verifyNoMoreInteractions( commandQueue, bubbles, controller, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index a6afd0e499f4..f5a901963f05 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -22,10 +22,6 @@ import static com.android.systemui.log.LogBufferHelperKt.logcatLogBuffer; import static com.google.common.truth.Truth.assertThat; -import static kotlinx.coroutines.flow.FlowKt.emptyFlow; -import static kotlinx.coroutines.flow.SharedFlowKt.MutableSharedFlow; -import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; - import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; @@ -40,6 +36,10 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static kotlinx.coroutines.flow.FlowKt.emptyFlow; +import static kotlinx.coroutines.flow.SharedFlowKt.MutableSharedFlow; +import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; + import android.animation.Animator; import android.annotation.IdRes; import android.content.ContentResolver; @@ -95,6 +95,7 @@ import com.android.systemui.flags.FakeFeatureFlagsClassic; import com.android.systemui.flags.Flags; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentService; +import com.android.systemui.haptics.msdl.FakeMSDLPlayer; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewConfigurator; import com.android.systemui.keyguard.data.repository.FakeKeyguardClockRepository; @@ -151,6 +152,7 @@ import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository; import com.android.systemui.statusbar.notification.ConversationNotificationManager; import com.android.systemui.statusbar.notification.DynamicPrivacyController; +import com.android.systemui.statusbar.notification.HeadsUpTouchHelper; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger; import com.android.systemui.statusbar.notification.data.repository.NotificationsKeyguardViewStateRepository; @@ -167,7 +169,6 @@ import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; -import com.android.systemui.statusbar.notification.HeadsUpTouchHelper; import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -200,12 +201,6 @@ import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; import com.android.wm.shell.animation.FlingAnimationUtils; -import dagger.Lazy; - -import kotlinx.coroutines.CoroutineDispatcher; -import kotlinx.coroutines.channels.BufferOverflow; -import kotlinx.coroutines.test.TestScope; - import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -220,6 +215,11 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; +import dagger.Lazy; +import kotlinx.coroutines.CoroutineDispatcher; +import kotlinx.coroutines.channels.BufferOverflow; +import kotlinx.coroutines.test.TestScope; + public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { protected static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400; @@ -374,6 +374,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { protected View.OnLayoutChangeListener mLayoutChangeListener; protected KeyguardStatusViewController mKeyguardStatusViewController; protected ShadeRepository mShadeRepository; + protected FakeMSDLPlayer mMSDLPlayer = mKosmos.getMsdlPlayer(); protected final FalsingManagerFake mFalsingManager = new FalsingManagerFake(); protected final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); @@ -761,7 +762,8 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { new ResourcesSplitShadeStateController(), mPowerInteractor, mKeyguardClockPositionAlgorithm, - mNaturalScrollingSettingObserver); + mNaturalScrollingSettingObserver, + mMSDLPlayer); mNotificationPanelViewController.initDependencies( mCentralSurfaces, null, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index a7fd1609d1ca..43dbb40d7721 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -49,6 +49,7 @@ import android.os.PowerManager; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.testing.TestableLooper; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; @@ -69,6 +70,8 @@ import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.KeyguardClockPositionAlgorithm; +import com.google.android.msdl.data.model.MSDLToken; + import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -1458,4 +1461,23 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo assertThat(mNotificationPanelViewController.getFalsingThreshold()).isGreaterThan(14); } + + @Test + @EnableFlags(com.android.systemui.Flags.FLAG_MSDL_FEEDBACK) + public void performHapticFeedback_withMSDL_forGestureStart_deliversDragThresholdToken() { + mNotificationPanelViewController + .performHapticFeedback(HapticFeedbackConstants.GESTURE_START); + + assertThat(mMSDLPlayer.getLatestTokenPlayed()) + .isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR); + } + + @Test + @EnableFlags(com.android.systemui.Flags.FLAG_MSDL_FEEDBACK) + public void performHapticFeedback_withMSDL_forReject_deliversFailureToken() { + mNotificationPanelViewController + .performHapticFeedback(HapticFeedbackConstants.REJECT); + + assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.FAILURE); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt index 90655c3cf4b3..97441f01bcf5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt @@ -33,7 +33,6 @@ import com.android.systemui.res.R import com.android.systemui.statusbar.StatusBarState.KEYGUARD import com.android.systemui.statusbar.StatusBarState.SHADE import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED -import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -157,6 +156,7 @@ class NotificationPanelViewControllerWithCoroutinesTest : } @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun doubleTapRequired_onKeyguard_usesPerformHapticFeedback() = runTest { launch(Dispatchers.Main.immediate) { val listener = getFalsingTapListener() @@ -184,6 +184,7 @@ class NotificationPanelViewControllerWithCoroutinesTest : } @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun doubleTapRequired_shadeLocked_usesPerformHapticFeedback() = runTest { launch(Dispatchers.Main.immediate) { val listener = getFalsingTapListener() @@ -209,7 +210,7 @@ class NotificationPanelViewControllerWithCoroutinesTest : KEYGUARD /*statusBarState*/, false /*keyguardFadingAway*/, false /*goingToFullShade*/, - SHADE /*oldStatusBarState*/ + SHADE, /*oldStatusBarState*/ ) } advanceUntilIdle() diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java index 308b3708e407..9a8df33a0276 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java @@ -31,7 +31,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.content.Context; @@ -642,7 +642,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { when(mShadeCarrier1.isVisibleToUser()).thenReturn(false); captor.getValue().onClick(mShadeCarrier1); - verifyZeroInteractions(mActivityStarter); + verifyNoMoreInteractions(mActivityStarter); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index d10ea1f02367..2b5e014b2048 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -26,7 +26,6 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; import android.content.ComponentName; import android.graphics.Rect; @@ -393,7 +392,7 @@ public class CommandQueueTest extends SysuiTestCase { mCommandQueue.addQsTileToFrontOrEnd(c, true); waitForIdleSync(); - verifyZeroInteractions(mCallbacks); + verifyNoMoreInteractions(mCallbacks); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java index e0eb99cebd37..2cb9791cc159 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.content.Intent; @@ -138,7 +138,7 @@ public class KeyboardShortcutsReceiverTest extends SysuiTestCase { mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); - verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); + verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test @@ -149,7 +149,7 @@ public class KeyboardShortcutsReceiverTest extends SysuiTestCase { mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); - verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); + verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test @@ -160,7 +160,7 @@ public class KeyboardShortcutsReceiverTest extends SysuiTestCase { mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT); - verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); + verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test @@ -171,6 +171,6 @@ public class KeyboardShortcutsReceiverTest extends SysuiTestCase { mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT); - verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); + verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index 9e6a498b325a..a8618eb544d4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -60,7 +60,7 @@ import org.mockito.Mockito import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.never import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.junit.MockitoJUnit @@ -557,7 +557,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { transitionController.dragDownAmount = 10f verify(singleShadeOverScroller).expansionDragDownAmount = 10f - verifyZeroInteractions(splitShadeOverScroller) + verifyNoMoreInteractions(splitShadeOverScroller) } @Test @@ -568,7 +568,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { transitionController.dragDownAmount = 10f verify(splitShadeOverScroller).expansionDragDownAmount = 10f - verifyZeroInteractions(singleShadeOverScroller) + verifyNoMoreInteractions(singleShadeOverScroller) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt index 58473c4e07a3..98487f7ac059 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt @@ -3,6 +3,7 @@ package com.android.systemui.statusbar import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import kotlinx.coroutines.ExperimentalCoroutinesApi import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS @@ -19,7 +20,6 @@ import org.mockito.Mockito.intThat import org.mockito.Mockito.reset import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @@ -30,6 +30,7 @@ class SplitShadeLockScreenOverScrollerTest : SysuiTestCase() { private val configurationController = FakeConfigurationController() + @OptIn(ExperimentalCoroutinesApi::class) @Mock private lateinit var scrimController: ScrimController @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController private var qS: QS? = null @@ -71,9 +72,9 @@ class SplitShadeLockScreenOverScrollerTest : SysuiTestCase() { setDragAmount(1000f) - verifyZeroInteractions(qS) - verifyZeroInteractions(scrimController) - verifyZeroInteractions(nsslController) + verifyNoMoreInteractions(qS) + verifyNoMoreInteractions(scrimController) + verifyNoMoreInteractions(nsslController) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/CommandQueueInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/CommandQueueInitializerTest.kt new file mode 100644 index 000000000000..2a196c6b979f --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/CommandQueueInitializerTest.kt @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import android.internal.statusbar.fakeStatusBarService +import android.platform.test.annotations.EnableFlags +import android.view.WindowInsets +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.initController +import com.android.systemui.keyguard.data.repository.fakeCommandQueue +import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository +import com.android.systemui.statusbar.mockCommandQueueCallbacks +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.verify + +@EnableFlags(StatusBarSimpleFragment.FLAG_NAME) +@SmallTest +@RunWith(AndroidJUnit4::class) +class CommandQueueInitializerTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val initController = kosmos.initController + private val commandQueue = kosmos.fakeCommandQueue + private val commandQueueCallbacks = kosmos.mockCommandQueueCallbacks + private val statusBarModeRepository = kosmos.fakeStatusBarModeRepository + private val fakeStatusBarService = kosmos.fakeStatusBarService + private val initializer = kosmos.commandQueueInitializer + + @Test + fun start_registersStatusBar() { + initializer.start() + + assertThat(fakeStatusBarService.registeredStatusBar).isNotNull() + } + + @Test + fun start_barResultHasTransientStatusBar_transientStateIsTrue() { + fakeStatusBarService.transientBarTypes = WindowInsets.Type.statusBars() + + initializer.start() + + assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isTrue() + } + + @Test + fun start_barResultDoesNotHaveTransientStatusBar_transientStateIsFalse() { + fakeStatusBarService.transientBarTypes = WindowInsets.Type.navigationBars() + + initializer.start() + + assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isFalse() + } + + @Test + fun start_callsOnSystemBarAttributesChanged_basedOnRegisterBarResult() { + initializer.start() + + verify(commandQueueCallbacks) + .onSystemBarAttributesChanged( + context.displayId, + fakeStatusBarService.appearance, + fakeStatusBarService.appearanceRegions, + fakeStatusBarService.navbarColorManagedByIme, + fakeStatusBarService.behavior, + fakeStatusBarService.requestedVisibleTypes, + fakeStatusBarService.packageName, + fakeStatusBarService.letterboxDetails, + ) + } + + @Test + fun start_callsSetIcon_basedOnRegisterBarResult() { + initializer.start() + + assertThat(commandQueue.icons).isEqualTo(fakeStatusBarService.statusBarIcons) + } + + @Test + fun start_callsSetImeWindowStatus_basedOnRegisterBarResult() { + initializer.start() + + verify(commandQueueCallbacks) + .setImeWindowStatus( + context.displayId, + fakeStatusBarService.imeWindowVis, + fakeStatusBarService.imeBackDisposition, + fakeStatusBarService.showImeSwitcher, + ) + } + + @Test + fun start_afterPostInitTaskExecuted_callsDisableFlags_basedOnRegisterBarResult() { + initializer.start() + + initController.executePostInitTasks() + + assertThat(commandQueue.disableFlags1ForDisplay(context.displayId)) + .isEqualTo(fakeStatusBarService.disabledFlags1) + assertThat(commandQueue.disableFlags2ForDisplay(context.displayId)) + .isEqualTo(fakeStatusBarService.disabledFlags2) + } + + @Test + fun start_beforePostInitTaskExecuted_doesNotCallsDisableFlags() { + initializer.start() + + assertThat(commandQueue.disableFlags1ForDisplay(context.displayId)).isNull() + assertThat(commandQueue.disableFlags2ForDisplay(context.displayId)).isNull() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt new file mode 100644 index 000000000000..580336539c37 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt @@ -0,0 +1,335 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import android.platform.test.annotations.EnableFlags +import android.view.View +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository +import com.android.systemui.kosmos.testDispatcher +import com.android.systemui.kosmos.testScope +import com.android.systemui.kosmos.unconfinedTestDispatcher +import com.android.systemui.plugins.DarkIconDispatcher +import com.android.systemui.plugins.mockPluginDependencyProvider +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.data.repository.fakePowerRepository +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakefulnessState +import com.android.systemui.shade.mockNotificationShadeWindowViewController +import com.android.systemui.shade.mockShadeSurface +import com.android.systemui.statusbar.data.model.StatusBarMode +import com.android.systemui.statusbar.data.model.StatusBarMode.LIGHTS_OUT +import com.android.systemui.statusbar.data.model.StatusBarMode.LIGHTS_OUT_TRANSPARENT +import com.android.systemui.statusbar.data.model.StatusBarMode.OPAQUE +import com.android.systemui.statusbar.data.model.StatusBarMode.TRANSPARENT +import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository +import com.android.systemui.statusbar.phone.mockPhoneStatusBarTransitions +import com.android.systemui.statusbar.phone.mockPhoneStatusBarViewController +import com.android.systemui.statusbar.window.data.model.StatusBarWindowState +import com.android.systemui.statusbar.window.data.repository.fakeStatusBarWindowStateRepositoryStore +import com.android.systemui.statusbar.window.data.repository.statusBarWindowStateRepositoryStore +import com.android.systemui.statusbar.window.fakeStatusBarWindowController +import com.android.systemui.testKosmos +import com.android.wm.shell.bubbles.bubbles +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.never +import org.mockito.kotlin.times +import org.mockito.kotlin.verify + +@EnableFlags(StatusBarSimpleFragment.FLAG_NAME) +@SmallTest +@RunWith(AndroidJUnit4::class) +class StatusBarOrchestratorTest : SysuiTestCase() { + + private val kosmos = + testKosmos().also { + it.testDispatcher = it.unconfinedTestDispatcher + it.statusBarWindowStateRepositoryStore = it.fakeStatusBarWindowStateRepositoryStore + } + private val testScope = kosmos.testScope + private val statusBarViewController = kosmos.mockPhoneStatusBarViewController + private val statusBarWindowController = kosmos.fakeStatusBarWindowController + private val statusBarModeRepository = kosmos.fakeStatusBarModeRepository + private val pluginDependencyProvider = kosmos.mockPluginDependencyProvider + private val notificationShadeWindowViewController = + kosmos.mockNotificationShadeWindowViewController + private val shadeSurface = kosmos.mockShadeSurface + private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository + private val fakeStatusBarWindowStateRepositoryStore = + kosmos.fakeStatusBarWindowStateRepositoryStore + private val fakePowerRepository = kosmos.fakePowerRepository + private val mockPhoneStatusBarTransitions = kosmos.mockPhoneStatusBarTransitions + private val mockBubbles = kosmos.bubbles + + private val orchestrator = kosmos.statusBarOrchestrator + + @Test + fun start_setsUpPluginDependencies() { + orchestrator.start() + + verify(pluginDependencyProvider).allowPluginDependency(DarkIconDispatcher::class.java) + verify(pluginDependencyProvider).allowPluginDependency(StatusBarStateController::class.java) + } + + @Test + fun start_attachesWindow() { + orchestrator.start() + + assertThat(statusBarWindowController.isAttached).isTrue() + } + + @Test + fun start_setsStatusBarControllerOnShade() { + orchestrator.start() + + verify(notificationShadeWindowViewController) + .setStatusBarViewController(statusBarViewController) + } + + @Test + fun start_updatesShadeExpansion() { + orchestrator.start() + + verify(shadeSurface).updateExpansionAndVisibility() + } + + @Test + fun bouncerShowing_setsImportanceForA11yToNoHideDescendants() = + testScope.runTest { + orchestrator.start() + + bouncerRepository.setPrimaryShow(isShowing = true) + + verify(statusBarViewController) + .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS) + } + + @Test + fun bouncerNotShowing_setsImportanceForA11yToNoHideDescendants() = + testScope.runTest { + orchestrator.start() + + bouncerRepository.setPrimaryShow(isShowing = false) + + verify(statusBarViewController) + .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) + } + + @Test + fun deviceGoesToSleep_barTransitionsAnimationsAreFinished() = + testScope.runTest { + putDeviceToSleep() + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions).finishAnimations() + } + + @Test + fun deviceIsAwake_barTransitionsAnimationsAreNotFinished() = + testScope.runTest { + awakeDevice() + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions, never()).finishAnimations() + } + + @Test + fun statusBarVisible_notifiesBubbles() = + testScope.runTest { + setStatusBarMode(TRANSPARENT) + setStatusBarWindowState(StatusBarWindowState.Showing) + + orchestrator.start() + + verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ true) + } + + @Test + fun statusBarInLightsOutMode_notifiesBubblesWithStatusBarInvisible() = + testScope.runTest { + setStatusBarMode(LIGHTS_OUT) + setStatusBarWindowState(StatusBarWindowState.Showing) + + orchestrator.start() + + verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ false) + } + + @Test + fun statusBarInLightsOutTransparentMode_notifiesBubblesWithStatusBarInvisible() = + testScope.runTest { + setStatusBarMode(LIGHTS_OUT_TRANSPARENT) + setStatusBarWindowState(StatusBarWindowState.Showing) + + orchestrator.start() + + verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ false) + } + + @Test + fun statusBarWindowNotShowing_notifiesBubblesWithStatusBarInvisible() = + testScope.runTest { + setStatusBarMode(TRANSPARENT) + setStatusBarWindowState(StatusBarWindowState.Hidden) + + orchestrator.start() + + verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ false) + } + + @Test + fun statusBarModeChange_transitionsToModeWithAnimation() = + testScope.runTest { + awakeDevice() + clearTransientStatusBar() + setStatusBarWindowState(StatusBarWindowState.Showing) + setStatusBarMode(TRANSPARENT) + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions) + .transitionTo(TRANSPARENT.toTransitionModeInt(), /* animate= */ true) + } + + @Test + fun statusBarModeChange_keepsTransitioningAsModeChanges() = + testScope.runTest { + awakeDevice() + clearTransientStatusBar() + setStatusBarWindowState(StatusBarWindowState.Showing) + setStatusBarMode(TRANSPARENT) + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions) + .transitionTo(TRANSPARENT.toTransitionModeInt(), /* animate= */ true) + + setStatusBarMode(OPAQUE) + verify(mockPhoneStatusBarTransitions) + .transitionTo(OPAQUE.toTransitionModeInt(), /* animate= */ true) + + setStatusBarMode(LIGHTS_OUT) + verify(mockPhoneStatusBarTransitions) + .transitionTo(LIGHTS_OUT.toTransitionModeInt(), /* animate= */ true) + + setStatusBarMode(LIGHTS_OUT_TRANSPARENT) + verify(mockPhoneStatusBarTransitions) + .transitionTo(LIGHTS_OUT_TRANSPARENT.toTransitionModeInt(), /* animate= */ true) + } + + @Test + fun statusBarModeChange_transientIsShown_transitionsToModeWithoutAnimation() = + testScope.runTest { + awakeDevice() + setTransientStatusBar() + setStatusBarWindowState(StatusBarWindowState.Showing) + setStatusBarMode(TRANSPARENT) + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions) + .transitionTo(/* mode= */ TRANSPARENT.toTransitionModeInt(), /* animate= */ false) + } + + @Test + fun statusBarModeChange_windowIsHidden_transitionsToModeWithoutAnimation() = + testScope.runTest { + awakeDevice() + clearTransientStatusBar() + setStatusBarWindowState(StatusBarWindowState.Hidden) + setStatusBarMode(TRANSPARENT) + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions) + .transitionTo(/* mode= */ TRANSPARENT.toTransitionModeInt(), /* animate= */ false) + } + + @Test + fun statusBarModeChange_deviceIsAsleep_transitionsToModeWithoutAnimation() = + testScope.runTest { + putDeviceToSleep() + clearTransientStatusBar() + setStatusBarWindowState(StatusBarWindowState.Showing) + setStatusBarMode(TRANSPARENT) + + orchestrator.start() + + verify(mockPhoneStatusBarTransitions) + .transitionTo(/* mode= */ TRANSPARENT.toTransitionModeInt(), /* animate= */ false) + } + + @Test + fun statusBarModeAnimationConditionsChange_withoutBarModeChange_noNewTransitionsHappen() = + testScope.runTest { + awakeDevice() + clearTransientStatusBar() + setStatusBarWindowState(StatusBarWindowState.Showing) + setStatusBarMode(TRANSPARENT) + + orchestrator.start() + + putDeviceToSleep() + awakeDevice() + setTransientStatusBar() + clearTransientStatusBar() + + verify(mockPhoneStatusBarTransitions, times(1)) + .transitionTo(TRANSPARENT.toTransitionModeInt(), /* animate= */ true) + } + + private fun putDeviceToSleep() { + fakePowerRepository.updateWakefulness( + rawState = WakefulnessState.ASLEEP, + lastWakeReason = WakeSleepReason.KEY, + lastSleepReason = WakeSleepReason.KEY, + powerButtonLaunchGestureTriggered = true, + ) + } + + private fun awakeDevice() { + fakePowerRepository.updateWakefulness( + rawState = WakefulnessState.AWAKE, + lastWakeReason = WakeSleepReason.KEY, + lastSleepReason = WakeSleepReason.KEY, + powerButtonLaunchGestureTriggered = true, + ) + } + + private fun setTransientStatusBar() { + statusBarModeRepository.defaultDisplay.showTransient() + } + + private fun clearTransientStatusBar() { + statusBarModeRepository.defaultDisplay.clearTransient() + } + + private fun setStatusBarWindowState(state: StatusBarWindowState) { + fakeStatusBarWindowStateRepositoryStore.defaultDisplay.setWindowState(state) + } + + private fun setStatusBarMode(statusBarMode: StatusBarMode) { + statusBarModeRepository.defaultDisplay.statusBarMode.value = statusBarMode + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt index 3c583f26b0df..56b70bde2cca 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt @@ -45,7 +45,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations.initMocks import org.mockito.Mockito.`when` as whenever @@ -110,7 +110,7 @@ class StackCoordinatorTest : SysuiTestCase() { whenever(section.bucket).thenReturn(BUCKET_ALERTING) afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(stackController).setNotifStats(NotifStats(1, false, true, false, false)) - verifyZeroInteractions(activeNotificationsInteractor) + verifyNoMoreInteractions(activeNotificationsInteractor) } @Test @@ -121,7 +121,7 @@ class StackCoordinatorTest : SysuiTestCase() { whenever(section.bucket).thenReturn(BUCKET_ALERTING) afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(stackController).setNotifStats(NotifStats(1, true, false, false, false)) - verifyZeroInteractions(activeNotificationsInteractor) + verifyNoMoreInteractions(activeNotificationsInteractor) } @Test @@ -130,7 +130,7 @@ class StackCoordinatorTest : SysuiTestCase() { whenever(section.bucket).thenReturn(BUCKET_SILENT) afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(stackController).setNotifStats(NotifStats(1, false, false, false, true)) - verifyZeroInteractions(activeNotificationsInteractor) + verifyNoMoreInteractions(activeNotificationsInteractor) } @Test @@ -141,7 +141,7 @@ class StackCoordinatorTest : SysuiTestCase() { whenever(section.bucket).thenReturn(BUCKET_SILENT) afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(stackController).setNotifStats(NotifStats(1, false, false, true, false)) - verifyZeroInteractions(activeNotificationsInteractor) + verifyNoMoreInteractions(activeNotificationsInteractor) } @Test @@ -151,7 +151,7 @@ class StackCoordinatorTest : SysuiTestCase() { afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(activeNotificationsInteractor) .setNotifStats(NotifStats(1, false, true, false, false)) - verifyZeroInteractions(stackController) + verifyNoMoreInteractions(stackController) } @Test @@ -166,7 +166,7 @@ class StackCoordinatorTest : SysuiTestCase() { afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(activeNotificationsInteractor) .setNotifStats(NotifStats(1, true, false, false, false)) - verifyZeroInteractions(stackController) + verifyNoMoreInteractions(stackController) } @Test @@ -176,7 +176,7 @@ class StackCoordinatorTest : SysuiTestCase() { afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(activeNotificationsInteractor) .setNotifStats(NotifStats(1, false, false, false, true)) - verifyZeroInteractions(stackController) + verifyNoMoreInteractions(stackController) } @Test @@ -191,7 +191,7 @@ class StackCoordinatorTest : SysuiTestCase() { afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(activeNotificationsInteractor) .setNotifStats(NotifStats(1, false, false, true, false)) - verifyZeroInteractions(stackController) + verifyNoMoreInteractions(stackController) } @Test @@ -204,6 +204,6 @@ class StackCoordinatorTest : SysuiTestCase() { afterRenderListListener.onAfterRenderList(listOf(entry), stackController) verify(activeNotificationsInteractor) .setNotifStats(NotifStats(1, hasNonClearableAlertingNotifs = true, false, false, false)) - verifyZeroInteractions(stackController) + verifyNoMoreInteractions(stackController) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt index 30a1214d69d0..a099c9dc6442 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt @@ -77,7 +77,7 @@ import org.mockito.kotlin.never import org.mockito.kotlin.spy import org.mockito.kotlin.times import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyZeroInteractions +import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever @SmallTest @@ -420,7 +420,7 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { val contentToInflate = FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP inflateAndWait(notificationInflater, contentToInflate, row) - verifyZeroInteractions(fakeRonViewInflater) + verifyNoMoreInteractions(fakeRonViewInflater) } @Test @@ -567,7 +567,7 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { // THEN do not dispose old contracted binder handle and change contracted child verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verifyZeroInteractions(oldHandle) + verifyNoMoreInteractions(oldHandle) verify(privateLayout, never()).setContractedChild(any()) } @@ -590,7 +590,7 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { // THEN do not dispose old expanded binder handle and change expanded child verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verifyZeroInteractions(oldHandle) + verifyNoMoreInteractions(oldHandle) verify(privateLayout, never()).setExpandedChild(any()) } @@ -613,7 +613,7 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { // THEN - do not dispose old heads up binder handle and change heads up child verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verifyZeroInteractions(oldHandle) + verifyNoMoreInteractions(oldHandle) verify(privateLayout, never()).setHeadsUpChild(any()) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java index 30556bef6af4..7cd306ead027 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java @@ -37,7 +37,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.metrics.LogMaker; @@ -937,7 +937,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @DisableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING) public void sensitiveNotificationProtectionControllerListenerNotRegistered() { initController(/* viewIsAttached= */ true); - verifyZeroInteractions(mSensitiveNotificationProtectionController); + verifyNoMoreInteractions(mSensitiveNotificationProtectionController); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index c710c56fd516..15ea811287b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -169,6 +169,7 @@ import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.core.StatusBarInitializerImpl; +import com.android.systemui.statusbar.core.StatusBarOrchestrator; import com.android.systemui.statusbar.data.repository.FakeStatusBarModeRepository; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -346,6 +347,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { @Mock private EmergencyGestureIntentFactory mEmergencyGestureIntentFactory; @Mock private NotificationSettingsInteractor mNotificationSettingsInteractor; @Mock private ViewCaptureAwareWindowManager mViewCaptureAwareWindowManager; + @Mock private StatusBarOrchestrator mStatusBarOrchestrator; private ShadeController mShadeController; private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); private final FakeGlobalSettings mFakeGlobalSettings = new FakeGlobalSettings(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 73e3bf4af31e..e804b33db1f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -40,7 +40,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.animation.Animator; @@ -1229,7 +1229,7 @@ public class ScrimControllerTest extends SysuiTestCase { reset(mScrimBehind); mScrimController.setExpansionAffectsAlpha(false); mScrimController.setRawPanelExpansionFraction(0.8f); - verifyZeroInteractions(mScrimBehind); + verifyNoMoreInteractions(mScrimBehind); assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha " + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f); @@ -1441,7 +1441,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void testDoesNotHoldWakeLock_whenUnlocking() { mScrimController.legacyTransitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); - verifyZeroInteractions(mWakeLock); + verifyNoMoreInteractions(mWakeLock); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java index 7a34e94ab362..cace60ce4c0e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java @@ -35,7 +35,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.ActivityManager; @@ -352,7 +351,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { eq(entry.getKey()), any(NotificationVisibility.class)); // The content intent should NOT be sent on click. - verifyZeroInteractions(mContentIntent); + verifyNoMoreInteractions(mContentIntent); // Notification should not be cancelled. verify(mOnUserInteractionCallback, never()) @@ -385,7 +384,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { eq(entry.getKey()), any(NotificationVisibility.class)); // The content intent should NOT be sent on click. - verifyZeroInteractions(mContentIntent); + verifyNoMoreInteractions(mContentIntent); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt index af4f647923a7..4d293b98c165 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt @@ -621,7 +621,7 @@ class DeviceBasedSatelliteRepositoryImplTest : SysuiTestCase() { val signalStrength by collectLastValue(underTest.signalStrength) // THEN we have not yet talked to satellite manager, since we are well before MIN_UPTIME - Mockito.verifyZeroInteractions(satelliteManager) + Mockito.verifyNoMoreInteractions(satelliteManager) // WHEN enough time has passed systemClock.advanceTime(MIN_UPTIME) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java index c4a74635d06e..aca263656dd5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java @@ -21,7 +21,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import android.os.Handler; import android.os.Looper; @@ -108,6 +108,6 @@ public class BatteryControllerStartableTest extends SysuiTestCase { mBatteryControllerStartable.start(); mExecutor.runAllReady(); - verifyZeroInteractions(mBroadcastDispatcher); + verifyNoMoreInteractions(mBroadcastDispatcher); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt index 80cc6eca8405..902caf3ff651 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt @@ -41,7 +41,6 @@ import org.mockito.Mockito.eq import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @@ -89,7 +88,7 @@ class FlashlightControllerImplTest : SysuiTestCase() { @Test fun testNoCameraManagerInteractionDirectlyOnConstructor() { - verifyZeroInteractions(cameraManager) + verifyNoMoreInteractions(cameraManager) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java index ea620a6856f1..3f33d2f89f5e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java @@ -19,7 +19,7 @@ package com.android.systemui.statusbar.policy; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -61,7 +61,7 @@ public class RotationLockControllerImplTest extends SysuiTestCase { public void whenFlagOff_doesntInteractWithDeviceStateRotationController() { createRotationLockController(new String[0]); - verifyZeroInteractions(mDeviceStateRotationLockSettingController); + verifyNoMoreInteractions(mDeviceStateRotationLockSettingController); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt index 2127057522a7..573927552acc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt @@ -73,7 +73,6 @@ import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.Mockito.times import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations import org.mockito.MockitoSession import org.mockito.quality.Strictness @@ -207,7 +206,7 @@ class SensitiveNotificationProtectionControllerTest : SysuiTestCase() { mediaProjectionCallback.onStart(mediaProjectionInfo) controller.registerSensitiveStateListener(listener1) - verifyZeroInteractions(listener1) + verifyNoMoreInteractions(listener1) mediaProjectionCallback.onStop(mediaProjectionInfo) diff --git a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt index 0b3dd660532b..516541dcaf50 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt @@ -46,7 +46,6 @@ import org.mockito.Mock import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.inOrder import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations import org.mockito.quality.Strictness @@ -175,7 +174,7 @@ class StylusManagerTest : SysuiTestCase() { fun startListener_hasStarted_doesNothing() { stylusManager.startListener() - verifyZeroInteractions(inputManager) + verifyNoMoreInteractions(inputManager) } @Test @@ -193,7 +192,7 @@ class StylusManagerTest : SysuiTestCase() { stylusManager.onInputDeviceAdded(STYLUS_DEVICE_ID) - verifyZeroInteractions(stylusCallback) + verifyNoMoreInteractions(stylusCallback) } @Test @@ -282,7 +281,7 @@ class StylusManagerTest : SysuiTestCase() { stylusManager.onInputDeviceChanged(STYLUS_DEVICE_ID) - verifyZeroInteractions(stylusCallback) + verifyNoMoreInteractions(stylusCallback) } @Test @@ -356,7 +355,7 @@ class StylusManagerTest : SysuiTestCase() { stylusManager.onInputDeviceRemoved(STYLUS_DEVICE_ID) - verifyZeroInteractions(stylusCallback) + verifyNoMoreInteractions(stylusCallback) } @Test @@ -565,7 +564,7 @@ class StylusManagerTest : SysuiTestCase() { stylusManager.onBatteryStateChanged(STYLUS_DEVICE_ID, 1, batteryState) - verifyZeroInteractions(uiEventLogger) + verifyNoMoreInteractions(uiEventLogger) } @Test @@ -574,7 +573,7 @@ class StylusManagerTest : SysuiTestCase() { stylusManager.onBatteryStateChanged(STYLUS_DEVICE_ID, 1, batteryState) - verifyZeroInteractions(uiEventLogger) + verifyNoMoreInteractions(uiEventLogger) } @Test @@ -630,7 +629,7 @@ class StylusManagerTest : SysuiTestCase() { fun onBatteryStateChanged_hasNotStarted_doesNothing() { stylusManager.onBatteryStateChanged(STYLUS_DEVICE_ID, 1, batteryState) - verifyZeroInteractions(inputManager) + verifyNoMoreInteractions(inputManager) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt index a5e52a469f97..9592b280be34 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt @@ -33,7 +33,6 @@ import org.mockito.Mockito.mock import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @@ -81,7 +80,7 @@ class StylusUsiPowerStartableTest : SysuiTestCase() { startable.start() - verifyZeroInteractions(stylusManager) + verifyNoMoreInteractions(stylusManager) } @Test @@ -109,7 +108,7 @@ class StylusUsiPowerStartableTest : SysuiTestCase() { fun onStylusAdded_external_noop() { startable.onStylusAdded(EXTERNAL_DEVICE_ID) - verifyZeroInteractions(stylusUsiPowerUi) + verifyNoMoreInteractions(stylusUsiPowerUi) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java index 666bdd6a881a..a3d2695227a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java @@ -30,7 +30,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.Application; @@ -437,7 +437,7 @@ public class ToastUITest extends SysuiTestCase { verify(mToastLogger).logOnSkipToastForInvalidDisplay(PACKAGE_NAME_1, TOKEN_1.toString(), invalidDisplayId); - verifyZeroInteractions(mWindowManager); + verifyNoMoreInteractions(mWindowManager); } private View verifyWmAddViewAndAttachToParent() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 0d398348bda2..9cfb0bb3900b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -53,7 +53,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.ActivityManager; @@ -2362,7 +2362,7 @@ public class BubblesTest extends SysuiTestCase { @DisableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING) @Test public void doesNotRegisterSensitiveStateListener() { - verifyZeroInteractions(mSensitiveNotificationProtectionController); + verifyNoMoreInteractions(mSensitiveNotificationProtectionController); } @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/BubblesTestActivity.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTestActivity.java index ab329c894fb2..ab329c894fb2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/BubblesTestActivity.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTestActivity.java diff --git a/packages/SystemUI/tests/utils/src/android/internal/statusbar/FakeStatusBarService.kt b/packages/SystemUI/tests/utils/src/android/internal/statusbar/FakeStatusBarService.kt new file mode 100644 index 000000000000..cc0597bc3853 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/android/internal/statusbar/FakeStatusBarService.kt @@ -0,0 +1,355 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.internal.statusbar + +import android.app.Notification +import android.content.ComponentName +import android.graphics.Rect +import android.graphics.drawable.Icon +import android.hardware.biometrics.IBiometricContextListener +import android.hardware.biometrics.IBiometricSysuiReceiver +import android.hardware.biometrics.PromptInfo +import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback +import android.media.INearbyMediaDevicesProvider +import android.media.MediaRoute2Info +import android.net.Uri +import android.os.Bundle +import android.os.IBinder +import android.os.UserHandle +import android.util.ArrayMap +import android.view.KeyEvent +import com.android.internal.logging.InstanceId +import com.android.internal.statusbar.IAddTileResultCallback +import com.android.internal.statusbar.ISessionListener +import com.android.internal.statusbar.IStatusBar +import com.android.internal.statusbar.IStatusBarService +import com.android.internal.statusbar.IUndoMediaTransferCallback +import com.android.internal.statusbar.LetterboxDetails +import com.android.internal.statusbar.NotificationVisibility +import com.android.internal.statusbar.RegisterStatusBarResult +import com.android.internal.statusbar.StatusBarIcon +import com.android.internal.view.AppearanceRegion +import org.mockito.kotlin.mock + +class FakeStatusBarService : IStatusBarService.Stub() { + + var registeredStatusBar: IStatusBar? = null + private set + + var statusBarIcons = + ArrayMap<String, StatusBarIcon>().also { + it["slot1"] = mock<StatusBarIcon>() + it["slot2"] = mock<StatusBarIcon>() + } + var disabledFlags1 = 1234567 + var appearance = 123 + var appearanceRegions = + arrayOf( + AppearanceRegion( + /* appearance = */ 123, + /* bounds = */ Rect(/* left= */ 4, /* top= */ 3, /* right= */ 2, /* bottom= */ 1), + ), + AppearanceRegion( + /* appearance = */ 345, + /* bounds = */ Rect(/* left= */ 1, /* top= */ 2, /* right= */ 3, /* bottom= */ 4), + ), + ) + var imeWindowVis = 987 + var imeBackDisposition = 654 + var showImeSwitcher = true + var disabledFlags2 = 7654321 + var navbarColorManagedByIme = true + var behavior = 234 + var requestedVisibleTypes = 345 + var packageName = "fake.bar.ser.vice" + var transientBarTypes = 0 + var letterboxDetails = + arrayOf( + LetterboxDetails( + /* letterboxInnerBounds = */ Rect( + /* left= */ 5, + /* top= */ 6, + /* right= */ 7, + /* bottom= */ 8, + ), + /* letterboxFullBounds = */ Rect( + /* left= */ 1, + /* top= */ 2, + /* right= */ 3, + /* bottom= */ 4, + ), + /* appAppearance = */ 123, + ) + ) + + override fun expandNotificationsPanel() {} + + override fun collapsePanels() {} + + override fun togglePanel() {} + + override fun disable(what: Int, token: IBinder, pkg: String) { + disableForUser(what, token, pkg, userId = 0) + } + + override fun disableForUser(what: Int, token: IBinder, pkg: String, userId: Int) {} + + override fun disable2(what: Int, token: IBinder, pkg: String) { + disable2ForUser(what, token, pkg, userId = 0) + } + + override fun disable2ForUser(what: Int, token: IBinder, pkg: String, userId: Int) {} + + override fun getDisableFlags(token: IBinder, userId: Int): IntArray { + return intArrayOf(disabledFlags1, disabledFlags2) + } + + override fun setIcon( + slot: String, + iconPackage: String, + iconId: Int, + iconLevel: Int, + contentDescription: String, + ) {} + + override fun setIconVisibility(slot: String, visible: Boolean) {} + + override fun removeIcon(slot: String) {} + + override fun setImeWindowStatus( + displayId: Int, + vis: Int, + backDisposition: Int, + showImeSwitcher: Boolean, + ) {} + + override fun expandSettingsPanel(subPanel: String) {} + + override fun registerStatusBar(callbacks: IStatusBar): RegisterStatusBarResult { + registeredStatusBar = callbacks + return RegisterStatusBarResult( + statusBarIcons, + disabledFlags1, + appearance, + appearanceRegions, + imeWindowVis, + imeBackDisposition, + showImeSwitcher, + disabledFlags2, + navbarColorManagedByIme, + behavior, + requestedVisibleTypes, + packageName, + transientBarTypes, + letterboxDetails, + ) + } + + override fun onPanelRevealed(clearNotificationEffects: Boolean, numItems: Int) {} + + override fun onPanelHidden() {} + + override fun clearNotificationEffects() {} + + override fun onNotificationClick(key: String, nv: NotificationVisibility) {} + + override fun onNotificationActionClick( + key: String, + actionIndex: Int, + action: Notification.Action, + nv: NotificationVisibility, + generatedByAssistant: Boolean, + ) {} + + override fun onNotificationError( + pkg: String, + tag: String, + id: Int, + uid: Int, + initialPid: Int, + message: String, + userId: Int, + ) {} + + override fun onClearAllNotifications(userId: Int) {} + + override fun onNotificationClear( + pkg: String, + userId: Int, + key: String, + dismissalSurface: Int, + dismissalSentiment: Int, + nv: NotificationVisibility, + ) {} + + override fun onNotificationVisibilityChanged( + newlyVisibleKeys: Array<NotificationVisibility>, + noLongerVisibleKeys: Array<NotificationVisibility>, + ) {} + + override fun onNotificationExpansionChanged( + key: String, + userAction: Boolean, + expanded: Boolean, + notificationLocation: Int, + ) {} + + override fun onNotificationDirectReplied(key: String) {} + + override fun onNotificationSmartSuggestionsAdded( + key: String, + smartReplyCount: Int, + smartActionCount: Int, + generatedByAssistant: Boolean, + editBeforeSending: Boolean, + ) {} + + override fun onNotificationSmartReplySent( + key: String, + replyIndex: Int, + reply: CharSequence, + notificationLocation: Int, + modifiedBeforeSending: Boolean, + ) {} + + override fun onNotificationSettingsViewed(key: String) {} + + override fun onNotificationBubbleChanged(key: String, isBubble: Boolean, flags: Int) {} + + override fun onBubbleMetadataFlagChanged(key: String, flags: Int) {} + + override fun hideCurrentInputMethodForBubbles(displayId: Int) {} + + override fun grantInlineReplyUriPermission( + key: String, + uri: Uri, + user: UserHandle, + packageName: String, + ) {} + + override fun clearInlineReplyUriPermissions(key: String) {} + + override fun onNotificationFeedbackReceived(key: String, feedback: Bundle) {} + + override fun onGlobalActionsShown() {} + + override fun onGlobalActionsHidden() {} + + override fun shutdown() {} + + override fun reboot(safeMode: Boolean) {} + + override fun restart() {} + + override fun addTile(tile: ComponentName) {} + + override fun remTile(tile: ComponentName) {} + + override fun clickTile(tile: ComponentName) {} + + override fun handleSystemKey(key: KeyEvent) {} + + override fun getLastSystemKey(): Int { + return -1 + } + + override fun showPinningEnterExitToast(entering: Boolean) {} + + override fun showPinningEscapeToast() {} + + override fun showAuthenticationDialog( + promptInfo: PromptInfo, + sysuiReceiver: IBiometricSysuiReceiver, + sensorIds: IntArray, + credentialAllowed: Boolean, + requireConfirmation: Boolean, + userId: Int, + operationId: Long, + opPackageName: String, + requestId: Long, + ) {} + + override fun onBiometricAuthenticated(modality: Int) {} + + override fun onBiometricHelp(modality: Int, message: String) {} + + override fun onBiometricError(modality: Int, error: Int, vendorCode: Int) {} + + override fun hideAuthenticationDialog(requestId: Long) {} + + override fun setBiometicContextListener(listener: IBiometricContextListener) {} + + override fun setUdfpsRefreshRateCallback(callback: IUdfpsRefreshRateRequestCallback) {} + + override fun showInattentiveSleepWarning() {} + + override fun dismissInattentiveSleepWarning(animated: Boolean) {} + + override fun startTracing() {} + + override fun stopTracing() {} + + override fun isTracing(): Boolean { + return false + } + + override fun suppressAmbientDisplay(suppress: Boolean) {} + + override fun requestTileServiceListeningState(componentName: ComponentName, userId: Int) {} + + override fun requestAddTile( + componentName: ComponentName, + label: CharSequence, + icon: Icon, + userId: Int, + callback: IAddTileResultCallback, + ) {} + + override fun cancelRequestAddTile(packageName: String) {} + + override fun setNavBarMode(navBarMode: Int) {} + + override fun getNavBarMode(): Int { + return -1 + } + + override fun registerSessionListener(sessionFlags: Int, listener: ISessionListener) {} + + override fun unregisterSessionListener(sessionFlags: Int, listener: ISessionListener) {} + + override fun onSessionStarted(sessionType: Int, instanceId: InstanceId) {} + + override fun onSessionEnded(sessionType: Int, instanceId: InstanceId) {} + + override fun updateMediaTapToTransferSenderDisplay( + displayState: Int, + routeInfo: MediaRoute2Info, + undoCallback: IUndoMediaTransferCallback, + ) {} + + override fun updateMediaTapToTransferReceiverDisplay( + displayState: Int, + routeInfo: MediaRoute2Info, + appIcon: Icon, + appName: CharSequence, + ) {} + + override fun registerNearbyMediaDevicesProvider(provider: INearbyMediaDevicesProvider) {} + + override fun unregisterNearbyMediaDevicesProvider(provider: INearbyMediaDevicesProvider) {} + + override fun showRearDisplayDialog(currentBaseState: Int) {} +} diff --git a/packages/SystemUI/tests/utils/src/android/internal/statusbar/StatusBarServiceKosmos.kt b/packages/SystemUI/tests/utils/src/android/internal/statusbar/StatusBarServiceKosmos.kt new file mode 100644 index 000000000000..1304161e81e1 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/android/internal/statusbar/StatusBarServiceKosmos.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.internal.statusbar + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.fakeStatusBarService by Kosmos.Fixture { FakeStatusBarService() } + +var Kosmos.statusBarService by Kosmos.Fixture { fakeStatusBarService } diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/TestScopeProvider.kt b/packages/SystemUI/tests/utils/src/com/android/keyguard/TestScopeProvider.kt index 6c35734c6eb4..6c35734c6eb4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/TestScopeProvider.kt +++ b/packages/SystemUI/tests/utils/src/com/android/keyguard/TestScopeProvider.kt diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/DemoModeKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/DemoModeKosmos.kt new file mode 100644 index 000000000000..39384fdec396 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/DemoModeKosmos.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui + +import com.android.systemui.demomode.DemoModeController +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.util.mockito.mock + +val Kosmos.mockDemoModeController by Kosmos.Fixture { mock<DemoModeController>() } + +var Kosmos.demoModeController by Kosmos.Fixture { mockDemoModeController } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/InitControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/InitControllerKosmos.kt new file mode 100644 index 000000000000..13169e133c9b --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/InitControllerKosmos.kt @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.initController by Kosmos.Fixture { InitController() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelKosmos.kt new file mode 100644 index 000000000000..1c84133d3821 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelKosmos.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.ui.viewmodel + +import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.shade.domain.interactor.shadeInteractor + +val Kosmos.communalUserActionsViewModel by Fixture { + CommunalUserActionsViewModel( + deviceUnlockedInteractor = deviceUnlockedInteractor, + shadeInteractor = shadeInteractor, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt index 3a59f6a8784f..601c14509107 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt @@ -18,6 +18,8 @@ package com.android.systemui.keyguard.data.repository import android.content.Context +import androidx.collection.ArrayMap +import com.android.internal.statusbar.StatusBarIcon import com.android.systemui.dagger.SysUISingleton import com.android.systemui.settings.DisplayTracker import com.android.systemui.statusbar.CommandQueue @@ -31,6 +33,11 @@ class FakeCommandQueue @Inject constructor() : CommandQueue(mock(Context::class.java), mock(DisplayTracker::class.java)) { private val callbacks = mutableListOf<Callbacks>() + val icons = ArrayMap<String, StatusBarIcon>() + + private val perDisplayDisableFlags1 = mutableMapOf<Int, Int>() + private val perDisplayDisableFlags2 = mutableMapOf<Int, Int>() + override fun addCallback(callback: Callbacks) { callbacks.add(callback) } @@ -44,6 +51,23 @@ class FakeCommandQueue @Inject constructor() : } fun callbackCount(): Int = callbacks.size + + override fun setIcon(slot: String, icon: StatusBarIcon) { + icons[slot] = icon + } + + override fun disable(displayId: Int, state1: Int, state2: Int, animate: Boolean) { + perDisplayDisableFlags1[displayId] = state1 + perDisplayDisableFlags2[displayId] = state2 + } + + override fun disable(displayId: Int, state1: Int, state2: Int) { + disable(displayId, state1, state2, /* animate= */ false) + } + + fun disableFlags1ForDisplay(displayId: Int) = perDisplayDisableFlags1[displayId] + + fun disableFlags2ForDisplay(displayId: Int) = perDisplayDisableFlags2[displayId] } @Module diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationBarControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationBarControllerKosmos.kt new file mode 100644 index 000000000000..9e2039eb6b54 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationBarControllerKosmos.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigationbar + +import com.android.systemui.kosmos.Kosmos +import org.mockito.kotlin.mock + +val Kosmos.mockNavigationBarController by Kosmos.Fixture { mock<NavigationBarController>() } + +var Kosmos.navigationBarController by Kosmos.Fixture { mockNavigationBarController } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/PluginDependencyKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/PluginDependencyKosmos.kt new file mode 100644 index 000000000000..f1388e9975bf --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/PluginDependencyKosmos.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.plugins + +import android.testing.LeakCheck +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.utils.leaks.FakePluginManager +import org.mockito.Mockito.mock +import org.mockito.kotlin.mock + +val Kosmos.leakCheck by Kosmos.Fixture { LeakCheck() } + +val Kosmos.fakePluginManager by Kosmos.Fixture { FakePluginManager(leakCheck) } + +var Kosmos.pluginManager by Kosmos.Fixture { fakePluginManager } + +val Kosmos.pluginDependencyProvider by Kosmos.Fixture { PluginDependencyProvider { pluginManager } } + +val Kosmos.mockPluginDependencyProvider by Kosmos.Fixture { mock<PluginDependencyProvider>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt index 737aaf22b557..f842db4c0026 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt @@ -1,7 +1,9 @@ package com.android.systemui.scene +import android.view.View import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.classifier.domain.interactor.falsingInteractor +import com.android.systemui.haptics.msdl.msdlPlayer import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.power.domain.interactor.powerInteractor @@ -13,11 +15,13 @@ import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.FakeOverlay import com.android.systemui.scene.ui.viewmodel.SceneContainerGestureFilter +import com.android.systemui.scene.ui.viewmodel.SceneContainerHapticsViewModel import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel import com.android.systemui.scene.ui.viewmodel.splitEdgeDetector import com.android.systemui.settings.displayTracker import com.android.systemui.shade.domain.interactor.shadeInteractor import kotlinx.coroutines.flow.MutableStateFlow +import org.mockito.kotlin.mock var Kosmos.sceneKeys by Fixture { listOf( @@ -68,18 +72,32 @@ val Kosmos.transitionState by Fixture { } val Kosmos.sceneContainerViewModel by Fixture { - SceneContainerViewModel( - sceneInteractor = sceneInteractor, - falsingInteractor = falsingInteractor, - powerInteractor = powerInteractor, - shadeInteractor = shadeInteractor, - splitEdgeDetector = splitEdgeDetector, - gestureFilterFactory = sceneContainerGestureFilterFactory, - displayId = displayTracker.defaultDisplayId, - motionEventHandlerReceiver = {}, - logger = sceneLogger, - ) - .apply { setTransitionState(transitionState) } + sceneContainerViewModelFactory.create(mock<View>(), displayTracker.defaultDisplayId, {}).apply { + setTransitionState(transitionState) + } +} + +val Kosmos.sceneContainerViewModelFactory by Fixture { + object : SceneContainerViewModel.Factory { + override fun create( + view: View, + displayId: Int, + motionEventHandlerReceiver: (SceneContainerViewModel.MotionEventHandler?) -> Unit, + ): SceneContainerViewModel = + SceneContainerViewModel( + sceneInteractor = sceneInteractor, + falsingInteractor = falsingInteractor, + powerInteractor = powerInteractor, + shadeInteractor = shadeInteractor, + splitEdgeDetector = splitEdgeDetector, + logger = sceneLogger, + gestureFilterFactory = sceneContainerGestureFilterFactory, + hapticsViewModelFactory = sceneContainerHapticsViewModelFactory, + view = view, + displayId = displayId, + motionEventHandlerReceiver = motionEventHandlerReceiver, + ) + } } val Kosmos.sceneContainerGestureFilterFactory by Fixture { @@ -92,3 +110,16 @@ val Kosmos.sceneContainerGestureFilterFactory by Fixture { } } } + +val Kosmos.sceneContainerHapticsViewModelFactory by Fixture { + object : SceneContainerHapticsViewModel.Factory { + override fun create(view: View): SceneContainerHapticsViewModel { + return SceneContainerHapticsViewModel( + view = view, + sceneInteractor = sceneInteractor, + shadeInteractor = shadeInteractor, + msdlPlayer = msdlPlayer, + ) + } + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt index 1ceab68604f3..a9f9c82be98b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt @@ -20,3 +20,13 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.mockito.mock var Kosmos.shadeViewController by Kosmos.Fixture { mock<ShadeViewController>() } + +val Kosmos.mockNotificationShadeWindowViewController by + Kosmos.Fixture { mock<NotificationShadeWindowViewController>() } + +var Kosmos.notificationShadeWindowViewController by + Kosmos.Fixture { mockNotificationShadeWindowViewController } + +val Kosmos.mockShadeSurface by Kosmos.Fixture { mock<ShadeSurface>() } + +var Kosmos.shadeSurface by Kosmos.Fixture { mockShadeSurface } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt index d24bcdc834a7..d24bcdc834a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt index 48c5121c71c1..0aeea4e1a2e5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt @@ -19,11 +19,13 @@ package com.android.systemui.shade.ui.viewmodel import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.qs.ui.adapter.qsSceneAdapter +import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor val Kosmos.shadeUserActionsViewModel: ShadeUserActionsViewModel by Fixture { ShadeUserActionsViewModel( qsSceneAdapter = qsSceneAdapter, shadeInteractor = shadeInteractor, + sceneBackInteractor = sceneBackInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt index 27f7f6823cc7..f571c1be9e6e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt @@ -19,4 +19,10 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.mockito.mock -var Kosmos.commandQueue by Kosmos.Fixture { mock<CommandQueue>() } +val Kosmos.mockCommandQueue by Kosmos.Fixture { mock<CommandQueue>() } + +var Kosmos.commandQueue by Kosmos.Fixture { mockCommandQueue } + +val Kosmos.mockCommandQueueCallbacks by Kosmos.Fixture { mock<CommandQueue.Callbacks>() } + +var Kosmos.commandQueueCallbacks by Kosmos.Fixture { mockCommandQueue } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryHelper.java b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationEntryHelper.java index 2420e573421a..2420e573421a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryHelper.java +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationEntryHelper.java diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt index 554bdbe0c382..d436cd4f2ed2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt @@ -19,5 +19,7 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.mockito.mock -var Kosmos.notificationRemoteInputManager by +val Kosmos.mockNotificationRemoteInputManager by Kosmos.Fixture { mock<NotificationRemoteInputManager>() } + +var Kosmos.notificationRemoteInputManager by Kosmos.Fixture { mockNotificationRemoteInputManager } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/CommandQueueInitializerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/CommandQueueInitializerKosmos.kt new file mode 100644 index 000000000000..cba4e8efe9fe --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/CommandQueueInitializerKosmos.kt @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import android.content.testableContext +import android.internal.statusbar.fakeStatusBarService +import com.android.systemui.initController +import com.android.systemui.keyguard.data.repository.fakeCommandQueue +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.navigationbar.mockNavigationBarController +import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository +import com.android.systemui.statusbar.mockCommandQueueCallbacks + +var Kosmos.commandQueueInitializer by + Kosmos.Fixture { + CommandQueueInitializer( + testableContext, + fakeCommandQueue, + { mockCommandQueueCallbacks }, + fakeStatusBarModeRepository, + initController, + fakeStatusBarService, + mockNavigationBarController, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializer.kt new file mode 100644 index 000000000000..edd660490e4d --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializer.kt @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewUpdatedListener +import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions +import com.android.systemui.statusbar.phone.PhoneStatusBarViewController + +class FakeStatusBarInitializer( + private val statusBarViewController: PhoneStatusBarViewController, + private val statusBarTransitions: PhoneStatusBarTransitions, +) : StatusBarInitializer { + + override var statusBarViewUpdatedListener: OnStatusBarViewUpdatedListener? = null + set(value) { + field = value + value?.onStatusBarViewUpdated(statusBarViewController, statusBarTransitions) + } + + override fun initializeStatusBar() {} +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt new file mode 100644 index 000000000000..d10320004454 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.statusbar.phone.phoneStatusBarTransitions +import com.android.systemui.statusbar.phone.phoneStatusBarViewController + +val Kosmos.fakeStatusBarInitializer by + Kosmos.Fixture { + FakeStatusBarInitializer(phoneStatusBarViewController, phoneStatusBarTransitions) + } + +var Kosmos.statusBarInitializer by Kosmos.Fixture { fakeStatusBarInitializer } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarOrchestratorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarOrchestratorKosmos.kt new file mode 100644 index 000000000000..c53e44d514f7 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarOrchestratorKosmos.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.core + +import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.mockDemoModeController +import com.android.systemui.plugins.mockPluginDependencyProvider +import com.android.systemui.power.domain.interactor.powerInteractor +import com.android.systemui.shade.mockNotificationShadeWindowViewController +import com.android.systemui.shade.mockShadeSurface +import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository +import com.android.systemui.statusbar.mockNotificationRemoteInputManager +import com.android.systemui.statusbar.phone.mockAutoHideController +import com.android.systemui.statusbar.window.data.repository.statusBarWindowStateRepositoryStore +import com.android.systemui.statusbar.window.fakeStatusBarWindowController +import com.android.wm.shell.bubbles.bubblesOptional + +val Kosmos.statusBarOrchestrator by + Kosmos.Fixture { + StatusBarOrchestrator( + applicationCoroutineScope, + fakeStatusBarInitializer, + fakeStatusBarWindowController, + fakeStatusBarModeRepository, + mockDemoModeController, + mockPluginDependencyProvider, + mockAutoHideController, + mockNotificationRemoteInputManager, + { mockNotificationShadeWindowViewController }, + mockShadeSurface, + bubblesOptional, + statusBarWindowStateRepositoryStore, + powerInteractor, + primaryBouncerInteractor, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/AutoHideKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/AutoHideKosmos.kt new file mode 100644 index 000000000000..090ce31bd43c --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/AutoHideKosmos.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.util.mockito.mock + +val Kosmos.mockAutoHideController by Kosmos.Fixture { mock<AutoHideController>() } + +var Kosmos.autoHideController by Kosmos.Fixture { mockAutoHideController } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/PhoneStatusBarKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/PhoneStatusBarKosmos.kt new file mode 100644 index 000000000000..603ee08b6b28 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/PhoneStatusBarKosmos.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone + +import com.android.systemui.kosmos.Kosmos +import org.mockito.Mockito.mock + +val Kosmos.mockPhoneStatusBarViewController: PhoneStatusBarViewController by + Kosmos.Fixture { mock(PhoneStatusBarViewController::class.java) } + +var Kosmos.phoneStatusBarViewController by Kosmos.Fixture { mockPhoneStatusBarViewController } + +val Kosmos.mockPhoneStatusBarTransitions: PhoneStatusBarTransitions by + Kosmos.Fixture { mock(PhoneStatusBarTransitions::class.java) } + +var Kosmos.phoneStatusBarTransitions by Kosmos.Fixture { mockPhoneStatusBarTransitions } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt index ec04da7030b7..ec04da7030b7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt new file mode 100644 index 000000000000..528c9d9ec64d --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.window + +import android.view.View +import android.view.ViewGroup +import com.android.systemui.animation.ActivityTransitionAnimator +import com.android.systemui.fragments.FragmentHostManager +import java.util.Optional + +class FakeStatusBarWindowController : StatusBarWindowController { + + var isAttached = false + private set + + override val statusBarHeight: Int = 0 + + override fun refreshStatusBarHeight() {} + + override fun attach() { + isAttached = true + } + + override fun addViewToWindow(view: View, layoutParams: ViewGroup.LayoutParams) {} + + override val backgroundView: View + get() = throw NotImplementedError() + + override val fragmentHostManager: FragmentHostManager + get() = throw NotImplementedError() + + override fun wrapAnimationControllerIfInStatusBar( + rootView: View, + animationController: ActivityTransitionAnimator.Controller, + ): Optional<ActivityTransitionAnimator.Controller> = Optional.empty() + + override fun setForceStatusBarVisible(forceStatusBarVisible: Boolean) {} + + override fun setOngoingProcessRequiresStatusBarVisible(visible: Boolean) {} +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt new file mode 100644 index 000000000000..c198b35be289 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.window + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.fakeStatusBarWindowController by Kosmos.Fixture { FakeStatusBarWindowController() } + +var Kosmos.statusBarWindowController by Kosmos.Fixture { fakeStatusBarWindowController } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/FakeStatusBarWindowStatePerDisplayRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/FakeStatusBarWindowStatePerDisplayRepository.kt new file mode 100644 index 000000000000..6532a7ecc85a --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/FakeStatusBarWindowStatePerDisplayRepository.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.window.data.repository + +import android.view.Display +import com.android.systemui.statusbar.window.data.model.StatusBarWindowState +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakeStatusBarWindowStateRepositoryStore : StatusBarWindowStateRepositoryStore { + + private val perDisplayRepos = mutableMapOf<Int, FakeStatusBarWindowStatePerDisplayRepository>() + + override val defaultDisplay: FakeStatusBarWindowStatePerDisplayRepository = + forDisplay(Display.DEFAULT_DISPLAY) + + override fun forDisplay(displayId: Int): FakeStatusBarWindowStatePerDisplayRepository = + perDisplayRepos.computeIfAbsent(displayId) { + FakeStatusBarWindowStatePerDisplayRepository() + } +} + +class FakeStatusBarWindowStatePerDisplayRepository : StatusBarWindowStatePerDisplayRepository { + + private val _windowState = MutableStateFlow(StatusBarWindowState.Hidden) + + override val windowState = _windowState.asStateFlow() + + fun setWindowState(state: StatusBarWindowState) { + _windowState.value = state + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt index e2b7f5fa0717..2205a3b6e084 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt @@ -21,6 +21,9 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.settings.displayTracker import com.android.systemui.statusbar.commandQueue +val Kosmos.fakeStatusBarWindowStateRepositoryStore by + Kosmos.Fixture { FakeStatusBarWindowStateRepositoryStore() } + class KosmosStatusBarWindowStatePerDisplayRepositoryFactory(private val kosmos: Kosmos) : StatusBarWindowStatePerDisplayRepositoryFactory { override fun create(displayId: Int): StatusBarWindowStatePerDisplayRepositoryImpl { @@ -32,7 +35,7 @@ class KosmosStatusBarWindowStatePerDisplayRepositoryFactory(private val kosmos: } } -val Kosmos.statusBarWindowStateRepositoryStore by +var Kosmos.statusBarWindowStateRepositoryStore: StatusBarWindowStateRepositoryStore by Kosmos.Fixture { StatusBarWindowStateRepositoryStoreImpl( displayId = displayTracker.defaultDisplayId, diff --git a/packages/SystemUI/tests/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt index 7e010886c394..7e010886c394 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt diff --git a/packages/VpnDialogs/res/values-kn/strings.xml b/packages/VpnDialogs/res/values-kn/strings.xml index 4f8d90b20405..f268af4ffdeb 100644 --- a/packages/VpnDialogs/res/values-kn/strings.xml +++ b/packages/VpnDialogs/res/values-kn/strings.xml @@ -32,7 +32,7 @@ <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"VPN ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string> <string name="configure" msgid="4905518375574791375">"ಕಾನ್ಫಿಗರ್ ಮಾಡು"</string> <string name="disconnect" msgid="971412338304200056">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string> - <string name="open_app" msgid="3717639178595958667">"ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string> + <string name="open_app" msgid="3717639178595958667">"ಆ್ಯಪ್ ತೆರೆಯಿರಿ"</string> <string name="dismiss" msgid="6192859333764711227">"ವಜಾಗೊಳಿಸಿ"</string> <string name="sanitized_vpn_label_with_ellipsis" msgid="7014327474633422235">"<xliff:g id="SANITIZED_VPN_LABEL_WITH_ELLIPSIS_0">%1$s</xliff:g>… ( <xliff:g id="SANITIZED_VPN_LABEL_WITH_ELLIPSIS_1">%2$s</xliff:g>)"</string> <string name="sanitized_vpn_label" msgid="1877415015009794766">"<xliff:g id="SANITIZED_VPN_LABEL_0">%1$s</xliff:g> ( <xliff:g id="SANITIZED_VPN_LABEL_1">%2$s</xliff:g>)"</string> diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index fbe593fd3df1..682eb768a23e 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -25,6 +25,7 @@ import static com.android.server.crashrecovery.CrashRecoveryUtils.dumpCrashRecov import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.Context; @@ -91,6 +92,7 @@ import java.util.concurrent.TimeUnit; * Monitors the health of packages on the system and notifies interested observers when packages * fail. On failure, the registered observer with the least user impacting mitigation will * be notified. + * @hide */ public class PackageWatchdog { private static final String TAG = "PackageWatchdog"; @@ -108,13 +110,25 @@ public class PackageWatchdog { private static final long NUMBER_OF_NATIVE_CRASH_POLLS = 10; + /** Reason for package failure could not be determined. */ public static final int FAILURE_REASON_UNKNOWN = 0; + + /** The package had a native crash. */ public static final int FAILURE_REASON_NATIVE_CRASH = 1; + + /** The package failed an explicit health check. */ public static final int FAILURE_REASON_EXPLICIT_HEALTH_CHECK = 2; + + /** The app crashed. */ public static final int FAILURE_REASON_APP_CRASH = 3; + + /** The app was not responding. */ public static final int FAILURE_REASON_APP_NOT_RESPONDING = 4; + + /** The device was boot looping. */ public static final int FAILURE_REASON_BOOT_LOOP = 5; + /** @hide */ @IntDef(prefix = { "FAILURE_REASON_" }, value = { FAILURE_REASON_UNKNOWN, FAILURE_REASON_NATIVE_CRASH, @@ -186,7 +200,8 @@ public class PackageWatchdog { // aborted. private static final String METADATA_FILE = "/metadata/watchdog/mitigation_count.txt"; - @GuardedBy("PackageWatchdog.class") + private static final Object sPackageWatchdogLock = new Object(); + @GuardedBy("sPackageWatchdogLock") private static PackageWatchdog sPackageWatchdog; private final Object mLock = new Object(); @@ -278,8 +293,8 @@ public class PackageWatchdog { } /** Creates or gets singleton instance of PackageWatchdog. */ - public static PackageWatchdog getInstance(Context context) { - synchronized (PackageWatchdog.class) { + public static @NonNull PackageWatchdog getInstance(@NonNull Context context) { + synchronized (sPackageWatchdogLock) { if (sPackageWatchdog == null) { new PackageWatchdog(context); } @@ -290,6 +305,7 @@ public class PackageWatchdog { /** * Called during boot to notify when packages are ready on the device so we can start * binding. + * @hide */ public void onPackagesReady() { synchronized (mLock) { @@ -311,6 +327,7 @@ public class PackageWatchdog { * * <p>Observers are expected to call this on boot. It does not specify any packages but * it will resume observing any packages requested from a previous boot. + * @hide */ public void registerHealthObserver(PackageHealthObserver observer) { synchronized (mLock) { @@ -344,6 +361,7 @@ public class PackageWatchdog { * * <p>If {@code durationMs} is less than 1, a default monitoring duration * {@link #DEFAULT_OBSERVING_DURATION_MS} will be used. + * @hide */ public void startObservingHealth(PackageHealthObserver observer, List<String> packageNames, long durationMs) { @@ -407,6 +425,7 @@ public class PackageWatchdog { * Unregisters {@code observer} from listening to package failure. * Additionally, this stops observing any packages that may have previously been observed * even from a previous boot. + * @hide */ public void unregisterHealthObserver(PackageHealthObserver observer) { mLongTaskHandler.post(() -> { @@ -425,7 +444,7 @@ public class PackageWatchdog { * * <p>This method could be called frequently if there is a severe problem on the device. */ - public void onPackageFailure(List<VersionedPackage> packages, + public void onPackageFailure(@NonNull List<VersionedPackage> packages, @FailureReasons int failureReason) { if (packages == null) { Slog.w(TAG, "Could not resolve a list of failing packages"); @@ -566,6 +585,7 @@ public class PackageWatchdog { * * Note: PackageWatchdog considers system_server restart loop as bootloop. Full reboots * are not counted in bootloop. + * @hide */ @SuppressWarnings("GuardedBy") public void noteBoot() { @@ -620,7 +640,7 @@ public class PackageWatchdog { // TODO(b/120598832): Optimize write? Maybe only write a separate smaller file? Also // avoid holding lock? // This currently adds about 7ms extra to shutdown thread - /** Writes the package information to file during shutdown. */ + /** @hide Writes the package information to file during shutdown. */ public void writeNow() { synchronized (mLock) { // Must only run synchronous tasks as this runs on the ShutdownThread and no other @@ -674,6 +694,7 @@ public class PackageWatchdog { * Since this method can eventually trigger a rollback, it should be called * only once boot has completed {@code onBootCompleted} and not earlier, because the install * session must be entirely completed before we try to rollback. + * @hide */ public void scheduleCheckAndMitigateNativeCrashes() { Slog.i(TAG, "Scheduling " + mNumberOfNativeCrashPollsRemaining + " polls to check " @@ -695,7 +716,9 @@ public class PackageWatchdog { return mPackagesExemptFromImpactLevelThreshold; } - /** Possible severity values of the user impact of a {@link PackageHealthObserver#execute}. */ + /** Possible severity values of the user impact of a {@link PackageHealthObserver#execute}. + * @hide + */ @Retention(SOURCE) @IntDef(value = {PackageHealthObserverImpact.USER_IMPACT_LEVEL_0, PackageHealthObserverImpact.USER_IMPACT_LEVEL_10, @@ -787,7 +810,7 @@ public class PackageWatchdog { * Identifier for the observer, should not change across device updates otherwise the * watchdog may drop observing packages with the old name. */ - String getUniqueIdentifier(); + @NonNull String getUniqueIdentifier(); /** * An observer will not be pruned if this is set, even if the observer is not explicitly @@ -804,7 +827,7 @@ public class PackageWatchdog { * <p> A persistent observer may choose to start observing certain failing packages, even if * it has not explicitly asked to watch the package with {@link #startObservingHealth}. */ - default boolean mayObservePackage(String packageName) { + default boolean mayObservePackage(@NonNull String packageName) { return false; } } @@ -1240,7 +1263,7 @@ public class PackageWatchdog { } } - /** Convert a {@code LongArrayQueue} to a String of comma-separated values. */ + /** @hide Convert a {@code LongArrayQueue} to a String of comma-separated values. */ public static String longArrayQueueToString(LongArrayQueue queue) { if (queue.size() > 0) { StringBuilder sb = new StringBuilder(); @@ -1254,7 +1277,7 @@ public class PackageWatchdog { return ""; } - /** Parse a comma-separated String of longs into a LongArrayQueue. */ + /** @hide Parse a comma-separated String of longs into a LongArrayQueue. */ public static LongArrayQueue parseLongArrayQueue(String commaSeparatedValues) { LongArrayQueue result = new LongArrayQueue(); if (!TextUtils.isEmpty(commaSeparatedValues)) { @@ -1268,7 +1291,7 @@ public class PackageWatchdog { /** Dump status of every observer in mAllObservers. */ - public void dump(PrintWriter pw) { + public void dump(@NonNull PrintWriter pw) { IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); ipw.println("Package Watchdog status"); ipw.increaseIndent(); @@ -1395,6 +1418,7 @@ public class PackageWatchdog { /** * Increments failure counts of {@code packageName}. * @returns {@code true} if failure threshold is exceeded, {@code false} otherwise + * @hide */ @GuardedBy("mLock") public boolean onPackageFailureLocked(String packageName) { @@ -1514,6 +1538,7 @@ public class PackageWatchdog { } } + /** @hide */ @Retention(SOURCE) @IntDef(value = { HealthCheckState.ACTIVE, @@ -1603,7 +1628,9 @@ public class PackageWatchdog { updateHealthCheckStateLocked(); } - /** Writes the salient fields to disk using {@code out}. */ + /** Writes the salient fields to disk using {@code out}. + * @hide + */ @GuardedBy("mLock") public void writeLocked(TypedXmlSerializer out) throws IOException { out.startTag(null, TAG_PACKAGE); diff --git a/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java b/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java index 5f2fbcedce88..8a81aaa1e636 100644 --- a/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java +++ b/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java @@ -23,7 +23,10 @@ import com.android.server.RescueParty; import com.android.server.SystemService; -/** This class encapsulate the lifecycle methods of CrashRecovery module. */ +/** This class encapsulate the lifecycle methods of CrashRecovery module. + * + * @hide + */ public class CrashRecoveryModule { private static final String TAG = "CrashRecoveryModule"; diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 1f9eb082aaf4..67e2ca2b312c 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -48,6 +48,7 @@ import static android.os.Process.ROOT_UID; import static android.provider.Settings.Secure.RESOLUTION_MODE_FULL; import static android.provider.Settings.Secure.RESOLUTION_MODE_HIGH; import static android.provider.Settings.Secure.RESOLUTION_MODE_UNKNOWN; +import static android.text.TextUtils.formatSimple; import static android.view.Display.HdrCapabilities.HDR_TYPE_INVALID; import static com.android.server.display.layout.Layout.Display.POSITION_REAR; @@ -279,6 +280,8 @@ public final class DisplayManagerService extends SystemService { private InputManagerInternal mInputManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private final UidImportanceListener mUidImportanceListener = new UidImportanceListener(); + private final DisplayFrozenProcessListener mDisplayFrozenProcessListener; + @Nullable private IMediaProjectionManager mProjectionService; private DeviceStateManagerInternal mDeviceStateManager; @@ -321,6 +324,12 @@ public final class DisplayManagerService extends SystemService { @GuardedBy("mSyncRoot") private final SparseArray<CallbackRecord> mCallbacks = new SparseArray<>(); + // All callback records indexed by [uid][pid], for fast lookup by uid. + // This is only used if {@link deferDisplayEventsWhenFrozen()} is true. + @GuardedBy("mSyncRoot") + private final SparseArray<SparseArray<CallbackRecord>> mCallbackRecordByPidByUid = + new SparseArray<>(); + /** * All {@link IVirtualDevice} and {@link DisplayWindowPolicyController}s indexed by * {@link DisplayInfo#displayId}. @@ -472,6 +481,7 @@ public final class DisplayManagerService extends SystemService { // Pending callback records indexed by calling process uid and pid. // Must be used outside of the lock mSyncRoot and should be self-locked. + // This is only used when {@link deferDisplayEventsWhenFrozen()} is false. @GuardedBy("mPendingCallbackSelfLocked") private final SparseArray<SparseArray<PendingCallback>> mPendingCallbackSelfLocked = new SparseArray<>(); @@ -611,6 +621,7 @@ public final class DisplayManagerService extends SystemService { mFlags = injector.getFlags(); mHandler = new DisplayManagerHandler(displayThreadLooper); mHandlerExecutor = new HandlerExecutor(mHandler); + mDisplayFrozenProcessListener = new DisplayFrozenProcessListener(); mUiHandler = UiThread.getHandler(); mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore); mLogicalDisplayMapper = new LogicalDisplayMapper(mContext, @@ -1034,10 +1045,14 @@ public final class DisplayManagerService extends SystemService { private class UidImportanceListener implements ActivityManager.OnUidImportanceListener { @Override public void onUidImportance(int uid, int importance) { - onUidImportanceInternal(uid, importance); + if (deferDisplayEventsWhenFrozen()) { + onUidImportanceFlagged(uid, importance); + } else { + onUidImportanceUnflagged(uid, importance); + } } - private void onUidImportanceInternal(int uid, int importance) { + private void onUidImportanceUnflagged(int uid, int importance) { synchronized (mPendingCallbackSelfLocked) { if (importance >= IMPORTANCE_GONE) { // Clean up as the app is already gone @@ -1068,6 +1083,83 @@ public final class DisplayManagerService extends SystemService { mPendingCallbackSelfLocked.delete(uid); } } + + private void onUidImportanceFlagged(int uid, int importance) { + final boolean cached = (importance >= IMPORTANCE_CACHED); + List<CallbackRecord> readyCallbackRecords = null; + synchronized (mSyncRoot) { + final SparseArray<CallbackRecord> procs = mCallbackRecordByPidByUid.get(uid); + if (procs == null) { + return; + } + if (cached) { + setCachedLocked(procs); + } else { + readyCallbackRecords = setUncachedLocked(procs); + } + } + if (readyCallbackRecords != null) { + // Attempt to dispatch pending events if the UID is coming out of cached state. + for (int i = 0; i < readyCallbackRecords.size(); i++) { + readyCallbackRecords.get(i).dispatchPending(); + } + } + } + + // Set all processes in the list to cached. + @GuardedBy("mSyncRoot") + private void setCachedLocked(SparseArray<CallbackRecord> procs) { + for (int i = 0; i < procs.size(); i++) { + final CallbackRecord cb = procs.valueAt(i); + if (cb != null) { + cb.setCached(true); + } + } + } + + // Set all processes to uncached and return the list of processes that were modified. + @GuardedBy("mSyncRoot") + private List<CallbackRecord> setUncachedLocked(SparseArray<CallbackRecord> procs) { + ArrayList<CallbackRecord> ready = null; + for (int i = 0; i < procs.size(); i++) { + final CallbackRecord cb = procs.valueAt(i); + if (cb != null) { + if (cb.setCached(false)) { + if (ready == null) ready = new ArrayList<>(); + ready.add(cb); + } + } + } + return ready; + } + } + + private class DisplayFrozenProcessListener + implements ActivityManagerInternal.FrozenProcessListener { + public void onProcessFrozen(int pid) { + synchronized (mSyncRoot) { + CallbackRecord callback = mCallbacks.get(pid); + if (callback == null) { + return; + } + callback.setFrozen(true); + } + } + + public void onProcessUnfrozen(int pid) { + // First, see if there is a callback associated with this pid. If there's no + // callback, then there is nothing to do. + CallbackRecord callback; + synchronized (mSyncRoot) { + callback = mCallbacks.get(pid); + if (callback == null) { + return; + } + callback.setFrozen(false); + } + // Attempt to dispatch pending events if the process is coming out of frozen. + callback.dispatchPending(); + } } private class SettingsObserver extends ContentObserver { @@ -1314,12 +1406,29 @@ public final class DisplayManagerService extends SystemService { } mCallbacks.put(callingPid, record); + if (deferDisplayEventsWhenFrozen()) { + SparseArray<CallbackRecord> uidPeers = mCallbackRecordByPidByUid.get(record.mUid); + if (uidPeers == null) { + uidPeers = new SparseArray<CallbackRecord>(); + mCallbackRecordByPidByUid.put(record.mUid, uidPeers); + } + uidPeers.put(record.mPid, record); + } } } private void onCallbackDied(CallbackRecord record) { synchronized (mSyncRoot) { mCallbacks.remove(record.mPid); + if (deferDisplayEventsWhenFrozen()) { + SparseArray<CallbackRecord> uidPeers = mCallbackRecordByPidByUid.get(record.mUid); + if (uidPeers != null) { + uidPeers.remove(record.mPid); + if (uidPeers.size() == 0) { + mCallbackRecordByPidByUid.remove(record.mUid); + } + } + } stopWifiDisplayScanLocked(record); } } @@ -3296,12 +3405,16 @@ public final class DisplayManagerService extends SystemService { // After releasing the lock, send the notifications out. for (int i = 0; i < mTempCallbacks.size(); i++) { CallbackRecord callbackRecord = mTempCallbacks.get(i); - deliverEventInternal(callbackRecord, displayId, event); + if (deferDisplayEventsWhenFrozen()) { + deliverEventFlagged(callbackRecord, displayId, event); + } else { + deliverEventUnflagged(callbackRecord, displayId, event); + } } mTempCallbacks.clear(); } - private void deliverEventInternal(CallbackRecord callbackRecord, int displayId, int event) { + private void deliverEventUnflagged(CallbackRecord callbackRecord, int displayId, int event) { final int uid = callbackRecord.mUid; final int pid = callbackRecord.mPid; if (isUidCached(uid)) { @@ -3330,6 +3443,10 @@ public final class DisplayManagerService extends SystemService { } } + private void deliverEventFlagged(CallbackRecord callbackRecord, int displayId, int event) { + callbackRecord.notifyDisplayEventAsync(displayId, event); + } + private boolean extraLogging(String packageName) { return mExtraDisplayEventLogging && mExtraDisplayLoggingPackageName.equals(packageName); } @@ -3454,9 +3571,7 @@ public final class DisplayManagerService extends SystemService { pw.println("Callbacks: size=" + callbackCount); pw.println("-----------------"); for (int i = 0; i < callbackCount; i++) { - CallbackRecord callback = mCallbacks.valueAt(i); - pw.println(" " + i + ": mPid=" + callback.mPid - + ", mWifiDisplayScanRequested=" + callback.mWifiDisplayScanRequested); + pw.println(" " + i + ": " + mCallbacks.valueAt(i).dump()); } pw.println(); @@ -3855,12 +3970,43 @@ public final class DisplayManagerService extends SystemService { public boolean mWifiDisplayScanRequested; + // A single pending event. + private record Event(int displayId, @DisplayEvent int event) { }; + + // The list of pending events. This is null until there is a pending event to be saved. + // This is only used if {@link deferDisplayEventsWhenFrozen()} is true. + @GuardedBy("mCallback") + private ArrayList<Event> mPendingEvents; + + // Process states: a process is ready to receive events if it is neither cached nor + // frozen. + @GuardedBy("mCallback") + private boolean mCached; + @GuardedBy("mCallback") + private boolean mFrozen; + CallbackRecord(int pid, int uid, @NonNull IDisplayManagerCallback callback, @EventsMask long eventsMask) { mPid = pid; mUid = uid; mCallback = callback; mEventsMask = new AtomicLong(eventsMask); + mCached = false; + mFrozen = false; + + if (deferDisplayEventsWhenFrozen()) { + // Some CallbackRecords are registered very early in system boot, before + // mActivityManagerInternal is initialized. If mActivityManagerInternal is null, + // do not register the frozen process listener. However, do verify that all such + // registrations are for the self pid (which can never be frozen, so the frozen + // process listener does not matter). + if (mActivityManagerInternal != null) { + mActivityManagerInternal.addFrozenProcessListener(pid, mHandlerExecutor, + mDisplayFrozenProcessListener); + } else if (Process.myPid() != pid) { + Slog.e(TAG, "DisplayListener registered too early"); + } + } String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid); mPackageName = packageNames == null ? null : packageNames[0]; @@ -3870,6 +4016,46 @@ public final class DisplayManagerService extends SystemService { mEventsMask.set(eventsMask); } + /** + * Return true if the process can accept events. + */ + @GuardedBy("mCallback") + private boolean isReadyLocked() { + return !mCached && !mFrozen; + } + + /** + * Return true if the process is now ready and has pending events to be delivered. + */ + @GuardedBy("mCallback") + private boolean hasPendingAndIsReadyLocked() { + return isReadyLocked() && mPendingEvents != null && !mPendingEvents.isEmpty(); + } + + /** + * Set the frozen flag for this process. Return true if the process is now ready to + * receive events and there are pending events to be delivered. + * This is only used if {@link deferDisplayEventsWhenFrozen()} is true. + */ + public boolean setFrozen(boolean frozen) { + synchronized (mCallback) { + mFrozen = frozen; + return hasPendingAndIsReadyLocked(); + } + } + + /** + * Set the cached flag for this process. Return true if the process is now ready to + * receive events and there are pending events to be delivered. + * This is only used if {@link deferDisplayEventsWhenFrozen()} is true. + */ + public boolean setCached(boolean cached) { + synchronized (mCallback) { + mCached = cached; + return hasPendingAndIsReadyLocked(); + } + } + @Override public void binderDied() { if (DEBUG || extraLogging(mPackageName)) { @@ -3885,7 +4071,7 @@ public final class DisplayManagerService extends SystemService { /** * @return {@code false} if RemoteException happens; otherwise {@code true} for * success. This returns true even if the event was deferred because the remote client is - * cached. + * cached or frozen. */ public boolean notifyDisplayEventAsync(int displayId, @DisplayEvent int event) { if (!shouldSendEvent(event)) { @@ -3902,6 +4088,22 @@ public final class DisplayManagerService extends SystemService { return true; } + if (deferDisplayEventsWhenFrozen()) { + synchronized (mCallback) { + // Add the new event to the pending list if the client frozen or cached (not + // ready) or if there are existing pending events. The latter condition + // occurs as the client is transitioning to ready but pending events have not + // been dispatched. The new event must be added to the pending list to + // preserve event ordering. + if (!isReadyLocked() || (mPendingEvents != null && !mPendingEvents.isEmpty())) { + // The client is interested in the event but is not ready to receive it. + // Put the event on the pending list. + addDisplayEvent(displayId, event); + return true; + } + } + } + return transmitDisplayEvent(displayId, event); } @@ -3948,8 +4150,81 @@ public final class DisplayManagerService extends SystemService { return true; } } + + // Add a single event to the pending list, possibly combining or collapsing events in the + // list. + // This is only used if {@link deferDisplayEventsWhenFrozen()} is true. + @GuardedBy("mCallback") + private void addDisplayEvent(int displayId, int event) { + if (mPendingEvents == null) { + mPendingEvents = new ArrayList<>(); + } + if (!mPendingEvents.isEmpty()) { + // Ignore redundant events. Further optimization is possible by merging adjacent + // events. + Event last = mPendingEvents.get(mPendingEvents.size() - 1); + if (last.displayId == displayId && last.event == event) { + if (DEBUG) { + Slog.d(TAG, "Ignore redundant display event " + displayId + "/" + event + + " to " + mUid + "/" + mPid); + } + return; + } + } + mPendingEvents.add(new Event(displayId, event)); + } + + // Send all pending events. This can safely be called if the process is not ready, but it + // would be unusual to do so. The method returns true on success. + // This is only used if {@link deferDisplayEventsWhenFrozen()} is true. + public boolean dispatchPending() { + synchronized (mCallback) { + if (mPendingEvents == null || mPendingEvents.isEmpty()) { + return true; + } + if (!isReadyLocked()) { + return false; + } + for (int i = 0; i < mPendingEvents.size(); i++) { + Event displayEvent = mPendingEvents.get(i); + if (DEBUG) { + Slog.d(TAG, "Send pending display event #" + i + " " + + displayEvent.displayId + "/" + + displayEvent.event + " to " + mUid + "/" + mPid); + } + if (!transmitDisplayEvent(displayEvent.displayId, displayEvent.event)) { + Slog.d(TAG, "Drop pending events for dead process " + mPid); + break; + } + } + mPendingEvents.clear(); + return true; + } + } + + // Return a string suitable for dumpsys. + private String dump() { + if (deferDisplayEventsWhenFrozen()) { + final String fmt = + "mPid=%d mUid=%d mWifiDisplayScanRequested=%s" + + " cached=%s frozen=%s pending=%d"; + synchronized (mCallback) { + return formatSimple(fmt, + mPid, mUid, mWifiDisplayScanRequested, mCached, mFrozen, + (mPendingEvents == null) ? 0 : mPendingEvents.size()); + } + } else { + final String fmt = + "mPid=%d mUid=%d mWifiDisplayScanRequested=%s"; + return formatSimple(fmt, + mPid, mUid, mWifiDisplayScanRequested); + } + } } + /** + * This is only used if {@link deferDisplayEventsWhenFrozen()} is false. + */ private static final class PendingCallback { private final CallbackRecord mCallbackRecord; private final ArrayList<Pair<Integer, Integer>> mDisplayEvents; @@ -5504,4 +5779,11 @@ public final class DisplayManagerService extends SystemService { return mExternalDisplayStatsService; } } + + /** + * Return the value of the pause + */ + private static boolean deferDisplayEventsWhenFrozen() { + return com.android.server.am.Flags.deferDisplayEventsWhenFrozen(); + } } diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java index f78c4488cbfb..d206c66ed09a 100644 --- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java @@ -99,6 +99,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve // True if needing to roll back only rebootless apexes when native crash happens private boolean mTwoPhaseRollbackEnabled; + /** @hide */ @VisibleForTesting public RollbackPackageHealthObserver(Context context, ApexManager apexManager) { mContext = context; @@ -123,7 +124,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } } - RollbackPackageHealthObserver(Context context) { + public RollbackPackageHealthObserver(@NonNull Context context) { this(context, ApexManager.getInstance()); } @@ -239,8 +240,8 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve return false; } - @Override + @NonNull public String getUniqueIdentifier() { return NAME; } @@ -251,7 +252,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public boolean mayObservePackage(String packageName) { + public boolean mayObservePackage(@NonNull String packageName) { if (getAvailableRollbacks().isEmpty()) { return false; } @@ -281,12 +282,14 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve * This may cause {@code packages} to be rolled back if they crash too freqeuntly. */ @AnyThread - void startObservingHealth(List<String> packages, long durationMs) { + @NonNull + public void startObservingHealth(@NonNull List<String> packages, @NonNull long durationMs) { PackageWatchdog.getInstance(mContext).startObservingHealth(this, packages, durationMs); } @AnyThread - void notifyRollbackAvailable(RollbackInfo rollback) { + @NonNull + public void notifyRollbackAvailable(@NonNull RollbackInfo rollback) { mHandler.post(() -> { // Enable two-phase rollback when a rebootless apex rollback is made available. // We assume the rebootless apex is stable and is less likely to be the cause @@ -314,7 +317,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve * to check for native crashes and mitigate them if needed. */ @AnyThread - void onBootCompletedAsync() { + public void onBootCompletedAsync() { mHandler.post(()->onBootCompleted()); } diff --git a/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java b/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java index 79560ce27919..9cfed02f9355 100644 --- a/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java +++ b/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java @@ -51,6 +51,7 @@ import java.util.List; /** * This class handles the logic for logging Watchdog-triggered rollback events. + * @hide */ public final class WatchdogRollbackLogger { private static final String TAG = "WatchdogRollbackLogger"; diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 946b61ad5fd9..2d75f35d2a9c 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.MANAGE_EXTERNAL_STORAGE; import static android.Manifest.permission.READ_WALLPAPER_INTERNAL; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; +import static android.app.Flags.fixWallpaperChanged; import static android.app.Flags.removeNextWallpaperComponent; import static android.app.WallpaperManager.COMMAND_REAPPLY; import static android.app.WallpaperManager.FLAG_LOCK; @@ -349,7 +350,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (DEBUG) { Slog.d(TAG, "publish system wallpaper changed!"); } - notifyWallpaperChanged(wallpaper); + notifyWallpaperComplete(wallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(wallpaper); + } } }; @@ -369,7 +373,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (DEBUG) { Slog.d(TAG, "publish lock wallpaper changed!"); } - notifyWallpaperChanged(wallpaper); + notifyWallpaperComplete(wallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(wallpaper); + } } }; @@ -403,8 +410,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } - private void notifyWallpaperChanged(WallpaperData wallpaper) { - // Publish completion *after* we've persisted the changes + /* + * Calls wallpaper setComplete methods. Called for static wallpapers after the wallpaper is set + * and changes are persisted. + */ + private void notifyWallpaperComplete(WallpaperData wallpaper) { if (wallpaper.setComplete != null) { try { wallpaper.setComplete.onWallpaperChanged(); @@ -1787,6 +1797,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub switchWallpaper(systemWallpaper, null); // TODO(b/278261563): call notifyCallbacksLocked inside switchWallpaper notifyCallbacksLocked(systemWallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(systemWallpaper); + } } if (mLockWallpaperWaitingForUnlock) { final WallpaperData lockWallpaper = @@ -1794,6 +1807,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub lockWallpaper.mBindSource = BindSource.SWITCH_WALLPAPER_UNLOCK_USER; switchWallpaper(lockWallpaper, null); notifyCallbacksLocked(lockWallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(lockWallpaper); + } } // Make sure that the SELinux labeling of all the relevant files is correct. @@ -3248,6 +3264,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } newWallpaper.wallpaperId = makeWallpaperIdLocked(); notifyCallbacksLocked(newWallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(newWallpaper); + } shouldNotifyColors = true; if (offloadColorExtraction()) { shouldNotifyColors = false; @@ -3316,6 +3335,21 @@ public class WallpaperManagerService extends IWallpaperManager.Stub return false; } + /* + * Attempt to bind the wallpaper given by `componentName`, returning true on success otherwise + * false. + * + * When called, `wallpaper` is in a deliberately inconsistent state. Most fields have been + * updated to describe the desired wallpaper, but the ComponentName is not updated until + * binding is successful. This is required for maybeDetachWallpapers() to work correctly. + * + * The late update of the component field should cause multi-threading headaches with + * WallpaperConnection#onServiceConnected, but doesn't because onServiceConnected required + * `mLock` and `bindWallpaperComponentLocked` is always called with that lock, which prevents a + * race condition. + * + * This is a major motivation for making WallpaperData immutable per b/267170056. + */ boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force, boolean fromUser, WallpaperData wallpaper, IRemoteCallback reply) { if (DEBUG_LIVE) { @@ -3610,8 +3644,18 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } wallpaper.callbacks.finishBroadcast(); + if (!fixWallpaperChanged()) { + final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED); + intent.putExtra(WallpaperManager.EXTRA_FROM_FOREGROUND_APP, + wallpaper.fromForegroundApp); + mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); + } + } + + private void notifyWallpaperChanged(WallpaperData wallpaper) { final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED); intent.putExtra(WallpaperManager.EXTRA_FROM_FOREGROUND_APP, wallpaper.fromForegroundApp); + intent.putExtra(WallpaperManager.EXTRA_WHICH_WALLPAPER_CHANGED, wallpaper.mWhich); mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 14e9180022a8..ca93075f2925 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -6409,7 +6409,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // and the token could be null. return; } - r.mDisplayContent.mAppCompatCameraPolicy.onActivityRefreshed(r); + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy + .getAppCompatCameraPolicy(r); + if (cameraPolicy != null) { + cameraPolicy.onActivityRefreshed(r); + } } static void splashScreenAttachedLocked(IBinder token) { @@ -9451,8 +9455,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (!shouldBeResumed(/* activeActivity */ null)) { return; } - mDisplayContent.mAppCompatCameraPolicy.onActivityConfigurationChanging( - this, newConfig, lastReportedConfig); + + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy( + this); + if (cameraPolicy != null) { + cameraPolicy.onActivityConfigurationChanging(this, newConfig, lastReportedConfig); + } } /** Get process configuration, or global config if the process is not set. */ diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java index f245efd7ff0e..0e666296dc33 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java @@ -255,8 +255,8 @@ class AppCompatAspectRatioOverrides { mActivityRecord.getOverrideOrientation()); final AppCompatCameraOverrides cameraOverrides = mActivityRecord.mAppCompatController.getAppCompatCameraOverrides(); - final AppCompatCameraPolicy cameraPolicy = - mActivityRecord.mAppCompatController.getAppCompatCameraPolicy(); + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy( + mActivityRecord); // Don't resize to split screen size when in book mode if letterbox position is centered return (isBookMode && isNotCenteredHorizontally || isTabletopMode && isLandscape) || cameraOverrides.isCameraCompatSplitScreenAspectRatioAllowed() diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java index 6946b6a71fab..3b023fe451bf 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java @@ -72,6 +72,15 @@ class AppCompatAspectRatioPolicy { float getDesiredAspectRatio(@NonNull Configuration newParentConfig, @NonNull Rect parentBounds) { + // If in camera compat mode, aspect ratio from the camera compat policy has priority over + // default letterbox aspect ratio. + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy( + mActivityRecord); + if (cameraPolicy != null && cameraPolicy.shouldCameraCompatControlAspectRatio( + mActivityRecord)) { + return cameraPolicy.getCameraCompatAspectRatio(mActivityRecord); + } + final float letterboxAspectRatioOverride = mAppCompatOverrides.getAppCompatAspectRatioOverrides() .getFixedOrientationLetterboxAspectRatio(newParentConfig); @@ -119,10 +128,10 @@ class AppCompatAspectRatioPolicy { if (aspectRatioOverrides.shouldApplyUserMinAspectRatioOverride()) { return aspectRatioOverrides.getUserMinAspectRatio(); } - final DisplayContent displayContent = mActivityRecord.getDisplayContent(); - final boolean shouldOverrideMinAspectRatioForCamera = displayContent != null - && displayContent.mAppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera( - mActivityRecord); + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy( + mActivityRecord); + final boolean shouldOverrideMinAspectRatioForCamera = cameraPolicy != null + && cameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord); if (!aspectRatioOverrides.shouldOverrideMinAspectRatio() && !shouldOverrideMinAspectRatioForCamera) { if (mActivityRecord.isUniversalResizeable()) { diff --git a/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java b/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java index 5338c01666fe..f6090eb89345 100644 --- a/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java @@ -18,6 +18,8 @@ package com.android.server.wm; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; +import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.pm.ActivityInfo.ScreenOrientation; @@ -74,6 +76,12 @@ class AppCompatCameraPolicy { } } + @Nullable + static AppCompatCameraPolicy getAppCompatCameraPolicy(@NonNull ActivityRecord activityRecord) { + return activityRecord.mDisplayContent != null + ? activityRecord.mDisplayContent.mAppCompatCameraPolicy : null; + } + /** * "Refreshes" activity by going through "stopped -> resumed" or "paused -> resumed" cycle. * This allows to clear cached values in apps (e.g. display or camera rotation) that influence @@ -167,12 +175,37 @@ class AppCompatCameraPolicy { : SCREEN_ORIENTATION_UNSPECIFIED; } + // TODO(b/369070416): have policies implement the same interface. + boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) { + return (mDisplayRotationCompatPolicy != null + && mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation( + activity)) + || (mCameraCompatFreeformPolicy != null + && mCameraCompatFreeformPolicy.shouldCameraCompatControlOrientation( + activity)); + } + + // TODO(b/369070416): have policies implement the same interface. + boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord activity) { + return (mDisplayRotationCompatPolicy != null + && mDisplayRotationCompatPolicy.shouldCameraCompatControlAspectRatio( + activity)) + || (mCameraCompatFreeformPolicy != null + && mCameraCompatFreeformPolicy.shouldCameraCompatControlAspectRatio( + activity)); + } + + // TODO(b/369070416): have policies implement the same interface. /** - * @return {@code true} if the Camera is active for the provided {@link ActivityRecord}. + * @return {@code true} if the Camera is active for the provided {@link ActivityRecord} and + * any camera compat treatment could be triggered for the current windowing mode. */ - boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) { - return mDisplayRotationCompatPolicy != null - && mDisplayRotationCompatPolicy.isCameraActive(activity, mustBeFullscreen); + private boolean isCameraRunningAndWindowingModeEligible(@NonNull ActivityRecord activity) { + return (mDisplayRotationCompatPolicy != null + && mDisplayRotationCompatPolicy.isCameraRunningAndWindowingModeEligible(activity, + /* mustBeFullscreen */ true)) + || (mCameraCompatFreeformPolicy != null && mCameraCompatFreeformPolicy + .isCameraRunningAndWindowingModeEligible(activity)); } @Nullable @@ -183,12 +216,24 @@ class AppCompatCameraPolicy { return null; } + // TODO(b/369070416): have policies implement the same interface. + float getCameraCompatAspectRatio(@NonNull ActivityRecord activity) { + float displayRotationCompatPolicyAspectRatio = mDisplayRotationCompatPolicy != null + ? mDisplayRotationCompatPolicy.getCameraCompatAspectRatio(activity) + : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; + float cameraCompatFreeformPolicyAspectRatio = mCameraCompatFreeformPolicy != null + ? mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(activity) + : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; + return Math.max(displayRotationCompatPolicyAspectRatio, + cameraCompatFreeformPolicyAspectRatio); + } + /** * Whether we should apply the min aspect ratio per-app override only when an app is connected * to the camera. */ boolean shouldOverrideMinAspectRatioForCamera(@NonNull ActivityRecord activityRecord) { - return isCameraActive(activityRecord, /* mustBeFullscreen= */ true) + return isCameraRunningAndWindowingModeEligible(activityRecord) && activityRecord.mAppCompatController.getAppCompatCameraOverrides() .isOverrideMinAspectRatioForCameraEnabled(); } diff --git a/services/core/java/com/android/server/wm/AppCompatConfiguration.java b/services/core/java/com/android/server/wm/AppCompatConfiguration.java index 42378aaf6c05..38c6de146293 100644 --- a/services/core/java/com/android/server/wm/AppCompatConfiguration.java +++ b/services/core/java/com/android/server/wm/AppCompatConfiguration.java @@ -290,6 +290,10 @@ final class AppCompatConfiguration { // is enabled and activity is connected to the camera in fullscreen. private final boolean mIsCameraCompatSplitScreenAspectRatioEnabled; + // Which aspect ratio to use when camera compat treatment is enabled and an activity eligible + // for treatment is connected to the camera. + private float mCameraCompatAspectRatio; + // Whether activity "refresh" in camera compatibility treatment is enabled. // See RefreshCallbackItem for context. private boolean mIsCameraCompatTreatmentRefreshEnabled = true; @@ -363,6 +367,8 @@ final class AppCompatConfiguration { .config_letterboxIsDisplayAspectRatioForFixedOrientationLetterboxEnabled); mIsCameraCompatSplitScreenAspectRatioEnabled = mContext.getResources().getBoolean( R.bool.config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled); + mCameraCompatAspectRatio = mContext.getResources().getFloat( + R.dimen.config_windowManagerCameraCompatAspectRatio); mIsPolicyForIgnoringRequestedOrientationEnabled = mContext.getResources().getBoolean( R.bool.config_letterboxIsPolicyForIgnoringRequestedOrientationEnabled); @@ -1320,6 +1326,31 @@ final class AppCompatConfiguration { } /** + * Overrides aspect ratio to use when camera compat treatment is enabled and an activity + * eligible for treatment is connected to the camera. + */ + void setCameraCompatAspectRatio(float aspectRatio) { + mCameraCompatAspectRatio = aspectRatio; + } + + /** + * Which aspect ratio to use when camera compat treatment is enabled and an activity eligible + * for treatment is connected to the camera. + */ + float getCameraCompatAspectRatio() { + return mCameraCompatAspectRatio; + } + + /** + * Resets aspect ratio to use when camera compat treatment is enabled and an activity eligible + * for treatment is connected to the camera. + */ + void resetCameraCompatAspectRatio() { + mCameraCompatAspectRatio = mContext.getResources().getFloat(R.dimen + .config_windowManagerCameraCompatAspectRatio); + } + + /** * Checks whether rotation compat policy for immersive apps that prevents auto rotation * into non-optimal screen orientation while in fullscreen is enabled at build time. This is * used when we need to safely initialize a component before the {@link DeviceConfig} flag diff --git a/services/core/java/com/android/server/wm/AppCompatController.java b/services/core/java/com/android/server/wm/AppCompatController.java index 173362c16728..6c344c6d850a 100644 --- a/services/core/java/com/android/server/wm/AppCompatController.java +++ b/services/core/java/com/android/server/wm/AppCompatController.java @@ -16,7 +16,6 @@ package com.android.server.wm; import android.annotation.NonNull; -import android.annotation.Nullable; import android.content.pm.PackageManager; import com.android.server.wm.utils.OptPropFactory; @@ -118,14 +117,6 @@ class AppCompatController { return mAppCompatOverrides.getAppCompatResizeOverrides(); } - @Nullable - AppCompatCameraPolicy getAppCompatCameraPolicy() { - if (mActivityRecord.mDisplayContent != null) { - return mActivityRecord.mDisplayContent.mAppCompatCameraPolicy; - } - return null; - } - @NonNull AppCompatReachabilityPolicy getAppCompatReachabilityPolicy() { return mAppCompatReachabilityPolicy; diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java index 7477c6272d89..5bd4aeb64b90 100644 --- a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java @@ -58,16 +58,17 @@ class AppCompatOrientationPolicy { && displayContent.getIgnoreOrientationRequest(); final boolean shouldApplyUserFullscreenOverride = mAppCompatOverrides .getAppCompatAspectRatioOverrides().shouldApplyUserFullscreenOverride(); - final boolean isCameraActive = displayContent != null - && displayContent.mAppCompatCameraPolicy.isCameraActive(mActivityRecord, - /* mustBeFullscreen */ true); + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy + .getAppCompatCameraPolicy(mActivityRecord); + final boolean shouldCameraCompatControlOrientation = cameraPolicy != null + && cameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord); if (shouldApplyUserFullscreenOverride && isIgnoreOrientationRequestEnabled // Do not override orientation to fullscreen for camera activities. // Fixed-orientation activities are rarely tested in other orientations, and it // often results in sideways or stretched previews. As the camera compat treatment // targets fixed-orientation activities, overriding the orientation disables the // treatment. - && !isCameraActive) { + && !shouldCameraCompatControlOrientation) { Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) + " for " + mActivityRecord + " is overridden to " + screenOrientationToString(SCREEN_ORIENTATION_USER) @@ -113,7 +114,7 @@ class AppCompatOrientationPolicy { // often results in sideways or stretched previews. As the camera compat treatment // targets fixed-orientation activities, overriding the orientation disables the // treatment. - && !isCameraActive) { + && !shouldCameraCompatControlOrientation) { Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) + " for " + mActivityRecord + " is overridden to " + screenOrientationToString(SCREEN_ORIENTATION_USER)); @@ -192,8 +193,9 @@ class AppCompatOrientationPolicy { + mActivityRecord); return true; } - final AppCompatCameraPolicy cameraPolicy = mActivityRecord.mAppCompatController - .getAppCompatCameraPolicy(); + + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy + .getAppCompatCameraPolicy(mActivityRecord); if (cameraPolicy != null && cameraPolicy.isTreatmentEnabledForActivity(mActivityRecord)) { Slog.w(TAG, "Ignoring orientation update to " diff --git a/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java b/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java index d6caa1a248b4..290e71d5b37d 100644 --- a/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java +++ b/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java @@ -29,6 +29,7 @@ import static android.content.res.Configuration.ORIENTATION_UNDEFINED; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_180; +import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -123,7 +124,7 @@ final class CameraCompatFreeformPolicy implements CameraStateMonitor.CameraCompa * </ul> */ @VisibleForTesting - boolean shouldApplyFreeformTreatmentForCameraCompat(@NonNull ActivityRecord activity) { + boolean isCameraCompatForFreeformEnabledForActivity(@NonNull ActivityRecord activity) { return Flags.enableCameraCompatForDesktopWindowing() && !activity.info.isChangeEnabled( ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT); } @@ -170,6 +171,36 @@ final class CameraCompatFreeformPolicy implements CameraStateMonitor.CameraCompa return true; } + boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) { + return isCameraRunningAndWindowingModeEligible(activity); + } + + boolean isCameraRunningAndWindowingModeEligible(@NonNull ActivityRecord activity) { + return activity.inFreeformWindowingMode() + && mCameraStateMonitor.isCameraRunningForActivity(activity); + } + + boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord activity) { + // Camera compat should direct aspect ratio when in camera compat mode, unless an app has a + // different camera compat aspect ratio set: this allows per-app camera compat override + // aspect ratio to be smaller than the default. + return isInCameraCompatMode(activity) && !activity.mAppCompatController + .getAppCompatCameraOverrides().isOverrideMinAspectRatioForCameraEnabled(); + } + + private boolean isInCameraCompatMode(@NonNull ActivityRecord activity) { + return activity.mAppCompatController.getAppCompatCameraOverrides() + .getFreeformCameraCompatMode() != CAMERA_COMPAT_FREEFORM_NONE; + } + + float getCameraCompatAspectRatio(@NonNull ActivityRecord activityRecord) { + if (shouldCameraCompatControlAspectRatio(activityRecord)) { + return activityRecord.mWmService.mAppCompatConfiguration.getCameraCompatAspectRatio(); + } + + return MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; + } + private void forceUpdateActivityAndTask(ActivityRecord cameraActivity) { cameraActivity.recomputeConfiguration(); cameraActivity.updateReportedConfigurationAndSend(); @@ -225,7 +256,7 @@ final class CameraCompatFreeformPolicy implements CameraStateMonitor.CameraCompa */ private boolean isTreatmentEnabledForActivity(@NonNull ActivityRecord activity) { int orientation = activity.getRequestedConfigurationOrientation(); - return shouldApplyFreeformTreatmentForCameraCompat(activity) + return isCameraCompatForFreeformEnabledForActivity(activity) && mCameraStateMonitor.isCameraRunningForActivity(activity) && orientation != ORIENTATION_UNDEFINED && activity.inFreeformWindowingMode() diff --git a/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java index 6e6f76aaa48c..3b2f723fb172 100644 --- a/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java +++ b/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java @@ -194,9 +194,10 @@ public class DesktopAppCompatAspectRatioPolicy { return aspectRatioOverrides.getUserMinAspectRatio(); } - final DisplayContent dc = task.mDisplayContent; - final boolean shouldOverrideMinAspectRatioForCamera = dc != null - && dc.mAppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord); + final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy( + mActivityRecord); + final boolean shouldOverrideMinAspectRatioForCamera = cameraPolicy != null + && cameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord); if (!aspectRatioOverrides.shouldOverrideMinAspectRatio() && !shouldOverrideMinAspectRatioForCamera) { if (mActivityRecord.isUniversalResizeable()) { diff --git a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java index efc38439bfcf..90f8b4900c3f 100644 --- a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java @@ -30,6 +30,7 @@ import static android.content.res.Configuration.ORIENTATION_UNDEFINED; import static android.view.Display.TYPE_INTERNAL; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION; +import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.DisplayRotationReversionController.REVERSION_TYPE_CAMERA_COMPAT; import android.annotation.NonNull; @@ -133,6 +134,11 @@ final class DisplayRotationCompatPolicy implements CameraStateMonitor.CameraComp return mLastReportedOrientation; } + float getCameraCompatAspectRatio(@NonNull ActivityRecord unusedActivity) { + // This policy does not apply camera compat aspect ratio by default, only via overrides. + return MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; + } + @ScreenOrientation private synchronized int getOrientationInternal() { if (!isTreatmentEnabledForDisplay()) { @@ -271,7 +277,7 @@ final class DisplayRotationCompatPolicy implements CameraStateMonitor.CameraComp boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) { return isTreatmentEnabledForDisplay() - && isCameraActive(activity, /* mustBeFullscreen */ true) + && isCameraRunningAndWindowingModeEligible(activity, /* mustBeFullscreen */ true) && activity.mAppCompatController.getAppCompatCameraOverrides() .shouldForceRotateForCameraCompat(); } @@ -290,7 +296,17 @@ final class DisplayRotationCompatPolicy implements CameraStateMonitor.CameraComp return isTreatmentEnabledForActivity(activity, /* mustBeFullscreen */ true); } - boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) { + boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) { + return isCameraRunningAndWindowingModeEligible(activity, /* mustBeFullscreen= */ true); + } + + boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord unusedActivity) { + // This policy does not apply camera compat aspect ratio by default, only via overrides. + return false; + } + + boolean isCameraRunningAndWindowingModeEligible(@NonNull ActivityRecord activity, + boolean mustBeFullscreen) { // Checking windowing mode on activity level because we don't want to // apply treatment in case of activity embedding. return (!mustBeFullscreen || !activity.inMultiWindowMode()) @@ -299,7 +315,8 @@ final class DisplayRotationCompatPolicy implements CameraStateMonitor.CameraComp private boolean isTreatmentEnabledForActivity(@Nullable ActivityRecord activity, boolean mustBeFullscreen) { - return activity != null && isCameraActive(activity, mustBeFullscreen) + return activity != null + && isCameraRunningAndWindowingModeEligible(activity, mustBeFullscreen) && activity.getRequestedConfigurationOrientation() != ORIENTATION_UNDEFINED // "locked" and "nosensor" values are often used by camera apps that can't // handle dynamic changes so we shouldn't force rotate them. @@ -428,6 +445,7 @@ final class DisplayRotationCompatPolicy implements CameraStateMonitor.CameraComp private boolean shouldOverrideMinAspectRatio(@NonNull ActivityRecord activityRecord) { return activityRecord.mAppCompatController.getAppCompatCameraOverrides() .isOverrideMinAspectRatioForCameraEnabled() - && isCameraActive(activityRecord, /* mustBeFullscreen= */ true); + && isCameraRunningAndWindowingModeEligible(activityRecord, + /* mustBeFullscreen= */ true); } } diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 4f8332a49750..9e6468020fc0 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -162,6 +162,12 @@ class InsetsSourceProvider { return mSource; } + @VisibleForTesting + @NonNull + Rect getSourceFrame() { + return mSourceFrame; + } + /** * @return Whether the current flag configuration allows to control this source. */ diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index db0374e52b1a..e4fd523d5ce7 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -815,8 +815,7 @@ class ScreenRotationAnimation { if (mDisplayContent.getRotationAnimation() == ScreenRotationAnimation.this) { // It also invokes kill(). mDisplayContent.setRotationAnimation(null); - mDisplayContent.mAppCompatCameraPolicy - .onScreenRotationAnimationFinished(); + mDisplayContent.mAppCompatCameraPolicy.onScreenRotationAnimationFinished(); } else { kill(); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 2451ca87c3c7..d4d6e659498f 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -556,8 +556,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { snapshotStartState(ar); mChanges.get(ar).mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END; }); - snapshotStartState(wc); - mChanges.get(wc).mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END; } /** Set a transition to be a seamless-rotation. */ @@ -1083,7 +1081,8 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // For config-at-end, the end-transform will be reset after the config is actually // applied in the client (since the transform depends on config). The other properties // remain here because shell might want to persistently override them. - if ((mTargets.get(i).mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) == 0) { + if (target.asActivityRecord() == null + || (mTargets.get(i).mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) == 0) { resetSurfaceTransform(t, target, targetLeash); } } @@ -1564,46 +1563,33 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (mConfigAtEndActivities == null || mConfigAtEndActivities.isEmpty()) { return; } - final SurfaceControl.Transaction t = - mController.mAtm.mWindowManager.mTransactionFactory.get(); - for (int i = 0; i < mTargets.size(); ++i) { - final WindowContainer target = mTargets.get(i).mContainer; - if (target.getParent() == null || (mTargets.get(i).mFlags - & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) == 0) { - continue; + // Now resume the configuration dispatch, wait until the now resumed configs have been + // drawn, and then apply everything together. Any activities that are already in an + // active sync will remain on that sync instead of the new one. + int syncId = -1; + for (int i = 0; i < mConfigAtEndActivities.size(); ++i) { + final ActivityRecord target = mConfigAtEndActivities.get(i); + final SurfaceControl targetLeash = target.getSurfaceControl(); + if (target.getSyncGroup() == null || target.getSyncGroup().isIgnoring(target)) { + if (syncId < 0) { + final BLASTSyncEngine.SyncGroup sg = mSyncEngine.prepareSyncSet( + (mSyncId, transaction) -> transaction.apply(), + "ConfigAtTransitEnd"); + syncId = sg.mSyncId; + mSyncEngine.startSyncSet(sg, BLAST_TIMEOUT_DURATION, true /* parallel */); + mSyncEngine.setSyncMethod(syncId, BLASTSyncEngine.METHOD_BLAST); + } + mSyncEngine.addToSyncSet(syncId, target); } - final SurfaceControl targetLeash = getLeashSurface(target, null /* t */); // Reset surface state here (since it was skipped in buildFinishTransaction). Since // we are resuming config to the "current" state, we have to calculate the matching // surface state now (rather than snapshotting it at animation start). - resetSurfaceTransform(t, target, targetLeash); - } - - // Now we resume the configuration dispatch, wait until the now resumed configs have been - // drawn, and then apply everything together. - final BLASTSyncEngine.SyncGroup sg = mSyncEngine.prepareSyncSet( - new BLASTSyncEngine.TransactionReadyListener() { - @Override - public void onTransactionReady(int mSyncId, - SurfaceControl.Transaction transaction) { - t.merge(transaction); - t.apply(); - } - - @Override - public void onTransactionCommitTimeout() { - t.apply(); - } - }, "ConfigAtTransitEnd"); - final int syncId = sg.mSyncId; - mSyncEngine.startSyncSet(sg, BLAST_TIMEOUT_DURATION, true /* parallel */); - mSyncEngine.setSyncMethod(syncId, BLASTSyncEngine.METHOD_BLAST); - for (int i = 0; i < mConfigAtEndActivities.size(); ++i) { - final ActivityRecord ar = mConfigAtEndActivities.get(i); - mSyncEngine.addToSyncSet(syncId, ar); - ar.resumeConfigurationDispatch(); + resetSurfaceTransform(target.getSyncTransaction(), target, targetLeash); + target.resumeConfigurationDispatch(); + } + if (syncId >= 0) { + mSyncEngine.setReady(syncId); } - mSyncEngine.setReady(syncId); } @Nullable @@ -1718,6 +1704,54 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { change.mFlags |= ChangeInfo.FLAG_CHANGE_NO_ANIMATION; } + void prepareConfigAtEnd(SurfaceControl.Transaction transact, ArrayList<ChangeInfo> targets) { + if (mConfigAtEndActivities == null) return; + for (int i = 0; i < mConfigAtEndActivities.size(); ++i) { + final ActivityRecord ar = mConfigAtEndActivities.get(i); + if (!ar.isVisibleRequested()) continue; + final SurfaceControl sc = ar.getSurfaceControl(); + if (sc == null) continue; + final Task task = ar.getTask(); + if (task == null) continue; + // If task isn't animating, then it means shell is animating activity directly (within + // task), so don't do any setup. + if (!containsChangeFor(task, targets)) continue; + final ChangeInfo change = mChanges.get(ar); + final Rect startBounds = change.mAbsoluteBounds; + Rect hintRect = null; + if (ar.getWindowingMode() == WINDOWING_MODE_PINNED && ar.pictureInPictureArgs != null + && ar.pictureInPictureArgs.getSourceRectHint() != null) { + hintRect = ar.pictureInPictureArgs.getSourceRectHint(); + } + if (hintRect == null) { + hintRect = new Rect(startBounds); + hintRect.offsetTo(0, 0); + } + final Rect endBounds = ar.getBounds(); + final Rect taskEndBounds = task.getBounds(); + // FA = final activity bounds (absolute) + // FT = final task bounds (absolute) + // SA = start activity bounds (absolute) + // H = source hint (relative to start activity bounds) + // We want to transform the activity so that when the task is at FT, H overlaps with FA + + // This scales the activity such that the hint rect has the same dimensions + // as the final activity bounds. + float hintToEndScaleX = ((float) endBounds.width()) / ((float) hintRect.width()); + float hintToEndScaleY = ((float) endBounds.height()) / ((float) hintRect.height()); + // top-left needs to be (FA.tl - FT.tl) - H.tl * hintToEnd . H is relative to the + // activity; so, for example, if shrinking H to FA (hintToEnd < 1), then the tl of the + // shrunk SA is closer to H than expected, so we need to reduce how much we offset SA + // to get H.tl to match. + float startActPosInTaskEndX = + (endBounds.left - taskEndBounds.left) - hintRect.left * hintToEndScaleX; + float startActPosInTaskEndY = + (endBounds.top - taskEndBounds.top) - hintRect.top * hintToEndScaleY; + transact.setScale(sc, hintToEndScaleX, hintToEndScaleY); + transact.setPosition(sc, startActPosInTaskEndX, startActPosInTaskEndY); + } + } + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) static boolean containsChangeFor(WindowContainer wc, ArrayList<ChangeInfo> list) { for (int i = list.size() - 1; i >= 0; --i) { @@ -1799,6 +1833,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Resolve the animating targets from the participants. mTargets = calculateTargets(mParticipants, mChanges); + prepareConfigAtEnd(transaction, mTargets); // Check whether the participants were animated from back navigation. mController.mAtm.mBackNavigationController.onTransactionReady(this, mTargets, @@ -2648,9 +2683,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } else { parentChange.mFlags |= ChangeInfo.FLAG_CHANGE_YES_ANIMATION; } - if ((targetChange.mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) != 0) { - parentChange.mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END; - } } } @@ -2742,14 +2774,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } else { intermediates.add(parentChange); } - // for config-at-end, we want to promote the flag based on the end-state even - // if the activity was reparented because it operates after the animation. So, - // check that here since the promote code skips reparents. - if ((targetChange.mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) != 0 - && targetChange.mContainer.asActivityRecord() != null - && targetChange.mContainer.getParent() == p) { - parentChange.mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END; - } foundParentInTargets = true; break; } else if (reportIfNotTop(p) && !skipIntermediateReports) { diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index 06d8c370b914..6d7396f1f477 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -1038,6 +1038,25 @@ public class WindowManagerShellCommand extends ShellCommand { return 0; } + private int runSetCameraCompatAspectRatio(PrintWriter pw) throws RemoteException { + final float aspectRatio; + try { + String arg = getNextArgRequired(); + aspectRatio = Float.parseFloat(arg); + } catch (NumberFormatException e) { + getErrPrintWriter().println("Error: bad aspect ratio format " + e); + return -1; + } catch (IllegalArgumentException e) { + getErrPrintWriter().println( + "Error: aspect ratio should be provided as an argument " + e); + return -1; + } + synchronized (mInternal.mGlobalLock) { + mAppCompatConfiguration.setCameraCompatAspectRatio(aspectRatio); + } + return 0; + } + private int runSetLetterboxStyle(PrintWriter pw) throws RemoteException { if (peekNextArg() == null) { getErrPrintWriter().println("Error: No arguments provided."); @@ -1129,6 +1148,9 @@ public class WindowManagerShellCommand extends ShellCommand { runSetBooleanFlag(pw, mAppCompatConfiguration::setCameraCompatRefreshCycleThroughStopEnabled); break; + case "--cameraCompatAspectRatio": + runSetCameraCompatAspectRatio(pw); + break; default: getErrPrintWriter().println( "Error: Unrecognized letterbox style option: " + arg); @@ -1220,6 +1242,9 @@ public class WindowManagerShellCommand extends ShellCommand { mAppCompatConfiguration .resetCameraCompatRefreshCycleThroughStopEnabled(); break; + case "cameraCompatAspectRatio": + mAppCompatConfiguration.resetCameraCompatAspectRatio(); + break; default: getErrPrintWriter().println( "Error: Unrecognized letterbox style option: " + arg); @@ -1330,6 +1355,7 @@ public class WindowManagerShellCommand extends ShellCommand { mAppCompatConfiguration.resetUserAppAspectRatioFullscreenEnabled(); mAppCompatConfiguration.resetCameraCompatRefreshEnabled(); mAppCompatConfiguration.resetCameraCompatRefreshCycleThroughStopEnabled(); + mAppCompatConfiguration.resetCameraCompatAspectRatio(); } } @@ -1619,6 +1645,11 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println(" Whether activity \"refresh\" in camera compatibility treatment should"); pw.println(" happen using the \"stopped -> resumed\" cycle rather than"); pw.println(" \"paused -> resumed\" cycle."); + pw.println(" --cameraCompatAspectRatio aspectRatio"); + pw.println(" Aspect ratio of letterbox for fixed-orientation camera apps, during "); + pw.println(" freeform camera compat mode. If aspectRatio <= " + + AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO); + pw.println(" it will be ignored."); pw.println(" reset-letterbox-style [aspectRatio|cornerRadius|backgroundType"); pw.println(" |backgroundColor|wallpaperBlurRadius|wallpaperDarkScrimAlpha"); pw.println(" |horizontalPositionMultiplier|verticalPositionMultiplier"); @@ -1627,7 +1658,8 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println(" |isTranslucentLetterboxingEnabled|isUserAppAspectRatioSettingsEnabled"); pw.println(" |persistentPositionMultiplierForHorizontalReachability"); pw.println(" |persistentPositionMultiplierForVerticalReachability"); - pw.println(" |defaultPositionMultiplierForVerticalReachability]"); + pw.println(" |defaultPositionMultiplierForVerticalReachability"); + pw.println(" |cameraCompatAspectRatio]"); pw.println(" Resets overrides to default values for specified properties separated"); pw.println(" by space, e.g. 'reset-letterbox-style aspectRatio cornerRadius'."); pw.println(" If no arguments provided, all values will be reset."); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 0e3ab63aefb9..ab8384601f8f 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1378,6 +1378,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // should be updated after the new given insets are sent to window manager. return; } + if (!mRelayoutCalled) { + // The window was not laid out yet. The source frame should be updated after the window + // is laid out. + return; + } final SparseArray<InsetsSourceProvider> providers = getInsetsSourceProviders(); for (int i = providers.size() - 1; i >= 0; i--) { providers.valueAt(i).updateSourceFrame(winFrame); diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java index 90f62577b261..d00e2c677930 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java @@ -25,6 +25,7 @@ import static android.util.DisplayMetrics.DENSITY_MEDIUM; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeTrue; import android.app.ActivityManager; import android.app.Instrumentation; @@ -38,6 +39,9 @@ import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.platform.test.annotations.AppModeSdkSandbox; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.Log; import android.util.SparseArray; @@ -46,15 +50,19 @@ import androidx.annotation.NonNull; import androidx.test.platform.app.InstrumentationRegistry; import com.android.compatibility.common.util.SystemUtil; +import com.android.compatibility.common.util.TestUtils; +import com.android.server.am.Flags; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; +import java.io.IOException; import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; @@ -68,6 +76,10 @@ import java.util.concurrent.TimeUnit; public class DisplayEventDeliveryTest { private static final String TAG = "DisplayEventDeliveryTest"; + @Rule + public final CheckFlagsRule mCheckFlagsRule = + DeviceFlagsValueProvider.createCheckFlagsRule(); + private static final String NAME = TAG; private static final int WIDTH = 720; private static final int HEIGHT = 480; @@ -149,7 +161,6 @@ public class DisplayEventDeliveryTest { mExpectations.offer(event); } - /** * Assert that there isn't any unexpected display event from the test activity */ @@ -189,19 +200,9 @@ public class DisplayEventDeliveryTest { @Parameter(0) public int mDisplayCount; - /** - * True if running the test activity in cached mode - * False if running it in non-cached mode - */ - @Parameter(1) - public boolean mCached; - - @Parameters(name = "#{index}: {0} {1}") + @Parameters(name = "#{index}: {0}") public static Iterable<? extends Object> data() { - return Arrays.asList(new Object[][]{ - {1, false}, {2, false}, {3, false}, {10, false}, - {1, true}, {2, true}, {3, true}, {10, true} - }); + return Arrays.asList(new Object[][]{ {1}, {2}, {3}, {10} }); } private class TestHandler extends Handler { @@ -289,20 +290,51 @@ public class DisplayEventDeliveryTest { } /** - * Create virtual displays, change their configurations and release them - * mDisplays: the amount of virtual displays to be created - * mCached: true to run the test activity in cached mode; false in non-cached mode + * Return true if the freezer is enabled on this platform. */ - @Test - public void testDisplayEvents() { - Log.d(TAG, "Start test testDisplayEvents " + mDisplayCount + " " + mCached); + private boolean isAppFreezerEnabled() { + try { + return mActivityManager.getService().isAppFreezerEnabled(); + } catch (Exception e) { + Log.e(TAG, "isAppFreezerEnabled() failed: " + e); + return false; + } + } + + private void waitForProcessFreeze(int pid, long timeoutMs) { + // TODO: Add a listener to monitor freezer state changes. + SystemUtil.runWithShellPermissionIdentity(() -> { + TestUtils.waitUntil("Timed out waiting for test process to be frozen; pid=" + pid, + (int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs), + () -> mActivityManager.isProcessFrozen(pid)); + }); + } + + private void waitForProcessUnfreeze(int pid, long timeoutMs) { + // TODO: Add a listener to monitor freezer state changes. + SystemUtil.runWithShellPermissionIdentity(() -> { + TestUtils.waitUntil("Timed out waiting for test process to be frozen; pid=" + pid, + (int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs), + () -> !mActivityManager.isProcessFrozen(pid)); + }); + } + + /** + * Create virtual displays, change their configurations and release them. The number of + * displays is set by the {@link #mDisplays} variable. + */ + private void testDisplayEventsInternal(boolean cached, boolean frozen) { + Log.d(TAG, "Start test testDisplayEvents " + mDisplayCount + " " + cached + " " + frozen); // Launch DisplayEventActivity and start listening to display events - launchTestActivity(); + int pid = launchTestActivity(); - if (mCached) { - // The test activity in cached mode won't receive the pending display events + // The test activity in cached or frozen mode won't receive the pending display events. + if (cached) { makeTestActivityCached(); } + if (frozen) { + makeTestActivityFrozen(pid); + } // Create new virtual displays for (int i = 0; i < mDisplayCount; i++) { @@ -315,8 +347,8 @@ public class DisplayEventDeliveryTest { } for (int i = 0; i < mDisplayCount; i++) { - if (mCached) { - // DISPLAY_ADDED should be deferred for cached process + if (cached || frozen) { + // DISPLAY_ADDED should be deferred for a cached or frozen process. displayBundleAt(i).assertNoDisplayEvents(); } else { // DISPLAY_ADDED should arrive immediately for non-cached process @@ -331,8 +363,8 @@ public class DisplayEventDeliveryTest { } for (int i = 0; i < mDisplayCount; i++) { - if (mCached) { - // DISPLAY_CHANGED should be deferred for cached process + if (cached || frozen) { + // DISPLAY_CHANGED should be deferred for cached or frozen process. displayBundleAt(i).assertNoDisplayEvents(); } else { // DISPLAY_CHANGED should arrive immediately for non-cached process @@ -340,10 +372,16 @@ public class DisplayEventDeliveryTest { } } - if (mCached) { - // The test activity becomes non-cached and should receive the pending display events + // Unfreeze the test activity, if it was frozen. + if (frozen) { + makeTestActivityUnfrozen(pid); + } + + if (cached || frozen) { + // Always ensure the test activity is not cached. bringTestActivityTop(); + // The test activity becomes non-cached and should receive the pending display events for (int i = 0; i < mDisplayCount; i++) { // The pending DISPLAY_ADDED & DISPLAY_CHANGED should arrive now displayBundleAt(i).waitDisplayEvent(DISPLAY_ADDED); @@ -363,9 +401,48 @@ public class DisplayEventDeliveryTest { } /** - * Launch the test activity that would listen to display events + * Create virtual displays, change their configurations and release them. + */ + @Test + public void testDisplayEvents() { + testDisplayEventsInternal(false, false); + } + + /** + * Create virtual displays, change their configurations and release them. The display app is + * moved to cached and the test verifies that no events are delivered to the cached app. */ - private void launchTestActivity() { + @Test + public void testDisplayEventsCached() { + testDisplayEventsInternal(true, false); + } + + /** + * Create virtual displays, change their configurations and release them. The display app is + * frozen and the test verifies that no events are delivered to the frozen app. + */ + @RequiresFlagsEnabled(Flags.FLAG_DEFER_DISPLAY_EVENTS_WHEN_FROZEN) + @Test + public void testDisplayEventsFrozen() { + assumeTrue(isAppFreezerEnabled()); + testDisplayEventsInternal(false, true); + } + + /** + * Create virtual displays, change their configurations and release them. The display app is + * cached and frozen and the test verifies that no events are delivered to the app. + */ + @RequiresFlagsEnabled(Flags.FLAG_DEFER_DISPLAY_EVENTS_WHEN_FROZEN) + @Test + public void testDisplayEventsCachedFrozen() { + assumeTrue(isAppFreezerEnabled()); + testDisplayEventsInternal(true, true); + } + + /** + * Launch the test activity that would listen to display events. Return its process ID. + */ + private int launchTestActivity() { Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClassName(TEST_PACKAGE, TEST_ACTIVITY); intent.putExtra(TEST_MESSENGER, mMessenger); @@ -377,6 +454,18 @@ public class DisplayEventDeliveryTest { }, android.Manifest.permission.START_ACTIVITIES_FROM_SDK_SANDBOX); waitLatch(mLatchActivityLaunch); + + try { + String cmd = "pidof " + TEST_PACKAGE; + String result = SystemUtil.runShellCommand(mInstrumentation, cmd); + return Integer.parseInt(result.trim()); + } catch (IOException e) { + fail("failed to get pid of test package"); + return 0; + } catch (NumberFormatException e) { + fail("failed to parse pid " + e); + return 0; + } } /** @@ -415,6 +504,45 @@ public class DisplayEventDeliveryTest { waitLatch(mLatchActivityCached); } + // Sleep, ignoring interrupts. + private void pause(int s) { + try { Thread.sleep(s * 1000); } catch (Exception e) { } + } + + /** + * Freeze the test activity. + */ + private void makeTestActivityFrozen(int pid) { + // The delay here is meant to allow pending binder transactions to drain. A process + // cannot be frozen if it has pending binder transactions, and attempting to freeze such a + // process more than a few times will result in the system killing the process. + pause(5); + try { + String cmd = "am freeze --sticky "; + SystemUtil.runShellCommand(mInstrumentation, cmd + TEST_PACKAGE); + } catch (IOException e) { + fail(e.toString()); + } + // Wait for the freeze to complete in the kernel and for the frozen process + // notification to settle out. + waitForProcessFreeze(pid, 5 * 1000); + } + + /** + * Freeze the test activity. + */ + private void makeTestActivityUnfrozen(int pid) { + try { + String cmd = "am unfreeze --sticky "; + SystemUtil.runShellCommand(mInstrumentation, cmd + TEST_PACKAGE); + } catch (IOException e) { + fail(e.toString()); + } + // Wait for the freeze to complete in the kernel and for the frozen process + // notification to settle out. + waitForProcessUnfreeze(pid, 5 * 1000); + } + /** * Create a virtual display * diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java index 84c4f620f394..5709d884d427 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java @@ -1010,7 +1010,39 @@ public class ZenModeConfigTest extends UiServiceTestCase { @Test @EnableFlags(Flags.FLAG_MODES_UI) - public void testConfigXml_manualRule_upgradeWhenExisting() throws Exception { + public void testConfigXml_manualRuleWithoutCondition_upgradeWhenExisting() throws Exception { + // prior to modes_ui, it's possible to have a non-null manual rule that doesn't have much + // data on it because it's meant to indicate that the manual rule is on by merely existing. + ZenModeConfig config = new ZenModeConfig(); + config.manualRule = new ZenModeConfig.ZenRule(); + config.manualRule.enabled = true; + config.manualRule.pkg = "android"; + config.manualRule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS; + config.manualRule.conditionId = null; + config.manualRule.enabler = "test"; + + // write out entire config xml + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig fromXml = readConfigXml(bais); + + + // The result should be valid and contain a manual rule; the rule should have a non-null + // ZenPolicy and a condition whose state is true. The conditionId should be default. + assertThat(fromXml.isValid()).isTrue(); + assertThat(fromXml.manualRule).isNotNull(); + assertThat(fromXml.manualRule.zenPolicy).isNotNull(); + assertThat(fromXml.manualRule.condition).isNotNull(); + assertThat(fromXml.manualRule.condition.state).isEqualTo(STATE_TRUE); + assertThat(fromXml.manualRule.conditionId).isEqualTo(Uri.EMPTY); + assertThat(fromXml.manualRule.enabler).isEqualTo("test"); + assertThat(fromXml.isManualActive()).isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_MODES_UI) + public void testConfigXml_manualRuleWithCondition_upgradeWhenExisting() throws Exception { // prior to modes_ui, it's possible to have a non-null manual rule that doesn't have much // data on it because it's meant to indicate that the manual rule is on by merely existing. ZenModeConfig config = new ZenModeConfig(); @@ -1029,6 +1061,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { // The result should have a manual rule; it should have a non-null ZenPolicy and a condition // whose state is true. The conditionId and enabler data should also be preserved. + assertThat(fromXml.isValid()).isTrue(); assertThat(fromXml.manualRule).isNotNull(); assertThat(fromXml.manualRule.zenPolicy).isNotNull(); assertThat(fromXml.manualRule.condition).isNotNull(); diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java index 92205f391f32..65736cbc519f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java @@ -186,7 +186,8 @@ class AppCompatActivityRobot { void setTopActivityCameraActive(boolean enabled) { doReturn(enabled).when(getTopDisplayRotationCompatPolicy()) - .isCameraActive(eq(mActivityStack.top()), /* mustBeFullscreen= */ eq(true)); + .isCameraRunningAndWindowingModeEligible(eq(mActivityStack.top()), + /* mustBeFullscreen= */ eq(true)); } void setTopActivityEligibleForOrientationOverride(boolean enabled) { diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java index dbcef10a6be2..a8ccf95e1bb5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java @@ -26,6 +26,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE; import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_FULL_USER; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @@ -35,6 +36,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; +import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING; import static org.junit.Assert.assertEquals; @@ -247,8 +249,8 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { assertTrue(mActivity.info .isChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT)); - assertFalse(mCameraCompatFreeformPolicy - .shouldApplyFreeformTreatmentForCameraCompat(mActivity)); + assertFalse(mCameraCompatFreeformPolicy.isCameraCompatForFreeformEnabledForActivity( + mActivity)); } @Test @@ -256,8 +258,8 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { public void testShouldApplyCameraCompatFreeformTreatment_notDisabledByOverride_returnsTrue() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); - assertTrue(mCameraCompatFreeformPolicy - .shouldApplyFreeformTreatmentForCameraCompat(mActivity)); + assertTrue(mCameraCompatFreeformPolicy.isCameraCompatForFreeformEnabledForActivity( + mActivity)); } @Test @@ -303,6 +305,49 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { assertActivityRefreshRequested(/* refreshRequested */ true, /* cycleThroughStop */ false); } + @Test + public void testGetCameraCompatAspectRatio_activityNotInCameraCompat_returnsDefaultAspRatio() { + configureActivity(SCREEN_ORIENTATION_FULL_USER); + + mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); + callOnActivityConfigurationChanging(mActivity); + + assertEquals(MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO, + mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(mActivity), + /* delta= */ 0.001); + } + + @Test + public void testGetCameraCompatAspectRatio_activityInCameraCompat_returnsConfigAspectRatio() { + configureActivity(SCREEN_ORIENTATION_PORTRAIT); + final float configAspectRatio = 1.5f; + mWm.mAppCompatConfiguration.setCameraCompatAspectRatio(configAspectRatio); + + mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); + callOnActivityConfigurationChanging(mActivity); + + assertEquals(configAspectRatio, + mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(mActivity), + /* delta= */ 0.001); + } + + + @Test + public void testGetCameraCompatAspectRatio_inCameraCompatPerAppOverride_returnDefAspectRatio() { + configureActivity(SCREEN_ORIENTATION_PORTRAIT); + final float configAspectRatio = 1.5f; + mWm.mAppCompatConfiguration.setCameraCompatAspectRatio(configAspectRatio); + doReturn(true).when(mActivity.mAppCompatController.getAppCompatCameraOverrides()) + .isOverrideMinAspectRatioForCameraEnabled(); + + mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); + callOnActivityConfigurationChanging(mActivity); + + assertEquals(MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO, + mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(mActivity), + /* delta= */ 0.001); + } + private void configureActivity(@ScreenOrientation int activityOrientation) { configureActivity(activityOrientation, WINDOWING_MODE_FREEFORM); } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index 7a0961d8c306..1015651438c3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -84,6 +84,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { // Disabling this call for most tests since it can override the systemUiFlags when called. doNothing().when(mDisplayPolicy).updateSystemBarAttributes(); + makeWindowVisible(mStatusBarWindow, mNavBarWindow); updateDisplayFrames(); } @@ -154,6 +155,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { }; addWindow(win); win.getFrame().set(0, 0, 500, 100); + makeWindowVisible(win); win.updateSourceFrame(win.getFrame()); mDisplayContent.getInsetsStateController().onPostLayout(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index 6a89178ec9bf..3bd57475614f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -540,6 +540,7 @@ public class DisplayPolicyTests extends WindowTestsBase { final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); mDisplayContent.setInputMethodWindowLocked(mImeWindow); + makeWindowVisible(mImeWindow); mImeWindow.getControllableInsetProvider().setServerVisible(true); mImeWindow.mGivenContentInsets.set(0, 10, 0, 0); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java index 8cf593fd21db..35c9e3fb3aaf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java @@ -544,39 +544,35 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase { } @Test - public void testIsCameraActiveWhenCallbackInvokedNoMultiWindow_returnTrue() { + public void testShouldCameraCompatControlOrientationWhenInvokedNoMultiWindow_returnTrue() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); - assertTrue( - mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true)); + assertTrue(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity)); } @Test - public void testIsCameraActiveWhenCallbackNotInvokedNoMultiWindow_returnFalse() { + public void testShouldCameraCompatControlOrientationWhenNotInvokedNoMultiWindow_returnFalse() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); - assertFalse( - mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true)); + assertFalse(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity)); } @Test - public void testIsCameraActiveWhenCallbackNotInvokedMultiWindow_returnFalse() { + public void testShouldCameraCompatControlOrientationWhenNotInvokedMultiWindow_returnFalse() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); when(mActivity.inMultiWindowMode()).thenReturn(true); - assertFalse( - mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true)); + assertFalse(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity)); } @Test - public void testIsCameraActiveWhenCallbackInvokedMultiWindow_returnFalse() { + public void testShouldCameraCompatControlOrientationWhenInvokedMultiWindow_returnFalse() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); when(mActivity.inMultiWindowMode()).thenReturn(true); mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); - assertFalse( - mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true)); + assertFalse(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity)); } private void configureActivity(@ScreenOrientation int activityOrientation) { diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index d0d7c06bd706..66a66a1e358b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -291,6 +291,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + makeWindowVisible(statusBar); + // IME cannot be the IME target. ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE; diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 064b434e1a6b..5b3fd53b197c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -34,7 +34,6 @@ import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; -import static android.window.TransitionInfo.FLAG_CONFIG_AT_END; import static android.window.TransitionInfo.FLAG_CROSS_PROFILE_OWNER_THUMBNAIL; import static android.window.TransitionInfo.FLAG_FILLS_TASK; import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; @@ -2935,9 +2934,6 @@ public class TransitionTests extends WindowTestsBase { controller.requestStartTransition(transit, task, null, null); player.start(); assertTrue(activity.isConfigurationDispatchPaused()); - // config-at-end flag must propagate up to task if activity was promoted. - assertTrue(player.mLastReady.getChange( - task.mRemoteToken.toWindowContainerToken()).hasFlags(FLAG_CONFIG_AT_END)); player.finish(); assertFalse(activity.isConfigurationDispatchPaused()); } @@ -2966,11 +2962,9 @@ public class TransitionTests extends WindowTestsBase { controller.requestStartTransition(transit, task, null, null); player.start(); - // config-at-end flag must propagate up to task even when reparented (since config-at-end - // only cares about after-end state). - assertTrue(player.mLastReady.getChange( - task.mRemoteToken.toWindowContainerToken()).hasFlags(FLAG_CONFIG_AT_END)); + assertTrue(activity.isConfigurationDispatchPaused()); player.finish(); + assertFalse(activity.isConfigurationDispatchPaused()); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 2d5e5dacc217..e7e184c537f7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -483,6 +483,32 @@ public class WindowStateTests extends WindowTestsBase { assertFalse(statusBar.isVisible()); } + /** + * Verifies that the InsetsSourceProvider frame cannot be updated by WindowState before + * relayout is called. + */ + @SetupWindows(addWindows = { W_STATUS_BAR }) + @Test + public void testUpdateSourceFrameBeforeRelayout() { + final WindowState statusBar = mStatusBarWindow; + statusBar.mHasSurface = true; + assertTrue(statusBar.isVisible()); + final int statusBarId = InsetsSource.createId(null, 0, statusBars()); + final var statusBarProvider = mDisplayContent.getInsetsStateController() + .getOrCreateSourceProvider(statusBarId, statusBars()); + statusBarProvider.setWindowContainer(statusBar, null /* frameProvider */, + null /* imeFrameProvider */); + + statusBar.updateSourceFrame(new Rect(0, 0, 500, 200)); + assertTrue("InsetsSourceProvider frame should not be updated before relayout", + statusBarProvider.getSourceFrame().isEmpty()); + + makeWindowVisible(statusBar); + statusBar.updateSourceFrame(new Rect(0, 0, 500, 100)); + assertEquals("InsetsSourceProvider frame should be updated after relayout", + new Rect(0, 0, 500, 100), statusBarProvider.getSourceFrame()); + } + @Test public void testIsSelfOrAncestorWindowAnimating() { final WindowState root = createWindow(null, TYPE_APPLICATION, "root"); diff --git a/telephony/java/android/telephony/UiccAccessRule.java b/telephony/java/android/telephony/UiccAccessRule.java index 38b551bff9a7..65e325466108 100644 --- a/telephony/java/android/telephony/UiccAccessRule.java +++ b/telephony/java/android/telephony/UiccAccessRule.java @@ -169,18 +169,21 @@ public final class UiccAccessRule implements Parcelable { } private final byte[] mCertificateHash; + private final int mCertificateHashHashCode; private final @Nullable String mPackageName; // This bit is not currently used, but reserved for future use. private final long mAccessType; public UiccAccessRule(byte[] certificateHash, @Nullable String packageName, long accessType) { this.mCertificateHash = certificateHash; + this.mCertificateHashHashCode = getCertificateHashHashCode(this.mCertificateHash); this.mPackageName = packageName; this.mAccessType = accessType; } UiccAccessRule(Parcel in) { mCertificateHash = in.createByteArray(); + mCertificateHashHashCode = getCertificateHashHashCode(mCertificateHash); mPackageName = in.readString(); mAccessType = in.readLong(); } @@ -247,7 +250,7 @@ public final class UiccAccessRule implements Parcelable { public int getCarrierPrivilegeStatus(Signature signature, String packageName) { byte[] certHash256 = getCertHash(signature, "SHA-256"); // Check SHA-256 first as it's the new standard. - if (matches(certHash256, packageName)) { + if (hasMatchingCertificateHashAndPackageName(certHash256, packageName)) { return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; } @@ -255,7 +258,7 @@ public final class UiccAccessRule implements Parcelable { // in the near future when GPD_SPE_068 fully replaces GPD_SPE_013. if (this.mCertificateHash.length == 20) { byte[] certHash = getCertHash(signature, "SHA-1"); - if (matches(certHash, packageName)) { + if (hasMatchingCertificateHashAndPackageName(certHash, packageName)) { return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; } } @@ -267,15 +270,41 @@ public final class UiccAccessRule implements Parcelable { * Returns true if the given certificate and package name match this rule's values. * @hide */ - public boolean matches(@Nullable String certHash, @Nullable String packageName) { - return matches(IccUtils.hexStringToBytes(certHash), packageName); + public boolean hasMatchingCertificateHashAndPackageName( + @Nullable String certHash, @Nullable String packageName) { + return hasMatchingCertificateHashAndPackageName( + IccUtils.hexStringToBytes(certHash), packageName); } - private boolean matches(byte[] certHash, String packageName) { + /** + * Returns true if the given certificate and package name match this rule's values. + * @hide + */ + public boolean hasMatchingCertificateHashAndPackageName( + @Nullable byte[] certHash, @Nullable String packageName) { return certHash != null && Arrays.equals(this.mCertificateHash, certHash) && (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName)); } + /** + * Returns true if the given certificate hash hash + * and package name both match this rules' values. + * + * @hide + */ + public boolean hasMatchingCertificateHashHashAndPackageName( + int certHashHashCode, String packageName) { + return certHashHashCode == this.mCertificateHashHashCode + && (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName)); + } + + /** + * @hide + */ + public static int getCertificateHashHashCode(byte[] certHash) { + return Arrays.hashCode(certHash); + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) { diff --git a/tests/broadcasts/unit/TEST_MAPPING b/tests/broadcasts/unit/TEST_MAPPING index 0e824c54e92e..8919fdcd7a3f 100644 --- a/tests/broadcasts/unit/TEST_MAPPING +++ b/tests/broadcasts/unit/TEST_MAPPING @@ -1,5 +1,5 @@ { - "postsubmit": [ + "presubmit": [ { "name": "BroadcastUnitTests", "options": [ diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index fce6aa7c80d9..da092f43caa4 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -1529,13 +1529,34 @@ bool ResourceParser::ParseStyleItem(xml::XmlPullParser* parser, Style* style) { ResolvePackage(parser, &maybe_key.value()); maybe_key.value().SetSource(source); + auto flag = ParseFlag(xml::FindAttribute(parser, xml::kSchemaAndroid, "featureFlag")); + std::unique_ptr<Item> value = ParseXml(parser, 0, kAllowRawString); if (!value) { diag_->Error(android::DiagMessage(source) << "could not parse style item"); return false; } - style->entries.push_back(Style::Entry{std::move(maybe_key.value()), std::move(value)}); + if (flag) { + if (options_.flag) { + diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number())) + << "Resource flag are not allowed both in the path and in the file"); + return false; + } + std::string error; + auto flag_status = GetFlagStatus(flag, options_.feature_flag_values, &error); + if (flag_status) { + value->SetFlagStatus(flag_status.value()); + value->SetFlag(std::move(flag)); + } else { + diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number())) << error); + return false; + } + } + + if (value->GetFlagStatus() != FlagStatus::Disabled) { + style->entries.push_back(Style::Entry{std::move(maybe_key.value()), std::move(value)}); + } return true; } diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto index a0f60b62db3a..fe9b4a8843ca 100644 --- a/tools/aapt2/Resources.proto +++ b/tools/aapt2/Resources.proto @@ -302,6 +302,11 @@ message CompoundValue { Plural plural = 5; MacroBody macro = 6; } + + // The status of the flag the value is behind if any + uint32 flag_status = 7; + bool flag_negated = 8; + string flag_name = 9; } // Message holding a boolean, so it can be optionally encoded. diff --git a/tools/aapt2/format/proto/ProtoDeserialize.cpp b/tools/aapt2/format/proto/ProtoDeserialize.cpp index 8583cadff6d2..91ec3485ac3b 100644 --- a/tools/aapt2/format/proto/ProtoDeserialize.cpp +++ b/tools/aapt2/format/proto/ProtoDeserialize.cpp @@ -551,11 +551,10 @@ static bool DeserializePackageFromPb(const pb::Package& pb_package, const ResStr return false; } - FeatureFlagAttribute flag; - flag.name = pb_config_value.value().item().flag_name(); - flag.negated = pb_config_value.value().item().flag_negated(); - ResourceConfigValue* config_value = - entry->FindOrCreateFlagDisabledValue(std::move(flag), config, pb_config.product()); + ResourceConfigValue* config_value = entry->FindOrCreateFlagDisabledValue( + FeatureFlagAttribute{.name = pb_config_value.value().item().flag_name(), + .negated = pb_config_value.value().item().flag_negated()}, + config, pb_config.product()); if (config_value->value != nullptr) { *out_error = "duplicate configuration in resource table"; return false; @@ -563,7 +562,6 @@ static bool DeserializePackageFromPb(const pb::Package& pb_package, const ResStr config_value->value = DeserializeValueFromPb(pb_config_value.value(), src_pool, config, &out_table->string_pool, files, out_error); - if (config_value->value == nullptr) { return false; } @@ -896,6 +894,9 @@ std::unique_ptr<Value> DeserializeValueFromPb(const pb::Value& pb_value, LOG(FATAL) << "unknown compound value: " << (int)pb_compound_value.value_case(); break; } + value->SetFlagStatus((FlagStatus)pb_compound_value.flag_status()); + value->SetFlag(FeatureFlagAttribute{.name = pb_compound_value.flag_name(), + .negated = pb_compound_value.flag_negated()}); } else { LOG(FATAL) << "unknown value: " << (int)pb_value.value_case(); return {}; @@ -1052,10 +1053,8 @@ std::unique_ptr<Item> DeserializeItemFromPb(const pb::Item& pb_item, if (item) { item->SetFlagStatus((FlagStatus)pb_item.flag_status()); if (!pb_item.flag_name().empty()) { - FeatureFlagAttribute flag; - flag.name = pb_item.flag_name(); - flag.negated = pb_item.flag_negated(); - item->SetFlag(std::move(flag)); + item->SetFlag( + FeatureFlagAttribute{.name = pb_item.flag_name(), .negated = pb_item.flag_negated()}); } } return item; diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp index d83fe916ee95..fcc77d5a9d6d 100644 --- a/tools/aapt2/format/proto/ProtoSerialize.cpp +++ b/tools/aapt2/format/proto/ProtoSerialize.cpp @@ -734,6 +734,13 @@ void SerializeValueToPb(const Value& value, pb::Value* out_value, android::Strin out_value->mutable_item()->set_flag_negated(flag->negated); out_value->mutable_item()->set_flag_name(flag->name); } + } else if (out_value->has_compound_value()) { + out_value->mutable_compound_value()->set_flag_status((uint32_t)value.GetFlagStatus()); + if (value.GetFlag()) { + const auto& flag = value.GetFlag(); + out_value->mutable_compound_value()->set_flag_negated(flag->negated); + out_value->mutable_compound_value()->set_flag_name(flag->name); + } } } diff --git a/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp b/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp index 7160b35033da..1b0f99753ce6 100644 --- a/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp +++ b/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp @@ -30,6 +30,7 @@ genrule { "res/values/bools2.xml", "res/values/ints.xml", "res/values/strings.xml", + "res/values/styles.xml", "res/layout/layout1.xml", "res/layout/layout3.xml", "res/flag(test.package.falseFlag)/values/bools.xml", @@ -50,6 +51,7 @@ genrule { "values_bools2.arsc.flat", "values_ints.arsc.flat", "values_strings.arsc.flat", + "values_styles.arsc.flat", "layout_layout1.xml.flat", "layout_layout2.(test.package.falseFlag).xml.flat", "layout_layout3.xml.flat", diff --git a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/styles.xml b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/styles.xml new file mode 100644 index 000000000000..604129c26fef --- /dev/null +++ b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/styles.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + <style name="style1"> + <item name="android:windowIsTranslucent">true</item> + </style> + <style name="style1" android:featureFlag="test.package.falseFlag"> + <item name="android:windowIsTranslucent">false</item> + </style> + + <style name="style2"> + <item name="android:windowIsTranslucent">false</item> + </style> + <style name="style2" android:featureFlag="test.package.trueFlag"> + <item name="android:windowIsTranslucent">true</item> + </style> + + <style name="style3"> + <item name="android:windowIsTranslucent" android:featureFlag="!test.package.trueFlag">false</item> + <item name="android:windowIsTranslucent" android:featureFlag="test.package.trueFlag">true</item> + </style> +</resources>
\ No newline at end of file |